2016-10-18 3 views
0

La première requête sera exécutée avec succès, mais pour la deuxième requête, cela ne fonctionne pas. Ce qui suit est le codage que je déclare ma base de données et exécute deux des requêtes:L'annulation PDO et beginTransaction, ne peut pas fonctionner plus de 1 requête

$db = new PDO("sqlsrv:server=$servername ; Database=$databasename", $UserId, $pwd); 
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 

$db->beginTransaction(); 

$sql2 = "INSERT INTO Header " 
     . "(Number,Date)" 
     . "VALUES (:Number, :Date)"; 

try 
{ 
    $stmt2 = $db->prepare($sql2); 
    $stmt2->bindParam("Number", $Number); 
    $stmt2->bindParam("Date", $Date); 
    $stmt2->execute(); 

    $sql3 = "UPDATE table2 
      SET Number= :Number 
      WHERE Date= :Date "; 

    try 
    { 
     $stmt3 = $db->prepare($sql3); 
     $stmt3->bindParam("Number", $Number); 
     $stmt3->bindParam("Date ", $Date); 

     $stmt3->execute(); 
    } 
    catch(PDOException $e) 
    { 
     $db->rollBack(); 
    } 
    $db->commit(); 
} 
catch(PDOException $e) 
{ 
    $db->rollBack(); 
} 

je tente avant la validation automatique mis à faux par $db->setAttribute(PDO::ATTR_AUTOCOMMIT,0);, cependant, il affiche le message d'erreur the auto-commit mode cannot be changed for this driver.

+1

Vous n'avez pas besoin d'imbriquer les blocs 'try/catch', – RiggsFolly

+0

Frappez-vous le bloc catch? Pouvez-vous var_dump l'exception dans le bloc catch et l'afficher ici? – krasipenkov

+0

Cette deuxième requête, le UPDATE n'a pas de clause WHERE, cela pourrait-il être votre problème? – RiggsFolly

Répondre

-1

Vous n'avez pas besoin de la clause interne try ... catch car la première ou la deuxième erreur déclencherait l'annulation de toute façon. Retour à votre question, MySQL pourrait ne pas exécuter votre instruction de mise à jour car vos lignes cibles ne sont pas identifiées par un identifiant unique. (Mise à jour dangereux)

vous pouvez remplacer le poste de contrôle de mise à jour sûr que:

SET SQL_SAFE_UPDATES =0; 
do the update.. 
SET SQL_SAFE_UPDATES =1; 

ou utiliser des identificateurs uniques dans votre clause where.

+0

J'essaie de supprimer le try/catch imbriqué avant, mais toujours être le même, la première requête peut s'exécuter, la deuxième requête ne peut pas. Les deux requêtes est juste un exemple. Les deux requêtes peuvent bien fonctionner si je les exécute séparément. –

+0

J'essaie de mettre 'echo" hello ";' après '$ stmt2-> execute();', mais il n'en affiche aucune sortie. –

+0

pouvez-vous faire $ affected_rows = $ stmt2-> rowCount(); ? @EliceEe –