Каков наилучший способ проверить, существует ли что-то с PDO

Кто-то сказал мне, что rowCount небезопасен, поэтому мне нравится спрашивать его здесь, у меня есть 2 примера и как узнать, что является самым безопасным и приятным способом проверить, существует ли что-то?

$sql = "SELECT count(*) FROM users WHERE username = 'administrator'"; $result = $db->prepare($sql); $result->execute(); echo $result->fetchColumn() ? 'true' : 'false'; 

или

 $sql = "SELECT username FROM users WHERE username = ?"; $result = $db->prepare($sql); $result->execute(array('administrator')); echo $result->rowCount() ? 'true' : 'false'; 

Лучший способ проверить его с помощью команды « prepare и fetchColumn

SELECT COUNT (*) с теми же предикатами, что и ваш запрошенный оператор SELECT, затем используйте PDOStatement :: fetchColumn (), чтобы получить количество строк, которые будут возвращены.

 $sql = "SELECT COUNT(*) FROM users WHERE username = ?";// use `COUNT(*)` $result = $db->prepare($sql); $result->execute(array('administrator')); echo $result->fetchColumn() ? 'true' : 'false'; 
 SELECT 1 FROM users WHERE username = 'administrator' LIMIT 1 

Использование rowCount () небезопасно, но просто неправильно.

Правило №1 при работе с базами данных

Всегда выбирайте точные данные, которые вам нужны.

с меньшей пост-обработкой.

Поэтому, если вам нужно проверить все данные для существования, попросите свою базу данных проверить и затем получить результат.

Однако вы должны иметь в виду, что существует два возможных сценария:

  1. В случае, если вам действительно нужно проверить, где что-то существует в базе данных, но не нужны данные, тогда (при условии, что имя пользователя имеет уникальный индекс на нем):

     $sql = "SELECT 1 FROM users WHERE username = ?"; $result = $db->prepare($sql); $result->execute(array('administrator')); echo $result->fetchColumn() ? 'true' : 'false'; 
  2. Но часто вам нужны сами данные, если это происходит. В этом случае вы просто выбираете эти данные :

     $sql = "SELECT * FROM users WHERE username = ?"; $result = $db->prepare($sql); $result->execute(array('administrator')); $user = $result->fetch(); echo $user ? 'true' : 'false'; 

Я подчеркиваю это, потому что формулировка другого ответа предполагает, что вам нужно выполнить 2 запроса: один для проверки существования и один для получения данных, что является бессмыслицей.

Что rowCount() метода rowCount() – вам это слишком редко нужно говорить .