Проверка базы данных MySQL - PullRequest
0 голосов
/ 07 января 2012

Это мой код

$username = $_POST['user'];
$password = $_POST['pass'];

if (isset($_POST['user'])); {
    $db = mysqli_connect('localhost', 'root', '', 'db');
    if($query = mysqli_query($db, "SELECT `pass` FROM `accounts` WHERE `user` = '$username'")){
      while($row = mysqli_fetch_assoc($query)){
        $row['pass'] = $setpassword;
      }
      mysqli_free_result($query);
    }
}

То, что он в данный момент делает, это из формы, извлекает имя пользователя и пароль, которые он ввел, берет это имя пользователя и находит строку с этим именем пользователя, получает пароль из этой строки и устанавливает его как переменную $ setpassword. Ниже приведен код для проверки соответствия пароля указанному имени пользователя в базе данных.

if ($password=='') {
    $verify = 0;
}

if ($password!='') {
    if ($password!=$setpassword) {
        $verify = 1;
    }
    if ($password==$setpassword) {
        $verify = 2;
    }
}

Если проверить ... 0 - Форма входа появится, поскольку ничего не было введено. 1 - Неверный пароль будет отображаться вместе с формой входа. 2 - Будет отображен правильный пароль и имя пользователя будет присвоено переменной сеанса.

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

Что я могу сделать, чтобы проверить, не существует ли имя пользователя в базе данных?

Ответы [ 3 ]

2 голосов
/ 07 января 2012

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

$result = mysqli_query("SELECT * FROM accounts where `user` = $username");

if(mysql_num_rows($result) >0) // if there are any rows returned then the username exists
{ 
    //User Name already exists
}
else
{
   //User name doesn't exist, add user
}

Я не уверен, что именно здесь вы это делаете.Но для устранения дубликатов вы можете сделать это таким образом.Также вы можете определить пользователя столбца как уникального.Таким образом, SQL не допустит дублирования значений.

Также эта строка:

$row['pass'] = $setpassword; //setting $row['pass'] to $setpasswords value.

Это обратное.Вы должны делать это наоборот.

 $setpassword = $row['pass']; //setting setpassword to $row['pass'] value.

Дайте мне знать, если мне нужно что-то прояснить.

0 голосов
/ 07 января 2012
if (isset($_POST['user'])); { 

в этой строке указана лишняя точка с запятой, поэтому весь код не работает

, чтобы выполнить проверку, все, что вам нужно, это восстановить пароль и сравнить его с введенным:

$row = mysqli_fetch_assoc($query));
if ($row AND $row['pass'] == $password)
  $verify = 1;
}

обратите внимание, что $ row может быть достаточно, поэтому вы должны сначала проверить это

однако, вы можете сделать оба сравнения в запросе, как это

"SELECT * FROM accounts where `user` = $username" AND `pass` = '$password';

Однако ваш код страдает от 2 распространенных проблем.

  1. Лучше сохранить хеш вместо простого пароля.

  2. Вы должны очистить ваши данные перед добавлением в запрос

хотя бы так:

$username = mysqli_real_escape_string($db,$_POST['user']);
0 голосов
/ 07 января 2012

Попробуйте это:

$username = isset($_POST['user'])?$_POST['user']:''; // check if isset to avoid notice
$password = isset($_POST['pass'])?$_POST['pass']:'';
$verify = 0; 

if (!empty($username)) {
    $db = mysqli_connect('localhost', 'root', '', 'db');
    if($query = mysqli_query($db, "SELECT `pass` FROM `accounts` WHERE `user` = '$username'")) { 
    while($row = mysqli_fetch_assoc($query)){
       $setpassword = $row['pass'];
       break; // exit the loop once you found the password
    }
    mysqli_free_result($query);    
} 

if (isset($setpassword)) {
   $verify = 1;       
   if ($password == $setpassword) {
      $verify = 2;
   }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...