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-запросами, я получаю правильный номер.

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

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

Solutions Collecting From Web of "SQL_CALC_FOUND_ROWS / FOUND_ROWS () не работает в PHP"

Спасибо.

Когда я запустил что-то аналогичное вашему примеру в командной строке 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