Мой скрипт входа в PHP выдаёт следующую ошибку - PullRequest
0 голосов
/ 19 октября 2018

У вас ошибка в синтаксисе SQL;проверьте руководство, соответствующее вашей версии сервера MariaDB, чтобы найти правильный синтаксис для использования рядом с 'password =' ​​$ 2y $ 10 $ QV6 '' в строке 1

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

<?php

$tbl_name = "user_accounts"; // Table name

// Connect to server and select database.
$mysqli = new mysqli("localhost", "root", "", "ems");

// email and password sent from form
$email = $_POST['email'];
$password = $_POST['password'];

if (!$_POST['email'] | !$_POST['password']) {
    print "<script>alert('Your email & password do not match!');
    javascript:history.go(-1);</script>";
    exit;
}

// To protect MySQL injection
$email = stripslashes($email);
$password = stripslashes($password);
$email = mysqli_real_escape_string($mysqli, $email);
$password = mysqli_real_escape_string($mysqli, $password);

$hash = password_hash($password, PASSWORD_BCRYPT);

$sql = "SELECT account_type, email and password FROM $tbl_name WHERE email='$email', password='$hash'";
$mysqli_result = mysqli_query($mysqli, $sql) or die(mysqli_error($mysqli));

// Mysql_num_row is counting table row
$count = mysqli_num_rows($mysqli_result);

// If result matched $email and $password, table row must be 1 row

if ($count == 1) {

    // Register $email, $password and redirect to file "index.php"
    $_session['email'] = $email;
    $_session['password'] = $password;

    //Checking User Account Type
    if ($_SESSION['account_type'] == 'user') {
        header("location:user.php");
    } else if ($_SESSION['account_type'] == 'admin') {
        header("location:admin.php");
    } else {
        print "<script>alert('This Account Doesn't Exist!');
            javascript:history.go(-1);</script>";
        exit;
    }
} else {
    echo "Wrong email or Password";
}
?>

Ответы [ 3 ]

0 голосов
/ 19 октября 2018

password_hash генерирует каждый раз новый хеш, даже с тем же значением.

Ваш запрос должен только запросить электронную почту, а затем выполнить password_verify($password, $passwordFromQuery).

Подробнее о password_hash() здесь и о password_verify() здесь

Я бы рекомендовал использовать подготовленные заявления.Подробнее об этом здесь

0 голосов
/ 19 октября 2018

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

$sql="SELECT account_type, email and password FROM $tbl_name WHERE email='".$email."', password='".$hash."'";
    $mysqli_result=mysqli_query($mysqli, $sql) or die(mysqli_error($mysqli));
0 голосов
/ 19 октября 2018

Несколько проблем здесь:

  1. Вы не разделяете условия с помощью запятой, вместо этого вы используете AND
  2. Вы не можете проверить хеш пароля таким, каким он будеткаждый раз отличается, так как соль генерируется динамически.Вместо этого вы должны получить пароль из строки и использовать функцию сравнения паролей password_verify().
  3. . Вы должны использовать подготовленный оператор вместо экранирования ввода, чтобы избежать внедрения sql.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...