我已经在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”WHEREtest2
= 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 =“”WHEREname
= “fcolour2”;更新config
SE' 第1行
现在我的另一个选择(在我看来)是在每个循环后执行一个SQL查询,一次一个查询。但这不是坏/慢/坏的做法吗?
答案 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));
}
}