Lorsque vous utilisez l'extension MySQLI de PHP pour les opérations de base de données, MySQLI_STMT :: $ INSERT_ID est principalement utilisé pour obtenir l'ID d'incrémentation automatique générée par la dernière opération d'insertion. Normalement, lors de l'exécution d'une opération d'insertion, si l'opération est réussie, $ insert_id renvoie une valeur entière, représentant l'ID de l'enregistrement qui vient d'être inséré. Si l'insertion échoue, elle renvoie généralement 0 ou d'autres valeurs anormales. Donc, dans le développement réel, comment déterminer si la valeur de retour de mysqli_stmt :: $ insert_id est valide ou si une exception se produit?
mysqli_stmt :: $ insert_id est un attribut de l'objet mysqli_stmt , qui stocke l'ID d'incrément automatique généré par l'opération d'insertion la plus récente effectuée par cette déclaration. Les cas typiques de sa valeur de retour sont:
Insérer avec succès et il existe un champ automatique: renvoie l'ID d'incrémentation automatique de l'enregistrement d'insertion.
L'insert a échoué: retour 0 , indiquant que l'insertion n'est pas réussie et signifie généralement que l'ID de mise en œuvre automatique n'est pas généré.
Insertion de l'opération sans champ automatique d'incrémentation: En l'absence de jeu de champ d'accès automatique, INSERT_ID retournera 0 car aucun ID n'est généré.
Pour déterminer si la valeur de retour de mysqli_stmt :: $ insert_id est valide, vous devez comprendre deux points clés:
Détermine si la valeur de retour est 0 .
Déterminez si l'opération d'insertion est réussie.
Si l'opération d'insertion est réussie et qu'un champ d'accès automatique est impliqué, $ insert_id doit renvoyer un entier supérieur à 0 . S'il est 0 , les situations suivantes peuvent se produire:
L'opération d'insertion a échoué (telles que les erreurs SQL, les conflits de contraintes, etc.).
Le tableau actuel n'a pas de champ de champ d'incrément automatique.
L'insertion a été réussie, mais le tableau n'impliquait pas le champ d'incrément automatique (comme le champ sans paramètre Auto_Increment ).
Par conséquent, il est très important de déterminer si $ insert_id est 0 , mais cela à lui seul ne peut pas entièrement confirmer si l'insertion est réussie.
Afin de déterminer avec précision si l'opération d'insertion est réussie, en plus de vérifier $ insert_id , il est préférable d'utiliser la valeur de retour de mysqli_stmt :: execute () ou mysqli_stmt :: affecte_rows pour confirmer davantage.
mysqli_stmt :: execute () : return true signifie que l'exécution est réussie, la fausse signifie que l'exécution est échouée.
mysqli_stmt :: affecte_rows : renvoie le nombre de lignes affectées. S'il est 0 , cela signifie qu'aucun enregistrement n'a été inséré. Même si l'instruction SQL est exécutée avec succès, l'opération d'insertion ne peut pas être considérée comme valide.
Dans le développement réel, nous rencontrons généralement des situations où l'opération d'insertion échoue, telle que la violation des contraintes, le décalage du type de champ, etc. Afin de juger avec précision le problème, vous pouvez combiner MySQLI_STMT :: $ insert_id et mysqli_stmt :: error pour obtenir des informations d'erreur plus détaillées.
<span><span><span class="hljs-meta"><?php</span></span><span>
</span><span><span class="hljs-comment">// Créer une connexion de base de données</span></span><span>
</span><span><span class="hljs-variable">$mysqli</span></span><span> = </span><span><span class="hljs-keyword">new</span></span><span> </span><span><span class="hljs-title function_ invoke__">mysqli</span></span><span>(</span><span><span class="hljs-string">"localhost"</span></span><span>, </span><span><span class="hljs-string">"user"</span></span><span>, </span><span><span class="hljs-string">"password"</span></span><span>, </span><span><span class="hljs-string">"database"</span></span><span>);
</span><span><span class="hljs-comment">// Vérifiez si la connexion réussit</span></span><span>
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$mysqli</span></span><span>->connect_error) {
</span><span><span class="hljs-keyword">die</span></span><span>(</span><span><span class="hljs-string">"Connection failed: "</span></span><span> . </span><span><span class="hljs-variable">$mysqli</span></span><span>->connect_error);
}
</span><span><span class="hljs-comment">// Préparer SQL Déclaration</span></span><span>
</span><span><span class="hljs-variable">$stmt</span></span><span> = </span><span><span class="hljs-variable">$mysqli</span></span><span>-></span><span><span class="hljs-title function_ invoke__">prepare</span></span><span>(</span><span><span class="hljs-string">"INSERT INTO my_table (name, age) VALUES (?, ?)"</span></span><span>);
</span><span><span class="hljs-variable">$stmt</span></span><span>-></span><span><span class="hljs-title function_ invoke__">bind_param</span></span><span>(</span><span><span class="hljs-string">"si"</span></span><span>, </span><span><span class="hljs-variable">$name</span></span><span>, </span><span><span class="hljs-variable">$age</span></span><span>);
</span><span><span class="hljs-comment">// Lier les paramètres et exécuter</span></span><span>
</span><span><span class="hljs-variable">$name</span></span><span> = </span><span><span class="hljs-string">"John"</span></span><span>;
</span><span><span class="hljs-variable">$age</span></span><span> = </span><span><span class="hljs-number">25</span></span><span>;
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$stmt</span></span><span>-></span><span><span class="hljs-title function_ invoke__">execute</span></span><span>()) {
</span><span><span class="hljs-comment">// Exécution avec succès,examiner insert_id</span></span><span>
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$stmt</span></span><span>->insert_id > </span><span><span class="hljs-number">0</span></span><span>) {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"Insérer avec succès,Généré ID Oui: "</span></span><span> . </span><span><span class="hljs-variable">$stmt</span></span><span>->insert_id;
} </span><span><span class="hljs-keyword">else</span></span><span> {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"Insérer avec succès,Mais aucun incrément automatique n'est généré ID。"</span></span><span>;
}
} </span><span><span class="hljs-keyword">else</span></span><span> {
</span><span><span class="hljs-comment">// L'exécution a échoué,Message d'erreur de sortie</span></span><span>
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"L'insertion a échoué: "</span></span><span> . </span><span><span class="hljs-variable">$stmt</span></span><span>->error;
}
</span><span><span class="hljs-comment">// fermeture statement et se connecter</span></span><span>
</span><span><span class="hljs-variable">$stmt</span></span><span>-></span><span><span class="hljs-title function_ invoke__">close</span></span><span>();
</span><span><span class="hljs-variable">$mysqli</span></span><span>-></span><span><span class="hljs-title function_ invoke__">close</span></span><span>();
</span><span><span class="hljs-meta">?></span></span><span>
</span></span>Dans le code ci-dessus, après l'opération d'insertion, nous vérifions d'abord $ stmt-> insert_id . Si la valeur de retour est supérieure à 0 , cela signifie que l'insertion est réussie et qu'un ID d'incrément automatique est généré. Si la valeur de retour est 0 , il se peut que l'opération d'insertion ait échoué ou que la table insérée n'a pas de champ d'incrément automatique.
Avant de vérifier INSERT_ID , il est préférable d'utiliser affecté_rows pour déterminer davantage si l'insert est réellement exécuté.
<span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$stmt</span></span><span>-></span><span><span class="hljs-title function_ invoke__">execute</span></span><span>()) {
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$stmt</span></span><span>->affected_rows > </span><span><span class="hljs-number">0</span></span><span>) {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"Insérer avec succès,Généré ID Oui: "</span></span><span> . </span><span><span class="hljs-variable">$stmt</span></span><span>->insert_id;
} </span><span><span class="hljs-keyword">else</span></span><span> {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"L'insertion a échoué:Aucun enregistrement n'est inséré。"</span></span><span>;
}
} </span><span><span class="hljs-keyword">else</span></span><span> {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"L'exécution a échoué: "</span></span><span> . </span><span><span class="hljs-variable">$stmt</span></span><span>->error;
}
</span></span>Pour prendre des exceptions de manière plus fiable, TRY-Catch peut être utilisé pour capter d'éventuelles erreurs de connexion de base de données ou des erreurs SQL. Bien que MySQLI lui-même ne prenne pas en charge le mécanisme de capture d'essai , nous pouvons encapsuler des exceptions dans les méthodes personnalisées pour le traitement.
<span><span><span class="hljs-keyword">try</span></span><span> {
</span><span><span class="hljs-variable">$stmt</span></span><span> = </span><span><span class="hljs-variable">$mysqli</span></span><span>-></span><span><span class="hljs-title function_ invoke__">prepare</span></span><span>(</span><span><span class="hljs-string">"INSERT INTO my_table (name, age) VALUES (?, ?)"</span></span><span>);
</span><span><span class="hljs-variable">$stmt</span></span><span>-></span><span><span class="hljs-title function_ invoke__">bind_param</span></span><span>(</span><span><span class="hljs-string">"si"</span></span><span>, </span><span><span class="hljs-variable">$name</span></span><span>, </span><span><span class="hljs-variable">$age</span></span><span>);
</span><span><span class="hljs-keyword">if</span></span><span> (!</span><span><span class="hljs-variable">$stmt</span></span><span>-></span><span><span class="hljs-title function_ invoke__">execute</span></span><span>()) {
</span><span><span class="hljs-keyword">throw</span></span><span> </span><span><span class="hljs-keyword">new</span></span><span> </span><span><span class="hljs-built_in">Exception</span></span><span>(</span><span><span class="hljs-string">"L'insertion a échoué: "</span></span><span> . </span><span><span class="hljs-variable">$stmt</span></span><span>->error);
}
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$stmt</span></span><span>->insert_id > </span><span><span class="hljs-number">0</span></span><span>) {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"Insérer avec succès,Généré ID Oui: "</span></span><span> . </span><span><span class="hljs-variable">$stmt</span></span><span>->insert_id;
} </span><span><span class="hljs-keyword">else</span></span><span> {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"Insérer avec succès,Mais aucun incrément automatique n'est généré ID。"</span></span><span>;
}
} </span><span><span class="hljs-keyword">catch</span></span><span> (</span><span><span class="hljs-built_in">Exception</span></span><span> </span><span><span class="hljs-variable">$e</span></span><span>) {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"Catch Exceptions: "</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>Pour déterminer si mysqli_stmt :: $ insert_id est valide, nous ne pouvons pas compter uniquement si la valeur de retour est 0 , et nous devons également combiner si l'opération d'insertion est réussie et si la structure du tableau a des champs d'incrément automatique. Pour garantir l'exactitude de l'opération, il est recommandé de vérifier la valeur de retour d' Execute () et de affecte_rows en même temps, et de capter les erreurs possibles grâce à des mécanismes de gestion des exceptions appropriés, faisant ainsi une rétroaction et un traitement d'erreur efficaces.
Étiquettes associées:
mysqli_stmt