複数のgetパラメータと条件分岐について

解決済

回答 3

投稿

  • 評価
  • クリップ 0
  • VIEW 135

Roo

score 50

前提:

【課題】ECサイト構築中
商品一覧画面にて、チェックボックスで商品を分けたい
メンズ/レディース/キッズ

現状:

単体での各チェックボックスを押下した際の挙動は問題なし
複数のチェックボックス押下でうまくいかない。

①↓メンズとレディースを同時に選択した時に、一番最後のGETパラメーターのみ反映されます(ja=ledies)
(例)
http://~~product_all_test2.php?ja=&ja=men&ja=ledies

②↓結果
表示されるのは、レディースの商品情報のみ

やりたいこと:

②で、表示されるのが、メンズとレディースの商品情報であること。
※複数のパラメーターを正常に処理したい。
if文での条件分岐の記載方法をお教えください。

 if ($_GET["ja"] == 'ledies'){

try{
    $dbh = new PDO($dsn, $user, $password);
    echo "接続成功";

    $sql = 'SELECT * FROM product';
    $statement = $dbh -> query($sql);

    $sql = 'SELECT * FROM product WHERE genre = 2';    //条件 genre=2(ledies)
    $statement = $dbh -> query($sql);

    //レコード件数取得
    $row_count = $statement->rowCount();

    while($row = $statement->fetch()){
        $rows[] = $row;
    }


    //データベース接続切断
    $dbh = null;

}catch (PDOException $e){
    print('Error:'.$e->getMessage());
    die();
}

} elseif ($_GET["ja"] == 'men'){
try{
    $dbh = new PDO($dsn, $user, $password);
    echo "接続成功";

    $sql = 'SELECT * FROM product';
    $statement = $dbh -> query($sql);

    $sql = 'SELECT * FROM product WHERE genre = 1';       ////条件 genre=1(men)
    $statement = $dbh -> query($sql);

    //レコード件数取得
    $row_count = $statement->rowCount();

    while($row = $statement->fetch()){
        $rows[] = $row;
    }


    //データベース接続切断
    $dbh = null;

}catch (PDOException $e){
    print('Error:'.$e->getMessage());
    die();
}

} elseif ($_GET["ja"] == 'kids') {
try{
    $dbh = new PDO($dsn, $user, $password);
    echo "接続成功";

    $sql = 'SELECT * FROM product';
    $statement = $dbh -> query($sql);

    $sql = 'SELECT * FROM product WHERE genre = 3';       ////条件 genre=3(kids)
    $statement = $dbh -> query($sql);

    //レコード件数取得
    $row_count = $statement->rowCount();

    while($row = $statement->fetch()){
        $rows[] = $row;
    }

    //データベース接続切断
    $dbh = null;

}catch (PDOException $e){
    print('Error:'.$e->getMessage());
    die();
}
} elseif ($_GET["ja"] == 'all') {
try{
    $dbh = new PDO($dsn, $user, $password);
    echo "接続成功";

    $sql = 'SELECT * FROM product';
    $statement = $dbh -> query($sql);

    $sql = 'SELECT * FROM product';       //すべてのチェックボックス押下
    $statement = $dbh -> query($sql);

    //レコード件数取得
    $row_count = $statement->rowCount();

    while($row = $statement->fetch()){
        $rows[] = $row;
    }



    //データベース接続切断
    $dbh = null;

}catch (PDOException $e){
    print('Error:'.$e->getMessage());
    die();
}

}

試したこと

if ($_GET["ja"] == 'men' and 'ledies') {
----------略
$sql = 'SELECT * FROM product WHERE genre=1 or genre=2';  

チェックボックス:
①メンズとレディース
②メンズのみ
③レディースのみ

①の結果:
レディースの商品画像のみが表示された。
②の結果:
メンズとレディースの商品画像が表示された。
③の結果:
レディースの商品画像のみが表示された。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

checkベストアンサー

+1

name[]のように配列にして送信してください。
配列を用いずに同名の場合はラジオボタンとほぼ同じ挙動です。1つしか送信されません。
で、SQLではINを利用すると良いです。

※未検証

<input type="checkbox" name="genre[]" value="1">
<input type="checkbox" name="genre[]" value="2">
<input type="checkbox" name="genre[]" value="3">
$where = "";
$genre = filter_input(INPUT_GET, 'genre',FILTER_DEFAULT,FILTER_REQUIRE_ARRAY);
if(!is_null($genre) && count($genre)> 0){
   $param = array_fill(0,count($genre),'?');
   $where = ' where genre in ('.implode(',',$param).')';
}
$sql = "SELECT * FROM product".$where;

$stmt = $pdo->prepare($sql);
$bindValue = [];
if(!is_null($genre) && count($genre)> 0){
  $bindValue = $genre;
}
$stmt->execute($bindValue);

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/09/12 15:24 編集

    ①print_r($param);
    ②print_r($where);
    ③print_r($bindValue);

    ①Array ( [0] => ? [1] => ? )
    ②where genre in (?,?)
    ③Array ( [0] => [1] => 2 )


    そのため、
    $sql = "SELECT * FROM product".$where;
    が指定できてない状態です。

    キャンセル

  • 2019/09/12 16:44

    今、htmlも含めてコードはどうなってますか?
    質問本文に「追記」してください。(提示されたコードを更新するのではなく「試したこと」としての追記をお願いします)

    キャンセル

  • 2019/09/13 13:30

    m.ts10806様の提示されたコードに対し
    我流でいくつかのコードを記載したことが原因となっておりました。
    複数のパラメータの受領と接続
    疑問符パラメーターも問題なく作用しました。


    また、難航した場合、手助けいただけると幸いです。
    ご丁寧にありがとうございました。

    キャンセル

+1

まずはinputのnameを「ja」から「ja[]」に変更してください

その上で

$ja=filter_input(INPUT_GET,"ja",FILTER_DEAFULT,FILTER_REQURE_ARRAY);


で受けます

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/09/10 16:44

    filter_input(INPUT_GET,"ja",FILTER_DEAFULT,FILTER_REQURE_ARRAY);
    ↑から調べます!ご指摘ありがとうございます

    キャンセル

+1

if文での条件分岐の記載方法をお教えください。

残念ながら、if文ではどうしようもありません。PHPが$_GETを生成する時点で、キーを上書きしてしまいますので、その後から値を取ろうとどう頑張っても、一番最後の値しか取れません。

対策としては2つ考えられます。

  • キーの名前をja[]のようにして、PHP側に配列を送れるようにする
  • JavaScriptをフォームに仕掛けて、同じキーに複数の値を送るという形ではない形にデータを変換する

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/09/10 15:26

    > どうしようもありません

    厳密に言えば「$_SERVER["QUERY_STRING"]を解釈すればifでもなんとかなるんですけどね

    キャンセル

  • 2019/09/10 16:44

    PHPが$_GETを生成する時点で、キーを上書きしてしまいますので、、。
    なるほど、故にですね。他の方々含め参考にさせていただきます。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.21%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る