Mysqli_stmt :: num_rows () возвращает неправильное значение

Я писал класс обработчика базы данных на 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

Кто-нибудь может сказать мне, почему это так?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
0
2 116
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Не похоже, что вы указали $ 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; 
}

Это имеет какой-то эффект?

Действительно, это была проблема. Чтобы num_rows () возвращал правильное значение, store_result () должен вызываться перед fetch ().

Steven Oxley 17.09.2008 10:12

Вот что я подумал; выборка данных увеличивает внутренний счетчик строк, так что вы можете делать что-то вроде while ($ statement-> num_rows ()) {/ * делать что-то * /}

Nathan Strong 17.09.2008 19:08

Я твердо верю, что комментарий @ StevenOxley - это ответ на этот вопрос.

Sablefoste 14.06.2015 17:06

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.

Другие вопросы по теме