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

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

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

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

SQL

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

PHP

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

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

Q&A

解決済

3回答

1478閲覧

PHP:検索フォーム

xxx0_0xxx

総合スコア9

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

SQL

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

PHP

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

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

0グッド

1クリップ

投稿2021/06/03 02:21

編集2021/06/03 05:47

DBに登録している商品を検索かけて、表示させたいです。
商品IDや名前を検索かけると表示はされるのですが、適当な値をいれても、データを取り出せてしまいます。もしかしたら、どこかのコードでとりあえず出力するようになってしまっているのかと・・・原因がつかめないためお力を貸してほしいです。

  $hoge1 = $_POST['number']??''; // 商品番号 $hoge2 = $_POST['name']??''; //商品名 $hoge3 = $_POST['date']??''; // 入荷日 if(empty($hoge1) && empty($hoge2) && empty($hoge3)){ // 初期状態を空白 $sql = $pdo->query('SELECT * FROM items where id=0'); // 条件が一つでも入力されていれば検索をかけれるようにする }elseif($sql=$pdo->query('SELECT * FROM items WHERE 1=1'));{ if($hoge1 ){'AND number=:number'; } if($hoge2 ){'AND name=:name'; } if($hoge3 ){'AND date=:date'; } } $rows = $sql->fetchAll();

初期表示を空にするため

