Перед использованием PDO я просто использовал mysql_num_rows()
.
Вы не должны были использовать его .
mysql_num_rows()
, а также PDOStatement::rowCount()
означает, что вы уже выбрали свои данные. В этом случае есть только два возможных варианта использования такой функции:
- Вы выбирали свои данные только для подсчета.
- Вы хотите знать, возвращал ли ваш запрос какие-либо строки.
И первый никогда не должен использоваться вообще. Никогда не следует выбирать строки для их подсчета, поскольку ваш сервер действительно может задохнуться из-за большого набора возвращаемых данных.
Кроме того, выбирать строки только для их подсчета просто бессмысленно. Вместо этого необходимо выполнить запрос count(*)
, с возвращением только одной строки.
Второй вариант использования менее катастрофичен, но довольно бессмысленен: если вам нужно узнать, возвращал ли ваш запрос какие-либо данные, у вас всегда есть эти данные!
Скажем, если вы выбираете только одну строку, просто извлеките ее и проверьте результат:
$stmt->execute();
$row = $stmt->fetch();
if ($row) { // here! as simple as that
}
Если вам нужно получить много строк, вы можете использовать fetchAll()
.
fetchAll()
- это то, чего я не хочу, так как иногда я имею дело с большими наборами данных
Обратите внимание, что в веб-приложении никогда не следует выделять огромное количество строк. Только строки, которые будут фактически использоваться на веб-странице, должны быть выбраны. Для этой цели необходимо использовать LIMIT
или аналогичное предложение в SQL. И для такого небольшого количества данных можно использовать fetchAll()
В таком редком случае, когда вам нужно выбрать действительно огромное количество строк (например, в консольном приложении), чтобы уменьшить объем используемой памяти, вы должны использовать небуферизованный запрос, но в этом случае rowCount()
будет недоступно в любом случае , поэтому эта функция также не используется.
Итак, вы видите, что нет ни одного варианта использования ни для rowCount()
, ни для дополнительного запроса для его замены, как предлагается в принятом ответе.