-1

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

如果我使用这个 youtube 网址http://www.youtube.com/watch?v=p64tAbP-nHE或其他 youtube 网址。如果该 youtube 网址的标题包含 ' ie(2013 Ravens Rock Rally - Jonathan O'Callaghan & Gavin Sheehan - Stage 3) 我得到错误

错误:您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 1 行的“Callaghan & Gavin Sheehan - Stage 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

4 回答 4

3

mysqli_real_escape_string在你的INSERT INTO ...部分使用。

您打开单引号。但标题也包含单引号,因此它们被关闭。MySQL 不知道这一点,并认为后面的文本是 MySQL 关键字。

于 2013-07-08T22:51:01.950 回答
2

包含引号的字符串的情况是 mysqli_real_escape_string() 存在的原因,找到这些引号并\在它们之前插入 a 以便它们计为文字引号字符,而不是终止引用的字符串。

. . .
$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

于 2013-07-08T22:59:02.717 回答
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 不理解Callaghan 和 Gavin Sheehan - 第 3 阶段

于 2013-07-08T22:50:23.377 回答
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
于 2013-07-08T22:48:52.123 回答