Есть ли способ использовать SELECT FOUND_ROWS () в php и mysqli? - PullRequest
1 голос
/ 10 июля 2019

Я пытаюсь внедрить систему пагинации на свой веб-сайт и не могу обойти эту упрямую ошибку.Я не совсем уверен, что вы можете использовать FOUND_ROWS () в mysqli в отличие от PDO, но для этого я и пришел сюда.

У меня последняя версия PHP, и все работает до этого момента в нумерации страниц.

$stmt = $conn->prepare('SELECT count(*) FROM owned_assets WHERE uid=? AND type=? LIMIT '.$start.', '.$rLim);
    $stmt->bind_param('ii', $uid, $assetType);
    $stmt->execute();
    $total = $conn->query('SELECT FOUND_ROWS() as total')->mysqli_fetch_array()['total'];

То, что должно произойти (пока), - это то, что mysql будет подсчитывать строки, найденные в соответствующем запросе, и я могу работать дальше оттуда.

Это моя текущая ошибка:

Неустранимая ошибка: необученная ошибка: вызов функции-члена mysqli_fetch_array () в bool

Ответы [ 3 ]

1 голос
/ 10 июля 2019

Конечно, есть, но вы должны следовать надлежащей процедуре .

Ваш текущий запрос не имеет смысла, поскольку он подсчитывает число, которое вы уже знаете, сохраненное в $ rLim (хорошо, не всегда, но это не главное).

Чтобы использовать FOUND_ROWS () для разбивки на страницы, вы должны добавить SQL_CALC_FOUND_ROWS к вашему запросу, который выбирает данные для одной страницы.

Тогда вы сможете получить общее количество строк без ограничений, выполнив другой запрос с FOUND_ROWS ().

Тем не менее, использование SQL_CALC_FOUND_ROWS не рекомендуется, поскольку оно медленнее, чем выборка всех строк без LIMIT. И это причина, почему эта функция была недавно устарела .

Таким образом, вы должны сделать два запроса, один из которых извлекает фактические данные с предложением LIMIT, а другой - с счетчиком (*) и без LIMIT.

0 голосов
/ 10 июля 2019

Вам не нужен другой запрос, чтобы получить общее количество строк, так как он у вас уже есть с COUNT().Вы можете просто привязать результат первого запроса к $total с помощью bind_result():

$stmt->bind_result($total);
0 голосов
/ 10 июля 2019

У вас уже есть запрос на подсчет, просто получите это значение. Нет необходимости в другом втором запросе FOUND_ROWS().

$stmt = $conn->prepare('SELECT count(*) FROM owned_assets WHERE uid=? AND type=?');
$stmt->bind_param('ii', $uid, $assetType);
$stmt->execute();
$result = $stmt->get_result();
$total = $result->fetch_assoc();
echo $total['count(*)'];

Sidenote: в запросе можно использовать псевдоним count(*) AS total и получить доступ к индексу как $total['total'] в возвращаемом значении.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...