Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/maven/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP登录系统密码不匹配_Php_Mysql_Hash_Login - Fatal编程技术网

PHP登录系统密码不匹配

PHP登录系统密码不匹配,php,mysql,hash,login,Php,Mysql,Hash,Login,我已经建立了一个登录系统,允许用户使用之前定义的电子邮件和密码登录,但是在测试部分,我注意到密码说他们不匹配,尽管我知道他们是正确的,因为我写下了测试一,因为我做了。我似乎不明白为什么会发生这种情况,我想这可能与我对密码的哈希有关,但我不知道是什么原因。登录页面检查来自文档login.php: if(empty($errors)) { $sql = "SELECT accountID, password FROM users WHERE emails=?"; $stmt

我已经建立了一个登录系统,允许用户使用之前定义的电子邮件和密码登录,但是在测试部分,我注意到密码说他们不匹配,尽管我知道他们是正确的,因为我写下了测试一,因为我做了。我似乎不明白为什么会发生这种情况,我想这可能与我对密码的哈希有关,但我不知道是什么原因。登录页面检查来自文档login.php:

    if(empty($errors))
{
    $sql = "SELECT accountID, password FROM users WHERE emails=?";
    $stmt = $pdo->prepare($sql);
    $stmt->execute([$data['email']]);

    if(!$row = $stmt->fetch())
    {
        // email didn't match
        $errors['login'] = "Login failed. on email";
    }
    else
    {
        // email matched, test password
        if(!password_verify($data['password'],$row['password']))
        {
            // password didn't match
            $errors['login'] = "Login failed. on password";
        }
        else
        {
            // password matched
            $_SESSION['user_id'] = $row['accountID'];
            header('location: welcome.php');
            die;
        }
    }
}
从insert.php开始,使用哈希法插入数据库:

    if (isset($_POST['name'])){
        $name = $_POST['name'];
    }
    if (isset($_POST['email'])){
        $email = $_POST['email'];
    }
    if (isset($_POST['password'])){
        $pword = $_POST['password'];
    }
    if (isset($_POST['busName'])){
        $busName = $_POST['busName'];
    }

    if (empty($name)){
        echo("Name is a required field");
        exit();
    }
    if (empty($email)){
        echo ("email is a required field");
        exit();
    }
    if (empty($pword)){
        echo("You must enter a password");
        exit();
    }
    $pword = password_hash($pword, PASSWORD_DEFAULT)."/n";



//insert html form into database
$insertquery= "INSERT INTO  `cscw`.`users` (
`accountID` ,
`businessName` ,
`name` ,
`emails` ,
`password`
)
VALUES (
NULL ,  '$busName',  '$name',  '$email',  '$pword'
);";
在网页上,我从login.php看到登录失败。输入密码。如果您需要查看更多代码,请告诉我。

它无法识别$row['password']。 始终对您的查询进行组织** 1准备 2执行 3取回 4Close 5然后利用获取的数据。 提取的数据需要按照returnArray函数所示进行排序

希望有独特的电子邮件和$data数组存在。试试这个

if(empty($errors))
{

    $sql = "SELECT accountID, password FROM users WHERE emails=:emails";
    $stmt = $pdo->prepare($sql);
    $stmt->bindParam(':emails', $data['email']);
    $stmt->execute();
    $rows = $stmt->fetchAll(PDO::FETCH_ASSOC);
    $stmt->CloseCursor();
    $stmt=null;

    /* Return the results is a more handy way */
    function returnArray( $rows, $string )
    {
       foreach( $rows as $row )
       {
           return $row[ $string ];
       }
    }

   if( empty($rows) )
   {    // email didn't match
       $errors['login'] = "Login failed. on email";
   }
   else
   {      // email matched, test password
       if( !password_verify( $data['password'], returnArray($rows,'password') ) )
       {
          // password didn't match
          $errors['login'] = "Login failed. on password";
       }
       else
       {
          // password matched
          $_SESSION['user_id'] = $row['accountID'];
          header('location: welcome.php');
          die;
       }
   }
}
登录页面未完成,查询未插入。请小心,您可能会受到SQL注入的攻击,因为您不会逃避用户操纵的变量。为了加强安全性,请添加表单验证,这将非常好

您使用了$pword=密码\u哈希$pword,密码\u默认值。/n; 我删除了/n部分。似乎您正在使用连接运算符“.”来添加/n添加密码\u散列的结尾

$insertquery未完成且不可读。您不需要在查询中插入反勾号。无需选择accountID,它将自动递增,以查看数据库中是否勾选了accountID的I。 在登录页面中执行类似操作

/* trim and escape*/
function escapeHtmlTrimed( $data )
{
    $trimed = trim( $data );
    $htmlentities = htmlentities( $trimed, ENT_QUOTES | ENT_HTML5, $encoding = 'UTF-8' );
    return $htmlentities;
}


if ( isset( $_POST['name'] ) ){
    $name = escapeHtmlTrimed( $_POST['name'] );
}
if ( isset($_POST['email']) ){
    $email = escapeHtmlTrimed( $_POST['email'] );
}
if ( isset($_POST['password']) ){
    $pword = escapeHtmlTrimed( $_POST['password'] );
}
if ( isset($_POST['busName']) ){
    $busName = escapeHtmlTrimed( $_POST['busName'] );
}

if ( empty($name) ){
    echo("Name is a required field");
    exit();
}
if ( empty($email) ){
    echo ("email is a required field");
    exit();
}
if ( empty($pword) ){
    echo("You must enter a password");
    exit();
}
/*Remove this your adding "./n"*/
$pword = password_hash($pword, PASSWORD_DEFAULT);



//insert html form into database
$insertquery= "INSERT INTO users (businessName ,name ,emails, 
password) VALUES (:busName , :name, :email , :pword)";
$stmt = $pdo->prepare($insertquery);
$stmt->bindParam(':busName', $busName);
$stmt->bindParam(':name', $name);
$stmt->bindParam(':email', $email);
$stmt->bindParam(':pword', $pword);
$stmt->execute();
$stmt->CloseCursor();
$stmt=null;

$数据从何而来?在密码\u散列中释放此位。/nline@FrankM$data=数组\映射'修剪',$\ POST@但是,您的$insertQuery并没有正确转义,所以这可能会使之前的所有努力付诸东流。这是一个巨人,通常只需要其中一个就可以让人攻击和颠覆你的系统。您的insert查询似乎没有实际执行,因此您可能需要检查它是否实际运行。