在PHP中,“只有变量应该通过引用传递”是什么意思?

时间:2018-02-06 22:52:52

标签: php database pdo

代码:

public function login($email , $password){
    $stmt =$this->pdo->prepare("SELECT 'user_id' FROM 'users' WHERE 'email' = :email AND 'password' =: password");
     $stmt->bindParam(":email", $email, PDO::PARAM_STR);
     $stmt->bindParam(":password", md5($password), PDO::PARAM_STR);
     $stmt->execute();

     $users = $stmt->fetch(PDO::FETCH_OBJ);
     $count = $stmt->rowCount();

     if($count > 0) {
        $_SESSION['user_id'] = $user->user_id;
        header('Location : home.php');
        }else {
           return false;

        }
  }
}

错误:

  

注意:在第18行的C:\ xampp8 \ htdocs \ social \ core \ classes \ user.php中只能通过引用传递变量

     

警告:PDOStatement :: execute():SQLSTATE [HY093]:参数号无效:绑定变量数与C:\ xampp8 \ htdocs \ social \ core \ classes \ user.php中的令牌数量不匹配19

1 个答案:

答案 0 :(得分:2)

如果这是您的实际代码,则您的命名占位符=: password和标题Location : home.php中会有空格,这些空格会在列名称周围计算并使用单引号(错误的identifier qualifiers)而不是刻度,但不管怎样它们都是不需要的,因为SQL会抱怨没有任何列名称。

注意:$user->user_id; - $user没有引用且未定义,您希望在此处使用$users。您的代码末尾还有一个额外的}大括号,并且不确定您是否还有其他任何内容。如果没有,请将其删除。

请参阅有关密码参考的“编辑”。

public function login($email , $password){
    $stmt =$this->pdo->prepare("SELECT user_id FROM users 
                                WHERE email = :email AND password =:password");
     $stmt->bindParam(":email", $email, PDO::PARAM_STR);
     $stmt->bindParam(":password", $password, PDO::PARAM_STR);
     $stmt->execute();

     $users = $stmt->fetch(PDO::FETCH_OBJ);
     $count = $stmt->rowCount();

     if($count > 0) {
        $_SESSION['user_id'] = $users->user_id;
        header('Location: home.php');
        exit; // added to prevent further execution
        }else {
           return false;

        }
  }
} // << that brace should probably not be there.

Magnus的评论中所述,请勿使用MD5。使用password_hash(),因为旧方法陈旧且不安全。当您使用更安全的方法时,请确保密码长度足以容纳哈希值。

还要确保会话数组具有值。如果没有,那么您可能无法使用session_start();启动会话。

修改

如下面的评论中所述,将变量指定给md5($password),而不是将其作为参考传递。

$password = md5($password); // wherever this is coming from.

然后

$stmt->bindParam(":password", $password, PDO::PARAM_STR); // in the code above

如果您还没有这样做,请使用正确的错误处理。