#php #mysql
#php #mysql
Вопрос:
Я следую руководству по API (аутентификация пользователя), но я довольно новичок в SQL, поэтому есть некоторые вещи, которые я не понимаю. Я искал ответ, и, насколько я знаю, предложение LIMIT имеет смещение (0 в данном случае) и количество (1 в данном случае). Это код (внутри пользовательского класса):
function emailExists(){
// query to check if email exists
$query = "SELECT id, firstname, lastname, password
FROM " . $this->table_name . "
WHERE email = ?
LIMIT 0,1";
// prepare the query
$stmt = $this->conn->prepare( $query );
// sanitize
$this->email=htmlspecialchars(strip_tags($this->email));
// bind given email value
$stmt->bindParam(1, $this->email);
// execute the query
$stmt->execute();
// get number of rows
$num = $stmt->rowCount();
// if email exists, assign values to object properties for easy access and use for php sessions
if($num>0){
// get record details / values
$row = $stmt->fetch(PDO::FETCH_ASSOC);
// assign values to object properties
$this->id = $row['id'];
$this->firstname = $row['firstname'];
$this->lastname = $row['lastname'];
$this->password = $row['password'];
// return true because email exists in the database
return true;
}
// return false if email does not exist in the database
return false;
}
Я понимаю, что запрос начинает искать похожее электронное письмо с самого начала (строка 0), но тогда я не понимаю, почему они привязывают 1 к электронному письму.
Обязательно ли использовать ОГРАНИЧЕНИЕ здесь? почему нельзя просто использовать предложение, ГДЕ email = :email (и привязать :email к электронной почте, отправленной пользователем?)
Комментарии:
1. dev.mysql.com/doc/refman/8.0/en/limit-optimization.html
2. Кстати, это не очищает
htmlspecialchars(strip_tags($this->email));
. Он подготавливает строку для вывода в HTML, что не имеет смысла в том месте, где она у вас есть.
Ответ №1:
Запрос проверяет, существует ли только электронная почта. Если есть больше записей с одним и тем же адресом электронной почты, для выполнения инструкции требуется больше ресурсов. Если есть хотя бы одна запись, это означает, что электронная почта существует. Нет необходимости проверять больше.
Этот случай не показывает это четко, но представьте, что у вас есть таблица с миллионами записей, и вы хотите проверить, существует ли одно конкретное значение, которое может отображаться в нескольких записях. Вы можете заморозить базу данных, если запрос слишком сложный / слишком много таблиц объединены и т.д. Вам нужно только проверить, поэтому вы ограничиваете его 1. Это хорошая практика для запросов такого типа.