错误:您的SQL语法有错误;请查看与MySQL服务器版本相对应的手册,了解在';附近使用的正确语法;


Error: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '

当用户输入youtube url时,会使用下面的代码,它会从url中获取youtube id。然后,它获得带有该id的视频的标题。然后将其插入数据库并调用以显示与该id相关联的视频的图像。

如果我使用这个youtube网址http://www.youtube.com/watch?v=p64tAbP-nHE或和其他youtube url。如果该youtube网址的标题包含一个"ie"(2013乌鸦摇滚拉力赛-乔纳森·奥卡拉汉和加文·希恩-第三阶段),我会得到错误

错误:您的SQL语法有错误;查看与您的MySQL服务器版本对应的手册,了解在Callaghan&Gavin Sheehan-第3阶段1号

任何帮助都将是伟大的,提前感谢。

这是我的代码:

<?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);  
?>

INSERT INTO ...部分中使用mysqli_real_escape_string

你打开单引号。但标题中也包含了单引号,所以它们是封闭的。MySQL不知道这一点,并认为下面的文本是MySQL关键字。

您的Tube名称中有一个引号,因此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不理解Callaghan&Gavin Sheehan-第3阶段

包含引号的字符串的情况就是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更可读。请注意,?占位符本身不会位于引号内,即使绑定到它的值是字符串也是如此。

附言:我质疑你使用带引号的字符串'null',你可能指的是SQL关键字NULL

您的插入查询不是有效的sql。关键字"set"用于更新查询。插入查询如下所示:

insert into atable
(f1, f2, etc)
values
(val1, val2, etc)

或者这个

insert into atable
(f1, f2, etc)
select val1, val2, etc
from someOtherTables

相关文章: