错误:SQL语法中有错误;检查与您的MySQL服务器版本对应的手册,以便在'附近使用正确的语法

时间:2013-07-08 22:45:11

标签: php mysql sql syntax-error

当用户输入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);  
?>

4 个答案:

答案 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