Кто-то сказал мне, что 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 при работе с базами данных
с меньшей пост-обработкой.
Поэтому, если вам нужно проверить все данные для существования, попросите свою базу данных проверить и затем получить результат.
Однако вы должны иметь в виду, что существует два возможных сценария:
В случае, если вам действительно нужно проверить, где что-то существует в базе данных, но не нужны данные, тогда (при условии, что имя пользователя имеет уникальный индекс на нем):
$sql = "SELECT 1 FROM users WHERE username = ?"; $result = $db->prepare($sql); $result->execute(array('administrator')); echo $result->fetchColumn() ? 'true' : 'false';
Но часто вам нужны сами данные, если это происходит. В этом случае вы просто выбираете эти данные :
$sql = "SELECT * FROM users WHERE username = ?"; $result = $db->prepare($sql); $result->execute(array('administrator')); $user = $result->fetch(); echo $user ? 'true' : 'false';
Я подчеркиваю это, потому что формулировка другого ответа предполагает, что вам нужно выполнить 2 запроса: один для проверки существования и один для получения данных, что является бессмыслицей.
Что rowCount()
метода rowCount()
– вам это слишком редко нужно говорить .