2013-01-05 4 views
3

J'ai deux requêtes dépendantes les unes des autres, c'est-à-dire si la première requête n'est pas exécutée, la seconde ne doit pas être exécutée, et inversement si second ne peut pas être exécuté t être exécuté.Plusieurs requêtes dépendantes les unes des autres

INSERT INTO `table` VALUES (1,2,3) 
UPDATE `otherTable` SET `val1`=1 WHERE `id`=$idOfInsert 

ON DUPLICATE KEY UPDATE n'est pas l'Answear.

J'ai essayé d'utiliser mysqli::multi_query mais comme il s'est avéré qu'il exécute le premier même si le second ne peut pas être exécuté (il s'arrête en cas d'erreur).

Si ce que j'ai dit n'est pas clair s'il vous plaît me demander pour plus d'informations.

Quelqu'un peut-il m'aider s'il vous plaît?

+1

« si la deuxième ne peut pas être exécuté le premier ne doit pas être exécutée » Cette exigence est un défi direct à la logique. Impossible –

+0

@HankyPanky Les transactions de base de données ont été spécifiquement faites pour gérer ces cas, afin de garantir la cohérence. – tmuguet

Répondre

4

Vous pouvez utiliser des transactions si le moteur que vous utilisez le supporte (InnoDB, BDB).

Voir http://dev.mysql.com/doc/refman/5.0/en/commit.html pour des exemples.

Edit: par exemple rapide à l'aide mysqli:

$connection->autocommit(FALSE); // disable auto-commit and start a new transaction 
$result = $connection->query("INSERT INTO `table` VALUES (1,2,3)"); 
$result &= $connection->query("UPDATE `otherTable` SET `val1`=1 WHERE `id`=$idOfInsert"); 
if (!$result) { 
    // One of the queries has failed: cancel the transaction 
    $connection->rollback(); 
} else { 
    // Both queries worked:commit the current transaction 
    $connection->commit(); 
} 
$connection->autocommit(TRUE); // enable auto-commit 

Vous pouvez vouloir optimiser les requêtes (c.-à-pas exécuter la deuxième si la première a échoué, utilisez les commandes préparées, ...)

+1

Ajouté upvote puisque la transaction est non seulement une bonne option pour faire des requêtes dépend, mais ils sont également capables d'empêcher dataloss sur la déconnexion pendant les transactions etc. (c'est pourquoi son appelé transactions haha) –

+0

Il ressemble à ce dont j'ai besoin mais je ne sais pas comment l'implémenter. Pouvez-vous me présenter un peu? – Dharman

+0

J'ai mis à jour ma réponse avec un exemple – tmuguet

-2

Pause dans plusieurs appels requête:

$result = mysql_query("INSERT ..."); 
if ($result) { 
    mysql_query("UPDATE ..."); 
} 

Mais le « ne pas faire d'abord si la deuxième ne peut pas » est impossible. PHP ne peut pas remonter dans le temps et avertir la première requête que le second a échoué.

+0

mysql_query() est obsolète depuis 5.5, vous voulez mysqli_query(). – nerdarama

+2

"PHP ne peut pas remonter dans le temps" .. en fait, les fonctions mysqli/mysql des transactions de support PHP. Les transactions vérifient si toutes les requêtes fonctionnent correctement. Si l'un d'eux échoue, il annulera les requêtes –

-1

Utilisez [INSERT IGNORE] pour que le serveur SQL ignore les erreurs. Ensuite, utilisez LAST_INSERT_ID() pour obtenir l'ID inséré ou 0 si rien n'a été inséré. Cela fera Mise à jour échouera si car il n'y a pas d'enregistrement avec un ID = 0.

UPDATE `otherTable` SET `val1`=1 WHERE `id`=LAST_INSERT_ID(); 
Questions connexes