当前位置: 首页 > 知识库问答 >
问题:

致命错误:在布尔[duplicate]上调用成员函数bind_param()

太叔俊侠
2023-03-14

我正忙于从DB获取设置的函数,突然,我遇到了以下错误:

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

通常,这意味着我正在从不存在的表和东西中选择东西。但在这种情况下,我不是...

下面是getSting函数:

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-

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');
}

我已经对连接进行了测试,100%肯定它能按预期工作。我正在配置文件中设置DB连接:

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

现在奇怪的是;表存在,请求的设置存在,数据库存在,但是错误不会消失。这里有一些证据证明DB是正确的:


共有3个答案

史弘致
2023-03-14

即使在查询语法正确的情况下,prepare也可能返回false,前提是前面有一条语句并且它没有关闭。始终用以下语句结束您以前的语句

$statement->close();

如果语法正确,下面的查询也会运行良好。

桂高昂
2023-03-14
匿名用户

任何时候你得到。。。

“致命错误:在布尔值上调用成员函数bind_param()”

...这很可能是因为您的查询存在问题。准备()可能会返回FALSE(一个布尔值),但是这个通用的失败消息不会给您留下太多线索。你如何发现你的查询有什么问题?你问!

首先,确保错误报告已打开且可见:在打开

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列,解决问题是微不足道的。

如果您选择,您可以将此检查包含在函数或类中,并通过前面提到的优雅处理错误来扩展它。

梁宪
2023-03-14

问题在于:

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

prepare()方法可以返回false,您应该对此进行检查。至于为什么返回false,可能是表名或列名(在SELECTWHERE子句中)不正确?

另外,考虑使用类似$this的东西-

 类似资料:
  • index.php 索引文件上有一个错误: 致命错误:调用第4行布尔值上的成员函数count()。

  • 这是我的函数,我在这里坐了很长时间,试图找出什么不起作用,它说它在$stmt2的行上- 如果我放一个$stmt2-

  • 密码 错误 致命错误:调用第26行C:\xampp\htdocs\create.php中布尔值的成员函数bind_param()

  • 我问了几个问题,但没有人帮忙。 致命错误:在中的布尔值上调用成员函数bind_param()- 我在PDO中使用PHP5和mySql: 连接和选择工作正常,但插入不想工作 这就是我的功能: 数据库模式是: id(int not null auto_inc)|昵称(varchar not null)|电子邮件(varchar not null)| insertdate(datetime)| upda

  • 问题内容: 我正在尝试检查注册中是否已使用电子邮件。当我在学校工作时,它运行良好,但现在突然显示出一个错误: 致命错误:在null上调用成员函数prepare() 我用这个包括 在这里 问题答案: 编辑:( 我想通了)。 我终于弄清楚了为什么您的代码无法正常工作,而我原来的答案已不再适用,我已将其剔除掉。 连接不起作用的原因是因为您从连接参数中省略了常量。 即使您可能没有设置密码,也仍然需要将其作

  • 问题内容: 我不确定这里出了什么问题。我只是在线上学习教程,并且弹出了这些错误。 我收到以下错误 错误 码 问题答案: 首先,您在函数外声明了$ db。如果要在函数内部使用它,则应将其放在函数代码的开头: 我猜,当你写的时候: 您真正想要的是: