2013-01-23 7 views
2

У меня есть код здесь, который возвращает «Имя пользователя неправильное» при вводе его, когда он должен выводить «Неправильный пароль», потому что я просто добавляю правильное имя пользователя, но неверный пароль.Проверка имени пользователя и пароля из datatabase

if ($_POST['login']) { 
    $username = strip_tags($_POST['username']); 
    $password = strip_tags($_POST['password']); 
    $fetchme = $dbc->query('SELECT * FROM users WHERE username="$username"'); 
    while($row = $fetchme->fetch(PDO::FETCH_ASSOC)) { 
     $lastlogin = $row['lastlogin']; 
    } 
    if (!$username||!$password) { 
     echo '<center>Please enter a valid username and password</center>'; 
    }else{ 
     $login = $dbc->query('SELECT * FROM users WHERE username="$username"'); 
     $num_rows_login = ($login->fetchColumn() > 0) ? true : false; 
     if ($num_rows_login == 0) { 
      echo "<center>Username doesn't exist</center>"; 
     }else{ 
      while($login_row = $login->fetch(PDO::FETCH_ASSOC)) { 
       $password_db = $login_row['password']; 
       $password_db2 = hash('sha512', $password); 
       if ($password_db2 != $password_db) { 
        echo '<center>Incorrect password</center>'; 
       } 
      } 
     }  
    } 
} 

Это мой первый опыт использования PDO. Любая помощь приветствуется!

+0

Вашего синтаксис SQL является неправильным. Вы должны получить сообщение об ошибке. Если вы используете PDO, также используйте подготовленные инструкции. – mario

+3

Не делайте 'strip_tags()' на пароле; это не имеет смысла, особенно потому, что вы все равно сохранили бы его до хранения. И почему вы повторяете запрос? –

ответ

0

Прежде всего, не используйте strip_tags() по именам пользователей или паролям; они не служат никакой цели, и вы должны просто избегать их должным образом в SQL (или использовать подготовленные инструкции).

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

В-третьих, не делайте различия между несуществующим именем пользователя и неверным паролем; они должны оба дать одно и то же сообщение «неверное имя пользователя или пароль».

Вот быстрый переписан:

$stmt = $dbc->prepare('SELECT * FROM users WHERE username=?'); 
$stmt->execute(array($username)); 
// fetch all records and take first one (returns false in case of no rows) 
$user = current($stmt->fetchAll(PDO::FETCH_ASSOC)); 
// validate record 
if ($user === false || hash('sha512', $password) !== $user['password']) { 
    echo '<center>Invalid username or password</center>'; 
} else { 
    echo 'yay, you are the man'; 
} 

Наконец, прочитать об этом для лучшего хэширования паролей:

How do you use bcrypt for hashing passwords in PHP?

Смежные вопросы