2014-04-24 4 views
0

je fais ces trois appels en succession rapide:Combiner plusieurs déclarations MySQL en un seul

UPDATE job 
    SET jstatus = '9' 
WHERE snum = :u AND jstatus = '7' AND jdate < :d 

DELETE FROM job 
WHERE snum = :u AND jstatus < '7' AND jdate < :d 

DELETE FROM jdate 
WHERE snum = :u AND jdate < :d 

Les params sont les mêmes pour chacun. À l'heure actuelle, chacun est fait comme suit:

$STH = $DBH->prepare(" 
UPDATE job 
    SET jstatus = '9' 
WHERE snum = :u AND jstatus = '7' AND jdate < :d"); 
$STH->bindParam(':u', $json['u']); 
$STH->bindParam(':d', $date); 
try{$STH->execute();}catch(PDOException $e){echo $e->getMessage();} 

Sûrement il doit y avoir un moyen de les combiner? J'ai regardé $mysqli->multi_query et ce SO question, mais les deux semblent plus complexes que je l'aurais cru nécessaire.

+0

Pourquoi voudriez-vous le faire dans "un" go? En outre, votre bloc try/catch n'attrape pas le scénario dans lequel la préparation de l'instruction peut échouer. –

+0

@ N.B. Je pense que je pense qu'il serait plus efficace et plus rapide de le faire en une seule fois. Peut-être pas ... – Nick

+0

Si vous aviez tout emballé avec un bloc de transaction, préparé les instructions et les exécuter - ce serait extrêmement rapide. En l'enveloppant dans une requête vous obtiendriez au mieux des microsecondes de performance (si cela) au prix de la complexité du code. –

Répondre

2

Je vais vous donner une réponse sous l'hypothèse que vous utilisez un moteur conforme à ACID (ou pour nous mortels, le moteur qui supporte les transactions). Ce que vous voulez faire est d'éviter la complexité du code - dans ce cas, il exécute 3 requêtes regroupées dans 1. Il est assez difficile de maintenir des requêtes énormes, vous devriez éviter cela à tout prix.

Ce que vous voulez, c'est d'avoir des requêtes exécutées le plus rapidement possible et d'être aussi claires que possible pour lire et comprendre.

De plus, vous devez être sûr qui interroge tous exécutés ou tous échouent en cas d'échec - c'est une transaction. Vous ne voulez pas avoir supprimé la suppression mais la mise à jour réussie, qui ruinera votre intégrité des données.

C'est pourquoi vous devez utiliser les transactions. L'énorme avantage de cela est que vous pouvez interroger votre base de données d'une manière que les gens normaux (une requête à la fois), assurez-vous que tout s'est bien passé ou que rien ne s'est passé, et il sera presque aussi rapide énorme, affreuse requête impossible à maintenir.

Voici le code:

$dsn = 'mysql:dbname=testdb;host=127.0.0.1'; 
$user = 'dbuser'; 
$password = 'dbpass'; 

$pdo = new PDO($dsn, $user, $password); 

$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 

try 
{ 
    $pdo->beginTransaction(); 


    /** 
    * Repeat for as many queries you wish to execute, I used only 1 for the example 
    */ 
    $stmt = $pdo->prepare(" 
       UPDATE job 
       SET jstatus = '9' 
       WHERE snum = :u AND jstatus = '7' AND jdate < :d");    

    $stmt->bindParam(':u', $json['u']); 
    $stmt->bindParam(':d', $date); 

    $stmt->execute(); 

    $pdo->commit();  
} 
catch(PDOException $e) { 

    $pdo->rollBack(); 

    echo 'Error: ' . $e->getMessage(); 
} 
+0

Merci d'avoir pris le temps de le faire. – Nick

+0

Pas de problème du tout, j'espère que ça va vous aider et quelqu'un d'autre :) –

1

vous devez commencer une transaction

pdo transaction

P.S.

moar about database transaction from wikipedia

+0

commettre un est généralement bonne pratique ainsi lol –

+0

aussi rollback, mais si vous n'êtes pas au courant de ce qu'est une transaction, un piège vous aidera à l'apprendre dans le bon sens :) – ROLO

+0

Comment c'est vrai! –

Questions connexes