0

私は現在、ユーザーが選択したデータに基づいて MySQL データベースにクエリを送信する必要があるページに取り組んでいます。

わかりました、より具体的に。ユーザーが国を選択できるWebページがあります。JavaScript を使用して、選択された国を文字列として取得します。国は 2 文字のコードで省略されているため、たとえば、ユーザーが選択した米国、英国、およびオーストラリアを示す文字列「US,GB,AU」を取得します。

これを PHP ページに送信し、GET パラメーターを使用してこれを取得します。

これで、最初に文字列を取得し、explode 関数を使用してカンマに基づいて配列に分割するこの PHP ページができました。この場合、US、UK、AU の 3 つの要素を含む配列ができました。

そして今、私がどうすればいいのかわからないその部分。国とは別に、ユーザーは人口を選択することもできます。ただし、これは常に 1 つの数値であるため、単純です。

次に、多くの都市を含む MySQL データベースにクエリを送信し、ユーザーが選択した人口と国に基づいていくつかの都市を選択します。

だから私はSQLクエリを持っています、そして重要な部分はWHEREステートメントです。

WHERE Population>$population AND Country=

今、これは私が続ける方法がわからないところです。私が望むのは、選択した国からすべての都市を取得することです。各都市はデータベース内の行であり、その名前、人口、および国コードが含まれています。

1 つの国だけの場合は単純で、人口の場合と同じで、Country='$country' だけですが、選択したユーザーのいずれかに対応するすべての都市を選択するようにするにはどうすればよいですか?配列に格納された値。

ありがとう

4

2 に答える 2

4

SQL コンストラクトが必要です

 WHERE Population>$population AND Country IN ('US','GB','AU')

これは、PHP のプリペアド ステートメントでは難しいことです。そのため、SQL インジェクションの危険を避けるために細心の注意を払う必要があります。

編集

$country という名前の php 文字列がある場合、php"US,UK,AU,DE"を使用してこのようにフォーマットできます。

    $country = "US,UK,AU,DE";
    $list = explode(',',$country);
    $instring = "('" . implode("','", $list) . "')";

$instring は次のようになります。 "('US','UK','AU','DE')"

次のように、SQL インジェクションに対して安全にすることができます。

        $country = 'US,UK,AU,DE';
        $list = array();
        foreach (explode(',',$country) as $item) {
            if (preg_match("/^[A-Z][A-Z]$/", $item) ) $list[] = $item;
        }
        $instring = "('" . implode("','", $list) . "')";        

これにより、国のリストがバーストされ、各国コードが 2 つの大文字の ASCII 文字であることを確認してから、リストを適切に引用符/コンマで区切られ、括弧で囲まれた式に結合されます。

このような国のリストがシステムをホストするのを防ぎ"US,;DROP TABLE whatever;"ます。私を信じてください、あなたにこの種のことをしたいだけの悪者がそこにいます.

MySQLFIND_IN_SET関数を使用できますが、これは列にある可能性のあるインデックスを無効にしますCountry

于 2013-08-14T22:31:04.073 に答える
0

またはを使用できます。

WHERE POPULATION>$population AND (COUNTRY="US" OR COUNTRY="AU" OR COUNTRY="UK")

配列を反復処理してクエリを作成するのに助けが必要ですか? また、まだ準備されていない場合は、準備されたステートメントまたは適切なエスケープを調べることをお勧めします。誰かが送信した場合に何が起こるかを考えてください

0; INSERT INTO USERS (USERNAME, PASSWORD) VALUES ("HACKER", "PWNED"); SELECT * FROM CITIES WHERE 1

$人口の内部。PHPによっては、難しくないかもしれません。

于 2013-08-14T22:48:36.423 に答える