Php $result每次都显示为true

Php $result每次都显示为true,php,pdo,Php,Pdo,我刚开始学习PDO function authenticate($username,$password) { $result=$this->con->query("select * from user where UserName='".$username."' AND Password='".$password."'"); var_dump($result->rowCount()); //return null if($result)

我刚开始学习PDO

 function authenticate($username,$password)
 {
    $result=$this->con->query("select * from user where UserName='".$username."' AND Password='".$password."'");
    var_dump($result->rowCount()); //return null
    if($result)
        echo "hey going great";
    else
        echo "Hey are you gone mad?";
}
我用用户名和密码调用上述函数。。。但是它每次都会返回嘿,非常好如果我也会传递错误的用户名和密码

我尝试了$result->rowCount(),但它也返回空值

你能告诉我我做错了什么吗

if($result->rowCount()>0){
        echo "hey going great";
    }else{
        echo "Hey are you gone mad?";
}
这将始终检查变量是否有任何信息。在这个变量中运行查询和存储时,它将存储返回的行数。即使它是错误的,它也会返回一个设置变量的负值


基本上,如果您的只是检查变量是否存在,那么它在这两种情况下都存在

假设
$this->con
PDO
的一个实例:

  • PDO->query()
    仅返回
    false
    on
  • $result
    将是的实例,其计算结果始终为
    true
  • 返回受相应PDOStatement对象执行的最后一条DELETE、INSERT或UPDATE语句影响的行数

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

编辑:顺便说一句,如果您使用(&bound参数)而不是
PDO->query()

,您的应用程序会更安全,您可以尝试如下操作:

$result=$this->con->query("select * from user where UserName='".$username."' AND Password='".$password."'");
    var_dump($result->rowCount()); //return null
    $num_row=$result->rowCount();
    if($num_row > 0)
        echo "hey going great";
    else
        echo "Hey are you gone mad?";

你几乎每件事都做错了

首先,使用PDO的唯一原因是在查询中使用占位符。
您不应该在函数中正确地检查查询结果。那么,去吧

function authenticate($username,$password)
{
    $sql = "SELECT * FROM user WHERE UserName=? AND Password=?";
    $stm = $this->con->prepare($sql);
    $stm->execute([$username,$password]);
    return $stm->fetch();
}
然后打电话

if($userdata = $user->authenticate($username,$password))
    echo "hey going great";
else
    echo "Hey are you gone mad?";

它将返回行数而不是字符串!=''还有=空值是相同的。不是吗?在select语句中,不影响行是吗??那么?你没有做错什么。查询执行正常(因此,
$result
变量为true)。我强烈建议您阅读可以检查的内容,即是否有1行(或更多?)行,然后运行
Hey going great
@BeatAlex我尝试通过$result->rowCount()进行检查,但在这两种情况下(真数据和假数据)。。如何检查?SQL注入是一种需要避免的事情
if($userdata = $user->authenticate($username,$password))
    echo "hey going great";
else
    echo "Hey are you gone mad?";