2008-09-17 11 views
0

J'écrivais une classe de gestionnaire de base de données en PHP en utilisant la classe mysqli et les instructions préparées. J'essayais d'imprimer le résultat. Cela n'a pas fonctionné dès le départ, j'ai donc décidé de faire du débogage. J'ai essayé d'utiliser la méthode num_rows() de la classe mysqli_statement, mais elle a continué à renvoyer 0. J'ai décidé d'écrire une petite partie du code de test pour la simplifier afin que je puisse voir ce qui n'allait pas. J'ai alors pu renvoyer les données que je voulais, mais la méthode num_rows() renvoie toujours 0 même lorsqu'elle sélectionne et récupère certaines données. Voici le code:mysqli_statement :: num_rows() retourne la mauvaise valeur

$mysqli = new mysqli('localhost', 'username', 'password', 'database'); 
if(mysqli_connect_errno()) 
{ 
    die('connection failed'); 
} 

$statement = $mysqli->stmt_init(); 

$query = "SELECT name FROM table WHERE id = '2000'"; 
if($statement->prepare($query)) 
{ 
    $statement->execute(); 
    $statement->bind_result($name); 
    $statement->fetch(); 
    $statement->store_result(); 
    echo $statement->num_rows(); 
    echo $name; 
} 
else 
{ 
    echo 'prepare statement failed'; 
    exit(); 
} 

Alors oui, le résultat attendu est:

1name 

et le résultat réel est:

0name 

Quelqu'un peut-il me dire pourquoi est-ce?

Répondre

5

Je me demande si num_rows() rapporte par rapport à l'ensemble de résultats en cours. Essayez de capturer num_rows() avant de récupérer les données. par exemple.

if($statement->prepare($query)) 
{ 
    $statement->execute(); 
    $statement->store_result(); 
    echo $statement->num_rows(); 
    $statement->bind_result($name); 
    $statement->fetch(); 
    echo $name; 
} 

Est-ce que cela a un effet?

+1

En effet, c'était le problème. Pour que num_rows() renvoie la bonne valeur, store_result() doit être appelé avant fetch(). –

+0

C'est ce que je pensais; récupérer les données incrémente le compteur de ligne interne, de sorte que vous pouvez faire quelque chose comme while ($ instruction-> num_rows()) {/ * faire des trucs * /} –

+0

Je crois fortement que le commentaire de @ StevenOxley est la réponse à cette question. – Sablefoste

0

Il ne semble pas que vous ayez déclaré $ name.

Aussi, essayez de supprimer bind_result() et fetch() il lit quelque chose comme ceci:

$statement->execute(); 

$statement->store_result(); 

printf("Number of rows: %d.\n", $statement->num_rows); 
1

num_rows n'est pas une méthode, c'est une propriété.

+0

Correct, je devais regarder la documentation de la classe mysqli_result au lieu de mysqli_stmt. –