PHP, если переменная проверки оператора - пустая проблема - PullRequest
1 голос
/ 29 декабря 2011

Это сводит меня с ума, у меня есть функция входа в систему, которая проверяет правильность учетных данных пользователя, а также проверяет, является ли поле «активации» для этого пользователя пустым (если оно не было, оноозначает, что они еще не активированы и поэтому не должны быть в состоянии войти).Если все эти условия в порядке, он возвращает идентификатор пользователя в переменной, а если нет, то возвращает 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 - это тот, который относится к входу пользователя в систему, так что это правильно.

Ответы [ 3 ]

4 голосов
/ 29 декабря 2011

Как вы можете видеть здесь: http://php.net/manual/en/pdostatement.fetchcolumn.php,

Невозможно вернуть другой столбец из той же строки, если вы используете PDOStatement :: fetchColumn () для получения данных.

Это потому, что каждый раз, когда вы вызываете fetchColumn, он будет применяться к строке рядом со строкой, к которой был применен предыдущий вызов.

 $salt = $stmt->fetchColumn(0);
$activation = $stmt->fetchColumn(1);

Второй вызов fetchColumn () работает над строкой, следующей за строкой первого вызова.В вашем случае, поскольку есть только одна строка, fetchColumn () возвращает NULL, поэтому активация выглядит пустой.

Используйте fetch (), чтобы получить массив со всеми значениями строки:

   $row=$stmt->fetch();
   $salt=$row[0];
   $activation=$row[1];
1 голос
/ 29 декабря 2011

Рассмотрим этот подход ..

Колонны

`activation_code` varchar(40) not null,
`activated` tinyint(1) not null default '0',

Теперь создайте функцию активации в другом месте, после завершения обновления активируйте === 1 для пользователя

Когда вы входите в систему, учитывайте:

  1. Проверьте имя пользователя
  2. Проверьте пароль
  3. Проверка активирована === 1
0 голосов
/ 29 декабря 2011

Я думаю, что вы используете тип данных 'char' в базе данных для активации.Так что лучше попробуй этот код.

if (trim($activation)!= "") 
{

}

Ура!

Прасад.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...