Я часто использую функцию rowCount в PDO, например, так:
$sql = $dataBase->prepare('SELECT email, firstname, lastname
FROM pr__user
WHERE id = :id');
$sql->execute(array('id' => $_SESSION['user_id']));
$rowCount = $sql->rowCount();
Все время работало нормально, но я видел в руководстве по PHP:
Если последний оператор SQL, выполненный связанным PDOStatement, был
оператор SELECT, некоторые базы данных могут возвращать количество строк
возвращается этим утверждением. Однако такое поведение не гарантируется.
для всех баз данных и не следует полагаться на портативные
Приложения.
http://php.net/manual/en/pdostatement.rowcount.php
Он прекрасно работает с MySQL и MariaDB, поэтому я продолжал использовать его. Как я использую это приложение, которое я хочу переносить, я должен изменить свой код?
Я никогда не спрашиваю количество строк. Запрос всегда возвращает массив строк результатов (в некотором формате), я могу просто спросить, сколько строк в массиве — например, с PHP count(..)
функция.
Чего вам не хватает, так это того, что PDO является интерфейсом для много разных баз данных, не только MySQL. Они не гарантируют, что функция будет возвращать одинаковые значения на совершенно разных серверных объектах.
Вот что означает «для переносимых приложений»: если вы хотите, чтобы ваш код выполнялся универсально в произвольной базе данных, вам, возможно, придется избегать использования этой функции. Если это не так, вы не пишете универсальный код библиотеки, вы можете зависеть от конкретного поведения MySQL.
Просто убедитесь, что вы проверяете все, что делаете, чтобы убедиться в обоснованности этого предположения.
Скорее это просто бессмысленно и лишнее. Вы раздули свой код без причины.
Из вашего примера видно, что вы собираетесь использовать выбранные данные (в противном случае нет смысла выбирать электронную почту). Таким образом, это означает, что вы можете использовать эти данные вместо подсчета строк полностью. Предполагая, что следующим оператором будет fetch (), вы можете опустить rowCount ()
$sql = $dataBase->prepare('SELECT email, firstname, lastname
FROM pr__user
WHERE id = :id');
$sql->execute(array('id' => $_SESSION['user_id']));
$user = $sql->fetch();
if ($user) { ...
а также отныне вы можете использовать $user
в каждом отдельном состоянии где был использован $ rowCount. Просто потому, что вам не нужен счет здесь, а скорее булев флаг для этой цели массив будет служить целым числом.
Даже в том случае, если вам не нужна электронная почта, а требуется только знать, существует ли пользователь, вы можете просто выбрать 1
скалярное значение, а затем получить его — так что ваш код остается единообразным.