En PHP, lors de l'interrogation de bases de données utilisant des extensions MySQLI, de nombreux développeurs rencontreront une question déroutante: que se passe-t-il? Cet article vous aidera à trier les malentendus courants et vous aidera à trouver la cause profonde du problème.
MySQLI_MULTI_QUERY est une méthode qui peut exécuter plusieurs instructions SQL à la fois, mais elle renvoie une valeur booléenne, et l'ensemble de résultats réel est obtenu via mysqli_store_result ou mysqli_use_result .
Exemple de code:
<?php
$mysqli = new mysqli("localhost", "user", "password", "database");
$sql = "SELECT * FROM users; SELECT * FROM products;";
if ($mysqli->multi_query($sql)) {
do {
if ($result = $mysqli->store_result()) {
echo "Désint de la ligne de définition des résultats actuelle: " . $result->num_rows . "<br>";
$result->free();
}
} while ($mysqli->more_results() && $mysqli->next_result());
}
?>
Si vous essayez d'appeler NUM_ROWS avec la valeur de retour Multi_Query , bien sûr, vous obtiendrez 0. Assurez-vous d'obtenir correctement l'objet SET des résultats.
Certains développeurs ont écrit $ stmt = $ mysqli-> préparer (...) et ensuite utilisé $ stmt-> num_rows , mais note: Prépare ne fait pas d'exécution de requêtes, c'est juste une préparation.
La requête doit être exécutée en premier et le résultat doit être obtenu:
<?php
$stmt = $mysqli->prepare("SELECT * FROM users WHERE age > ?");
$stmt->bind_param("i", $age);
$age = 18;
$stmt->execute();
$result = $stmt->get_result();
echo "Nombre de lignes: " . $result->num_rows;
?>
Si vous sautez exécuter ou get_result , NUM_ROWS n'a aucun moyen de parler.
Par défaut, MySQLI utilise des requêtes tamponnées et vous pouvez utiliser NUM_ROWS directement. Cependant, si vous utilisez le mode mysqli_use_result , le jeu de résultats est en streaming et MySQL ne peut pas calculer le nombre total de lignes avant d'être traversé.
Exemple:
<?php
$result = $mysqli->query("SELECT * FROM users", MYSQLI_USE_RESULT);
echo $result->num_rows; // erreur:此时无法获取Nombre de lignes
La solution consiste à utiliser le mode tampon par défaut ou à parcourir vous-même les statistiques.
Beaucoup de gens croient à tort que NUM_ROWS peut être utilisé pour insérer , mettre à jour et supprimer les requêtes. En fait, ces opérations n'ont aucun résultat, vous devez donc utiliser $ mysqli-> affecté_rows .
<?php
$mysqli->query("UPDATE users SET status = 'active' WHERE last_login > NOW() - INTERVAL 30 DAY");
echo "受影响的Nombre de lignes: " . $mysqli->affected_rows;
?>
N'oubliez pas: seul le jeu de résultats produit par la requête sélectionnée a num_rows .
Si vous rencontrez Num_Rows renvoie toujours 0, vérifiez d'abord:
? Avez-vous utilisé Multi_Query mais n'a pas réussi à obtenir le jeu de résultats?
? Avez-vous oublié d'exécuter et d'obtenir_result après avoir préparé ?
? Avez-vous utilisé le mode non frappé ?
? Avez-vous trompé le type de requête?
En évitant ces malentendus, vous pouvez utiliser correctement MySQLI_RESULT et NUM_ROWS et éviter les détours.