我遇到mysqli_multi_query问题。
我可以多次INSERT INTO
次,但只要我包含DELETE
,所有后续查询都无效。有趣的是,这个查询在粘贴到phpMyAdmin SQL框中时工作正常。
SET @contact_id := 1;
INSERT INTO `contacts_tags` (`contact_id`, `tag_id`)
SELECT * FROM (SELECT @contact_id, 1) AS tmp
WHERE NOT EXISTS (
SELECT `contact_id`, `tag_id` FROM `contacts_tags`
WHERE `contact_id` = @contact_id AND `tag_id` = 1
);
DELETE FROM `contacts_tags`
WHERE `contact_id`=@contact_id AND `tag_id` NOT IN (1);
直到DELETE
查询的所有查询都按照我的php代码执行。
添加进一步的查询作为日志(见下文),步骤1,@ contact_id,步骤2a,步骤2b和步骤2c都被插入。 '最后'一个没有。 (当然,DELETE
也没有。
INSERT INTO `tf_logs` (`query`) VALUES ('Step0');
SET @contact_id := 1;
INTO `tf_logs` (`query`) VALUES ('Step1');
INSERT INTO `contacts_tags` (`contact_id`, `tag_id`)
SELECT * FROM (SELECT @contact_id, 1) AS tmp
WHERE NOT EXISTS (
SELECT `contact_id`, `tag_id` FROM `contacts_tags`
WHERE `contact_id` = @contact_id AND `tag_id` = 1
);
INSERT INTO `tf_logs` (`query`) VALUES (@contact_id);
INSERT INTO `tf_logs` (`query`) VALUES ('Step 2a');
INSERT INTO `tf_logs` (`query`) VALUES ('Step 2b');
INSERT INTO `tf_logs` (`query`) VALUES ('Step 2c');
DELETE FROM `contacts_tags`
WHERE `contact_id`=@contact_id AND `tag_id` NOT IN (1);
INSERT INTO `tf_logs` (`query`) VALUES ('Last');
要创建此查询,我会逐步将值附加到字符串,然后使用mysqli_multi_query
,如下所示。为了准确检查变量包含的内容,我已通过电子邮件向自己发送了最终查询。将电子邮件内容复制并粘贴到phpMyAdmin中会完全按照预期执行查询。
$queryString = "";
$queryString .= "INSERT INTO `tf_logs` (`query`) VALUES ('Step0'); ";
$queryString .= "
SET @contact_id := $contactId; ";
//...and so on
if(mysqli_multi_query($connection,$queryString)) {
echo "Success.";
$to = "abc@xyz.com";
$subject = "SQL query";
$headers = "From: abc@xyz.com";
mail($to,$subject,$queryString,$headers);
} else {
echo "Error.";
}
我确定我在这里遗漏了一些明显的东西,但几天的谷歌搜索让我精神错乱。提前谢谢!
答案 0 :(得分:0)
感谢@Chris Caviness-
正如所料,解决方案很简单!
用户拥有INSERT
个权限,但没有DELETE
个权限。
固定和工作。