我花了五个小时处理同样的问题,过于沮丧地认真考虑,一些帮助将不胜感激。
文件包含结构有点像:
page.php includes-> head.php include->(* glo_functions.php * then * sql_functions.php *)
page.php中的行导致触发错误:
$logdata = $db->escape($_POST['logdata']);
在文件中建立连接:globals.php:
$db->connect();
escape()函数,在文件中:sql_functions.php
function escape($text) {
return mysqli_real_escape_string($this->connection_id, '$text');
}
问题(调用函数的任何地方):
function log_add($text)
{
global $db, $row;
$IP = $_SERVER['REMOTE_ADDR'];
$text= $db->escape($text);
$db->query("INSERT INTO log VALUES(NULL, {$row['userid']}, unix_timestamp(), '$text', '$IP')");
}
发生了许多错误。如果connection_id和$ text相反,则表示它需要参数1并杀死脚本。
理想情况下,转义函数会以某种方式清理信息。执行此操作后,截至目前,我的日志表中正在填充$ text而不是实际文本。
我知道准备查询会是一个更好的选择,但每次查询都需要花费超过5个小时才能完成。我正在从SQL转换,因此在需要时通过调用函数来普遍转义数据,因此在数据需要转义的任何地方,它都已调用此函数。
编辑:
$db=new database;
$db->configure($_CONFIG['hostname'],
$_CONFIG['username'],
$_CONFIG['password'],
$_CONFIG['database'],
$_CONFIG['persistent']);
$db->connect();
答案 0 :(得分:2)
return mysqli_real_escape_string($this->connection_id, '$text');
您将变量放在单引号内,因此它将使用文字字符串“$ text”,而不是变量$ text的值。
您可以使用双引号来确保扩展变量:
return mysqli_real_escape_string($this->connection_id, "$text");
或者只是在这种情况下根本不要把它放在引号中。将变量传递给PHP函数不是SQL注入。
return mysqli_real_escape_string($this->connection_id, $text);
当然,当您在SQL查询中使用字符串文字中的变量时,您需要使用单引号对其进行分隔。
我同意其他评论者使用查询参数是优越的,只是因为你再也不用担心引号了。但我知道你现在必须放弃代码更新。
答案 1 :(得分:0)
function escape($text) {
global $link; // link to db
return mysqli_real_escape_string($link, $text);
}
或者
function escape($text) {
global $db; // db object
return $db->real_escape_string($text);
}
或仅当escape
是您创建$db
对象所在的同一类的方法时:
function escape($text) {
return $this->mysqli_real_escape_string($text);
}