2017-01-27 2 views
0

J'ai des problèmes avec mysqli_multi_query. Je peux INSERT INTO plusieurs fois, mais dès que j'inclue un DELETE, toutes les requêtes suivantes ne fonctionnent pas. Fait intéressant, cette requête fonctionne bien lorsqu'elle est collée dans la boîte de dialogue phpMyAdmin SQL.Problème avec mysqli_multi_query

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`[email protected]_id AND `tag_id` NOT IN (1); 

Toutes les requêtes jusqu'à à la requête DELETE exécuter comme prévu à partir de mon code php.

Ajout d'autres requêtes en tant que journaux (voir ci-dessous), étape 1, @contact_id, étape 2a, étape 2b et étape 2c sont toutes insérées. Le «Dernier» ne le fait pas. (Et bien sûr, ni ne le DELETE un.

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`[email protected]_id AND `tag_id` NOT IN (1); 
INSERT INTO `tf_logs` (`query`) VALUES ('Last'); 

Pour créer cette requête, j'append progressivement des valeurs à une chaîne, puis utilisez mysqli_multi_query, comme ci-dessous. Pour vérifier exactement ce que la variable contient, je me suis envoyé par courrier électronique le requête finale. Copier et coller le contenu du courrier électronique dans phpMyAdmin exécute les requêtes exactement comme prévu.

$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 = "[email protected]"; 
$subject = "SQL query"; 
$headers = "From: [email protected]"; 
mail($to,$subject,$queryString,$headers); 
} else { 
    echo "Error."; 
} 

Je suis sûr que je manque quelque chose évidente, mais quelques jours de googler m'a conduit à la folie. Merci à l'avance!

+0

Pouvez-vous afficher la définition de votre table - tf_logs – Mihai

+0

Il existe une colonne 'query' de type' text'. Pourquoi demandez-vous? Pour moi, le problème semble se trouver dans la requête DELETE? La table entière est seulement là comme un moyen simple de tester si je suis capable d'insérer une valeur (c'est-à-dire de vérifier que la connexion fonctionne, le php s'exécute, et de résoudre le problème avec le reste de mon code) . Je serais plus qu'heureux de supprimer la table et toutes les références à celle-ci! – Tim

+1

Y a-t-il une contrainte qui empêcherait la suppression de se terminer? –

Répondre

0

Merci à @Chris Caviness- La solution, comme prévu, était simple! L'utilisateur avait les privilèges INSERT mais pas les privilèges DELETE. Fixé et fonctionnel.