Я использую 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-запросами, я получаю правильный номер.
Может ли кто-нибудь дать мне идею решения, не переустанавливая все?
Извините, мой предыдущий запрос был ужасно неясным.
Спасибо.
Когда я запустил что-то аналогичное вашему примеру в командной строке mysql, это сработает; но запустив его из php, он не удался. Второй запрос должен «знать о первом», поэтому я как-то понимаю, что персистентность / память, связывающая два запроса, перепуталась с php.
(Оказывается, WordPress использует этот тип запроса для разбиения на страницы, поэтому наша большая проблема заключалась в том, что разбиение на страницы в wordpress-установке внезапно прекратилось, когда мы перешли на php 5.2.6 … в конечном итоге отследили его до FOUND_ROWS ( )).
Просто ради публикации для людей, которые могут столкнуться с этим в будущем … для меня это была настройка php «mysql.trace_mode» – это по умолчанию «включено» в 5.2.6 вместо «off», как раньше, и по какой-то причине препятствует работе FOUND_ROWS ().
Как «исправление», мы могли бы либо поместить это на каждую php-страницу (фактически, в общую «include»):
ini_set("mysql.trace_mode", "0");
или добавить это в .htaccess:
php_value mysql.trace_mode "0"
Еще раз спасибо, Джерри
Вы используете метод запросов MySQL, который позволяет выполнять несколько запросов.
Из документации MySQL.
Чтобы получить этот счетчик строк,
SQL_CALC_FOUND_ROWS
опцию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()
здесь.
Другим способом было бы использовать 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(); ?>
Это была проблема с расширением mysql php в комплекте с php 5.2.6. Mysqli работает отлично, и еще одна версия php. Извините за шум и непонятный вопрос.
Если у вас такая же проблема, мой совет – переустановить PHP или сменить версию.
Самое быстрое решение – подзапросить свой фактический запрос следующим образом:
SELECT SQL_CALC_FOUND_ROWS * FROM (SELECT whatever FROM whatever WHERE whatever LIMIT whatever) ax; select FOUND_ROWS();
Теперь вы получите правильные результаты. Я думаю, что основная причина заключается в том, что SQL_CALC_FOUND_ROWS
главным образом отслеживает найденные строки (т. SQL_CALC_FOUND_ROWS
Без LIMITS
), а не возвращенные строки.
Я была такая же проблема. Решение было глупо, я использовал $wpdb->query
вместо $wpdb->get_var
. Итак, вы хотите сделать
$wpdb->get_var('select FOUND_ROWS()');
если вы на WordPress