$dbh->query
适用于$queryUser = $dbh->query
,但不适用于$querySessions = $dbh->query
,$querySessions
为空,
echo $querySessions == null;
回声1
然后
致命错误:在非对象中调用成员函数fetchAll() /path/to/file.php在线(while(count($ querySessions-> fetchAll())!= 0))
if($_POST['loginbtn'])
{
$User = $_POST['user'];
$Pass = md5(md5("salt" . $_POST['pass'] . "salt2"));
if($User)
{
if($_POST['pass'])//not $Pass because thats hashed
{
$queryUser = $dbh->query("SELECT * FROM `Users` WHERE `UserName` = '" . base64_encode($User) . "' LIMIT 1");
$Record = $queryUser->fetch();
if($Pass != $Record["Password"])
{
echo "Incorect password.";
}
else
{
if($Record["Banned"] == 1)
{
echo "Sorry, your banned.";
}
else
{
if($Record["NeedsActivation"] == 1)
{
echo "You must activate your account before you can login.";
}
else
{
$SID = md5(rand(0,0x7fffffff) . "salt3");
$querySessions = $dbh->query("SELECT * FROM `Sessions` WHERE `ID` = " . $SID . " LIMIT 1");
echo $querySessions == null;
while(count($querySessions->fetchAll()) != 0)
{
$SID = md5(rand(0,0x7fffffff) . "salt2");
$querySessions = $dbh->query("SELECT * FROM `Sessions` WHERE `ID` = " . $SID . " LIMIT 1");
}
$_SESSION['id'] = $SID;
$dbh->query("INSERT INTO `godzchea_Site`.`Sessions` (`ID` ,`UserID`)VALUES ('" . $SID . "', '" . $Record["ID"] . "');");
echo base64_decode($Record["UserName"]) . " Logged in.";
}
}
}
}
else
{
echo "You must enter your password.";
}
}
else
{
echo "You must enter your username.";
}
}
任何人都可以看到为什么它被设置为null, 如果有一个更好的循环方式,直到我得到一个空的id。
答案 0 :(得分:1)
问题在于,与$querySession
关联的查询是失败的。可能是您的查询中存在错误,因为手册中说的是:
PDO::query() returns a PDOStatement object, or FALSE on failure.
我不确定,但也可能没有找到任何行。 我可以给你一个建议,找出真正的错误是什么:
try{/*code in here*/}catch(PDOException $e){ exit($e->getMessage()); }
,并查看输出内容。$SID
的查询和值,并尝试将其直接运行到phpmyadmin数据库中。 请注意,致命错误还与您的查询返回false而不是对象的事实有关。这些错误只是说您将$querySession
视为对象,但事实并非如此。
如需更多信息,请发表评论,我会回答。
祝你好运。