【发布时间】:2017-06-13 03:02:11
【问题描述】:
我遇到了 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.";
}
我确定我在这里遗漏了一些明显的东西,但是几天的谷歌搜索让我发疯了。提前致谢!
【问题讨论】:
-
你能显示你的表定义 - tf_logs
-
有一个
query列是text类型。你为什么要问?对我来说,问题似乎在于 DELETE 查询?整个表只是作为一种简单的方法来测试我是否能够插入一个值(也就是说,仔细检查连接是否正常,php 是否执行,并解决我的其余代码的问题所在) .我很乐意删除该表和所有对它的引用! -
是否存在阻止删除完成的约束?
-
感谢@ChrisCaviness。都修好了。请参阅下面的答案。
标签: php mysql mysqli mysqli-multi-query