J'ai une simple déclaration préparée pour un e-mail qui existe réellement:

$mysqli = new mysqli("localhost", "root", "", "test");
if (mysqli_connect_errno()) {
    printf("Connect failed: %s\n", mysqli_connect_error());
    exit();
}

$sql = 'SELECT `email` FROM `users` WHERE `email` = ?';
$email = 'example@hotmail.com';

if ($stmt = $mysqli->prepare($sql)) {
    $stmt->bind_param('s', $email);
    $stmt->execute();

    if ($stmt->num_rows) {
        echo 'hello';
    }

    echo 'No user';
}

Résultat: echos No user quand il doit écho hello

J'ai exécuté la même requête dans la console et j'ai obtenu un résultat en utilisant le même e-mail que ci-dessus.

J'ai également testé en utilisant une simple requête mysqli:

if ($result = $mysqli->query("SELECT email FROM users WHERE email = 'example@hotmail.com'")) {
    echo 'hello';

}

Résultat: ce que j'attendais hello

De plus, num_rows de $result est égal à 1.

Pourquoi la déclaration préparée num_row n'est-elle pas supérieure à 0?

1
Robert Rocha 27 août 2017 à 07:01

2 réponses

Meilleure réponse

Lorsque vous exécutez une instruction via mysqli, les résultats ne sont pas réellement en PHP tant que vous ne les récupérez pas - les résultats sont détenus par le moteur de base de données. Ainsi, l'objet mysqli_stmt n'a aucun moyen de savoir combien de résultats il y a immédiatement après l'exécution.

Modifiez votre code comme ceci:

$stmt->execute();
$stmt->store_result(); // pull results into PHP memory

// now you can check $stmt->num_rows;

Voir le manuel

Cela ne s'applique pas à votre exemple particulier, mais si votre jeu de résultats est volumineux, $stmt->store_result() consommera beaucoup de mémoire. Dans ce cas, si tout ce qui vous importe est de savoir si au moins un résultat a été renvoyé, ne stockez pas les résultats; à la place, vérifiez simplement si les métadonnées du résultat ne sont pas nulles:

$stmt->execute();
$hasResult = $stmt->result_metadata ? true : false;

Voir le manuel

3
BeetleJuice 27 août 2017 à 04:19

Je pense qu'il manque

$stmt->store_result();

if ($stmt->num_rows) {
    echo 'hello';
}

http://php.net/manual/en/mysqli-stmt.num-rows.php

1
evitt 27 août 2017 à 04:11