Mysql
 sql >> Base de données >  >> RDS >> Mysql

Impossible d'obtenir le nombre de lignes et de récupérer lors de l'utilisation de l'instruction préparée MySQLi

Si vous souhaitez utiliser mysqli_stmt::$num_rows (c'est-à-dire vérifier le nombre de lignes sur l'instruction préparée), vous devez utiliser $stmt->store_result() après avoir exécuté l'instruction préparée avant de pouvoir vérifier le nombre de lignes. Cela signifie que le résultat est stocké en mémoire avant de vérifier le nombre de lignes renvoyées.

$stmt = $conn->prepare($sql);
$stmt->bind_param('ss',$log_username,$log_username);
$stmt->execute();
$stmt->store_result(); // Need to store the result into memory first
if ($stmt->num_rows) {
    // ...

Cependant, si vous souhaitez utiliser mysqli_result::$num_rows (sur le résultat MySQLi que vous convertissez à partir du résultat de l'instruction), vous devez le faire après avoir fait $result = $stmt->get_result(); , et utilisez $result->num_rows; , comme indiqué ci-dessous.

$stmt = $conn->prepare($sql);
$stmt->bind_param('ss',$log_username,$log_username);
$stmt->execute();
$result = $stmt->get_result();
if ($result->num_rows) {
    while ($row = $result->fetch_assoc()) {
    // ....

En fin de compte, ils devraient tous les deux faire la même chose - fournir un certain nombre de lignes renvoyées par la requête préparée d'origine.

Remarque
Il est important de noter que vous ne pouvez pas utiliser store_result() et get_result() sur la même déclaration. Ce qui signifie que dans le premier exemple, vous ne pouvez pas convertir en un objet mysqli-result (en utilisant get_result() , qui vous permet d'utiliser le standard fetch_assoc() méthode). Comme store_result() stocke le résultat en mémoire, il n'y a rien pour get_result() convertir, et vice-versa.

Cela signifie que si vous utilisez store_result() , vous devez récupérer l'instruction-fetch, mysqli_stmt::fetch() et liez les résultats via mysqli_stmt::bind_result() . Si vous utilisez get_result() , vous devez vérifier le nombre de lignes sur l'objet de résultat MySQLi résultant (comme indiqué dans le deuxième exemple).

Vous devez donc construire votre code de telle sorte que vous n'ayez besoin d'utiliser qu'un seul d'entre eux.

Cela étant dit, en utilisant affected_rows comme suggéré dans les commentaires, n'est pas le bon outil pour le travail - selon le manuel sur mysqli_stmt::$affected_rows (la même chose s'applique pour une requête régulière, mysqli::$affected_rows ):