当用户输入youtube网址时,会使用以下代码从网址获取youtube id。然后它获得具有该ID的视频的标题。然后将其插入数据库并调用以显示与该ID相关联的视频图像。
如果我使用此youtube网址http://www.youtube.com/watch?v=p64tAbP-nHE或其他youtube网址。如果youtube url的标题包含'ie(2013年乌鸦摇滚拉力赛 - Jonathan O'Callaghan& Gavin Sheehan - 第3阶段)我收到错误
错误:您的SQL语法出错;查看与您的MySQL服务器版本相对应的手册,以便在'Callaghan& amp;& Gavin Sheehan - 第1行的第3阶段
任何帮助都会很棒,提前谢谢。
这是我的代码:
<?php
include 'dataconnection.php';
// Check connection
if (mysqli_connect_errno())
{
echo "Failed to connect to MySQL: " . mysqli_connect_error();
}
else
$url = $_POST['set_video'];
parse_str( parse_url( $url, PHP_URL_QUERY ), $my_array_of_vars );
$youtube_id = $my_array_of_vars['v'];
$info = $_POST['set_desc'];
$id = $my_array_of_vars['v'];
$xmlData = simplexml_load_string(file_get_contents("http://gdata.youtube.com/feeds/api/videos/{$id}?fields=title"));
$title = (string)$xmlData->title;
$sql="INSERT INTO videodetails SET id='null',youtube_id='$youtube_id',info='$title'";
if (!mysqli_query($connection,$sql))
{
die('Error: ' . mysqli_error($connection));
}
echo "<div id='pageheader'>
1 record added<span id='logout'>Return to <a href='contributors_login.html'>Contributors Login</a></span>
</div>";
echo '<div id="setvideo"><a href="http://www.youtube.com/watch?v='.$my_array_of_vars['v'].'" target="_blank"><img src="http://i4.ytimg.com/vi/'.$my_array_of_vars['v'].'/default.jpg" style="border:solid 2px white;"></a><p>'.$title.'</p></div>';
mysqli_close($connection);
?>
答案 0 :(得分:3)
在INSERT INTO ...
部分使用mysqli_real_escape_string
。
你打开单引号。但标题也包含单引号,因此它们会被关闭。 MySQL不知道这一点,并认为后面的文本是一个MySQL关键字。
答案 1 :(得分:2)
您的yourTube名称中包含引号,因此SQL行
$sql="INSERT INTO videodetails SET id='null',youtube_id='$youtube_id',info='$title'
变成这个
INSERT INTO videodetails SET id='null',
youtube_id='2013 Ravens Rock Rally - Jonathan O'Callaghan & Gavin Sheehan - Stage 3'
MySQL认为是
INSERT INTO videodetails SET id='null',
youtube_id='2013 Ravens Rock Rally - Jonathan O',Callaghan & Gavin Sheehan - Stage 3'
并且MySQL不理解卡拉汉&amp; Gavin Sheehan - 第3阶段
答案 2 :(得分:2)
包含引号的字符串的情况是mysqli_real_escape_string()存在的原因,要找到这些引号并在它们之前插入\
,这样它们就算作文字引号字符,而不是终止引用的字符串。
. . .
$youtube_id = mysqli_real_escape_string($my_array_of_vars['v']);
$info = mysqli_real_escape_string($connection, $_POST['set_desc']);
$sql="INSERT INTO videodetails SET id='null',youtube_id='$youtube_id',info='$title'";
if (!mysqli_query($connection,$sql))
. . .
但最佳做法是使用查询参数,因此您不必担心这些嵌入式引号。在SQL字符串中有变量代替文字值的任何地方,都使用查询参数占位符。这些占位符不代替表名,列名或SQL表达式或关键字 - 它们只能在您通常在SQL中放置单标量值的地方工作。
$sql="INSERT INTO videodetails SET id='null',youtube_id=?,info=?";
if ($stmt = mysqli_prepare($connection, $sql)) {
mysqli_stmt_bind_param($stmt, 'ss', $youtube_id, $title);
mysqli_stmt_execute($stmt);
mysqli_stmt_close($stmt);
}
这更安全,使您的SQL更具可读性。请注意,?
占位符本身不会进入引号内,即使绑定到它的值是字符串。
PS:我质疑你对引用字符串'null'
的使用,你可能指的是SQL关键字NULL
。
答案 3 :(得分:1)
您的插入查询无效sql。关键字“set”用于更新查询。插入查询如下所示:
insert into atable
(f1, f2, etc)
values
(val1, val2, etc)
或者
insert into atable
(f1, f2, etc)
select val1, val2, etc
from someOtherTables