Avant d'appeler begin_transaction () , vous devez vous assurer que la connexion de la base de données a été établie avec succès. Si la connexion échoue, l'appel de la méthode liée aux transactions lancera une erreur. Par exemple:
<code> $ mysqli = new mysqli ('localhost', 'utilisateur', 'mot de passe', 'database'); if ($ mysqli-> connect_error) {
Die ('Connexion a échoué:'. $ mysqli-> connect_error);
}
$ mysqli-> begin_transaction (); // Si la connexion échoue, cette ligne rapportera une erreur
</code>
Il est recommandé d'ajouter une logique de détection de connexion avant d'appeler la méthode de transaction et d'enregistrer correctement les informations d'erreur pour le dépannage ultérieur.
Assurez-vous que l'utilisateur de la base de données a la permission d'activer les transactions. Certains hôtes ou comptes de base de données partagés avec des autorisations limitées peuvent être empêchés d'effectuer des transactions.
<code> // Exemple: requête les autorisations utilisateur actuelles $ result = $ mysqli-> requête ("Afficher les subventions pour current_user ()"); while ($ row = $ result-> fetch_row ()) {echo $ row [0]. "\ n"; } </code>Si vous constatez que Start Transaction ou tous les privilèges ne sont pas inclus dans les autorisations de subvention , cela signifie que les autorisations de compte en cours sont limitées et que vous devez contacter l'administrateur de la base de données pour ajuster les autorisations.
Les transactions sont prises en charge dans les tables MySQL uniquement à l'aide du moteur InNODB. Si vous essayez d'activer une transaction sur la table Myisam, cela ne prendra pas effet et une erreur peut se produire.
<code> // Vérifiez le moteur de la table $ result = $ mysqli-> query ("Afficher l'état de la table où name = 'your_table'"); $ row = $ result-> fetch_assoc (); Echo 'Type de moteur:'. $ row ['moteur']; </code>Si la sortie est myisam , vous devez modifier la structure de la table et changer son moteur en innodb :
<code> alter table votre_table moteur = innodb; </code>L'une des fonctions de MySqli :: Begin_Transaction () est de désactiver la soumission automatique. Si la connexion actuelle est déjà définie en mode automatique, certaines configurations de base de données peuvent ne pas permettre d'écraser ce comportement, ce qui entraîne la non-ouverture de la transaction.
<code> // désactiver explicitement Auto-Commit $ mysqli-> autoCommit (false); // démarrer une transaction
$ mysqli-> begin_transaction ();
</code>
Certaines versions plus anciennes des serveurs MySQL (telles que 5.5 ou ci-dessous) peuvent ignorer l'appel à AutoCommit (FALSE) sous des configurations spécifiques, et les paramètres des paramètres pertinents (tels que AutoCommit ) dans la version de la base de données et les fichiers de configuration doivent être confirmés.
Utilisez les classes Try ... Catch et MySQLI_SQL_Exception pour mieux capturer et diagnostiquer les messages d'erreur.
<code> mysqli_report (mysqli_report_error | mysqli_report_strict); essayer {
$ mysqli = new mysqli («localhost», «utilisateur», «mot de passe», «base de données»);
$ mysqli-> begin_transaction ();
// opération de transaction
$ mysqli-> commit ();
} catch (mysqli_sql_exception $ e) {
Echo 'Erreur de transaction:'. $ e-> getMessage ();
$ mysqli-> rollback ();
}
</code>
Cette méthode peut aider les développeurs à localiser rapidement les erreurs, telles que les délais de connexion, les erreurs de réseau ou les problèmes de configuration SQL.
Si le message d'erreur de connexion est ne peut pas se connecter au serveur MySQL ou une connexion perdue pendant la requête , il est recommandé de vérifier la configuration du réseau suivant:
Le nom d'hôte est-il correct (comme l'utilisation de LocalHost vs 127.0.0.1 );
Si le pare-feu autorise la communication Port 3306;
Si le serveur de base de données est en cours d'exécution;
S'il y a une limite de connexion (comme le paramètre max_connections est trop faible);
Tester une connexion à l'aide d'outils tels que des clients Ping , Telnet ou Database (tels que DBEAaver, MySQL Workbench) peut aider à confirmer rapidement les problèmes:
<code> telnet gitbox.net 3306 </code>Enfin, si les méthodes ci-dessus ne peuvent pas localiser le problème, vous pouvez afficher le journal d'erreur MySQL et le journal d'erreur PHP:
Path de journal MySQL (généralement spécifié dans /var/log/mysql/error.log ou dans le fichier de configuration );
PHP ERROR LOG Path (peut être affiché via la configuration Error_Log de php.ini );
Recherche de mots clés tels que Error 2002 , Error 1045 , Error 2013 dans le journal peut rapidement verrouiller le problème.