質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.35%
SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

PHP

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

検索

検索は、あるデータの集まりの中から 目的のデータを見つけ出すことです。

Q&A

解決済

1回答

549閲覧

いずれかのチェックでも一致したものを検索でヒットするようにしたい

tsunana

総合スコア18

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

PHP

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

検索

検索は、あるデータの集まりの中から 目的のデータを見つけ出すことです。

0グッド

0クリップ

投稿2020/07/27 01:38

前提・実現したいこと

いずれかのチェックでも一致したものを検索でヒットするようにしたい

該当のソースコード

・ ・ //checkbox「トップス」 if (isset($tops)) { $sql .= " AND A.c_tops_short = 0 "; $sql .= " AND A.c_tops = 1 "; } //checkbox「ボトムス」 if (isset($bottoms)) { $sql .= " AND ( A.bottoms <> 1 OR A.bottoms is null) "; $sql .= " AND A.bottoms_code = 5 "; } ・ ・

内容/詳細

チェックボックス検索項目に「トップス」「ボトムス」があります。

上記がその各チェック項目の検索条件を書いています。
「トップス」のみチェックを入れて検索した場合は「トップス」の商品が検索でヒットしますが、「トップス」と「ボトムス」両方にチェックを入れ検索した場合は1件もヒットしません。。

おそらく現状ですとくくりを別で書いている(ORを使っていない?)ためチェックを入れた全ての条件を満たすもの?
しかヒットしていないような気がします。。

これをいずれかのチェックに該当するものでも検索ヒットするように書き換えたいです。

試してみたソースコード

if (isset($tops) && isset($bottoms)) { //両方チェックした場合 $sql .= " AND ((A.c_tops_short = 0 AND A.c_tops = 2) OR ((A.bottoms <> 1 OR A.bottoms is null) AND A.bottoms_code = 71))"; } else { if (//トップスだけの場合) { ・・・ } if (//ボトムスだけの場合) { ・・・ } }

カッコでひと括りにしてORにするような気がするのですが、方法がわからず手が詰まっています。
何卒ご教授のほどお願いいたします。

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

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

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

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

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

m.ts10806

2020/07/27 01:45

まず、SQLだけで組んでみてはどうでしょう。
sazi

2020/07/27 03:45

単独とそれを合わせた時の条件が違っていますが、何故ですか?
tsunana

2020/07/27 06:39

m.ts10806様>そうですね・・迷走してしまってもなのでいま一度SQLで整理してみます。 sazi様>すみません、前者が正しいです。内容の修正後と修正前がごっちゃになっておりました。
guest

回答1

0

ベストアンサー

topsとbottomsがor検索するならこう

投稿2020/07/27 03:23

yambejp

総合スコア116724

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

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

yambejp

2020/07/27 03:23

<?PHP $sql="select * from tbl where 1 "; $tops=filter_input(INPUT_GET,"tops"); $bottoms=filter_input(INPUT_GET,"bottoms"); if (!is_null($tops) or !is_null($bottoms)) { $sql .= " AND (0 "; if (!is_null($tops)) { $sql .= " OR (A.c_tops_short = 0 AND A.c_tops = 1 )"; } if (!is_null($bottoms)) { $sql .= " OR (( A.bottoms <> 1 OR A.bottoms is null) AND A.bottoms_code = 5) "; } $sql .= " )"; } print $sql.";<br>\n"; ?> <form> <label><input type="checkbox" name="bottoms" value="1">bottoms</label> <label><input type="checkbox" name="tops" value="1">tops</label> <input type="submit" value="send"> </form>
tsunana

2020/07/27 06:42

なるほどです・・・参考になります。 今後検索カテゴリ追加でチェックボックスが増えた場合は、あいだに if (!is_null(変数)) { $sql .= " OR (中身の条件)"; } を書き加えていけば良いのでしょうか。
yambejp

2020/07/27 06:55

「if (!is_null($tops) or !is_null($bottoms)) {」のところが調整になりますが どれも選ばないときは絞り込みをしない、どれか一つでも選んだとき OR検索という条件であればあとはORでつないでいけばOKです。 AND (0 OR 条件1 OR 条件2 OR 条件3・・・) となります
tsunana

2020/07/28 02:36

ありがとうございます。 その後試しや応用に「靴」の選択カテゴリを追加してみたところ、 if (!is_null($tops) or !is_null($bottoms) or !is_null($shoose)) { $sql .= " AND (0 "; if (!is_null($tops)) { $sql .= " OR (A.c_tops_short = 0 AND A.c_tops = 1 )"; } if (!is_null($bottoms)) { $sql .= " OR (( A.bottoms <> 1 OR A.bottoms is null) AND A.bottoms_code = 5) "; } if (!is_null($shoose)) { $sql .= " OR (A.shoose = 1 AND A.shoose_code = 3) "; } $sql .= " )"; } のように追加してみたのですが3つ目以降?を追加したら検索がおかしくなりました。 (3つの項目のうちいろんなチェックして検索すると、検索で全部でてしまったりなど) また書き方が悪いのでしょうか;
yambejp

2020/07/28 03:00

複数の変数すべてがnullの場合を判定するのはフィルタとか使う方が楽かも $sql="select * from tbl where 1 "; $tops=filter_input(INPUT_GET,"tops"); $bottoms=filter_input(INPUT_GET,"bottoms"); $shoes=filter_input(INPUT_GET,"shoes"); if (count(array_filter([$tops,$bottoms,$shoes],function($x){ return !is_null($x); }))>0){ $sql .= " AND (0 "; if (!is_null($tops)) { $sql .= " OR (A.c_tops_short = 0 AND A.c_tops = 1 )"; } if (!is_null($bottoms)) { $sql .= " OR (( A.bottoms <> 1 OR A.bottoms is null) AND A.bottoms_code = 5) "; } if (!is_null($shoes)) { $sql .= " OR (A.shoose = 1 AND A.shoose_code = 3) "; } $sql .= " )"; } print $sql.";<br>\n";
yambejp

2020/07/28 03:42

すべてがNULLかどうかのチェックはPHP7からはNULL合体演算子が 使えたと思います
q_sane_q

2020/07/28 04:22

PHPは久しく触っていないのでおかしなことを言っていたら申し訳ないのですが $arr[] = "(A.c_tops_short = 0 AND A.c_tops = 1 )" のように文字列を配列に入れていって 最後に配列の要素数が1以上だったら implode(" OR ", $arr) で結合してはめ込む、というようにすれば ・項目が増えたら最初のifで確認するものを増やさなければいけない ・文字列連結の都合上「0 OR」から始まっている あたりのところがすっきりしないでしょうか
tsunana

2020/07/28 04:35

yambejp様、q_sane_q様>ご意見ありがとうございます。 後者の内容で、あくまで想像でわからないところは多いのですが $sqlとは別の変数を配列で定義して(例:$sample)、その配列に文字列を追加していって最終的に $sql に $sample をつなげれば良いみたいなイメージでしょうか? $sql .= ' AND ' . implode(' OR ', $sample); みたいな・・・
yambejp

2020/07/28 04:48 編集

ロジックの問題 A AND B AND (C OR D OR E)は、すなわち A AND B AND (0 OR C OR D OR E)なので、 プログラム的に「OR X」でつなぐことで平準的に処理ができます 「AND」についても同様で 「WHERE A AND B」と書くよりも 「WHERE 1 AND A AND B」の方がプログラム的に処理しやすいということ
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問