mysql在一个语句中有多个查询

时间:2009-10-29 08:45:50

标签: php mysql

我已经在stackoverflow上查找了类似的问题,但还没找到我想要的内容,所以这里有。在phpMyAdmin中,您可以在一个语句中有多个查询,并为您执行,例如:'

UPDATE `test` WHERE `test2` = 4;
UPDATE `test` WHERE `test4` = 8;
UPDATE `test` WHERE `test8` = 1;

现在,如果我尝试在PHP中执行类似的操作,它根本不起作用。例如:

 $test = 'UPDATE `test` SET `value` = "123" WHERE `test2` = 4;
             UPDATE `test` SET `value` = "321" WHERE `test4` = 8;
             UPDATE `test` SET `value` = "533" WHERE `test8` = 1;';
    mysql_query($test);

给予和错误:

  

您的SQL语法有错误;   检查对应的手册   您的MySQL服务器版本   在'附近使用正确的语法'; UPDATE   test SET值=“123”WHERE test2   = 4;在第1行更新test SE'

甚至可以在一个声明中组合比如上面的多个查询吗?我希望在以下情况下执行此操作:(这背后的逻辑可能非常糟糕,但我没有太多的MySQL经验,所以如果有更好的方法,请告诉我)

以下循环几次:

function SaveConfig($name, $value)
{
        global $sql_save_query;
    $sql = 'SELECT * FROM `config` WHERE `name` = "'.$name.'"';
    $res = mysql_query($sql);

    if($res)
    {
        $sql_save_query .= 'UPDATE `config` SET value = "'.$value.'" WHERE `name` = "' .$name. '"; '."\n";
    }
    else
    {
            $sql_save_query .= 'INSERT INTO `config`(`id`,`name`,`value`) VALUES("","' .$name. '","' .$value. '"); '."\n";
    }
}

然后在循环结束后运行:

mysql_query($sql_save_query);

哪个出错:

  

您的SQL语法有错误;   检查对应的手册   您的MySQL服务器版本   在'附近使用正确的语法'; UPDATE   config SET value =“”WHERE name =   “fcolour2”;更新config SE'   第1行

现在我的另一个选择(在我看来)是在每个循环后执行一个SQL查询,一次一个查询。但这不是坏/慢/坏的做法吗?

5 个答案:

答案 0 :(得分:3)

php API禁止您在一次调用中发出多个查询,以减少SQL injection攻击代码的可能性(想想如果我将'; UPDATE users SET admin=1 WHERE username='hacker'传递给您的登录脚本会发生什么用户名)。您需要执行多个语句,或者将语句的逻辑包装到单个语句中(在您的情况下这是不可能的)。

答案 1 :(得分:1)

使用mysql_query无法执行多个查询。

您可以使用以下语法一次执行多个插入:

INSERT INTO table (col1, col2) VALUES (0, 1), (2, 3), (4, 5); -- Insert 3 rows

通常,较少的查询=更好,但对于更新,您只需要执行它们。

答案 2 :(得分:1)

您的示例中的循环表示存在架构问题。

如果您正在处理现有记录,请传递主键 - 然后您根本不需要选择 - 您只需运行更新语句。

如果您正在处理新记录,则不传递密钥 - 然后您知道要运行插入语句。

答案 3 :(得分:1)

可能您可以使用INSERT ... ON DUPLICATE KEY UPDATE

INSERT INTO table (a,b,c) VALUES (1,2,3)
  ON DUPLICATE KEY UPDATE c=c+1;

其他一些有用的链接

http://dev.mysql.com/doc/refman/5.0/en/replace.html

http://www.mysqlperformanceblog.com/2007/01/18/insert-on-duplicate-key-update-and-replace-into/

答案 4 :(得分:0)

$sqls = explode(";",$test);
foreach ($sqls as $key=>$sql) {
  if (strlen(trim($sql))>0) {
       mysql_query(trim($sql));
   }
}