【问题标题】:Trying to get property of non-object MySQLi result [duplicate]试图获取非对象 MySQLi 结果的属性 [重复]
【发布时间】:2011-09-07 11:09:09
【问题描述】:

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

问题是:

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

代码(类中的方法)

<?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) }

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

我确实收到此错误链接到if ($r-&gt;num_rows) { 的行

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

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

【问题讨论】:

  • 确实很奇怪,试试var_dump($r-&gt;num_rows)。顺便说一句:如果您使用的是 mysqli,为什么不使用准备好的语句或至少转义插入的值?
  • 你试过 $r["num_rows"]
  • 目前这只是早期开发,所以我没有添加任何转义等,但是一旦它发布,它就会相应地添加。对我的实际问题有什么想法吗?
  • 你正在使用全局,让我猜你正在将 $r 传递给另一个文件进行处理
  • @Haim 是的,我使用了 $mysqli = new mysqli('localhost', 'user', '', 'db');

标签: php mysqli


【解决方案1】:
$sql = "SELECT * FROM table";
$result = $conn->query($sql);

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

用 mysqli_error() 函数检查错误

您的查询可能有问题。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

          【解决方案5】:

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

          如果执行返回 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;
              }
          

          【讨论】:

          • 这个答案的第一行是不真实的。它仅在出现错误时返回 FALSE。具有 0 个匹配项的查询不是错误。
          • 您错过了我说您正在运行 UPDATE 而不是 SELECT 的那一点。
          • 对不起,我没有仔细看这个问题。我以为你在谈论 mysqli::query(),而不是用户编写的方法,它有自己的返回 FALSE 的标准。
          猜你喜欢
          • 2016-07-16
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-08-19
          • 2013-01-21
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多