Php 非对象上的fetch()

Php 非对象上的fetch(),php,pdo,mysqli,Php,Pdo,Mysqli,我一直收到相同的错误消息… 致命错误:对非对象调用成员函数fetch() 我试过: -正在从“:user”和“:pass”中删除引号 -将fetch()更改为fetchAll() -使用PDO::FETCH_ASSOC 我似乎找不到一个问题来解决这个问题,它们都是可靠的SQL语句,里面没有变量 $q = $dbh->prepare("SELECT * FROM users WHERE username= ':user' AND password= ':pass' "); $q -&

我一直收到相同的错误消息…
致命错误:对非对象调用成员函数fetch()
我试过:
-正在从“:user”和“:pass”中删除引号
-将
fetch()
更改为
fetchAll()

-使用PDO::FETCH_ASSOC

我似乎找不到一个问题来解决这个问题,它们都是可靠的SQL语句,里面没有变量

$q = $dbh->prepare("SELECT * FROM users WHERE username= ':user' AND password= ':pass' ");
    $q -> bindParam(':user', $username);
    $q -> bindParam(':pass', $password);
    $result = $q -> execute();
    $numrows = count($result);
    echo $numrows;
    if($numrows == 1){
        while($row = $result->fetch(PDO::FETCH_OBJ)){
            $row["id"] = $_SESSION["id"];
            $row["username"] = $_SESSION["username"];
            $row["password"] = $_SESSION["password"];
            $row["email"] = $_SESSION["email"];
        }
    } else {
        header("location: index.php?p=5");
    }

应在PDOstatement对象上使用Fetch

根据报告:

PDOStatement::fetch-从结果集中获取下一行

fetch
函数是PDOStatement对象的成员函数。 手册中的示例:

$sth = $dbh->prepare("SELECT name, colour FROM fruit");
$sth->execute(); //no need in another variable, like: $r = $sth->

/* Exercise PDOStatement::fetch styles */
$result = $sth->fetch(PDO::FETCH_ASSOC); //$sth, not "$r"
另一个注意事项: 关于
execute
的用法,根据,它返回一个布尔值(真/假),而不是一个值数组


我相信您已经使用了mySQL,所以对您来说,到PDO的“迁移”有点奇怪,请参阅手册并遵循一些教程。

删除
用户的引用
传递

$q = $dbh->prepare(" SELECT * FROM users WHERE username= :user AND password= :pass");

问题是,如果失败,它将返回
false
count(false)
实际上是
1
,如果成功,它将返回
true
count(true)
也是
1
,您需要更好的错误检查。@adeneo我确信他们从
mysql\u*
api切换过来,错误地认为pdo语句
execute
也会返回一个结果集,就像
mysql\u query
does一样,当他们说
$result=$q->execute()时
然后,
$result
不是他们认为的那样,它只能是
真/假
execute()
返回一个
bool
而不是结果集。