Подтвердить что ты не робот

SQL_CALC_FOUND_ROWS/FOUND_ROWS() не работает в PHP

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

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

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

4b9b3361

Ответ 1

Спасибо.

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

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

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

Как "исправление", мы могли бы либо поместить это на каждую php-страницу (фактически, в общую "include" ):

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

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

php_value mysql.trace_mode "0"

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

Ответ 2

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

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

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

Пример:

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

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

Ответ 3

Другим способом было бы использовать 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();
?>

Ответ 4

Ну, это была проблема с расширением mysql php в комплекте с php 5.2.6. Mysqli работает отлично, и еще одна версия php. Извините за шум и непонятный вопрос.

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

Ответ 5

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

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

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

Ответ 6

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

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

если вы находитесь в WordPress