$_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
、配列で正当な値が見つからないだけです。
私がこれを混乱させていないことを願っています。助けてくれてありがとう。