Lorsque vous utilisez l'extension MySQLI de PHP pour les opérations de base de données, les développeurs utilisent généralement des instructions préparées pour améliorer la sécurité et les performances. Dans certains scénarios, nous pouvons essayer d'appeler la méthode mysqli_stmt :: att_get () après l'exécution de l'instruction ou même après la fermeture explicite ou implicitement de l'instruction. Que se passe-t-il dans ce cas? Est-ce que ça marche toujours normalement? Cet article analysera cela en détail.
MySQLI_STMT :: att_get () est une méthode de PHP qui est utilisée pour obtenir des attributs liés à une poignée d'instruction. La syntaxe est la suivante:
int mysqli_stmt::attr_get( int $attribute )
Il est généralement utilisé pour obtenir des valeurs d'attribut, telles que les paramètres des ensembles de résultats tamponnés ( mysqli_stmt_attr_cursor_type ), la taille du tampon de prétraitement, etc.
Lorsque la poignée de l'instruction est fermée (nettoyée automatiquement après l'exécution par mysqli_stmt :: close () ou exécution de script), ses ressources ont été publiées. Appeler n'importe quelle méthode à ce moment-là, y compris Attr_get () , peut conduire aux situations suivantes:
Lancer une erreur ou un avertissement <br> En PHP, appeler une méthode sur une ressource d'objet libérée lance généralement un avertissement ou une erreur fatale. Par exemple:
$stmt = $mysqli->prepare("SELECT * FROM users");
$stmt->close();
$cursorType = $stmt->attr_get(MYSQLI_STMT_ATTR_CURSOR_TYPE); // Avertissement ou erreur
La sortie peut être similaire à:
Warning: mysqli_stmt::attr_get(): Couldn't fetch mysqli_stmt in /var/www/html/index.php on line 4
Cela signifie que la poignée a expiré et qu'aucune acquisition de propriétés ne peut être effectuée.
Retourner null ou faux
Certaines versions et configurations PHP peuvent ne pas lancer immédiatement une erreur, mais renvoyer false ou nul . Bien que cela n'interrompra pas l'exécution du script, cela indique toujours que la méthode ne peut pas être exécutée avec succès et le résultat n'est pas valide.
La conclusion est: Non. Une fois la poignée de déclaration fermée, son état interne et ses ressources ont été détruits et ne peuvent plus être utilisés pour des opérations, notamment en appelant la méthode ATTR_GET () . Essayer de le faire entraînera des erreurs de script ou des exceptions logiques.
Obtenez les propriétés requises avant de fermer la poignée <br> Si vous avez vraiment besoin d'obtenir une certaine propriété, assurez-vous de le faire avant l'appel close () . Par exemple:
$stmt = $mysqli->prepare("SELECT * FROM users");
$stmt->attr_set(MYSQLI_STMT_ATTR_CURSOR_TYPE, MYSQLI_CURSOR_READ_ONLY);
$cursorType = $stmt->attr_get(MYSQLI_STMT_ATTR_CURSOR_TYPE);
$stmt->close();
Évitez le fonctionnement des objets défaillants <br> Vérifiez toujours la validité de la poignée avant l'opération. Vous pouvez encapsuler la logique de jugement pour assurer la robustesse du code.
Utiliser le mécanisme de gestion des exceptions <br> Allumez MySQLI_Report (mysqli_report_error | mysqli_report_strict) pour attraper et localiser rapidement les problèmes lorsque des erreurs se produisent.
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$mysqli = new mysqli("localhost", "user", "pass", "dbname");
$stmt = $mysqli->prepare("SELECT * FROM articles WHERE status = ?");
$stmt->attr_set(MYSQLI_STMT_ATTR_CURSOR_TYPE, MYSQLI_CURSOR_READ_ONLY);
$cursorType = $stmt->attr_get(MYSQLI_STMT_ATTR_CURSOR_TYPE);
echo "Cursor Type: " . $cursorType;
$stmt->bind_param("s", $status);
$status = 'published';
$stmt->execute();
$result = $stmt->get_result();
while ($row = $result->fetch_assoc()) {
echo $row['title'] . "<br>";
}
$stmt->close();
$mysqli->close();
?>
Remarque: Si vous prévoyez d'interagir avec le backend via URL, par exemple via les résultats de la demande AJAX, assurez-vous que le nom de domaine est remplacé par votre propre nom de domaine tel que https://m66.net/api/fetch_status.php pour éviter les problèmes croisés.
mysqli_stmt :: att_get () ne peut pas être utilisé sur les poignées d'instructions fermées.
L'appel de cette méthode devrait garantir que la poignée est toujours active.
Une mauvaise utilisation peut entraîner des avertissements ou des erreurs logiques, affectant la stabilité du programme.
La gestion correcte des cycles de vie des ressources fait partie des bonnes pratiques de programmation PHP.
En comprenant ces comportements et en suivant les meilleures pratiques, les erreurs inutiles peuvent être effectivement évitées et la robustesse et la maintenabilité du code peuvent être améliorées.