我有一个名为getUser
的方法,如果参数中提供的用户名存在,它只会从数据库中获取一条记录。方法如下:
public function getUser($username)
{
$userInfo = array(
'username' => $username
);
if ( ! $stmt = $this->Connection()->prepare("SELECT * FROM " . $this->_info['Prefix'] . "users
WHERE `".implode("`, `", array_keys($userInfo))."` = ?"))
{
echo 'Prepare Failed: ' . $stmt->error . '<br />';
return FALSE;
}
if ( ! $stmt->bind_param('s', $userInfo['username']))
{
echo 'Bind Failed: ' . $stmt->error . '<br />';
return FALSE;
}
if ( ! $stmt->execute())
{
echo 'Execute Failed: ' . $stmt->error . '<br />';
return FALSE;
}
$stmt->store_result();
if ($stmt->num_rows == 0)
{
$this->_user['exists'] = FALSE;
}
else
{
$this->_user['exists'] = TRUE;
}
$stmt->bind_result($username, $password);
$stmt->fetch();
$this->_user['username'] = $username;
$this->_user['password'] = $password;
$stmt->close();
return $this->_user;
}
正如您在方法末尾看到的,我返回了_user
数组,该数组在另一个名为checkPassword
的方法中使用。这就是一切出错的地方,我的意思是密码是NULL
。为了确保这不是查询中的错误,我输出了用户名(从getUser
方法返回),并且它是正确的。因此,我知道查询正在执行并存储值,但是密码将以NULL
的形式返回。以下是checkPassword
方法:
public function checkPassword($username, $password)
{
$info = $this->getUser($username);
if ($info['exists'] == FALSE) {
exit('The specified user does not exist!');
}
if (password_verify($password, $info['password']))
{
echo 'YAY';
}
else
{
echo 'NAY';
}
}
正如你可能猜到的那样,即使密码是正确的,我得到的输出也是NAY
。当我检查$info['password']
的值时,它只是NULL
。
为什么密码返回为NULL
?
您应该将查询从以下位置更改:
"SELECT * FROM "
至
"SELECT username, password FROM "
现在,如果用户表中有更多列,则可以在getUser()
函数中为$password
和$username
变量分配另一个字段