调用成员函数非对象

时间:2014-06-19 20:14:47

标签: php mysql sql

我从PHP开始,我需要你的帮助。

我尝试列出与current_member(我指的是连接成员)具有相同兴趣的所有成员。

我写这个:

$current_members = params('current_member');
    $members_all = option('db')->query('SELECT * FROM members WHERE interest = $current_members["interest"] ORDER BY lastname, firstname')->fetchAll();

    set('members_all', $members_all);

当我进入我的页面时,我有错误: 致命错误:在非对象上调用成员函数fetchAll()

在我看来,我只想写下:

 
        <h2 id="member-<?= $member['id'] ?>">

            <?= avatar_tag($member,'30x30') ?>

            <a href="<?=member_url_for($member)?>"><?=$member['firstname']?><small> <?= $member['lastname'] ?></small></a>

        </h2>

我不明白这个错误,任何人都可以帮助我吗?

感谢您的帮助。

3 个答案:

答案 0 :(得分:2)

不要像往常一样将呼叫链接到query()fetchAll()。这是不好的做法。永远不要假设您的查询有效,请务必查看是否有。

$db = option('db');
$query = $db->query('SELECT ...');
if($query === FALSE){
    print_r($db->errorInfo());
    die;
}
$members_all = $query->fetchAll();

(因为你正在调用fetchAll(),我假设你正在使用PDO(而不是MySQLi))

另外,尝试将变量连接到SQL查询中。 (P.S。你甚至没有这样做,你使用单引号,所以$current_members["interest"]不被读作变量)这只是要求SQL注入攻击。你想要做的是使用准备好的陈述。

$db = option('db');
$query = $db->prepare('SELECT * FROM members WHERE interest = ? ORDER BY lastname, firstname');
$exec = $query->execute(array($current_members['interest']));
if($exec === FALSE){
    print_r($query->errorInfo());
    die;
}
$members_all = $query->fetchAll();

答案 1 :(得分:0)

在你的SQL查询中

'SELECT * FROM members WHERE interest = $current_members["interest"] ORDER BY lastname, firstname'

你正在使用单引号,所以$ current_members [“interest”]实际上没有解析为PHP变量,它是一个字符串。您可以切换单引号和双引号:

在这里进行编辑,传递数组偏移并不幸运:

$interest = $current_members['interest'];
"SELECT * FROM members WHERE interest = $interest ORDER BY lastname, firstname"

不幸的是,您没有共享任何底层数据库代码,但假设选项('db')是一个pdo对象,这应该可以正常工作。

如果option('db')确实是pdo,则在执行任何语句之前添加:

option('db') -> setAttribute( \PDO::ATTR_ERRMODE, \PDO::ERRMODE_EXCEPTION );

这会告诉你确切的错误

答案 2 :(得分:0)

“对非对象调用成员函数”错误意味着您正在尝试对不代表对象的变量调用方法。

您在$ members_all denifition上有一个接一个地调用以下方法: 选项( 'DB') - &GT;查询( “...”) - &GT;使用fetchall();

使用某些SQL查询调用任何返回选项('db')的方法“query”,然后调用fetchAll()方法返回“query”方法返回的任何内容。

我不知道自己是否解释得很好,主要的一点是当你执行查询方法时它会返回一些没有“fetchAll”方法的东西,在你的情况下你的SQL是错误,可能query()返回NULL或FALSE而不是结果集。

用双引号更改单引号或连接$ current_member ['interest']变量。