0

次のエラーが見つかりました。

これは、次のコードで発生し、名前が配列であるフォームに入力フィールドを追加した場合にのみ発生します (そのため、入力を複数回繰り返すことができます)。エラーが参照する行は ($v=htmlspecialchars($value);) です

if ($len > 2) {
    $values=array();
    $possible=array('orderId','source','date', 'clientPrice','firstName','lastName','email','address','city','zip');
    $i=1;
    $query2 = "UPDATE orders SET ";
    foreach ($_POST as $key => $value) {
        $k=htmlspecialchars($key);
        $v=htmlspecialchars($value);
        if(in_array($k, $possible)) {
            $query2 .= $k." = ?";
            $values[]=$v;  //append values to an array for later use
            if($i < ($len-2)) $query2 .= ', ';
            $i++;
        }
    }
}

これを解決する方法とエラーの理由について何か考えはありますか?

4

3 に答える 3

1

あなたは最初の段落であなた自身の質問に答えました。配列を値として渡したため$value、配列名を割り当てたさまざまな入力の配列になります。

foreach($_POST as $key => $value)
{
    if ( ! is_array($value))
    {
        // Manage values that aren't arrays
    }
}

反復すること$_POSTは、実際には良い習慣ではありません。フィールドの実際の名前を独自の変数に割り当てるか、必要な正確なデータで独自の配列を作成することをお勧めします。

于 2013-09-16T19:54:21.917 に答える
0

すべての _POST 値を処理しないでください。必要なものだけにチェックを入れてください。このコードを別のアプローチで試してください。より正確です。

foreach ($possible as $_possib) {
    if (!isset($_POST[$_possib])) continue;
    $query1 .= $_possib." = ?";
    $values[] = htmlspecialchars($_POST[$_possib]); // should be mysql_real_escape?
    if($i < ($len-2)) $query2 .= ', ';
    $i++;
}

ちなみに htmlspecialchars は html 形式で正しく表示するためだけのものなので考えてみてください。これらの値をデータベースに送信するようですので、関連するエスケープ関数を使用してください。

于 2013-09-16T19:55:30.100 に答える
0

エラーが示すように、$_POST 値の少なくとも 1 つが配列のようです。

array_walk_recursive 内で htmlspecialchars() 呼び出しをラップしてみてください。必要な場合にのみ適用するように、 if(is_array()) チェックも追加しました。

if(is_array($value)) array_walk_recursive(htmlspecialchars($value));

または、var_dump($_POST) を使用して、どの入力フィールドが配列として表示されているかを確認し、これが望ましくない動作である場合は、それに応じてフォームを微調整することもできます。

于 2013-09-16T19:55:48.327 に答える