Это сводит меня с ума, у меня есть функция входа в систему, которая проверяет правильность учетных данных пользователя, а также проверяет, является ли поле «активации» для этого пользователя пустым (если оно не было, оноозначает, что они еще не активированы и поэтому не должны быть в состоянии войти).Если все эти условия в порядке, он возвращает идентификатор пользователя в переменной, а если нет, то возвращает false
.
Функция
Функция работает правильно до тех пор, пока я не добавлюоператор if, который проверяет, является ли переменная $activation
пустой, используя empty()
.Если поле действительно пустое, оно возвращает user_id, как и положено, но если поле не пустое и все еще содержит код активации в 40 символов - оно также позволяет пользователю войти в систему. Что смешно.
Вот функция входа в систему (с удалением ненужных частей):
function loginCheck($email, $password) {
$stmt = $dbh->prepare("SELECT `salt`,`activation` FROM `users` WHERE `email`= :email LIMIT 1");
$stmt->bindParam(':email', $email);
$stmt->execute();
if ($stmt->rowCount() == 1) {
$salt = $stmt->fetchColumn(0);
$activation = $stmt->fetchColumn(1);
if (empty($activation)) {
// another few unrelated tasks and query here to grab user id which is returned below
if ($stmt->execute()) {
return $stmt->fetchColumn(1); // the returned user ID
} else {
return false;
}
} else {
return false; // It should return this false here because the field IS NOT empty!
}
} else {
return false;
}
}
1) Я выполнил первый запрос вручную, и он фактически выбралполя salt
и activation
безупречно.
2) Я проверил, чтобы убедиться, что столбец, выбранный и примененный к переменной $activation
, правильный, это второй столбец, поэтому $activation = $stmt->fetchColumn(1)
Это хорошо.
Страница
Теперь на странице login.php
, которая вызывает вышеуказанную функцию, приведен код, относящийся к вызову функции и входу в нее:
$login = loginCheck($email, $password);
if ($login === false) {
$errors[] = 'Unable to log you in';
}
if (!empty($errors)) {
foreach ($errors as $error) {
echo $error, '<br />';
}
} else {
$_SESSION['user_id'] = $login;
header('Location: you/default.php');
exit();
}
I 'Я посмотрел и посмотрел и не могу найти никаких ошибок.С какой стати это происходит?
РЕДАКТИРОВАТЬ
Поле активации в моей таблице MySQL установлено на varchar(40)
с сопоставлением utf8_general_ci
, и так как поле активации заполнено числамии буквы, я предполагаю, что это строка.
И да, возвращаемый user_id - это тот, который относится к входу пользователя в систему, так что это правильно.