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

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

我忙着处理一个从DB获取设置的函数,突然,我遇到了以下错误:

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

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

这是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->db变量通过构造函数传递。在需要的情况下,这是:

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存在,但是错误不会留下。这里有一些证据证明DB是正确的:



暮色呼如
浏览 1385回答 3
3回答

汪汪一只猫

问题在于:$query = $this->db->conn->prepare('SELECT value, param FROM ws_settings WHERE name = ?');$query->bind_param('s', $setting);这个prepare()方法可以返回false你应该检查一下。为什么它会回来false,可能是表名或列名(在SELECT或WHERE条款)是不正确的?另外,考虑使用类似的$this->db->conn->error_list若要检查解析SQL时发生的错误,请执行以下操作。(我偶尔会回显实际的SQL语句字符串,并粘贴到phpMyAdmin中进行测试,但肯定有一些地方失败了。)

12345678_0001

任何时候你得到.。“致命错误:对布尔值上的成员函数BIND_PARAM()的调用”.这很可能是因为你的查询有问题.这个prepare()可能会回来FALSE(一个布尔值),但是这个通用的失败消息并没有给你留下太多线索。如何发现您的查询有什么问题?你,你们问!首先,确保打开错误报告并使其可见:在打开文件后立即将这两行添加到文件的顶部。<?php标签:error_reporting(E_ALL);ini_set('display_errors',&nbsp;1);如果在php.ini中设置了错误报告,则不必担心这一点。只需确保您优雅地处理错误,不要向用户透露任何问题的真正原因。向公众揭示真正的原因可能是给那些想要伤害你的网站和服务器的人一个金刻的邀请。如果不希望向浏览器发送错误,则始终可以监视Web服务器错误日志。日志位置因服务器而异,例如,在Ubuntu上,错误日志通常位于/var/log/apache2/error.log..如果您正在检查Linux环境中的错误日志,可以使用tail -f /path/to/log在控制台窗口中查看实时发生的错误.或您所做的错误。一旦您对标准错误报告进行了平方,添加了对数据库连接和查询的错误检查,将为您提供更多关于正在发生的问题的详细信息。查看此示例,其中列名不正确。首先,返回通用致命错误消息的代码:$sql&nbsp;=&nbsp;"SELECT&nbsp;`foo`&nbsp;FROM&nbsp;`weird_words`&nbsp;WHERE&nbsp;`definition`&nbsp;=&nbsp;?";$query&nbsp;=&nbsp;$mysqli->prepare($sql));&nbsp; //&nbsp;assuming&nbsp;$mysqli&nbsp;is&nbsp;the&nbsp;connection$query->bind_param('s',&nbsp;$definition);$query->execute();这个错误是通用的,对你解决正在发生的事情没有多大帮助。使用更多的代码行,您可以获得非常详细的信息,您可以使用这些信息来解决问题。立马..检查prepare()语句的真实性,如果它是好的,您可以继续绑定和执行。$sql&nbsp;=&nbsp;"SELECT&nbsp;`foo`&nbsp;FROM&nbsp;`weird_words`&nbsp;WHERE&nbsp;`definition`&nbsp;=&nbsp;?";if($query&nbsp;=&nbsp;$mysqli->prepare($sql))&nbsp;{&nbsp;//&nbsp;assuming&nbsp;$mysqli&nbsp;is&nbsp;the&nbsp;connection &nbsp;&nbsp;&nbsp;&nbsp;$query->bind_param('s',&nbsp;$definition); &nbsp;&nbsp;&nbsp;&nbsp;$query->execute(); &nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;any&nbsp;additional&nbsp;code&nbsp;you&nbsp;need&nbsp;would&nbsp;go&nbsp;here.}&nbsp;else&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;$error&nbsp;=&nbsp;$mysqli->errno&nbsp;.&nbsp;'&nbsp;'&nbsp;.&nbsp;$mysqli->error; &nbsp;&nbsp;&nbsp;&nbsp;echo&nbsp;$error;&nbsp;//&nbsp;1054&nbsp;Unknown&nbsp;column&nbsp;'foo'&nbsp;in&nbsp;'field&nbsp;list'}如果有什么问题,你可以说出一条错误信息,直接带你去处理这个问题。在这种情况下没有foo列中,解决问题是微不足道的。如果您选择,可以将此检查包含在函数或类中,并像前面提到的那样优雅地处理错误来扩展它。

MYYA

prepare因此,只有当布尔值失败时才返回它。FALSE,为了避免错误,您需要检查是否是True执行前先:$sql&nbsp;=&nbsp;'SELECT&nbsp;value,&nbsp;param&nbsp;FROM&nbsp;ws_settings&nbsp;WHERE&nbsp;name&nbsp;=&nbsp;?';if($query&nbsp;=&nbsp;$this->db->conn->prepare($sql)){ &nbsp;&nbsp;&nbsp;&nbsp;$query->bind_param('s',&nbsp;$setting); &nbsp;&nbsp;&nbsp;&nbsp;$query->execute(); &nbsp;&nbsp;&nbsp;&nbsp;//rest&nbsp;of&nbsp;code&nbsp;here}else{ &nbsp;&nbsp;&nbsp;//error&nbsp;!!&nbsp;don't&nbsp;go&nbsp;further &nbsp;&nbsp;&nbsp;var_dump($this->db->error);}
打开App,查看更多内容
随时随地看视频慕课网APP