1

Mysql データベースに単一引用符 (') を含む部品番号があります (例: 1234'xyz)。単一引用符で部品番号を正しく表示する選択リストを含む、かなり長いフォームの HTML ページがあります。ただし、フォーム POST の後、部品番号に一重引用符が含まれている場合、その部品番号は、一重引用符に続くすべての文字が切り捨てられて表示されます。上記の場合、品番は1234と表示されます。

これは、フォーム入力をエスケープしてフォームを投稿する方法です。

array_walk_recursive( $_POST, 'mysqli_real_escape_string' ); //escape the array
$array = array_filter($_POST);  //remove empty values from the array

//---- convert key/values to string to insert as column names/values to insert          

foreach ($array as $key => $value) {
$value = "'$value'";
    $updates[] = "$key = $value";
            }   

$implodeArray = implode(', ', $updates);
$id=$_SESSION['Userid'];

$query = ("UPDATE Database
        SET $implodeArray
        WHERE Userid='$id'");

フォーム入力がエスケープされていない可能性はありますか?

4

1 に答える 1

0

$_POST key=>value ペアをチェックし、期待される値が渡されていることを確認したと仮定すると、上記のコードmysqli_real_escape_stringは、ダブルで再度補間することにより、おそらくエスケープ文字の効果をキャンセルしていると思います-引用"$value"... 2回!そして、再び補間します"$implodeArray"

試す:

foreach ($array as $key => $value) {
$value = "'".$value."'";
    $updates[] = "$key = ".$value;
            }   

$implodeArray = implode(', ', $updates);
$id=$_SESSION['Userid'];

$query = ("UPDATE Database
        SET ".$implodeArray."
        WHERE Userid='$id'");

それが役立つことを願っています

于 2014-01-22T16:26:41.100 に答える