mysqli_statement::num_rows() restituisce il valore sbagliato
Domanda
Stavo scrivendo una classe del gestore di database in PHP utilizzando la classe mysqli e le istruzioni preparate.Stavo tentando di stampare il risultato.Non ha funzionato subito, quindi ho deciso di fare un po' di debug.Ho provato a usare il num_rows()
metodo da mysqli_statement
class, ma continuava a restituire 0.Ho deciso di scrivere una piccola porzione di codice di test per semplificarlo e poter vedere cosa non andava.Sono stato quindi in grado di restituire i dati che volevo, ma il file num_rows()
Il metodo restituisce comunque 0 anche quando sta effettivamente selezionando e recuperando alcuni dati.Ecco il codice:
$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();
}
Quindi sì, il risultato atteso è:
1name
E il risultato effettivo è:
0name
Qualcuno può dirmi perché è così?
Soluzione
Mi chiedo se num_rows() stia segnalando rispetto al set di risultati corrente.Prova a catturare num_rows() prima di recuperare i dati.per esempio.
if($statement->prepare($query))
{
$statement->execute();
$statement->store_result();
echo $statement->num_rows();
$statement->bind_result($name);
$statement->fetch();
echo $name;
}
Ha qualche effetto?
Altri suggerimenti
num_rows non è un metodo, è una proprietà.
Non sembra che tu abbia dichiarato $name.
Inoltre, prova a rimuovere bind_result() e fetch() in modo che venga letto qualcosa del genere:
$statement->execute();
$statement->store_result();
printf("Number of rows: %d.\n", $statement->num_rows);