从普通MySQL切换到PDO,但无法使登录过程正常工作


Switched from normal MySql to PDO but can't get the login process to work

好吧,就像我在标题中所说的那样,我决定使用 PDO 方法而不是 mysql_query 等方法,但由于某种原因它不断返回信息不正确,我不完全熟悉可能出现的问题,因为这是第一次使用 PDO,谁能告诉我出了什么问题?法典:

    $user = $user;
    $pass = sha1($pass);
    $sql = "SELECT COUNT(*) FROM users WHERE `username` = :username and `password` = :password";
    $result = $db->prepare($sql);
    $result->execute(array(":username"=>$_POST['username'], ":password"=>$_POST['pass']));
    $num=$result->fetchColumn();
    if($num == 0)
    {
        $message="The information you entered is incorrect";
    }
    else
    {
        $_SESSION['pass'] = $pass;
        $num = $result->fetch(PDO::FETCH_ASSOC);
        while($row = $num)
        {
            $username = $row['username'];
            $id = $row['id'];
        }
        $_SESSION['username'] = $username;
        $_SESSION['id'] = $id;
        if($remember == "yes")
        {
            setcookie("id_cookie", $id, time()+60*60*24*100, "/");
            setcookie("pass_cookie", $pass, time()+60*60*24*100, "/");
        }
        header("Location: home.php");

如果未找到结果,则返回下一列(或通过列号参数指定(fetchColumn() false。根据文档中的返回值格式,这通常是一个字符串。

通过松散比较

(将任何字符串与此处找到的松散比较表中的0匹配(,如果$num = 'any string'; fetchColumn()的输出,则$num == 0计算结果为 true

我相信您希望使用rowCount()

$num = $result->rowCount();
if($num == 0) {
    // ...

但是,文档中的警告:

如果关联的 PDOStatement 执行的最后一个 SQL 语句是 SELECT 语句,则某些数据库可能会返回该语句返回的行数。但是,并非所有数据库都保证此行为,便携式应用程序不应依赖此行为。

COUNT(*)总是会以一个结果返回,所以$num最终总是1.

如果要获取COUNT(*)的值,可以更轻松地将其分配给别名:

$sql = "SELECT COUNT(*) AS found_rows FROM users WHERE `username` = :username and `password` = :password";

然后获取该值:

$num = $result->fetch(PDO::FETCH_OBJ)->found_rows;

正如@Mario指出的,你自己说,你的代码确实有一些严重的逻辑问题。解释每个错误需要花费太多时间,但这里有一个更好的修订版,可以帮助您朝着正确的方向前进:

$sql = "SELECT * FROM users WHERE `username` = :username and `password` = :password";
$result = $db->prepare($sql);
$result->execute(array(":username"=>$_POST['username'], ":password"=>$_POST['pass']));
$user = $result->fetch(PDO::FETCH_OBJ); // Returns false-y value if data set is empty
if(empty($user))
{
    $message="The information you entered is incorrect";
}
else
{
    $pass = sha1($user->password);
    $_SESSION['pass'] = $pass;
    $username = $user->username;
    $id = $user->id;
    $_SESSION['username'] = $username;
    $_SESSION['id'] = $id;
    if($remember == "yes")
    {
        setcookie("id_cookie", $id, time()+60*60*24*100, "/");
        setcookie("pass_cookie", $pass, time()+60*60*24*100, "/");
    }
    header("Location: home.php");
}