从MYSQL转换为MYSQLI ...中断转义函数

时间:2014-02-04 23:33:58

标签: php mysql mysqli

我花了五个小时处理同样的问题,过于沮丧地认真考虑,一些帮助将不胜感激。

文件包含结构有点像:

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();

2 个答案:

答案 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);
}