【问题标题】:PHP Call to a member function prepare() on a non-object errorPHP在非对象错误上调用成员函数prepare()
【发布时间】:2011-09-30 08:46:17
【问题描述】:

您好,我需要一些帮助来解决我不断收到的这个错误。它在脚本中的其他任何地方都可以正常工作,除非我尝试在这个函数中调用它。

我调用的函数是:getTotalServers

错误:

Fatal error: Call to a member function prepare() on a non-object in C:\xampp2\htdocs\runeloft\ss_sources\util.php on line 208

在这个函数中调用:

function display_table($online, $where, $num_servers = null){
global $aaaa, $bbbb;
 $num_per_page = 30;

 $page = 1;

 // how many records per page
 $size = 10;

 // we get the current page from $_GET
 if (isset($_GET['page'])){
     $page = (int) $_GET['page'];
 }

 $aaaa = getTotalServers(1, $num_servers);;
 $bbbb = $page;

 // create the pagination class
 $pagination = new Pagination();
 $pagination->setLink("?action=status&page=%s");
 $pagination->setPage($page);
 $pagination->setSize($size);
 $pagination->setTotalRecords($num_servers);

 global $g_headers;
 $g_headers = array(
           'name' => 'Server Name',
           'ip' => 'IP',
           'port' => 'Port',
           'uptime' => 'Uptime',
           'online' => 'Status',
           );

 $start = isset($_GET['start']) ? $_GET['start'] : 0;

 mysql_con();
 global $g_mysqli;
 $start = $g_mysqli->real_escape_string($start);
 if(isset($_GET['sort']) && isset($g_headers[$_GET['sort']])){
      $order_by = 'ORDER BY `'.$g_mysqli->real_escape_string($_GET['sort']).'` '.(isset($_GET['desc']) ? 'DESC' : 'ASC');
 }else{
      //default sort
      $order_by = 'ORDER BY `uptime` DESC, `time` ASC';
 }

 //$order_by .= " LIMIT $start, $num_per_page";
 $order_by .= " " . $pagination->getLimitSql();

 if($start == 0 && $online == 1 && !isset($_GET['sort']))
      echoTable('Spons', "`sponsored` != '0'", "ORDER BY `sponsored` DESC, RAND() LIMIT 10");



 echoTable('Other', $where, $order_by, $online, $start, $num_per_page, $num_servers);
 close_mysql();
}

调用函数:

function getTotalServers($online, $where, $num_servers = null){
$where = "`online` = '$online' AND `sponsored` = '0'";
 if($num_servers == null){
      global $g_mysqli;
      $stmt = $g_mysqli->prepare("SELECT COUNT(*) FROM `servers` WHERE ".$where) or debug($g_mysqli->error);
      $stmt->execute();
      // bind result variables
      $stmt->bind_result($num_servers);
      $stmt->fetch();
      $stmt->close();
 }
    return $num_servers;

}

感谢您的帮助。

【问题讨论】:

  • $g_mysqli 没有初始化?

标签: mysql mysqli php prepare


【解决方案1】:

我的猜测是,由于此时尚未调用 mysql_con,因此 $g_mysql 变量不存在。

如果您尝试在非对象上调用方法,PHP 将触发您看到的错误。基本上因为变量不存在,所以默认为null。

$a = null;
$a->prepare()

没有意义,所以这就是 PHP 抛出该错误的原因。

另一方面,您确实不应该使用全局变量。你可以谷歌或搜索 stackoverflow 以获得更详细的列表,但简而言之,它们破坏了代码的可移植性,并使此类错误更难发现。将额外的参数传递给每个需要它的函数调用很痛苦,但从设计的角度来看,它要好得多(而且真的不需要太多额外的努力:p)。

【讨论】:

  • $g_mysqli 变量确实存在,我在站点的其他任何地方都使用它并且工作正常。除非我尝试在这个函数中调用它。
  • 您是否尝试过对其进行 var_dump 以查看其中是否有任何内容?就像我说的,我怀疑它当时还没有初始化。 (根据错误,它要么不存在于全局范围内,要么不是具有 prepare 方法的类的实例。)
  • 您好,刚刚在 $g_mysqli 上做了一个 var_dump,它返回为 NULL。但我不明白为什么它返回为 NULL。
  • 仔细追踪脚本的执行路径,您应该会发现在 $g_mysqli 被引用的地方,它还没有被创建。您的 mysql_con 函数创建它,对吗?如果是这样,那么它当时还没有被调用(或者我怀疑它还没有被调用)。
  • 已修复。感谢您的帮助
【解决方案2】:

对象$g_mysqli 应在在您的代码中调用它之前进行初始化。

在您的情况下,您在许多地方创建全局变量$g_mysqli,但每次在初始化之前它都是一个 NULL 对象。

所以你不能在空对象中调用任何函数。

【讨论】:

  • 前面的回答是这么说的。并且 OP 说他解决了他的问题(这个问题可能应该因为过于本地化而关闭)。
【解决方案3】:

问题在于 header() 函数。 您需要做的就是在任何使用 header() 函数的页面的代码顶部添加一个 ob_start()。

只是一个令人困惑的错误!!! 如果有人知道原因,请解释..

【讨论】:

    猜你喜欢
    • 2013-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多