如果使用Fetch,则无法对PHP中的Prepared语句进行Fetch_Assoc()操作,num_rows变为零

时间:2018-12-18 11:15:37

标签: php prepared-statement

public function Login($username, $pass){
    if(!empty($username) && !empty($pass)){
        $user = $this->link->prepare("SELECT username, pass FROM users WHERE username=? AND pass=?");
        $user->bind_param("ss", $username, $pass);
        $user->execute();

        $row=$user->fetch_assoc();

        If($user->num_rows==1){         
            session_start();
            $_SESSION['name']=$row['username'];
            $_SESSION['name']=true;
            header("Location: admin.php");                  
        }else{
            echo "Invalid Username and Password";   
        }   

    }else{
        echo "Empty Login Details";
    }
}

num_row = 0的测试,因为结果现在在关联数组中, 当我使用Fetch()时,num_rows正确为1,但是我无法访问该数组以将$row['username']分配给会话变量。

1 个答案:

答案 0 :(得分:1)

您的第一个问题是您没有得到结果,我的意思是您缺少mysqli_stmt::get_result

您的代码应该是

$user->bind_param("ss", $username, $pass);
$user->execute();
$result = $user->get_result();

if($result->num_rows === 1){
    $row = $result->fetch_assoc()
    $_SESSION['name']=$row['username'];
    header("Location: admin.php");
}else{
    echo "Invalid Username and Password";   
}  

如果没有返回正确的行,为什么要提取?

您正在此处覆盖会话

$_SESSION['name']=$row['username'];
$_SESSION['name']=true;

最后一个会话$_SESSION['name']覆盖了第一个会话。