2

我正在使用 dataHandler 库来处理我所有的数据库插入/更新等。该库具有以下功能:

function prepareValue($value, $connection){
$preparedValue = $value;
if(is_null($value)){
    $preparedValue = 'NULL';
}
else{
    $preparedValue = '\''.mysql_real_escape_string($value, $connection).'\'';
}
return $preparedValue;
}

function parseParams($params, $type, $connection){
$fields = "";
$values = "";

    if ($type == "UPDATE"){
    $return = "";
    foreach ($params as $key => $value){
    if ($return == ""){
        if (preg_match("/\)$/", $value)){
            $return = $key."=".$value;
        }
        else{
            $return = $key."=".$this->prepareValue($value, $connection);
        }
    }
    else{
        if (preg_match("/\)$/", $value)){
            $return = $return.", ".$key."=".$value;
        }
        else{
            $return = $return.", ".$key."=".$this->prepareValue($value,              
                         $connection);
        }
    }
    }
    return $return;
/* rest of function contains similar but for "INSERT", etc.
   }

这些函数然后用于使用 sprintf 构建查询,如下所示:

$query = sprintf("UPDATE table SET " .
    $this->parseParams($params, "UPDATE", $conn) .
" WHERE fieldValue = %s;", $this->prepareValue($thesis_id, $conn));

$params是一个关联数组: array("db_field_name"=>$value, "db_field_name2"=>$value2, etc.)

当我想要更新或插入以“)”结尾的字符串时,我现在遇到了问题,因为 parseParams 函数没有将这些值放在引号中。

我的问题是:为什么这个库不会在以右括号结尾的字符串上调用 prepareValue?调用mysql_real_escape_string()这个值会导致任何问题吗?我可以轻松地修改库,但我假设作者以这种方式处理这个特定的正则表达式是有原因的。我就是想不通这是什么原因!在我理解这里的原因之前,我很犹豫是否要进行任何修改。

谢谢你的帮助!

4

1 回答 1

1

请注意, insideprepareValue不仅mysql_real_escape_string应用于 value,而且还应用于 inside '。考虑到这一点,我们可以怀疑作者假设所有)以 mysql 函数调用结尾的字符串,即:

$params = array(
    'field1' => "John Doe",
    'field2' => "CONCAT('John',' ','Doe')",
    'field3' => "NOW()"
);

这是唯一能想到的合理答案。

于 2011-08-14T10:52:37.197 回答