Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/252.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 错误:您的SQL语法有错误;查看与您的MySQL服务器版本对应的手册,以了解使用near';_Php_Mysql_Sql_Syntax Error - Fatal编程技术网

Php 错误:您的SQL语法有错误;查看与您的MySQL服务器版本对应的手册,以了解使用near';

Php 错误:您的SQL语法有错误;查看与您的MySQL服务器版本对应的手册,以了解使用near';,php,mysql,sql,syntax-error,Php,Mysql,Sql,Syntax Error,当用户输入youtube url并从url获取youtube id时,将使用下面的代码。然后,它获取具有该id的视频的标题。然后将该标题插入数据库并调用以显示与该id关联的视频图像 如果我使用此youtube url或其他youtube url。如果youtube url的标题包含一个“ie”(2013 Ravens Rock Rally-Jonathan O'Callaghan&Gavin Sheehan-Stage 3),我会得到错误 错误:您的SQL语法有错误;检查与MySQL服务器版本对

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

如果我使用此youtube url或其他youtube url。如果youtube url的标题包含一个“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);  
?>

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

insert into atable
(f1, f2, etc)
values
(val1, val2, etc)
还是这个

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

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-Stage 3'


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

字符串包含引号的情况就是为什么存在mysqli\u real\u escape\u 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

您需要进行一些转义。您可能会发现查看$SQL变量的内容很有帮助。@Alan,别忘了接受(勾选)您认为最有用的答案。也可以随意+1任何你喜欢的答案,这是奖励答案的好方法!它不是标准的SQL,但MySQL支持它。
INSERT。。。SET
是有效的mysql语法。参见第二个例子Upvoted-我不知道MySQL支持这一点,但是,这里没有理由不使用标准SQL。更大的问题是OP的值中有未替换的单引号-
。。。Jonathan O'Callaghan…
因此,即使他们更改了语法,查询仍然会失败。因为OP使用的是
mysqli.*
not
mysql.*
最好是这样写$sql=sprintf(“插入到视频详细信息集id='null',youtube\u id='youtube\u id',info='s',mysql\u real\u escape\u string($title))
$sql=“INSERT-INTO-videodetails SET id='null',youtube\u id=”.mysqli\u real\u escape\u string($youtube\u id)。”,info=”.mysqli\u real\u escape\u string($title)。“另外,
SET
对于
INSERT
语句来说是无效的语法。编辑:eek,显然MySQL支持它!“我得吃我的帽子了。”@halfer,对了,MySQL支持
INSERT
语句中的
SET
,即使这不是标准的SQL,也不一定适用于其他品牌的RDBMS。查阅