我只是尝试PDO而且我得到了这个错误,致命错误:在非对象上调用成员函数fetch(),但是它不是已经在$ this-> db对象上了吗?
class shoutbox {
private $db;
function __construct($dbname, $username, $password, $host = "localhost" )
{ # db conections
try {
$this->db = new PDO("mysql:host=".$hostname.";dbname=".$dbname, $username, $password);
}
catch(PDOException $e)
{
echo $e->getMessage();
}
}
function getShouts()
{
$sql_shouts = $this->db->query('SELECT shoutid, message, pmuserid, ipadress, time FROM shouts WHERE pmuserid == 0');
return $sql_shouts->fetch(PDO::FETCH_OBJ);
}
}
答案 0 :(得分:17)
仔细查看PDO::query的文档,特别是“返回值”部分:
PDO :: query()返回PDOStatement 对象,或失败时为FALSE。
重要的是“失败时假”。 FALSE不是一个对象,因此调用 - > fetch()是坏消息。
错误可能是由于您使用“==”比较运算符。在SQL中,它只是“=”。
你应该测试$sql_shouts
是不是假的,然后对错误做一些聪明的事情,如果有的话:
<?PHP
$sql_shouts = $this->db->query('...');
if ($sql_shouts === false){
$errorInfo = $this->db->errorInfo();
//log the error or take some other smart action
}
return $sql_shouts->fetch(PDO::FETCH_OBJ);
答案 1 :(得分:1)
我会说由于语法不正确,您的查询未执行。您应该检查PDO的errorinfo静态函数以查看查询是否出错。
这是一个可能正确的SQL语句:
$sql_shouts = $this->db->query('SELECT shoutid, message, pmuserid, ipadress, `time` FROM shouts WHERE pmuserid = 0');
我相信时间是MySQL中的一个保留字我建议使用不同的名称,但将其包含在反引号中可以缓解这个问题。 1个等号用于mysql,而不是两个。但是,请查看errorinfo函数以确定您的查询是否因语法错误而失败并正常处理它。
答案 2 :(得分:-1)
当表不存在时也会发生。确保它确实存在,并且由于硬盘错误而不仅仅是数据库中的持有者。
当发生这种情况时,我建议您重新创建数据库/表。
答案 3 :(得分:-1)
由于带括号的愚蠢错误,我收到此错误消息。它嵌套在if语句中,只是没有看到它。
db_query("SELECT thing FROM table WHERE var=:var", array(":var" => $var)->fetchField());
我花了一段时间才弄清楚我没有在正确的位置关闭db_query括号。也许它可以帮助别人盯着这个想知道的问题。正确的:
db_query("SELECT thing FROM table WHERE var=:var", array(":var" => $var))->fetchField();