Php 尝试获取非对象MySQLi result的属性

Php 尝试获取非对象MySQLi result的属性,php,mysqli,Php,Mysqli,我有一点PHP代码,我正在挣扎-有一个搜索周围的谷歌等,并尝试了所有提到的,但由于某种原因,我有困难解决它 问题是: 我有一些查询数据库中是否存在特定用户的代码 代码(它是类中的一个方法) 这是正确的,上面应该只有一行 我确实在链接到一行时遇到了这个错误,该行说,if($r->num_rows){ 注意:尝试在第行获取文件中非对象的属性 但我不知道为什么,因为这个对象是有效的(如上所述),而且它应该工作正常。从我所能看到的情况来看,它似乎正在正常运行,我只是想知道为什么会出现错误。我确信它很简单

我有一点PHP代码,我正在挣扎-有一个搜索周围的谷歌等,并尝试了所有提到的,但由于某种原因,我有困难解决它

问题是:

我有一些查询数据库中是否存在特定用户的代码

代码(它是类中的一个方法)

这是正确的,上面应该只有一行

我确实在链接到一行时遇到了这个错误,该行说,
if($r->num_rows){

注意:尝试在第行获取文件中非对象的属性


但我不知道为什么,因为这个对象是有效的(如上所述),而且它应该工作正常。从我所能看到的情况来看,它似乎正在正常运行,我只是想知道为什么会出现错误。我确信它很简单,但我很感谢任何帮助。

我只是想对此进行一些扩展

如果执行返回0个结果的MYSQLI SELECT查询,则返回FALSE

但是,如果出现此错误,并且编写了自己的MYSQLI查询函数,那么如果正在运行的查询不是select而是更新,则也可能出现此错误。更新查询将返回TRUE或FALSE。因此,如果您只是假设任何非FALSE结果都将返回记录,那么在运行更新时,您将出错e或选择以外的任何内容

一旦您检查了它是否为false,最简单的解决方案是首先检查查询结果是否为对象

    $sqlResult = $connection->query($sql);
    if (!$sqlResult)
    {
     ... 
    }
    else if (is_object($sqlResult))
    {
        $sqlRowCount = $sqlResult->num_rows;
    }
    else
    {
        $sqlRowCount = 0;
    }

我一直在努力在Drupal 7中编写自定义模块,但遇到了相同的错误:

注意:尝试获取非对象的属性

我的代码是这样的:

function example_node_access($node, $op, $account) {
  if ($node->type == 'page' && $op == 'update') {
    drupal_set_message('This poll has been published, you may not make changes to it.','error');
    return NODE_ACCESS_DENY;    
  }
}
解决方案: 我刚刚添加了一个条件if(is_object($sqlResult)),一切正常

这是我的最终代码:

function mediaten_node_access($node, $op, $account) {

    if (is_object($node)){

     if ($node->type == 'page' && $op == 'update') {
       drupal_set_message('This poll has been published, you may not make changes.','error');
       return NODE_ACCESS_DENY;    
      }

    }

}

我认为这并不是所有人都提到的原因。您的代码中有一些错误,可能是拼写错误或与数据库列名不匹配。如果mysqli查询没有结果,那么它将返回false,因此它不是对象-这是一个错误的想法。一切正常。如果查询有结果或没有结果,它将返回1或0

所以,我的建议是检查变量名、表列名或其他拼写错误

$sql = "SELECT * FROM table";
$result = $conn->query($sql);

if (!$result) {
    trigger_error('Invalid query: ' . $conn->error);
}
使用mysqli_error()函数检查错误


可能您的查询有一些错误。

问题的原因很简单。很多人都会遇到同样的问题,因为我也遇到过,而且我花了几个小时才弄清楚。以防万一,其他人会绊倒,问题出在您的查询中,您的select语句调用的是
$dbname
,而不是表名。因此,在eby返回
false
这是
boolean
。祝你好运。

这确实很奇怪,尝试
var\u dump($r->num\u rows)
。顺便问一下:如果你在使用mysqli,为什么不使用预先准备好的语句或至少转义插入的值?你尝试过$r[“num\u rows”]目前这只是早期开发,所以我没有添加任何转义等内容,但一旦发布,所有内容都会相应添加。对我的实际问题有什么想法吗?您使用的是global,让我猜您正在将$r传递到另一个文件以供参考processing@Haim是的,我使用了$mysqli=newmysqli('localhost','user','db'));此答案的第一行不正确。当出现错误时,它只返回
FALSE
。匹配项为0的查询不是错误。您错过了我所说的运行更新而不是SELECT的部分。抱歉,我没有仔细研究这个问题。我以为您在谈论
mysqli::query()
,而不是用户编写的方法,它有自己的返回标准
FALSE
function mediaten_node_access($node, $op, $account) {

    if (is_object($node)){

     if ($node->type == 'page' && $op == 'update') {
       drupal_set_message('This poll has been published, you may not make changes.','error');
       return NODE_ACCESS_DENY;    
      }

    }

}
$sql = "SELECT * FROM table";
$result = $conn->query($sql);

if (!$result) {
    trigger_error('Invalid query: ' . $conn->error);
}