Проверка базы данных MySQL

это мой код

$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 - Будет отображен правильный пароль, а имя пользователя будет присвоено переменной сеанса.

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

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


person SteppingHat    schedule 06.01.2012    source источник
comment
Что-то перепутано. Проверьте строку $row['pass'] = $setpassword;. Скорее всего, вы имели в виду ЧИТАТЬ из $row, а не переопределять значения.   -  person yankee    schedule 07.01.2012
comment
нет. все, что нужно сделать, это установить пароль, который был в той же строке, что и имя пользователя, в качестве переменной $setpassword   -  person SteppingHat    schedule 07.01.2012
comment
@yankee: Я тоже об этом подумал, как вы можете видеть в моем ответе ниже. SteppingHat, кажется, у вас есть 3 значения пароля: пароль формы $_post, пароль базы данных, а затем $setpassword. Зачем тебе три?   -  person Matt Moore    schedule 07.01.2012
comment
Как заметил кто-то другой, вам следует подумать о очистке ваших значений с помощью такой функции, как mysql_escape_string, чтобы избежать инъекции БД, которая может сильно испортить все.   -  person DaOgre    schedule 07.01.2012


Ответы (3)


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

$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.

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

person Matt Moore    schedule 06.01.2012
comment
Да, это. Это лучший способ решить проблему с двойным именем пользователя. Также вы спросили, как проверить, существует ли имя пользователя. Я предоставил это. Если вы применяете код, оператор else обеспечивает ситуацию, когда имя пользователя не выходит. - person Matt Moore; 07.01.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;
   }
}
person Alin    schedule 06.01.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';

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

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

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

по крайней мере так:

$username = mysqli_real_escape_string($db,$_POST['user']);
person Your Common Sense    schedule 06.01.2012