if(empty($hoge1) && empty($hoge2) && empty($hoge3)){ // 初期状態を空白 $sql = $pdo->query('SELECT * FROM items where id=0');

検索条件は、一つでも当てはまっていれば表示する

// 条件が一つでも入力されていれば検索をかけれるようにする }elseif($sql=$pdo->query('SELECT * FROM items WHERE 1=1'));{ if($hoge1 ){'AND number=:number'; } if($hoge2 ){'AND name=:name'; } if($hoge3 ){'AND date=:date'; } }

テーブルのコード

<tbody> <?php foreach ($rows as $key => $row): ?> <tr data-index="0"> <th scope="row"> <!-- 1-2: #ラジオボタン --> <input class="form-check-input ml-1" type="radio" name="flexRadioDefault" id="flexRadioDefault1"> <label class="form-check-label" for="flexRadioDefault1"></label> </th> <td><?= $row['number']?></td> <td><?= $row['name']?></td> <td><?= $row['date']?></td> </tr> <?php endforeach; ?> </tbody>
<form method = "post" action = "hogehoge.php" name="test"> <div class="form-group"> <div class="row"> <div class="col-4"> <label for="number" class="control-label">商品番号:</label> <input type="number" class="form-control" id="number" name="number" value=""> </div> <div class="col-4"> <label for = "name" class = "control-label">商品名:</label> <input type = "text" class = "form-control" id = "name" name = "name" value=""> </div> <div class="col-4"> <label for = "date" class = "control-label">入荷日:</label> <!-- input="date"でカレンダー表示 --> <input type="date" class="form-control" id="date" name="date" placeholder="年/月/日" value=""> </div> </div> <!-- 2-1:クリア処理 ボタン:「クリア」・「検索」--> <div class="form-group text-right mt-3"> <button class="btn btn-warning btn-sm" type="reset" name="reset" value="clear">クリア</button> <button class="btn btn-info btn-sm" type="serch">検索</button> </div> </div> </form>

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2021/06/03 02:31 編集

「if(empty($hoge1 && empty($hoge2) && empty($hoge3))」 でカッコが足りてない。転記ミスはほかにないですか? あと、ソースまるごと貼ってくれないと、第三者が再現できないので、エスパー的回答に終止するしかないんですけど。
guest

回答3

0

php

1if(empty($hoge1 && empty($hoge2) && empty($hoge3))

php

1if(empty($hoge1) && empty($hoge2) && empty($hoge3))

くらいはパット見でわかった。


php

1 if(empty($hoge1 && empty($hoge2) && empty($hoge3)){ // 初期状態を空白 2 $sql = $pdo->query('SELECT * FROM items where id=0'); 3 // 条件が一つでも入力されていれば検索をかけれるようにする 4 }elseif($sql=$pdo->query('SELECT * FROM items WHERE 1=1'));{

elseifのところ、おかしいよな?


php

1 if($hoge1 ){'AND number=:number'; 2 } 3 if($hoge2 ){'AND name=:name'; 4 } 5 if($hoge3 ){'AND date=:date'; 6 }

何がしたいの? 文字列リテラルだけ置いても意味がない。

ダメ出しばかりしているのは、仕様や設計に関わる情報が質問文中にないために、
どう改善すればいいかを考える段階にないってことです。
思考整理中に試しに実行したコードのまま、動作確認すら取ってないのかなって思えるほど、
phpコードからやりたいことが読み取れないので。

投稿2021/06/03 02:30

編集2021/06/03 02:37
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

0

}elseif($sql=$pdo->query('SELECT * FROM items WHERE 1=1'));{

ここ、最初のifを満たさなければ必ず実行されてます。

if($hoge1 ){'AND number=:number';

} if($hoge2 ){'AND name=:name'; } if($hoge3 ){'AND date=:date';

}

ここ、なんにもしてません。

SQLを動的に組み立てたいのでしょうけど、
これでは組み合わせの検索ができませんので、
配列に追加していってimplodeでandで結合すると良いです。

また、たとえ条件いれてもパラメータセットしててバインドしてないのでエラーになるのでは(ちゃんとtry-catchしてね)

いずれにしても下記のような記事は読んで、基本的な概念や組み方は覚えましょう。

PHPでデータベースに接続するときのまとめ

投稿2021/06/03 02:30

編集2021/06/03 02:35
m.ts10806

総合スコア80850

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

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

0

ベストアンサー

PHP

1<?PHP 2$number=filter_input(INPUT_POST,'number'); 3$name =filter_input(INPUT_POST,'name'); 4$date =filter_input(INPUT_POST,'date'); 5$data =[]; 6$sql='SELECT * FROM items where 1 '; 7if(count(array_filter([$number,$name,$date],function($x){ 8 return !empty($x); 9}))==0){ 10 $sql.=" and 0"; 11} 12foreach(["number","name","date"] as $val){ 13 if($$val){ 14 $sql.=" and {$val}=?"; 15 $data[]=$$val; 16 } 17} 18print $sql.";<br>\n"; 19print_r($data); 20?> 21<hr> 22<form method="post"> 23number:<input name="number" value=""><br> 24name:<input name="name" value=""><br> 25date:<input name="date" value=""><br> 26<input type="submit" value="send"> 27</form>

※一部フローを調整

投稿2021/06/03 02:39

編集2021/06/03 02:49
yambejp

総合スコア114858

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

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

m.ts10806

2021/06/03 02:40

array_filterって便利ですね。
yambejp

2021/06/03 02:40

値が0だったときにemptyと判断するか・・・など課題はあります
m.ts10806

2021/06/03 02:51

まあそこは仕様次第ですね。
xxx0_0xxx

2021/06/03 05:53 編集

大変ご丁寧な回答ありがとうございます。 @yambejp様のコードを基に、書いてみたものの、私の情報不備でエラーが出てしまいました。 $$valが見つからないというエラーが出るのですが、テーブルの取得が間違っているのでしょうか・・・
m.ts10806

2021/06/03 05:52 編集

>@m.ts10806様のコードを基に 宛先私ではないと思います。 yambejpさんも突貫で書かれたと思うので、変数名一部間違ってますね。
m.ts10806

2021/06/03 06:01

失礼、最初と変数名連携してましたね。
xxx0_0xxx

2021/06/03 06:04

「可変変数」というものがあるのですね! 変数を上書きするということなのでしょうか? すみませんまだまだ勉強不足です><
yambejp

2021/06/03 06:06

変数を上書きしません 参考でつけているリンク先をよく読んでみてください
m.ts10806

2021/06/03 06:24

「参考に組んだ」は理解できてないと使いこなせないと思うので実際に自身が組んだコードを提示されたほうが良いかと思いますし、yambejpさんの今回の回答のコードは、質問者さんにはかなり難しいと思います。
yambejp

2021/06/03 09:19

TO:xxx0_0xxxさん m.ts10806さんがおっしゃるように、回答者が独りよがりの回答をして 理解できないようなときには無理にBAをつける必要はないんですよ。
xxx0_0xxx

2021/06/03 09:25

丁寧にコードを書いていただいたのでBAにしてしまったので! でも解決済みになってしまうことを知らず、外させてもらいました>< ごめんなさい混乱させてしまってm(__)m
xxx0_0xxx

2021/06/03 09:26

m.ts10806様のおっしゃる通り、まだまだ私にはこのコードが理解できない状態です。 if(count(array_filter([$number,$name,$date],function($x){ return !empty($x); }))==0){ $sql.=" and 0"; } foreach(["number","name","date"] as $val){ if($$val){ $sql.=" and {$val}=?"; $data[]=$$val; } } ここの部分でどういう動きになっているのか、よければご教授下さい。
yambejp

2021/06/03 10:33

まず最初のifと、あとのforeachは独立してますので順に解説 array_filter([$number,$name,$date],function($x){ return !empty($x); }) は、$numberと$nameと$dateのそれぞれから空でないものを抽出しています それをcountしてるので空でない個数で、それが==0なのですから ifの条件分は「すべてが空」という意味です。 その時、$sql文にand 0がつき、where 1 and 0となります SQLの抽出条件としてはand 0は常に偽となるためSQLは必ず空を返します foreachの方は、"number","name","date"という文字列をそれぞれ取り出して$valに入れて ループ処理をします 仮に"number"を$valにわたすとif($$val)というのはif($number)と同等なので $numberが空ではない場合という条件になります SQL文には" and number=?"という文字が追加され、$dataに$numberを追加します これをnameやdateについても続けます。 あとは私の回答をご自身の環境でコピペしてnumber、name、dateの入力欄に 値を入れたり、入れなかったりしてサブミットすると どういう処理がされるかわかると思います。 なお最終的に$sqlはprepareを使って実行され、その値は$dataをexecuteするとよいでしょう
xxx0_0xxx

2021/06/16 06:13

大変詳しいアドバイスありがとうございます! おかげさまで、見事に実装することできました。 やはり、基礎からやり直してみたいと思います。 今後とも何卒ご教授いただければ幸いです!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問