麻烦mysqli_multi_query

时间:2017-01-27 12:16:46

标签: php mysql mysqli mysqli-multi-query

我遇到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.";
}

我确定我在这里遗漏了一些明显的东西,但几天的谷歌搜索让我精神错乱。提前谢谢!

1 个答案:

答案 0 :(得分:0)

感谢@Chris Caviness- 正如所料,解决方案很简单! 用户拥有INSERT个权限,但没有DELETE个权限。 固定和工作。