2

フォームのチェックボックスの値をMySQLクエリとして使用してデータを取得するphpスクリプトが必要です。クエリでOR演算子とともにWHEREを使用する必要があると思います。

私のPHPとMySqlレベルは初心者です。

<form id="form1" name="form1" method="post" action="">

    <p>
        <h3>story</h3>
        <label><input type="checkbox" name="story" value="1" id="story_1" />one story</label>
        <label><input type="checkbox" name="story" value="2" id="story_2" />two story</label>
    </p>

    <p>
        <h3>bedrooms</h3>
        <label><input type="checkbox" name="bedroom" value="2" id="bed_2" />two beds</label>
        <label><input type="checkbox" name="bedroom" value="3" id="bed_3" />three beds</label>
        <label><input type="checkbox" name="bedroom" value="4" id="bed_4" />four beds</label>
    </p>

    <p>
        <h3>baths</h3>
        <label><input type="checkbox" name="bath" value="1" id="bath_1" />one bath</label>
        <label><input type="checkbox" name="bath" value="2" id="bath_2" />two baths</label>
        <label><input type="checkbox" name="bath" value="3" id="bath_3" />three baths</label>
    </p>

    <input type="submit" name="search" value="search" />

</form>

これまでの私の質問

SELECT * FROM homes WHERE story='1' OR story='2' OR bed='3' OR baths='3'

したがって、チェックボックスがチェックされていない場合、WHERE句はまったく追加されず、デフォルトですべてのレコードが取得されます。

4

4 に答える 4

2

非常に多くのorを使用してselectステートメントを使用すると、問題が発生します。

SELECT * FROM homes WHERE story='1' OR story='2' OR bed='3' OR baths='3'

これにより、ストーリー= 1で、バスルームまたはベッドルームの数に関係なく、すべての家が作成されます。ここで、story = 2で、任意の数のバスルームまたはベッドルームがあります。ここで、ベッド= 3で、任意の数のストーリーまたはバスがあります。ここで、バス= 3で、任意の数のベッドまたはバスがあります。

だからあなたはおそらくすべての家で結果を得ることになります

あなたがすべきことは、parensで異なるタイプを分離し、それらの間にANDを使用することです。

SELECT * FROM homes WHERE (story='1' OR story='2') and (bed='3') and (baths='3')

または、より複雑なクエリの場合は、次のようになります。

SELECT * FROM homes WHERE (story='1' OR story='2') 
                      and (bed='3' OR bed = '4') 
                      and (baths='3' OR baths='4')

これにより、1または2のストーリー、3または4のベッドルーム、3または4のバスの結果が生成されます。3つのストーリーの家は取得できず、2つのベッドルームの家は取得できません。 tは2つの寝室の家を取得します。

これでうまくいくと思います。

于 2012-04-14T15:08:21.897 に答える
2

入力に同じ名前を付け、その後に角かっこを付けることで、選択したすべての値を配列で取得できます。

HTML:
<input type = "checkbox" name = "bed []" value = "1"/>1ベッドルーム
<inputtype= "checkbox" name = "bed []" value = "2"/>2ベッドルーム

その後、WHERE句でmysql IN()関数を使用できます。PHP:

$aBeds = $_POST['bed'];  // array (1,2) if both are checked
$aBeds = array_map ('intval', $aBeds); // filter with intval for sql injection
$sBeds = implode (',', $aBeds); // "1,2" if both are checked
$query = "SELECT  * FROM homes WHERE bed IN($sBeds) and ...";

注:そこで私はいくつかの迅速で汚い入力フィルタリングを行いましたが、これはおそらくSQLインジェクションを回避するための最良の方法ではないことに注意してください。データアクセス層、プリペアドステートメント、またはすべてのクエリが独自のフィルタリングコードを必要としないその他のユニバーサルスキームを使用することをお勧めします。

于 2012-04-14T15:20:34.780 に答える
1

HTMLの各入力には、一意の「名前」属性が必要です。フォームが投稿されると、「action」属性のURLアドレスに送信されます。これは空白なので、「something.php」に送信して、サーバー上に同じ名前のPHPファイルを作成することをお勧めします。

empty($ _ POST)がTrueを返す場合、フォームがPHPファイルに投稿されたかどうかがわかります。この変数は、フォームから投稿されたデータを保持します。

各入力タグのname属性は、$_POSTグローバル変数に配列エントリを作成します。したがって、チェックボックスが有効になっている場合、$ _POST["bath_1"]は1になります。

$_POSTデータを必要なSQLステートメントに変換する方法はたくさんあります。投稿されたデータの処理を最初に機能させてから、配列の処理とSQLwhereステートメントの生成に関連するより具体的な質問に戻ることをお勧めします。

于 2012-04-14T15:11:37.263 に答える
1

インジェクション攻撃を回避するためにいくつかの追加機能を追加しました。

$query = 'SELECT * FROM homes WHERE 1';

// Protect against injection attacks
$valid_responses = array(
    'story' => array(
        '1','2'),
    'bedroom' => array(
        '2','3','4'),
    'bath_1' => array(
        '1','2','3'),
);
foreach ($valid_responses as $field=>$values) {
    $selection = array_intersect($_POST[$field],$values);
    if (!empty($selection)) {
        $query .= ' AND ' . $field . ' IN (' . implode(',',$selection) . ')';
    }
}
于 2012-04-14T15:13:10.417 に答える