You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在PHP中提取YouTube视频ID并存入MySQL数据表?

实现PHP提取YouTube视频ID并存入MySQL数据表

我来帮你一步步完善这个功能,先从修正现有代码的问题开始,再补充提取ID和插入数据的完整逻辑:

1. 修正数据表创建代码

你现有的建表SQL末尾多了个多余的逗号,会导致语法错误。另外建议新增专门存储YouTube视频ID的字段,还可以加上创建时间字段方便追踪:

<?php
$conn = mysqli_connect('localhost', 'root', '', 'test');
if (!$conn) {
    die("Error connecting to database: " . mysqli_connect_error($conn));
    exit();
}
// 修正后的建表语句,新增youtube_id字段并设为唯一避免重复存储
$sql = "CREATE TABLE IF NOT EXISTS vidid (
    id INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    youtube_id VARCHAR(255) NOT NULL UNIQUE,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
)";
if ($conn->query($sql) === TRUE) {
    echo "Table vidid created successfully (or already exists)";
} else {
    echo "Error creating table: " . $conn->error;
}
$conn->close();
?>

这里加了IF NOT EXISTS,避免重复执行建表语句时抛出错误;把youtube_id设为UNIQUE,可以防止同一个视频ID被多次存入数据库。

2. 编写YouTube视频ID提取函数

接下来实现从各种格式的YouTube URL中提取ID的逻辑,支持常见的链接格式(比如https://www.youtube.com/watch?v=XXX、https://youtu.be/XXX、嵌入链接等):

function extractYoutubeId($url) {
    // 匹配多数YouTube URL格式的正则表达式
    $pattern = '/(?:youtube\.com\/(?:[^\/]+\/.+\/|(?:v|e(?:mbed)?)\/|.*[?&]v=)|youtu\.be\/)([^"&?\/\s]{11})/i';
    if (preg_match($pattern, $url, $matches)) {
        return $matches[1]; // 返回提取到的11位视频ID
    }
    return false; // 无法提取时返回false
}

// 示例使用
$youtubeUrl = "https://www.youtube.com/watch?v=dQw4w9WgXcQ";
$vidid = extractYoutubeId($youtubeUrl);
if ($vidid) {
    echo "提取到的视频ID: " . $vidid;
} else {
    echo "无法从该URL中提取YouTube视频ID";
}

3. 将提取到的ID安全存入数据库

现在把提取到的$vidid插入数据库,必须使用预处理语句防止SQL注入,这是处理用户输入数据的关键安全原则:

<?php
// 连接数据库
$conn = mysqli_connect('localhost', 'root', '', 'test');
if (!$conn) {
    die("Error connecting to database: " . mysqli_connect_error($conn));
    exit();
}

// 替换为实际需要处理的YouTube URL
$youtubeUrl = "https://www.youtube.com/watch?v=dQw4w9WgXcQ";
$vidid = extractYoutubeId($youtubeUrl);

if ($vidid) {
    // 预处理插入语句
    $stmt = $conn->prepare("INSERT INTO vidid (youtube_id) VALUES (?)");
    $stmt->bind_param("s", $vidid); // "s"表示参数为字符串类型

    if ($stmt->execute()) {
        echo "视频ID已成功存入数据库";
    } else {
        // 针对重复ID的情况给出友好提示(唯一键冲突错误码1062)
        if ($conn->errno === 1062) {
            echo "该视频ID已经存在于数据库中";
        } else {
            echo "存入数据库失败: " . $stmt->error;
        }
    }

    $stmt->close();
} else {
    echo "无效的YouTube URL,无法提取视频ID";
}

$conn->close();

// 别忘了引入提取函数
function extractYoutubeId($url) {
    $pattern = '/(?:youtube\.com\/(?:[^\/]+\/.+\/|(?:v|e(?:mbed)?)\/|.*[?&]v=)|youtu\.be\/)([^"&?\/\s]{11})/i';
    if (preg_match($pattern, $url, $matches)) {
        return $matches[1];
    }
    return false;
}
?>

几个关键注意点

  • 安全优先:绝对不要直接把用户输入的URL或ID拼接到SQL语句里,预处理语句是防止SQL注入的核心手段。
  • URL兼容性:上面的正则表达式覆盖了绝大多数常用的YouTube链接格式,如果遇到特殊格式可以微调正则规则。
  • 错误处理:代码中加入了对重复ID的判断,你可以根据自己的需求调整错误提示的逻辑。

内容的提问来源于stack exchange,提问作者YusufK_b3ra

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 07:08:33