$sql = "SELECT count(*) FROM `table` WHERE foo = ?";
$result = $con->prepare($sql);
$result->execute([$bar]);
$number_of_rows = $result->fetchColumn();
Не самый элегантный способ сделать это, плюс это требует дополнительного запроса.
Есть PDO PDOStatement::rowCount()
, который, видимо, не работает в MySql. Вот это боль.
Из документа ЗОП:
Для большинства баз данных PDOStatement :: rowCount () не возвращает количество строк, затронутых оператором SELECT. Вместо этого используйте PDO :: query (), чтобы выдать оператор SELECT COUNT (*) с теми же предикатами, что и предполагаемый оператор SELECT, а затем используйте PDOStatement :: fetchColumn (), чтобы получить количество строк, которые будут возвращены. Ваше приложение может затем выполнить правильное действие.
РЕДАКТИРОВАТЬ: В приведенном выше примере кода используется подготовленный оператор, который во многих случаях, вероятно, не нужен для подсчета строк, поэтому:
$nRows = $pdo->query('select count(*) from blah')->fetchColumn();
echo $nRows;
fetchColumn()
возвращает строку «1234» ... ваш EDIT имеетecho count($nRows);
-count()
это функция массива: P. Я также рекомендовал бы приведение типаfetchColumn()
к целому числу.$count = (int) $stmt->fetchColumn()
Как я писал ранее в ответе на аналогичный вопрос , единственная причина
mysql_num_rows()
работала в том, что он извлекал все строки, чтобы дать вам эту информацию, даже если она вам не показалась.Итак, в PDO, ваши варианты:
FOUND_ROWS()
функцию MySQL .fetchAll()
функцию PDO для извлечения всех строк в массив, а затем используйтеcount()
его.SELECT COUNT(*)
, как предложено karim79.источник
Как это часто бывает, этот вопрос чертовски запутан. Люди приходят сюда, имея в виду две разные задачи :
Это две абсолютно разные задачи, которые не имеют ничего общего и не могут быть решены одной и той же функцией. По иронии судьбы, ни для одного из них
PDOStatement::rowCount()
нельзя использовать фактическую функцию.Посмотрим почему
Подсчет строк в таблице
Значит, ты уже сделал это неправильно. Использование
mysql_num_rows()
илиrowCount()
для подсчета количества строк в таблице является настоящей катастрофой с точки зрения использования ресурсов сервера. База данных должна прочитать все строки с диска, использовать память на сервере базы данных, а затем отправить всю эту кучу данных в PHP, также потребляя память процесса PHP, обременяя ваш сервер без всякой причины.Кроме того, выбирать строки только для их подсчета просто бессмысленно.
count(*)
Запрос должен быть запущен вместо этого. База данных будет считать записи из индекса, не считывая фактические строки, а затем вернет только одну строку.Для этого код, предложенный в принятом ответе, является справедливым.
Подсчет количества возвращенных строк.
Второй вариант использования не так катастрофичен, как довольно бессмысленный: в случае, если вам нужно знать, вернул ли ваш запрос какие-либо данные, у вас всегда есть эти данные!
Скажем, если вы выбираете только одну строку. Хорошо, вы можете использовать выбранную строку в качестве флага:
В случае, если вам нужно получить много строк, вы можете использовать
fetchAll()
.Да, конечно, для первого варианта использования это будет в два раза хуже. Но , как мы уже знаем, просто не выбрать строки только сосчитать, ни с
rowCount()
ниfetchAll()
.Но если вы собираетесь использовать выбранные строки, в этом нет ничего плохого
fetchAll()
. Помните, что в веб-приложении никогда не следует выделять огромное количество строк. Только строки, которые будут фактически использоваться на веб-странице, должны быть выбраны, следовательно, вы должны использоватьLIMIT
,WHERE
или аналогичное предложение в вашем SQL. И для такого умеренного количества данных все в порядкеfetchAll()
. И снова, просто используйте результат этой функции в условии:И, конечно, это будет абсолютное безумие, чтобы выполнить дополнительный запрос только для того, чтобы узнать, вернул ли ваш другой запрос какие-либо строки, как это было предложено в двух главных ответах.
Подсчет количества строк в большом наборе результатов
В таком редком случае, когда вам нужно выбрать действительно огромное количество строк (например, в консольном приложении), вы должны использовать небуферизованный запрос , чтобы уменьшить объем используемой памяти. Но это тот самый случай, когда
rowCount()
не будет доступно , поэтому эта функция также бесполезна.Следовательно, это единственный случай использования, когда вам может потребоваться выполнить дополнительный запрос, если вам нужно знать приблизительную оценку количества выбранных строк.
источник
Это супер поздно, но я столкнулся с проблемой, и я делаю это:
Это действительно просто и легко. :)
источник
Я закончил тем, что использовал это:
источник
Этот пост старый, но получить количество строк в php с помощью PDO просто
источник
Это старый пост, но он разочарован поиском альтернативы. Очень жаль, что в PDO нет этой возможности, тем более что PHP и MySQL стремятся идти рука об руку.
К сожалению, в fetchColumn () есть недостаток, поскольку вы больше не можете использовать этот результирующий набор (эффективно), поскольку fetchColumn () перемещает стрелку к следующей строке. Так, например, если у вас есть результат, похожий на
Если вы используете fetchColumn (), вы можете обнаружить, что возвращены 3 плода, но если вы теперь перебираете результат, у вас есть только два столбца. Цена fetchColumn () - это потеря первого столбца результатов, чтобы найти сколько строк было возвращено. Это приводит к небрежному кодированию и полностью ошибочным результатам, если они реализованы.
Так что теперь, используя fetchColumn (), вы должны реализовать и совершенно новый вызов и MySQL запрос, чтобы получить свежий рабочий набор результатов. (что, надеюсь, не изменилось со времени вашего последнего запроса), я знаю, вряд ли, но это может произойти. Кроме того, накладные расходы двойных запросов на проверку всех строк. Что для этого примера невелико, но анализирует 2 миллиона строк в объединенном запросе, а это не приятная цена.
Я люблю PHP и поддерживаю всех, кто участвует в его разработке, а также сообщество в целом, использующее PHP на ежедневной основе, но очень надеюсь, что это будет решено в будущих выпусках. Это «действительно» моя единственная жалоба с PHP PDO, которая в остальном является отличным классом.
источник
Отвечая на это, потому что я поймал себя в ловушку с этим, зная это, и, возможно, это будет полезно.
Имейте в виду, что вы не можете получить результаты дважды. Вы должны сохранить результаты выборки в массив, получить количество строк
count($array)
и вывести результаты с помощьюforeach
. Например:источник
Если вы просто хотите получить количество строк (а не данные) т.е. используя COUNT (*) в подготовленном выражении, все, что вам нужно сделать, - это получить результат и прочитать значение:
На самом деле получение всех строк (данных) для простого подсчета является пустой тратой ресурсов. Если набор результатов велик, ваш сервер может подавиться им.
источник
Посмотрите эту ссылку: http://php.net/manual/en/pdostatement.rowcount.php Не рекомендуется использовать rowCount () в инструкциях SELECT!
источник
Чтобы использовать переменные в запросе, вы должны использовать
bindValue()
илиbindParam()
. И не объединяйте переменные с" . $variable . "
GL
источник
Когда речь идет о MySQL, как подсчитать или получить, сколько строк в таблице с PHP PDO я использую это
кредиты идут на Майк @ codeofaninja.com
источник
Быстрый один лайнер, чтобы получить первую запись возвращается. Это хорошо для очень простых запросов.
Ссылка
источник
Я пытался
$count = $stmt->rowCount();
с Oracle 11.2, и он не работал. Я решил использовать цикл как показано ниже.источник
Для прямых запросов, где я хочу конкретную строку и хочу знать, была ли она найдена, я использую что-то вроде:
источник
Есть простое решение. Если вы используете PDO, подключитесь к вашей БД следующим образом:
Тогда запрос к БД будет:
И, наконец, для подсчета строк, соответствующих вашему запросу, напишите так
источник
fetchColumn ()
используется, если хотите получить количество записей [effisien]
запроса ()
используется, если вы хотите получить данные и количество записей [опции]
PDOStatement :: ROWCOUNT
источник
когда вы делаете COUNT (*) в вашем MySQL выражении, как в
Ваш запрос MySQL уже подсчитывает количество результатов, зачем снова считать в php? чтобы получить результат вашего mysql
и
$nb
будет содержать целое число, которое вы посчитали с помощью оператора mysql, чтобы написать немного, но быстро выполнитьРедактировать: извините за неправильный пост, но, как показывают некоторые примеры запроса с счетчиком в, я предложил использовать результат mysql, но если вы не используете счетчик в sql, то fetchAll () эффективен, если вы сохраняете результат в переменной Вы не потеряете линию.
count($table)
вернет номер строки, и вы все равно можете использовать результат после как$row = $table[0]
или с помощьюforeach
источник
Вот специальное расширение класса PDO с вспомогательной функцией для получения количества строк, включенных в критерии WHERE последнего запроса.
Возможно, вам придется добавить больше «обработчиков», в зависимости от того, какие команды вы используете. Прямо сейчас это работает только для запросов, которые используют «ОТ» или «ОБНОВЛЕНИЕ».
источник
Вы можете объединить лучший метод в одну строку или функцию и автоматически сгенерировать новый запрос:
источник
источник
источник
Используйте параметр
array(PDO::ATTR_CURSOR => PDO::CURSOR_SCROLL)
, иначе покажите -1:Усен параметр
array(PDO::ATTR_CURSOR => PDO::CURSOR_SCROLL)
, грешить Элло продажа -1пример:
источник