Да, вы используете подготовленный оператор с параметром.Это правильная вещь.Параметры - лучший способ написать безопасные операторы SQL в большинстве случаев.Есть только несколько крайних случаев, когда они не помогают (см. Мой ответ на насколько безопасны подготовленные PDO заявления )
Я могу предложить некоторые небольшие изменения, основанные на том, как я написал быcode.
$sql = "SELECT id, password FROM users133 WHERE username=:username";
Избегайте SELECT *
, всегда четко указывайте свои столбцы.См.
$stmt = $db->prepare($sql);
$stmt->execute(['username' => $username]);
Если вы включили исключения PDO, это нормально, потому что любая ошибка SQL прерывает код и выдает исключение.Но если вы не включили исключения, вы всегда должны проверять возвращаемое значение как prepare()
, так и execute()
.См. http://php.net/manual/en/pdo.error-handling.php и http://php.net/manual/en/pdo.errorinfo.php
Синтаксис array()
взят из старых версий PHP, а начиная с PHP 5.4 вы можете использовать более короткий синтаксис в квадратных скобках.
Вам не нужно использовать :
в своем ключе для параметра PDO.Только в строке SQL.В старых версиях PDO вам нужно было :
в обоих местах, но не больше.
while (row = $stmt->fetch()) {
$hash = $row['password'];
if (password_verify($password, $hash)) {
$_SESSION['loggedIn'] = $row['id'];
header("location: ?page=profile");
}else{
header("location: ?page=loginfailed");
}
}
header("location: ?page=loginfailed");
Вышеприведенное позволяет избежать вызова rowCount()
.Если строк нет, то while()
естественным образом завершается без выполнения одного цикла, а затем он переходит к последнему вызову header()
.
Я предпочитаю избегать вызова rowCount()
, потому что запоминать, когдаэто работает, и когда это не работает.rowCount()
вернет 0 до того, как клиент извлечет все строки с сервера MySQL.Иногда выполнение запроса неявно извлекает все строки в память клиента, а затем вызывает fetch()
, просто перебирая их.Это называется буферизованным запросом.Но небуферизованные запросы полезны, если в вашем результате будет слишком много строк для буферизации.Так что не всегда ясно, когда rowCount()
вернет точный счет.