2011-09-30 47 views
0

嗨,我需要一些帮助,我不断收到这个错误。它在脚本中的其他任何地方都可以正常工作,除非我尝试在此函数中调用它。PHP调用一个成员函数prepare()对一个非对象错误

我打电话的功能是: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; 

}

感谢您的帮助。

+1

$ g_mysqli没有初始化? – matino

回答

0

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

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

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

没有意义,所以这就是为什么PHP会抛出这个错误。

在另一个笔记上,你真的不应该使用全局变量。你可以谷歌或搜索stackoverflow的更详细的列表,但总之,他们打破了代码的可移植性,并使这样的错误难以发现。将额外的参数传递给需要它的每个函数调用是一种痛苦,但从设计的角度来看它更好(并且实际上没有太多的额外努力:p)。

+0

$ g_mysqli变量确实存在我在网站周围的其他地方使用它,并且正常工作。除了我尝试在这个函数中调用它。 –

+0

你有没有试过对它做var_dump来查看它是否有任何东西?就像我说的,我怀疑这个时候还没有初始化。 (根据错误,它不是存在于全局范围中,或者它不是一个具有准备方法的类的实例。) – Corbin

+0

您刚完成$ g_mysqli上的var_dump并将其返回为NULL。但我不明白为什么它返回NULL。 –

0

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

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

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

+0

这就是早先的答案所说的。 OP说他解决了他的问题(这个问题应该可能因为太局部化而关闭)。 – Barmar

-1

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

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

相关问题