🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
if

if文とは様々なプログラミング言語で使用される制御構文の一種であり、条件によって処理の流れを制御します。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

3回答

4124閲覧

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

Roo

総合スコア55

if

if文とは様々なプログラミング言語で使用される制御構文の一種であり、条件によって処理の流れを制御します。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2019/09/10 06:07

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

##現状:

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

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

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

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

php

1 2 if ($_GET["ja"] == 'ledies'){ 3 4try{ 5 $dbh = new PDO($dsn, $user, $password); 6 echo "接続成功"; 7 8 $sql = 'SELECT * FROM product'; 9 $statement = $dbh -> query($sql); 10 11 $sql = 'SELECT * FROM product WHERE genre = 2'; //条件 genre=2(ledies) 12 $statement = $dbh -> query($sql); 13 14 //レコード件数取得 15 $row_count = $statement->rowCount(); 16 17 while($row = $statement->fetch()){ 18 $rows[] = $row; 19 } 20 21 22 //データベース接続切断 23 $dbh = null; 24 25}catch (PDOException $e){ 26 print('Error:'.$e->getMessage()); 27 die(); 28} 29 30} elseif ($_GET["ja"] == 'men'){ 31try{ 32 $dbh = new PDO($dsn, $user, $password); 33 echo "接続成功"; 34 35 $sql = 'SELECT * FROM product'; 36 $statement = $dbh -> query($sql); 37 38 $sql = 'SELECT * FROM product WHERE genre = 1'; ////条件 genre=1(men) 39 $statement = $dbh -> query($sql); 40 41 //レコード件数取得 42 $row_count = $statement->rowCount(); 43 44 while($row = $statement->fetch()){ 45 $rows[] = $row; 46 } 47 48 49 //データベース接続切断 50 $dbh = null; 51 52}catch (PDOException $e){ 53 print('Error:'.$e->getMessage()); 54 die(); 55} 56 57} elseif ($_GET["ja"] == 'kids') { 58try{ 59 $dbh = new PDO($dsn, $user, $password); 60 echo "接続成功"; 61 62 $sql = 'SELECT * FROM product'; 63 $statement = $dbh -> query($sql); 64 65 $sql = 'SELECT * FROM product WHERE genre = 3'; ////条件 genre=3(kids) 66 $statement = $dbh -> query($sql); 67 68 //レコード件数取得 69 $row_count = $statement->rowCount(); 70 71 while($row = $statement->fetch()){ 72 $rows[] = $row; 73 } 74 75 //データベース接続切断 76 $dbh = null; 77 78}catch (PDOException $e){ 79 print('Error:'.$e->getMessage()); 80 die(); 81} 82} elseif ($_GET["ja"] == 'all') { 83try{ 84 $dbh = new PDO($dsn, $user, $password); 85 echo "接続成功"; 86 87 $sql = 'SELECT * FROM product'; 88 $statement = $dbh -> query($sql); 89 90 $sql = 'SELECT * FROM product'; //すべてのチェックボックス押下 91 $statement = $dbh -> query($sql); 92 93 //レコード件数取得 94 $row_count = $statement->rowCount(); 95 96 while($row = $statement->fetch()){ 97 $rows[] = $row; 98 } 99 100 101 102 //データベース接続切断 103 $dbh = null; 104 105}catch (PDOException $e){ 106 print('Error:'.$e->getMessage()); 107 die(); 108} 109 110}

###試したこと

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

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

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

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

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

※未検証

html

1<input type="checkbox" name="genre[]" value="1"> 2<input type="checkbox" name="genre[]" value="2"> 3<input type="checkbox" name="genre[]" value="3">

php

1$where = ""; 2$genre = filter_input(INPUT_GET, 'genre',FILTER_DEFAULT,FILTER_REQUIRE_ARRAY); 3if(!is_null($genre) && count($genre)> 0){ 4 $param = array_fill(0,count($genre),'?'); 5 $where = ' where genre in ('.implode(',',$param).')'; 6} 7$sql = "SELECT * FROM product".$where; 8 9$stmt = $pdo->prepare($sql); 10$bindValue = []; 11if(!is_null($genre) && count($genre)> 0){ 12 $bindValue = $genre; 13} 14$stmt->execute($bindValue);

投稿2019/09/10 06:24

編集2019/09/10 06:25
m.ts10806

総合スコア80875

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Roo

2019/09/10 07:49

勉強不足ですみませんが、上記内容一旦調べて試させていただきます。 無邪気にコピーして試したところ、 $stmt -> execute($bindValue); ここで、おこられました。。
m.ts10806

2019/09/10 07:51

まぁ、未検証なので。コメントも書いてませんしね。 長れの参考にしてもらったらと思って提示しています。 $genreに何が来ているかは確認しておいてください。エラーメッセージ次第ですし。 コードの後半はpdo使うための蛇足です。
Roo

2019/09/11 10:29

genreの中身は期待値通り、valueが格納されたのですが $paramは ( [0] => ? [1] => ? ) $whereは  where genre in (?,?) となっており、宜しければ、提示していただいた文面に コメントを当てていただきたいです。
m.ts10806

2019/09/11 21:27

想定通りのSQLのはずです。 「おこられた」だけではわからないのでエラーメッセージを確認してください
Roo

2019/09/12 02:13

現在エラー文言は出ておりません。 $param = array_fill(0,count($genre),'?'); 疑問符に値が入っていないことから、 取得する情報がないように思えます。。
m.ts10806

2019/09/12 02:51

疑問符パラメータです。 execute時に値を送ってバインドしてるはずです。
Roo

2019/09/12 07:14 編集

①print_r($param); ②print_r($where); ③print_r($bindValue); ①Array ( [0] => ? [1] => ? ) ②where genre in (?,?) ③Array ( [0] => [1] => 2 ) そのため、 $sql = "SELECT * FROM product".$where; が指定できてない状態です。
m.ts10806

2019/09/12 07:44

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

2019/09/13 04:30

m.ts10806様の提示されたコードに対し 我流でいくつかのコードを記載したことが原因となっておりました。 複数のパラメータの受領と接続 疑問符パラメーターも問題なく作用しました。 また、難航した場合、手助けいただけると幸いです。 ご丁寧にありがとうございました。
guest

0

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

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

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

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

投稿2019/09/10 06:19

maisumakun

総合スコア145977

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yambejp

2019/09/10 06:26

> どうしようもありません 厳密に言えば「$_SERVER["QUERY_STRING"]を解釈すればifでもなんとかなるんですけどね
Roo

2019/09/10 07:44

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

0

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

その上で

PHP

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

で受けます

投稿2019/09/10 06:17

yambejp

総合スコア116694

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Roo

2019/09/10 07:44

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問