试图获取非对象MySQLi结果的属性

时间:2011-09-07 11:09:10

标签: php mysqli

得到了一些我正在努力的PHP代码 - 在谷歌等地搜索并尝试了所有提到的内容,但由于某些原因我无法解决它。

问题是:

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

代码(它是类中的方法)

<?php
global $mysqli;
// Query specified database for value
$q = 'SELECT id FROM ' . $database . ' WHERE username = \'' . $username . '\'';
$r = $mysqli->query($q);
var_dump($r);
if ($r->num_rows) {
    // If row found username exists so return false
    return false;
}
...
?>

我把var转储了查询的结果($ r)并得到了这个:

object(mysqli_result)#4 (5) { ["current_field"]=> int(0) ["field_count"]=> int(1) ["lengths"]=> NULL ["num_rows"]=> int(1) ["type"]=> int(0) }

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

我确实将此错误链接到if ($r->num_rows) {

这一行

注意:尝试在LINE行上的FILE中获取非对象的属性

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

5 个答案:

答案 0 :(得分:13)

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

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

使用mysqli_error()函数检查错误

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

答案 1 :(得分:0)

问题的原因很简单。很多人会遇到同样的问题,因为我也这样做了,花了我一个小时才弄明白。以防万一,其他人绊倒,问题在于您的查询,您的select语句调用$dbname而不是表名。因此找不到返回false boolean的内容。祝你好运。

答案 2 :(得分:-1)

我一直在努力在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;    
      }

    }

}

答案 3 :(得分:-1)

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

所以,我的建议是检查你的变量名和表列名或任何其他拼写错误。

答案 4 :(得分:-2)

我想我会稍微扩展一下。

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

但是,如果您收到此错误并且您已编写自己的MYSQLI查询功能,那么如果您运行的查询不是选择而是更新,则也会出现此错误。更新查询将返回TRUE或FALSE。因此,如果您只是假设任何非错误结果将返回记录,那么当您运行更新或除select之外的任何其他内容时,您将会绊倒。

最简单的解决方案是,一旦检查到它不是假的,首先要检查查询结果是否为对象。

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