我正在开展一个项目,其中有一个简单的查询表格。型号代码如下:
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并填写网页末尾的查询表单来查看错误。
有没有人对错误的原因提出任何建议?如果是,请回答此问题。 欢迎所有积极的建议。
答案 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)
因为我使用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的链接。