2

dataHandlerライブラリを使用して、すべてのdb挿入/更新などを処理しています。ライブラリには次の関数があります。

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

insideは value に適用されるprepareValueだけでなく、 inside にも入れられることに注意してください。これを念頭に置いて、著者は で終わるすべての文字列が mysql 関数呼び出しであると想定したのではないかと疑うことができます。mysql_real_escape_string')

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

それが頭に浮かぶ唯一の合理的な答えです。

于 2011-08-14T10:52:37.197 に答える