Каков предпочтительный метод получения количества строк, возвращаемых для состояния SELECT при использовании PDO с подготовленными операторами?
В настоящее время я использую rowCount (), но документы говорят, что я не должен использовать это, поскольку «большинство баз данных» его не поддерживают (на самом деле это работает отлично для меня, поэтому я испытываю соблазн продолжать использовать его. 't найти какие-либо источники, которые точно перечисляют, какие базы данных не поддерживают его, но, видимо, у меня все в порядке).
Вместо этого они рекомендуют использовать fetchColumn (), но для этого требуется написать полностью отдельный оператор SQL, содержащий COUNT (*) в моей инструкции sql.
Это то, что они предлагают ( http://php.net/manual/en/pdostatement.rowcount.php#example-1038 ):
//SQL TO GET ROWS TO OUTPUT $sql = 'SELECT * FROM properties WHERE lister_id = :lister_id AND lister_type = "landlord"'; $result = $dbh->prepare($sql); $result->bindParam(':lister_id', $_SESSION['loggedin_lister_id'], PDO::PARAM_INT); $result->execute(); //SQL TO GET NUMBER OF RETURNED ROWS $row_num_sql = 'SELECT COUNT(*) FROM properties WHERE lister_id = :lister_id AND lister_type = "landlord"'; $row_num_result = $dbh->prepare($row_num_sql); $row_num_result->bindParam(':lister_id', $_SESSION['loggedin_lister_id'], PDO::PARAM_INT); $row_num_result->execute(); $num_rows = $row_num_result->fetchColumn(); if($num_rows > 0) { while($row = $result->fetch(PDO::FETCH_ASSOC)) { echo $row['name']; } }
Я нахожу этот метод, который требует от меня написать отдельную и почти идентичную инструкцию sql для избыточности и серьезной боли при использовании подготовленных операторов. Я могу понять, как этот подход может быть приемлемым при использовании краткого оператора SQL с базовым запросом, но не в случае подготовленного оператора.
1. Есть ли другой способ, которым я могу использовать метод fetchColumn (), не переписывая то, что почти точно такое же?
2. Где я могу найти официальный список, какие базы данных rowCount () поддерживает при использовании инструкции SELECT? И поскольку он работает с базой данных, которую я использую в настоящее время, могу ли я предположить, что это безопасно использовать (если я не обновляю свою базу данных в ближайшее время)?
Если вы не хотите использовать rowCount
я думаю, вам нужно два запроса, или вы можете использовать fetchAll
и count(fetchAll)
для rowCount
второй способ, используйте SELECT *,COUNT(*) ...