定义PHP错误的原因是:在非对象上调用成员函数fetch_object()

时间:2014-02-18 16:16:48

标签: php

我一直想知道这个问题。我有两个PHP程序几乎完全相同,除了它们是一个函数而另一个不是。此外,一个工作,另一个发回错误:

Call to a member function fetch_object() on a non-object

我通过省略变量并插入确定的字符串并添加$con->errno而不是mysqli_errno来修复无效的那个。但是,当我再次使用变量替换字符串时,问题又返回了。

所以,我的问题是:是什么导致了这个错误,我将如何解决它。另外,为什么第二个代码中出现错误而不是第一个?

第一个代码(有效)

<?php
$con = new mysqli("database info");

if (mysqli_connect_errno())
  {
  echo "Failed to connect to MySQL: " . mysqli_connect_error();
  }

 $stmt = $con->query("SELECT coordinator, announcements, description, comments, picture FROM Class_data WHERE class_year = '" .$class. "';");

    $result_row = $stmt->fetch_object();

    $coordinator = $result_row->coordinator;
    $announcement = $result_row->announcements;
    $description = $result_row->description;
    $comments = $result_row->comments;
    $picturepath = $result_row->picture;

    mysqli_error($con);

    mysqli_close($con);

    if ($picturepath == "")
    {
        $picturepath = "../images/AlumnLogo.png";
    }
?>

第二段代码(不起作用)

<?php

function fetch($page, $content1, $content2, $content3)
{
    $con = new mysqli("database info");
    if ($con->errno)
      {
      echo "Failed to connect to MySQL: " . mysqli_connect_error();
      }

     $stmt = $con->query("SELECT '" .$content1. "' , '" .$content2. "' , '" .$content3. "' FROM '" .$page. "';");

    $result_row = $stmt->fetch_object();

    $content = array();
    $content[0] = $result_row->body;
    $content[1] = $result_row->calendar;
    $content[2] = $result_row->announcements;
    $output = implode("--",$content);

    mysqli_error($con);

    mysqli_close($con);

    return $output;
}

?>

非常感谢!

2 个答案:

答案 0 :(得分:1)

您使用单引号引用列名称。你不能这样做,你需要使用反引号引用表名和列名(如果是保留字,空格等),只需要使用单引号或双引号引用(非整数...)值。 / p>

将您的代码更改为:

$stmt = $con->query("SELECT `" .$content1. "` , `" .$content2. "` , `" .$content3. "` FROM `" .$page. "`;");
                            ^ All these

顺便说一句,我假设你使用了一个白名单来表示你的表名和列名。如果没有,你应该避免sql注入。

向数据库调用添加错误处理也是一个好主意。使用mysqli的一种简单方法是将mysqli_report(MYSQLI_REPORT_STRICT);放在脚本的开头。这将导致mysqli抛出异常,这样您就不必在每次数据库调用时检查个别错误。

答案 1 :(得分:0)

错误消息只是意味着您尝试在不是对象的事物上调用方法。问题是$stmt不是对象!

这是因为您的SQL Statemetn中存在错误。 $con->query()在这种情况下重新false。因此,您尝试执行的内容类似于false->fetch_object();。并且false不是对象......

尝试打印生成的SQL语句。它可能会包含一些语法错误。解决这些问题,它会起作用