【问题标题】:Query that works in phpmyadmin is NOT working in php page?在 phpmyadmin 中有效的查询在 php 页面中无效?
【发布时间】:2014-11-07 05:21:01
【问题描述】:

我已经在 phpmyadmin 中测试了这个查询,它返回的正是我要查找的内容...它重复了 row1 并将标题更新为 DUPLICATE

$sql = "CREATE TEMPORARY TABLE  tmp 
        SELECT  `unit_id`,
                    `title`,
                    `status_id`,
                    `category_id`,
                    `tags`,
                    `access_id`
        FROM        unit_genData 
        WHERE       `unit_id`='1';
        ALTER TABLE tmp 
        DROP COLUMN `unit_id`;
        UPDATE      tmp 
        SET         `title` = 'DUPLICATE';
        INSERT INTO unit_genData 
        SELECT      0,tmp.* 
        FROM        tmp;
        DROP TABLE  tmp;";

然后我去把它添加到一个php页面,然后……

You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'ALTER TABLE tmp DROP COLUMNunit_id; UPDATE tmp ' at line 10

为什么会出现这个错误?

【问题讨论】:

  • post php code too..你如何执行查询?
  • 您是否尝试用单引号将表名 tmp 括起来?
  • 您是否将其称为stored procedure
  • 除非您使用 mysqli_multi_query(),否则您的查询将失败,因为您的查询必须是 1 个查询,所以它在您的第一个 ; 上失败
  • 为什么要创建一个表,然后用下一个查询改变它?为什么不按照您想要的方式创建它?

标签: php mysql alter-table


【解决方案1】:

使用mysqli_multi_query() 执行多个查询。

$sql = "CREATE TEMPORARY TABLE  tmp 
    SELECT  `unit_id`,
                `title`,
                `status_id`,
                `category_id`,
                `tags`,
                `access_id`
    FROM        unit_genData 
    WHERE       `unit_id`='1';
    ALTER TABLE tmp 
    DROP COLUMN `unit_id`;
    UPDATE      tmp 
    SET         `title` = 'DUPLICATE';
    INSERT INTO unit_genData 
    SELECT      0,tmp.* 
    FROM        tmp;
    DROP TABLE  tmp;";

$mysqli->multi_query($sql);

【讨论】:

    【解决方案2】:

    默认情况下,PHP 在单个查询中禁用多个语句。

    要么分别运行这两个语句,要么你可以使用mysql_multi_query

    http://php.net/manual/en/mysqli.quickstart.multiple-statement.php

    (问题没有指定使用哪个 MySQL 接口。)

    请注意,如果您的代码受到 SQL 注入漏洞的影响,那么为每个查询启用多个语句可能会为一整船的恶意行为打开大门……比如 Little Bobby Tables http://xkcd.com/327/

    【讨论】:

      【解决方案3】:

      如果您出于某种原因使用 mysql 函数,则将 CLIENT_MULTI_STATEMENTS 作为 mysql_connect 的第 5 个参数传递,以允许在查询中使用多个语句。

      更多信息here

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-10-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多