mysql_real_escape_string не используется с данным регулярным выражением - PullRequest
2 голосов
/ 14 августа 2011

Я использую библиотеку 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() для этого значения вызовет какие-либо проблемы? Я мог бы легко изменить библиотеку, но я предполагаю, что есть причина, по которой автор обработал это конкретное регулярное выражение таким образом. Я просто не могу понять, что это за причина! И я не решаюсь вносить какие-либо изменения, пока не пойму причину того, что здесь.

Спасибо за вашу помощь!

1 Ответ

1 голос
/ 14 августа 2011

Обратите внимание, что внутри prepareValue к значению применяется не только mysql_real_escape_string, но и значение '. Имея это в виду, мы можем заподозрить, что автор предположил, что все строки, заканчивающиеся на ), являются вызовами функции mysql, то есть:

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

Это единственный разумный ответ, который приходит на ум.

...