Le mode de traitement par défaut de l'erreur de PDO est PDO :: errmode_silent , ce qui signifie que si une erreur se produit, l'OPD ne lancera pas activement une exception, mais le gérera silencieusement. Cela signifie que si vous rencontrez une erreur lors de l'exécution des instructions SQL, l'OPD ne demande pas automatiquement ou ne lancera pas une exception, mais vous devez vérifier manuellement l'état d'erreur.
Si vous souhaitez pouvoir prendre des exceptions et déboguer lorsqu'une erreur se produit, la bonne façon de le faire est de définir le mode d'erreur de PDO sur PDO :: errmode_exception . De cette façon, lorsque EXEC () ou une autre méthode de fonctionnement de la base de données sont exécutées, une exception sera lancée lorsqu'une erreur se produit, que vous pouvez attraper et gérer via un coup de main .
Lors de la création d'une instance PDO, vous pouvez définir le mode de gestion des erreurs en utilisant la méthode SetAttribute () . Par exemple, le code suivant montre comment permettre la gestion des exceptions:
<span><span><span class="hljs-meta"><?php</span></span><span>
</span><span><span class="hljs-keyword">try</span></span><span> {
</span><span><span class="hljs-comment">// créer PDO Exemple,et définir le mode d'erreur sur l'exception</span></span><span>
</span><span><span class="hljs-variable">$pdo</span></span><span> = </span><span><span class="hljs-keyword">new</span></span><span> </span><span><span class="hljs-title function_ invoke__">PDO</span></span><span>(</span><span><span class="hljs-string">'mysql:host=localhost;dbname=testdb'</span></span><span>, </span><span><span class="hljs-string">'username'</span></span><span>, </span><span><span class="hljs-string">'password'</span></span><span>);
</span><span><span class="hljs-variable">$pdo</span></span><span>-></span><span><span class="hljs-title function_ invoke__">setAttribute</span></span><span>(PDO::</span><span><span class="hljs-variable constant_">ATTR_ERRMODE</span></span><span>, PDO::</span><span><span class="hljs-variable constant_">ERRMODE_EXCEPTION</span></span><span>);
</span><span><span class="hljs-comment">// Exécuter un SQL Déclaration</span></span><span>
</span><span><span class="hljs-variable">$sql</span></span><span> = </span><span><span class="hljs-string">"UPDATE users SET name = 'John' WHERE id = 1"</span></span><span>;
</span><span><span class="hljs-variable">$pdo</span></span><span>-></span><span><span class="hljs-title function_ invoke__">exec</span></span><span>(</span><span><span class="hljs-variable">$sql</span></span><span>);
} </span><span><span class="hljs-keyword">catch</span></span><span> (PDOException </span><span><span class="hljs-variable">$e</span></span><span>) {
</span><span><span class="hljs-comment">// Catch et gérer les exceptions</span></span><span>
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">'Le fonctionnement de la base de données a échoué: '</span></span><span> . </span><span><span class="hljs-variable">$e</span></span><span>-></span><span><span class="hljs-title function_ invoke__">getMessage</span></span><span>();
}
</span><span><span class="hljs-meta">?></span></span><span>
</span></span>Dans cet exemple, nous définissons PDO :: att_errMode sur PDO :: errMode_Exception , de sorte que lorsque Exec () ne parvient pas à s'exécuter, PDO lancera une exception PDOException , et nous pouvons attraper le message d'erreur via l'instruction Catch .
Le mode de gestion par défaut des erreurs de l'APD est d'améliorer les performances, en particulier dans les scénarios où la gestion des erreurs n'est pas requise, ce qui peut réduire les frais généraux inutiles. Par exemple, lors de l'exécution des opérations d'insertion par lots, le développeur peut ne pas se soucier de savoir si chaque élément de données est inséré avec succès, mais prêtez seulement attention à savoir s'il y a un problème avec l'exécution globale. Ne pas lancer une exception peut réduire la complexité du code.
Cependant, lorsque vous devez effectuer des vérifications d'erreur plus strictes sur les opérations de base de données, l'activation du mode d'exception devient critique. Sinon, même si votre instruction SQL est écrite incorrectement, PDO ne vous invitera pas à quelque chose de mal.
Il convient de noter que Exec () ne permettra que la gestion des erreurs en dehors de la transaction. Si vous utilisez Exec () dans la transaction et que l'exception n'est pas capturée correctement, la validation ou le retour de la transaction ne sera pas automatiquement traité. Pour un meilleur contrôle des transactions, vous devez l'utiliser en combinaison avec beginTransaction () et commit () :
<span><span><span class="hljs-meta"><?php</span></span><span>
</span><span><span class="hljs-keyword">try</span></span><span> {
</span><span><span class="hljs-variable">$pdo</span></span><span>-></span><span><span class="hljs-title function_ invoke__">beginTransaction</span></span><span>();
</span><span><span class="hljs-variable">$sql</span></span><span> = </span><span><span class="hljs-string">"UPDATE users SET name = 'Jane' WHERE id = 1"</span></span><span>;
</span><span><span class="hljs-variable">$pdo</span></span><span>-></span><span><span class="hljs-title function_ invoke__">exec</span></span><span>(</span><span><span class="hljs-variable">$sql</span></span><span>);
</span><span><span class="hljs-variable">$pdo</span></span><span>-></span><span><span class="hljs-title function_ invoke__">commit</span></span><span>(); </span><span><span class="hljs-comment">// Soumettre les transactions</span></span><span>
} </span><span><span class="hljs-keyword">catch</span></span><span> (PDOException </span><span><span class="hljs-variable">$e</span></span><span>) {
</span><span><span class="hljs-variable">$pdo</span></span><span>-></span><span><span class="hljs-title function_ invoke__">rollBack</span></span><span>(); </span><span><span class="hljs-comment">// Transactions en arrière</span></span><span>
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">'Échec de la transaction: '</span></span><span> . </span><span><span class="hljs-variable">$e</span></span><span>-></span><span><span class="hljs-title function_ invoke__">getMessage</span></span><span>();
}
</span><span><span class="hljs-meta">?></span></span><span>
</span></span>Cela garantit que lorsqu'une erreur se produit, les transactions peuvent être annulées et garantissent la cohérence dans l'état de la base de données.
Étiquettes associées:
PDO