SQL错误仅发生在PHP脚本中[重复]

Posted

技术标签:

【中文标题】SQL错误仅发生在PHP脚本中[重复]【英文标题】:SQL error only occurs in PHP script [duplicate] 【发布时间】:2014-09-13 00:44:51 【问题描述】:

我很矛盾。我的 SQL 查询只会通过 phpMyAdmin 发送。如果我尝试通过 PHP 发送此特定查询,则会收到错误消息。当我将该确切的查询复制到 PhpMyAdmin 时,它会顺利通过。

INSERT INTO posts (id, content, poster, timestamp, tags) VALUES ('12056242', 'OMG I just got a #toyota', 'Clunker5', '09/12/14 08:43:36', 'toyota');INSERT INTO `tags` (tag, posts) VALUES ('toyota', 1) ON DUPLICATE KEY UPDATE posts=posts+1; UPDATE `tags` SET posts=posts+1 WHERE tag IN ('toyota');

这是与问题相关的 PHP 代码

//Ups one post for all tags entered by the user
    if(!empty($tags))
        $tags1 = explode(",", $tags);
        $tags_submit = join("','", $tags1);
        $tags_insert = join("', 1), ('", $tags1);
        $sql = "INSERT INTO posts (id, content, poster, timestamp, tags) VALUES ('$d', '$b', '".$_SESSION['username']."', '$c', '$tags');"
                . "INSERT INTO `tags` (tag, posts) VALUES ('".$tags_insert."', 1)
                        ON DUPLICATE KEY UPDATE posts=posts+1;
                        UPDATE `tags` SET posts=posts+1 WHERE tag IN ('".$tags_submit."');";

    $result = mysql_query($sql);
    else
        $sql = "INSERT INTO posts (id, content, poster, timestamp, tags) VALUES ('$d', '$b', '".$_SESSION['username']."', '$c', '$tags');";

    $result = mysql_query($sql);
    
    $error = mysql_error();
   if($result)
       echo "1";
   else
       echo error($sql, $error, "Tags: ".$tags, "Post: ".$b, "ID: ".$d);
   

错误是

SQL Response: 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 'INSERT INTO `tags` (tag, posts) VALUES ('toyota', 1), ('ohmygoodness', 1) ' at line 1.

编辑:现在我知道我不能进行多重查询,我该如何进行这个查询?

INSERT INTO `tags` (tag, posts) VALUES ('".$tags_insert."', 1)
                        ON DUPLICATE KEY UPDATE posts=posts+1;
                        UPDATE `tags` SET posts=posts+1 WHERE tag IN ('".$tags_submit."');

【问题讨论】:

你得到什么错误?你在检查 mysql_error() 吗?插入变量后,您是否确保查询正确? 今天第三个类似的问题。 INSERT INTO tags (tag, posts) VALUES ('toyota', 1), ('ohmygoodness', 1) - 我从来没有见过像这样的VALUES 子句,它怎么会起作用? 如果你想一次插入多行,你可以这样做,INSERT INTO table (var1, var2) VALUES (row1_1, row1_2), (row2_1, row2_2) 试试看,效果很好 那个查询是有效的,问题是你要提供多个查询,听从比尔的建议,只需在单独的 mysql_query 调用中查询每个查询,无论如何你不应该使用 mysql_*,为什么不使用 mysqli_。更好的 api 或 PDO 【参考方案1】:

您尝试在一次调用该 API 函数时执行多个语句,但 mysql_query() 不支持多查询。

无论如何,您都不应该使用多重查询。你可能会接触到一整堂SQL injection vulnerabilties。

您应该单独执行每个 SQL 语句,分别调用 mysql_query()

另外,@JohnConde 的评论是恰当的:您应该始终检查来自mysql_query() 的返回值,因为如果出现错误,它会返回 false。如果发生这种情况,请登录或报告mysql_error(),以了解更多关于问题所在。

【讨论】:

【参考方案2】:

来自the mysql_query documentation:

不支持多个查询。

因此,您不能发送由; 分隔的多个语句。

【讨论】:

【参考方案3】:

我今天遇到了同样的问题,我有 2 个很好的答案。每次有SQL语句都需要使用mysql_query;这是一个更好的说明,例如,如果您有

 "INSERT INTO query";
 "INSERT INTO 2nd query";
 mysql_query(process both query "INSERT INTO query";
 this isn't going to work, it'll only work in phpmyadmin or 
 in straight mysql command line sql. not in a php script.

 you'll need to:

 "INSERT INTO query";
 mysql_query(process one query); //you should also use mysql_error() to see the response
 "INSERT INTO 2nd query";
 mysql_query(process 2nd query);

它将需要在 2 个单独的 mysql 查询中形成。它是 php 端的一项安全功能,可防止 sql 注入。不管出于什么原因,它就是这样。

【讨论】:

以上是关于SQL错误仅发生在PHP脚本中[重复]的主要内容,如果未能解决你的问题,请参考以下文章

检查架构中的 IF 表 EXISTS 时发生 Oracle PL/SQL 过程错误 [重复]

PHP,MY SQL错误查询[重复]

设置在重复输入尝试唯一字段时导致 php 错误?

PHP在准备SQL语句时抛出致命错误[重复]

发生数据库错误错误号:1055 [重复]

虚拟机初始化期间发生错误,对象堆空间不足[重复]