如何在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
相关产品推荐
相关产品推荐

