Lorsque vous utilisez l'extension MySQLI de PHP pour la programmation de la base de données, les développeurs rencontrent parfois une situation déroutante: appeler MySQLI :: STMT_INIT () initialise avec succès l'objet de déclaration, mais échoue dans la méthode Préparez () suivante. Cette situation semble illogique, mais en fait, elle implique plusieurs niveaux de raisons. Cet article analysera en détail les causes et les solutions communes à ce problème.
MySQLI :: STMT_INIT () est utilisé pour créer un objet MySQLI_STMT vide. Il n'effectue aucune interaction avec la base de données, mais se prépare uniquement aux opérations SQL ultérieures. La méthode Pread () enverra des instructions SQL au serveur de base de données pour précompilation. Si la syntaxe est erronée ou si la configuration de la base de données est incorrecte, préparez () renvoie false .
$mysqli = new mysqli("localhost", "user", "password", "database");
$stmt = $mysqli->stmt_init(); // Initialisation avec succès
if ($stmt->prepare("SELECT * FROM users WHERE id = ?")) {
echo "Prepare succès";
} else {
echo "Prepare échouer: " . $stmt->error;
}
C'est l'une des raisons les plus courantes. Bien que STMT_INIT () réussit, s'il y a une erreur de syntaxe dans le SQL passé dans Prepare () , MySQL refusera la précompilation, entraînant une défaillance de préparation () .
Exemple d'erreur SQL:
SELECT FROM users WHERE id = ?
La bonne façon de l'écrire devrait être:
SELECT * FROM users WHERE id = ?
L'instruction préparée de MySQL ne prend pas en charge tous les types d'instructions SQL. Par exemple, créer des instructions Table , Drop , Alter and Other INCORD UTILISATION PREEPY () . Si vous essayez de le faire, préparez () renverra également un échec.
Si une table ou un champ qui n'existe pas dans SQL est référencé, bien qu'il ne constitue pas une erreur de syntaxe, il peut également amener le serveur à refuser la compilation, ce qui a fait que PREPEL () signale une erreur.
$stmt->prepare("SELECT age FROM userz WHERE id = ?"); // Nom de la table incorrect 'userz'
Si la connexion a été déconnectée ou invalide lorsque l'objet MySQLI est appelé , bien que STMT_INIT () puisse ne pas erreur immédiatement, Préparer () échouera une fois qu'il essaiera d'interagir avec le serveur.
Les utilisateurs de la base de données peuvent ne pas avoir des autorisations sélectionnées sur certaines tables, ce qui fait que les instructions de prétraitement ne parviennent pas à accéder au tableau de données cible, échouant ainsi lors de la préparation () .
Si le nom de la table, le nom de la colonne, etc. Utilisez les mots réservés MySQL mais ne sont pas enveloppés dans des backticks ( ` ), il peut également être reconnu comme une erreur de syntaxe lorsque vous préparez () .
$stmt->prepare("SELECT select FROM users WHERE id = ?"); // Exemple d'erreur,'select' C'est réservé
Passer à:
$stmt->prepare("SELECT `select` FROM users WHERE id = ?");
Imprimer le message d'erreur Utilisation de $ stmt-> Erreur ou $ mysqli-> Erreur pour afficher les informations d'erreur spécifiques est la première étape du dépannage.
Rapport d'erreur d'activation
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
Enregistrement Le SQL et les erreurs échoué peuvent être enregistrés dans un fichier journal pour une analyse de phase de développement et de test facile.
Supposons que nous ayons visité le lien suivant pour soumettre des données de formulaire:
https://m66.net/form/submit.php
La logique de traitement du formulaire est la suivante:
$mysqli = new mysqli("localhost", "user", "pass", "db");
$mysqli->set_charset("utf8mb4");
$stmt = $mysqli->stmt_init();
if (!$stmt->prepare("INSERT INTO user_data (name, email) VALUES (?, ?)")) {
error_log("Prepare échouer: " . $stmt->error); // Erreurs d'enregistrement
die("Le système est temporairement indisponible");
}
$stmt->bind_param("ss", $_POST['name'], $_POST['email']);
$stmt->execute();
Si la table user_data n'existe pas ou si le nom du champ est incorrectement orthographié, Préparer () provoquera une erreur, bien que STMT_INIT () soit réussie.
MySqli :: stmt_init () n'est qu'un constructeur d'objets de déclaration, et son succès ne signifie pas que SQL lui-même est légal ou exécutable. Des vérifications de syntaxe et de logiques réelles se produisent pendant la phase de préparation () . La compréhension de cela, combinée à des messages d'erreur et à de bonnes habitudes de débogage peut permettre une emplacement et une résolution plus rapides des problèmes.
Si vous rencontrez toujours des problèmes insolubles lors du débogage, vous pouvez essayer d'amener SQL au client de la base de données (tel que PhpMyAdmin ou la ligne de commande) pour le tester séparément, ou contacter un administrateur avec des autorisations de base de données pour obtenir de l'aide.