-1

$_GETホワイトリスト配列に対して変数をチェックしようとすると、奇妙な結果が得られます。変数は配列にありますが、in_array見つかりません。何が起こっているのかをできる限り説明します。

vars は、$_GET全部で 3 つのオプション/選択項目から設定されます。オプションの1つだけが問題を引き起こしています。クエリを実行するSELECTには、少なくとも 2 つのオプションを選択する必要があります。他の 2 つのオプションをどのように組み合わせても、期待どおりに機能します。

オプション/選択リストを取得するにSELECTは、レコードのサブセットを取得するクエリがあります。

そのレコードセットから、foreachループを使用してさまざまな値を取得し、select タグに入力します。そのため、選択値は db テーブルの値によって入力されます。ホワイトリスト配列はデータベースからコピーされます。

$_GETホワイトリスト配列に対して変数をチェックします。問題のオプションは、カンマ区切りの文字列にすることができます (例: 'Italian,Pizza' または 'American, Barbeque, Sandwiches')。

このオプションの選択値リストを取得するにはimplode、各カテゴリのカンマ区切りのリストを作成し、次に使用explodeして配列を作成し、次に使用array_uniqueして各カテゴリの単一インスタンスを含む配列を取得します。この配列をエコーすると、すべてが正しくなります (選択した選択肢が正しく入力されます)。

implode出力:

Italian,Pizza,Italian,Pizza,Italian,Pizza,Italian,Italian,Sandwiches,Italian,Pizza,Italian

explode出力:

    Array
    (
        [0] => Italian
        [1] => Pizza
        [2] => Italian
        [3] => Pizza
        [4] => Italian
        [5] => Pizza
        [6] => Italian
        [7] => Italian
        [8] => Sandwiches
        [9] => Italian
        [10] => Pizza
        [11] => Italian
    )

array_unique出力:

    Array
    (
        [0] => Italian
        [1] => Pizza
        [8] => Sandwiches
    )

したがって、URL は次のようになります。 ../search.php?var_src=Sandwiches&city_src=Cityname

変数をサニタイズするには$_GET:

    if((isset($_GET['var_src'])) && in_array($_GET['var_src'], $var_array)) {
        $var_sort = $_GET['var_src'];
    }

繰り返し$var_arrayますが、db テーブルからコピーされた配列です。

$_GET配列内に var が見つからないため、コードはここで停止します。

データベース レコードの 1 つを 1 つのカテゴリ値 (「サンドイッチ」など) に変更し、リストでそのオプションを選択すると、結果は期待どおりになります。ただし、「Pizza,Sandwiches」のように、レコードに複数のカテゴリ値 (それぞれがホワイトリスト配列にある) がある場合は、どちらも機能しません。

キッカーは、カテゴリ値 'Italian' を、単独で、または db レコード内の他の値と一緒に含めて、この値を選択すると、機能することです。理由がわかりません。

そのため、レコードのコンマ区切り文字列として他の値が含まれているかどうかに関係なく、その特定の値 (「Italian」) が選択されている場合、コードは機能し、レコードに複数の値が関連付けられている他の値では機能しません。

問題の値が URL にあることを確認したので、上記のコード (in_array($_GET['var_src'], $var_array)) で動作するはずです。

また、渡された値に基づいてレコードを選択する前にホワイトリストに対するサニタイズが行われるため、db レコードを変更すると効果がある理由がわかりません。私が知る限りin_array、配列で正当な値が見つからないだけです。

私がこれを混乱させていないことを願っています。助けてくれてありがとう。

4

1 に答える 1

1

これが役立つかどうかわからない場合は、次の例のように変更してみてください。

$opt = array( 'Italian,Pizza' , 'American, Barbeque, Sandwiches');
$opts = implode(',',$opt);
$opta = explode(',',$opts);
foreach ($opta as $key=>$value) {
    $opta[$key]=trim($value);
}
$opta = array_flip($opta);
var_export($opta);
//now test it simply with isset:
$val = trim($_GET['var_src']);
echo isset($opta[$val])? 'yes':'no';
于 2012-08-12T21:32:33.623 に答える