0

これは、単純化とテスト目的で PHP とデータベースを使用して構築された小さなセグメントです。テキストの例を次に示します。

アイデアは、フォームが送信され、PHP が結果を処理するというものです。ただし、セキュリティのために各投稿に mysql_real_escape_string を使用しようとしています (もっと良い方法があるのではないでしょうか?)

とにかく、ここで問題です。foreach ループを保持すると、qty[] と optname[] の 2 つの post 配列変数が両方とも NULL として返されます (テスト目的で var_export($_POST) を介して出力されます)。これは、WITH foreach mysql_real_escape_string ループを出力するものです。

array (
  'update' => 'Yes',
  'qty' => NULL,
  'optname' => NULL,
)

foreach ループを削除すると、すべて正常に動作します。これが得られ、php が結果を処理するために必要なものです。

array (
  'update' => 'Yes',
  'qty' => 
  array (
    1 => '2',
    2 => '2',
    3 => '2',
    4 => '2',
  ),
  'optname' => 
  array (
    1 => '1|4',
    2 => '1|4',
    3 => '1|4',
    4 => '1|4',
  ),
)

ただし、SQLクエリが発生する前にデータがチェック/クリーニングされていません。ループを使用して各投稿変数をチェックし、POST 変数をそのままにしておくにはどうすればよいですか??

これは、任意のローカル ホストに貼り付けてテストできるコードです。

<?php
foreach ($_POST as $key=>$value) { $_POST[$key] = mysql_real_escape_string($value); }

echo '<pre>';
var_export($_POST);
echo '</pre>';  
?>
<form name="updateQty" id="updateQty" method="post" />
  <input type="hidden" name="update" id="update" value="Yes" />

  <input type="text" name="qty[1]" id="qty[]" class="field" value="2" />
  <input type="hidden" name="optname[1]" id="optname[]" value="1|4" />

  <input type="text" name="qty[2]" id="qty[]" class="field" value="2" />
  <input type="hidden" name="optname[2]" id="optname[]" value="1|4" />

  <input type="text" name="qty[3]" id="qty[]" class="field" value="2" />
  <input type="hidden" name="optname[3]" id="optname[]" value="1|4" />

  <input type="text" name="qty[4]" id="qty[]" class="field" value="2" />
  <input type="hidden" name="optname[4]" id="optname[]" value="1|4" />

  <input type="submit">
</form>

ありがとう!

4

3 に答える 3

2

セキュリティのために mysql_real_escape_string を使用しようとしています

それはあなたが間違っていることです。この関数は、セキュリティとはまったく関係ありません
実際のところ、あなたが実際にやろうとしていることは、すでに非推奨で削除されたmagic quotes機能を復活させ、データを安全にすることなく台無しにすることです.

少なくとも、この関数をこのように使用する必要があります

$var = "'".mysql_real_escape_string($value)."'"; 

エスケープされた値に引用符を追加します(もちろん、クエリからそれらを削除します)。他の場所ではなく、クエリを作成する直前に作成する必要があります。

于 2013-04-06T20:26:40.060 に答える
1
foreach ($_POST as $key=>$value) {
    if(is_array($value)){
        foreach ($value as $k => $v) {
            $_POST[$key][$k] = mysql_real_escape_string($v); 
        }
    } else {
        $_POST[$key] = mysql_real_escape_string($value); 
    }
}

あなたの場合、あなたの POST 値は配列なので、それらもループする必要があります..

@hjpotter92 がコメントしているように、古い mysql 関数を使用するのは良くありません。将来のバージョンでは動作しません...

于 2013-04-06T20:14:12.907 に答える