Существует много дискуссий о SO о том, как получить количество строк, возвращаемых при выполнении запроса SELECT
с использованием PDO. Хотя большинство (включая руководство PHP ) предлагают использовать два запроса, при первом запуске COUNT()
я не видел того, что предлагало, как легко это сделать, используя подготовленные инструкции с WHERE
.
Как я наиболее эффективно (как при обработке, так и в количестве строк кода) запускает COUNT()
с использованием того же WHERE
? В подготовленном запросе уже указаны указанные столбцы. fetchAll()
не будет работать здесь, потому что это не будет масштабироваться; если мне нужно вернуть миллионы строк, обработка его с помощью fetchAll будет очень медленной.
Например, без счета:
$sql = "SELECT FirstName, LastName FROM People WHERE LastName = :lastName"; $query = $pdoLink->prepare($sql); $query->bindValue(":lastName", '%Smith%'); $query->execute(); while($row = $query->fetch(PDO::FETCH_ASSOC)) { echo $row['FirstName'] . " " . $row['LastName']; }
Я посмотрел на добавление COUNT(ID)
в предложение SELECT
, и это был всего лишь один запрос, но похоже, что нет реального способа (или не конкретного для базы данных) перемотки fetch()
только я получу от него.
Другим решением могло бы стать WHERE
это собственная переменная, которая построена. Но это не кажется очень эффективным. Он готовит два запроса, связывает значения снова и снова и выполняет их.
Итак, что-то вроде:
$whereClause = " WHERE LastName = :lastName"; $rowsSql = "SELECT COUNT(ID) As NumOfRows FROM People " . $whereClause; $rowsQuery = $pdoLink->prepare($sql); $rowsQuery->bindValue(":lastName", '%Smith%'); $rowsQuery->execute(); if ($rowsQuery->fetchColumn() >= 1) //Prepare the original query, bind it, and execute it. $sql = "SELECT FirstName, LastName FROM People " . $whereClause; $query = $pdoLink->prepare($sql); $query->bindValue(":lastName", '%Smith%'); $query->execute(); while($row = $query->fetch(PDO::FETCH_ASSOC)) { echo $row['FirstName'] . " " . $row['LastName']; } } else { //No rows found, display message echo "No people found with that name."; }
При использовании MySQL PDOStatement::rowCount()
возвращает количество строк в наборе результатов. Он фактически вызывает основную функцию mysql_num_rows()
C для заполнения значения. Нет необходимости в нескольких запросах или каких-либо других беспорядках.
Это относится и к MySQL, но для других драйверов это поведение нельзя полагаться (другие могут его поддержать, но это не гарантировано, я не знаком с другими, чтобы сказать наверняка в любом случае). Но поскольку ваш вопрос касается конкретно MySQL, он должен служить вашим целям.
Попробуйте эту встроенную функцию PDO; $ Query-> сверка ();