Codeigniter显示错误:mysql_real_escape_string()期望参数2是资源,布尔给定

时间:2015-11-30 09:29:54

标签: php mysql codeigniter mysqli

我正在开展一个项目,其中有一个简单的查询表格。型号代码如下:

 public function insenqm($name, $email, $enqtype, $comments) {
        $data = array(
            'name' => $name,
            'email' => $email,
            'enqtype' => $enqtype,
            'comments' => $comments
        );
        $this->db->insert('enquiry', $data);
    }

首先我认为数据没有进入模型函数insenqm,但是它正在进入函数而没有插入到数据库中。而是显示错误如下:

A PHP Error was encountered

Severity: Warning

Message: mysql_real_escape_string() expects parameter 2 to be resource, boolean given

Filename: mysql/mysql_driver.php

Line Number: 314




A PHP Error was encountered

Severity: Warning

Message: Cannot modify header information - headers already sent by (output started at /home/webtrees123/public_html/system/core/Exceptions.php:186)

Filename: helpers/url_helper.php

Line Number: 543

当我搜索错误时,它显示关键字mysql已被删除并建议使用mysqli。但是,它在我的本地计算机上运行良好,但在服务器上显示此错误。您可以访问this link并填写网页末尾的查询表单来查看错误。

有没有人对错误的原因提出任何建议?如果是,请回答此问题。 欢迎所有积极的建议。

1 个答案:

答案 0 :(得分:1)

我在Code Igniter中发生此错误,并在我的服务器上升级到PHP 5.4后在我的日志文件中多次看到它。

当您升级到PHP 5.4以获得新的有趣内容时,会发生此错误。 希望您已激活错误日志记录,以便您可以看到它。

此错误是由mysql驱动程序中的以下函数引起的。 假设Code Igniter:2.2.6,最新版本:

function escape_str($str, $like = FALSE)
{
    if (is_array($str))
    {
        foreach ($str as $key => $val)
        {
            $str[$key] = $this->escape_str($val, $like);
        }

        return $str;
    }

    $str = mysql_real_escape_string($str, $this->conn_id);

    // escape LIKE condition wildcards
    if ($like === TRUE)
    {
        $str = str_replace(array('%', '_'), array('\\%', '\\_'), $str);
    }

    return $str;
}

如果使用mysqli驱动程序(数据库中的设置)也会发生这种情况,因此使用其他驱动程序无法解决问题,因为它有类似的功能。

错误是由于在没有连接到mysql的情况下调用$this->escape_str()这一事实,因此发生错误,因为$ this-> conn_id不是资源。

使用使用mysql_escape_string($string)

的旧版CI时也会出现类似错误

因为我使用PHP 5.4并且该错误不会是警告,所以它将是8192 E_DEPRECATED! 这会给你一些关于你正在使用的CI 2版本的提示。 无论如何,解决方案是相同的:

在任何情况下,错误都可以通过以下方式解决:

这是我将此功能更改为

的内容
function escape_str($str, $like = FALSE)
{
    if (is_array($str))
    {
        foreach ($str as $key => $val)
        {
            $str[$key] = $this->escape_str($val, $like);
        }

        return $str;
    }

    if (is_resource($this->conn_id)) {
                $str = mysql_real_escape_string($str, $this->conn_id);
                //log_message('error', 'is_resource is true');
            } else {
                //log_message('error', 'string to convert is '.$str);                    
                $str = addslashes($str);

            }

    // escape LIKE condition wildcards
    if ($like === TRUE)
    {
        $str = str_replace(array('%', '_'), array('\\%', '\\_'), $str);
    }

    return $str;
}

当我进行测试以查看此功能正在逃避时,我已经注意到我已经在那里留下了一些log_message()来电,我已经在上面评论过了。

CI 2版本的最新代码仍然不包含此修复程序。 CI 2尚未积极开发。

最后,我想指出这篇文章作为参考:

http://forum.codeigniter.com/thread-62431.html 提到有一个字符集MySQL注入技术可能需要升级到3.0。

不确定此修复程序是否就是这种情况。

其他人可以调查如何调用此函数并修复调用者,而不是此函数。

这是指github上mysql driver code in version 2.2.3的链接。