2011-08-13 13 views
2

で使用されていないmysql_real_escape_stringの私は、など、私のデシベルの挿入/更新のすべてを処理するために ライブラリの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()と呼ぶと何か問題はありますか?私は簡単にライブラリを変更することができますが、私は、この特定の正規表現をこの方法で処理した理由があると仮定しています。私はその理由が分かりません!そして私は、ここにあるものの背後にある理由を理解するまで、変更を加えることを躊躇しています。

ありがとうございました!

+3

')'で終わる値に 'mysql_real_escape_string()'を呼び出さない理由はわかりません。このライブラリは何ですか?おそらく著者は、珍しいパーソナルユースケースしか考えていなかったでしょう。 –

+0

@Michael健全性検査をありがとう。私が知る限り、これは著者がデータベースのやりとりのために持っていた単なる汎用ライブラリであり、特別な使用事例のために設計されたものではありません。 – user480029

答えて

1

prepareValueの中にはmysql_real_escape_stringが適用されるだけでなく、'の中に入れられることに注意してください。頭に浮かぶ唯一の合理的な答えザッツ

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

:このことを念頭に、我々は著者がMySQLの関数呼び出し、つまりする)で終わるすべての文字列を想定していることを疑うことができます。

+0

ありがとう!それは多くの意味があり、私の目的のために、私は関数呼び出しを渡していないので、私は編集できます。 – user480029

関連する問題