Я писал класс обработчика базы данных на PHP, используя класс mysqli и подготовленные операторы. Я пытался распечатать результат. Это не сработало сразу, поэтому я решил немного отладить. Я попытался использовать метод num_rows() из класса mysqli_statement, но он продолжал возвращать 0. Я решил написать небольшую часть тестового кода, чтобы упростить его, чтобы я мог видеть, что идет не так. Затем я смог вернуть нужные данные, но метод num_rows() по-прежнему возвращает 0, даже когда он фактически выбирает и извлекает некоторые данные. Вот код:
$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();
}
Ожидаемый результат:
1name
И вот реальный результат:
0name
Кто-нибудь может сказать мне, почему это так?






Не похоже, что вы указали $ name.
Также попробуйте удалить bind_result () и fetch (), чтобы он читал что-то вроде этого:
$statement->execute();
$statement->store_result();
printf("Number of rows: %d.\n", $statement->num_rows);
Интересно, сообщает ли num_rows () относительно текущего набора результатов. Попробуйте захватить num_rows () до получения данных. например
if ($statement->prepare($query))
{
$statement->execute();
$statement->store_result();
echo $statement->num_rows();
$statement->bind_result($name);
$statement->fetch();
echo $name;
}
Это имеет какой-то эффект?
Вот что я подумал; выборка данных увеличивает внутренний счетчик строк, так что вы можете делать что-то вроде while ($ statement-> num_rows ()) {/ * делать что-то * /}
Я твердо верю, что комментарий @ StevenOxley - это ответ на этот вопрос.
num_rows - это не метод, это свойство.
Чтобы использовать mysqli_stmt::num_rows(),, вам необходимо получить все строки в PHP. Есть два способа получить все: буферизация с использованием store_result() или ручная выборка всех строк с помощью fetch().
В вашем случае вы начали ручную загрузку, позвонив в fetch() один раз. Вы не можете вызвать store_result(), когда выполняется другой процесс выборки. Вызов store_result() завершается ошибкой *.
$statement->fetch();
$statement->store_result(); // produces error. See $mysqli->error;
echo $statement->num_rows();
Самое простое решение - поменять местами порядок, в котором вы вызываете эти два метода.
$statement->store_result();
$statement->fetch(); // This will initiate fetching from PHP buffer instead of MySQL buffer
echo $statement->num_rows(); // This will tell you the total number of rows fetched to PHP
* Due to a bug in PHP, this error will not trigger an exception in the exception error reporting mode. The error message can only be seen with mysqli_error() function or its corresponding property.
Действительно, это была проблема. Чтобы num_rows () возвращал правильное значение, store_result () должен вызываться перед fetch ().