Сценарий PDO, чтобы получить количество строк не работает? - PullRequest
1 голос
/ 16 августа 2011

Я новичок в PDO PHP (только сегодня).Я тоже пытаюсь написать функцию входа в систему, но она возвращает false, хотя я знаю, что учетные данные верны.

Я думаю, что это попытка получить количество строк, которое запускает скрипт, можетВы помогаете?

function check_login($email, $username, $password)
{
    $host = 'localhost';
    $port = 3306;
    $database = 'example';
    $username = 'root';
    $password = '';

    $dsn = "mysql:host=$host;port=$port;dbname=$database";
    $db = new PDO($dsn, $username, $password);
    $password = md5($password);

    $statement = $db->prepare("SELECT * FROM users WHERE email = ? or username = ? and password = ?");
    $statement->execute(array($email, $username, $password));

    while ($result = $statement->fetchObject()) {
        $sql = "SELECT count(*) FROM users WHERE email = ? or username = ? and password = ?";
        $result1 = $db->prepare($sql);
        $result1->execute(array($email, $username, $password));
        $number_of_rows = $result1->fetchColumn();
        if ($number_of_rows == 1)
        {

            $_SESSION['login'] = true;
            $_SESSION['uid'] = $result->uid;
            return TRUE;
        }
        else
        {
            return FALSE;
        }
    }
}

1 Ответ

1 голос
/ 16 августа 2011
  1. Это:

    WHERE email = ? or username = ? and password = ?
    

    ... равно этому:

    WHERE email = ? or (username = ? and password = ?)
    

    ... из-за приоритета оператора . Это означает, что если вы проводите проверку с помощью адреса электронной почты, вы не обязаны указывать действительный пароль для входа.

  2. Как только вы узнали, существует ли пользователь, вы делаете второй запрос, чтобы подсчитать количество подходящих пользователей. Таблица базы данных не должна содержать дублирующих пользователей! Столбцы username и email должны быть определены как уникальные индексы.

  3. Нет смысла использовать цикл while, если он будет return в первой итерации. Это может работать, но это сбивает с толку.

Этого должно быть достаточно:

$statement = $db->prepare('SELECT uid FROM users WHERE (email = ? or username = ?) and password = ?');
$statement->execute(array($email, $username, $password));

if ($result = $statement->fetchObject()) {
    $_SESSION['login'] = true;
    $_SESSION['uid'] = $result->uid;
    return TRUE;
}else{
    return FALSE;
}

Редактировать: Кстати, вы не должны хранить пароли в виде простого текста. Бесчисленные сайты были взломаны, а их пароли украдены. Google для соленые пароли .

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