SQL_CALC_FOUND_ROWS / FOUND_ROWS () не работает в PHP - PullRequest
17 голосов
/ 23 марта 2009

Я использую SQL_CALC_FOUND_ROWS в операторе Mysql SELECT, чтобы получить количество строк, которые мой SELECT должен вернуть без предложения LIMIT.

$sql = new mysqli('localhost', 'root', '');
$sql->select_db('mysql');
$s1 = $sql->query('select SQL_CALC_FOUND_ROWS * from db limit 0, 3');
$s2 = $sql->query('select FOUND_ROWS()');
if($row = $s2->fetch_row()) printf('%d/%d', $s1->num_rows, $row[0]);

На моей станции разработки WinXP он возвращает 3/0 каждый раз в течение нескольких недель. Когда я использую другой сервер MySQL со своей станции, он также возвращает 3/0. На другом компьютере тот же код работает нормально и возвращает правильное число (например, 3/17, если у меня есть 17 записей в таблице mysql.db). Каждый XP-ПК имеет одинаковую версию PHP / Mysql, и раньше он прекрасно работал на моем ПК Используя Mysql Query Browser с теми же SQL-запросами, я получаю правильное число.

Может ли кто-нибудь дать мне идею решения без переустановки всего?

Извините, мой предыдущий запрос был ужасно неясен.

Ответы [ 6 ]

14 голосов
/ 15 мая 2009

Спасибо.

Когда я запускал что-то аналогичное вашему примеру в командной строке mysql, это работало; но запустить его из php, это не удалось. Второй запрос должен «знать» о первом, так что я думаю, что постоянство / память, связывающая два запроса, испортилась php.

(Оказывается, WordPress использует этот тип запроса для разбивки на страницы - поэтому наша большая проблема заключалась в том, что нумерация страниц в установке WordPress внезапно перестала работать, когда мы перешли на php 5.2.6 ... в итоге отследил его до FOUND_ROWS ()).

Просто ради публикации сообщений для людей, которые могут столкнуться с этим в будущем ... для меня это был параметр php "mysql.trace_mode" - по умолчанию это "включено" в 5.2.6 вместо "выключено", как ранее и по какой-то причине препятствует работе FOUND_ROWS ().

В качестве «исправления» мы могли бы поместить это на каждой php-странице (на самом деле, в обычное «include»):

ini_set("mysql.trace_mode", "0");

или добавьте это к .htaccess:

php_value mysql.trace_mode "0"

Еще раз спасибо, Джерри

9 голосов
/ 23 марта 2009

Используете ли вы метод запросов MySQL, который допускает несколько запросов.

Из документации MySQL.

Чтобы получить это количество строк, включите параметр SQL_CALC_FOUND_ROWS в инструкцию SELECT, а затем вызовите FOUND_ROWS() после

Пример:

mysql> SELECT SQL_CALC_FOUND_ROWS * FROM tbl_name
    -> WHERE id > 100 LIMIT 10;
mysql> SELECT FOUND_ROWS();

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

2 голосов
/ 09 марта 2011

Другой способ - использовать mysqli_multi_query, как указано в руководстве по PHP, передавая оба запроса, содержащие SQL_CALC_FOUND_ROWS и FOUND_ROWS, разделенные точкой с запятой

<?php
$mysqli = new mysqli("localhost", "my_user", "my_password", "world");

/* check connection */
if (mysqli_connect_errno()) {
    printf("Connect failed: %s\n", mysqli_connect_error());
    exit();
}

$query  = "SELECT SQL_CALC_FOUND_ROWS * FROM db limit 0, 3;";
$query .= "SELECT FOUND_ROWS()";

/* execute multi query */
if ($mysqli->multi_query($query)) {
    do {
        /* store first result set */
        if ($result = $mysqli->store_result()) {
            while ($row = $result->fetch_row()) {
                printf("%s\n", $row[0]);
            }
            $result->free();
        }
        /* print divider */
        if ($mysqli->more_results()) {
            printf("-----------------\n");
        }
    } while ($mysqli->next_result());
}

/* close connection */
$mysqli->close();
?>
0 голосов
/ 17 июня 2015

У меня была такая же проблема. Решение было глупым, я использовал $wpdb->query вместо $wpdb->get_var. Итак, вы хотите сделать

$wpdb->get_var('select FOUND_ROWS()');

если вы на WordPress

0 голосов
/ 19 мая 2015

Самое быстрое решение - это запросить фактический запрос следующим образом:

SELECT SQL_CALC_FOUND_ROWS * FROM (SELECT whatever FROM whatever WHERE whatever LIMIT whatever) ax; 
select FOUND_ROWS();

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

0 голосов
/ 26 марта 2009

Что ж, это была проблема с расширением mysql php в комплекте с php 5.2.6. Mysqli работает нормально, и другая версия PHP тоже. Извините за шум и неясный вопрос.

Если у вас возникла такая же проблема, я советую переустановить PHP или изменить версию.

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