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-запросами, я получаю правильный номер.
Может ли кто-нибудь дать мне идею решения, не переустанавливая все?
Извините, мой предыдущий запрос был ужасно неясным.
Ответы
Ответ 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