致命错误:调用布尔上的成员函数bind_param()

我忙于从一个数据库获取设置的function,突然,我跑到这个错误:

Fatal error: Call to a member function bind_param() on boolean in C:\xampp2\htdocs\application\classes\class.functions.php on line 16 

通常情况下,这意味着我正在从未来的表格和东西中select东西。 但在这种情况下,我不是…

这里是getSetting函数:

 public function getSetting($setting) { $query = $this->db->conn->prepare('SELECT value, param FROM ws_settings WHERE name = ?'); $query->bind_param('s', $setting); $query->execute(); $query->bind_result($value, $param); $query->store_result(); if ($query->num_rows() > 0) { while ($query->fetch()) { return $value; if ($param === '1') { $this->tpl->createParameter($setting, $value); } } } else { __('invalid.setting.request', $setting); } } 

$this->dbvariables通过构造函数传递。 在需要的情况下,这里是:

 public function __construct($db, $data, $tpl) { $this->db = $db; $this->tpl = $tpl; $this->data = $data; $this->data->setData('global', 'theme', $this->getSetting('theme')); } 

另外,由于我正在使用数据库,我的数据库连接:

 class Database { private $data; public function __construct($data) { $this->data = $data; $this->conn = new MySQLi( $this->data->getData('database', 'hostname'), $this->data->getData('database', 'username'), $this->data->getData('database', 'password'), $this->data->getData('database', 'database') ); if ($this->conn->errno) { __('failed.db.connection', $this->conn->errno); } date_default_timezone_set('Europe/Amsterdam'); } 

我已经testing了连接,100%肯定它按预期工作。 我在configuration文件中设置数据库连接的东西:

 'database' => array( 'hostname' => '127.0.0.1', 'username' => 'root', 'password' => ******, 'database' => 'wscript' ) 

现在奇怪的是, 表存在,请求的设置存在,数据库存在,但仍然,该错误不会离开。 这是一些certificate数据库是正确的:

IMG

问题在于:

 $query = $this->db->conn->prepare('SELECT value, param FROM ws_settings WHERE name = ?'); $query->bind_param('s', $setting); 

prepare()方法可以返回false ,你应该检查。 至于为什么它返回false ,或许表名或列名(在SELECTWHERE子句中)是不正确的?

另外,考虑使用像$this->db->conn->error_list这样的东西来检查分析SQL时发生的错误。 (我偶尔会回应实际的SQL语句string,并粘贴到phpMyAdmin中进行testing,但肯定会出现某些错误。)

任何时候你得到…

“致命错误:调用一个成员函数bind_param()布尔”

…很可能是因为您的查询存在问题。 prepare()可能返回FALSE (一个布尔值),但是这个通用的失败消息并没有给你太多的线索。 你怎么知道你的查询有什么问题? 你

首先,确保错误报告已打开并可见:在打开<?php标记之后立即将这两行添加到文件顶部:

 error_reporting(E_ALL); ini_set('display_errors', 1); 

如果您的错误报告已经在php.ini中设置,您将不必担心这一点。 只要确保你妥善处理错误,不要向用户泄露任何问题的真正原因。 向公众揭示真正的事业可以是那些想要伤害你的网站和服务器的人的黄金邀请。 如果您不想向浏览器发送错误,则可以随时监控您的Web服务器错误日志。 日志位置因服务器而异,例如在Ubuntu上,错误日志通常位于/var/log/apache2/error.log 。 如果您正在Linux环境中检查错误日志,则可以使用tail -f /path/to/log到控制台窗口,以查看实时发生的错误….

一旦你摆脱了标准的错误报告添加错误检查你的数据库连接和查询会给你更详细的问题正在进行。 看看列名不正确的例子。 首先,返回通用致命错误消息的代码:

 $sql = "SELECT `foo` FROM `weird_words` WHERE `definition` = ?"; $query = $mysqli->prepare($sql)); // assuming $mysqli is the connection $query->bind_param('s', $definition); $query->execute(); 

这个错误是通用的,对你解决这个问题不是很有帮助。

有了更多的代码,您可以获得非常详细的信息,您可以立即使用这些信息来解决问题。 检查prepare()语句的真实性,如果它是好的,你可以继续绑定和执行。

 $sql = "SELECT `foo` FROM `weird_words` WHERE `definition` = ?"; if($query = $mysqli->prepare($sql)) { // assuming $mysqli is the connection $query->bind_param('s', $definition); $query->execute(); // any additional code you need would go here. } else { $error = $mysqli->errno . ' ' . $mysqli->error; echo $error; // 1054 Unknown column 'foo' in 'field list' } 

如果有什么不对,你可以吐出一个错误信息,直接把你的问题。 在这种情况下,表中没有foo列,解决这个问题是微不足道的。

如果你select,你可以在一个函数或类中包含这个检查,并通过如前所述优雅地处理错误来扩展它。

prepare返回一个布尔值,只有当它失败,因此错误,以避免错误,你需要检查它是否是True第一个执行之前:

 $sql = 'SELECT value, param FROM ws_settings WHERE name = ?'; if($query = $this->db->conn->prepare($sql)){ $query->bind_param('s', $setting); $query->execute(); //rest of code here }else{ //error !! don't go further var_dump($this->db->error); } 

即使查询语法正确,如果以前的语句没有closures,那么prepare可能会返回false。 请务必closures您以前的陈述

 $statement->close(); 

如果语法正确,则以下查询也将运行良好。

可能导致此问题的另一种情况是不正确的转换您的查询中。

我知道这听起来很明显,但我已经通过使用tablename而不是Tablename 。 检查您的查询,并确保您使用的是与表中列的实际名称相同的大小写。