首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Php登录password_verify

Php登录password_verify
EN

Stack Overflow用户
提问于 2017-02-15 23:04:21
回答 2查看 5.1K关注 0票数 2

我正在学习如何使用预准备语句,我想我应该尝试一个使用password_hash()password_verify(函数的登录系统(简单)。我已经成功地在使用准备好的状态表中插入了数据,现在我希望验证密码并与用户一起做一些事情。

在这个阶段,我似乎得到了失败的消息:

代码语言:javascript
复制
$stmt = $conn->prepare("SELECT username, password FROM users WHERE username = ?");
$stmt->bind_param('s', $username);

$username = $_POST['ulogin'];
$password = $_POST['upassword'];

$stmt->execute();
$stmt->bind_result($username, $password);



$row = $stmt->fetch();
if ($stmt->num_rows == 1) {
    if (password_verify($password, $row['user_password'])) {
        echo 'success';
    }
} else {
 echo "Wrong data";
}

$stmt->close();
$conn->close();

如果我执行var_dump($stmt->fetch());,并且登录用户名正确,则返回的结果为bool(true)

我不确定现在如何尝试验证密码。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-02-15 23:29:53

代码语言:javascript
复制
<?php

$stmt = $conn->prepare("SELECT username, password FROM users WHERE username = ?");
$stmt->bind_param('s', $username);

$username = $_POST['ulogin'];
$password = $_POST['upassword'];

$stmt->execute();
$stmt->bind_result($username, $password);
$row = $stmt->fetch(); //fetch DB results


if (!empty($row)) { // checks if the user actually exists(true/false returned)
    if (password_verify($_POST['upassword'], $row['password'])) {
        echo 'success'; // password_verify success!
    } else {
    echo 'failed';
    }
} else {
    echo "This user does not exist"; //email entered does not match any in DB
}

$stmt->close();
$conn->close();

您不一定需要检查行数。如果口令由于任何原因没有被验证,我也有一个else语句

票数 5
EN

Stack Overflow用户

发布于 2017-02-15 23:14:58

这是你的一个问题:

代码语言:javascript
复制
$password = $_POST['upassword'];
...
$stmt->bind_result($username, $password);
...
if (password_verify($password, $row['user_password'])) {

您正在覆盖您的$password变量,因此它不再是已提交的值。

使用POST值应该可以解决这个问题:

代码语言:javascript
复制
 if (password_verify($_POST['upassword'], $row['user_password'])) {

代码语言:javascript
复制
 if (password_verify($_POST['upassword'], $password)) {

因为您已经将结果中的密码绑定到该变量。

此外,如果您的用户名在数据库中是唯一的,则可以替换:

代码语言:javascript
复制
$row = $stmt->fetch();
if ($stmt->num_rows == 1) {

通过以下方式:

代码语言:javascript
复制
if ($row = $stmt->fetch()) {
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42252986

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档