我对PHP很新,并且一直在关注Lynda.com教程(尽管他们仍然使用mysql而不是mysqli或PDO)。
我在使用从查询中获得的数据时遇到问题。
我以我的登录页面为例,省去了连接到db部分:
$login_username = trim(htmlspecialchars($_POST['username']));
$password = trim(htmlspecialchars($_POST['password'])); // from login form
$stmt = $db->prepare("SELECT * FROM users
WHERE username = :login_username");
$stmt->bindParam(':login_username', $login_username);
$stmt->execute();
$result = $stmt->fetch(PDO::FETCH_ASSOC);
if($stmt->rowCount() > 0 && $result = password_verify($password,$result['hashed_password'])) {
$_SESSION['logged_in_id'] = $result['id'];
$_SESSION['logged_in_username'] = $login_username; //this was the only way I could pass the username as I could not get it from $result['username']
$_SESSION['first_name'] = $result['first_name'];
$_SESSION['last_name'] = $result['last_name'];
没有任何内容传递给会话,也没有错误。我也无法回应$ result的价值。如果我只是尝试回显$ result,那么我只得到值1
请帮忙!
答案 0 :(得分:1)
你的问题是:
... && $result = password_verify($password,$result['hashed_password'])
请注意,$result
是一个数组,其中包含您刚刚提取的行,并且您在此处为其指定了一个新值;您正在覆盖$result
变量,因此之后的所有作业都将失败。
您可能需要以下内容:
... && password_verify($password,$result['hashed_password'])
另请注意,您不应该依赖rowCount()
,因为这不一定是您对SELECT
语句的期望。
当您正在获取一行时,您可以执行以下操作:
if ($result && password_verify($password,$result['hashed_password']))
如果没有结果,则永远不会检查第二个条件,因此不会导致警告或错误。