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

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

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

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

PHP

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

検索

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

Q&A

解決済

2回答

1765閲覧

PHP 複数検索窓設置を設置して結果表示させたい

kotetsu0521

総合スコア8

SQL

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

PHP

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

検索

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

0グッド

0クリップ

投稿2018/04/09 00:55

現在、複数検索窓を設置してSQLへ接続後データベースより検索結果(情報)を表示させるという仕組みを作っています。色々とアドバイスをいただき「or検索」でというところまでは辿りついたのですが、結果が思うように表示されないのとなぜかSQL文がそのまま画面に表示されます。

例)検索窓に1箇所には「1234567」もう1箇所には「8901234」を入力して検索ボタンをクリックすると、データベースから「1234567」と「8901234」の情報を抽出し表示。

###画面に表示されるSELECT文###(現在のエラー部分)
SELECT partsnumber,description,unitprice,stockqty FROM parts_price WHERE 1 and partsnumber in(?,?)
Array ( [0] => 1234567 [1] => 8901234 ) 結果

該当のソースコード###

serch.html

<input class="text" type="text" name="pnk[]"><br> <input class="text" type="text" name="pnk[]"><br> <input type="submit" class="subbtn" value="Search">

view.php

<?php try{ $pnk=filter_input(INPUT_POST,"pnk",FILTER_DEFAULT,["options"=>["default"=>[]],"flags"=>FILTER_REQUIRE_ARRAY]); $pnk=array_filter(array_unique($pnk),function($x){ return $x!==""; }); //SQL接続 $dbh=new PDO($dsn,$user,$password); $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $dbh->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC); $dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES,false); $sql="SELECT partsnumber,description,unitprice,stockqty FROM parts_price WHERE 1 "; $data=[]; if(count($pnk)>0){ $sql.="and partsnumber in("; $sql.=implode(array_fill(0,count($pnk),"?"),","); $sql.=")"; $data=array_merge($data,$pnk); } print $sql."<br>"; print_r($data); $stmt = $dbh->prepare($sql); $stmt->execute($data); $rows=$stmt->fetchAll(); $partsnumber = $row['partsnumber']; $description = $row['description']; $unitprice = $row['unitprice']; $stockqty = $row['stockqty']; } catch(PDOException $e) { die($e->getMessage()); } ?> //下記のテーブルの中にデータベースの検索結果を表示させたいのです。今は何も表示されていません。 結果<br/> <table width="60%" align="center" border="1"> <table width="750" border="0"> <tr> <th scope="col">Parts Number</th> <th scope="col">Description</th> <th scope="col">Unit Price</th> </tr> <td><?php print $partsnumber;?></td> <td><?php print $description;?></td> <td align="right"><?php print number_format($unitprice)?></td> </table> <br/><input type="button" class="subbtn" onClick="history.back()" value="Back">

上記のコードの中で不具合となる原因がどこにあるのか見当がつきません。どなたかご教示いただけると助かります。
よろしくお願い致します。

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

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

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

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

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

m.ts10806

2018/04/09 02:02 編集

SQLがそのまま表示されているのはprint $sql."<br>";があるからに他なりませんが、「何も表示されていない」というのは「結果」以下 何もということでしょうか。画面にエラーを表示させるようにしてみては? https://qiita.com/shotets/items/3c95aef631b2c5eadae5
kotetsu0521

2018/04/09 04:54

エラー表示の仕方を教えていただきましてありがとうございました。今後の参考にさせていただきたいと思います。
m.ts10806

2018/04/09 04:55

システム完成時には外して(エラー表示させない)おいてくださいね
kotetsu0521

2018/04/09 05:02

外すことを忘れそうですが・・・気をつけます。
guest

回答2

0

■SQLが表示される

ご自分でそう書かれているからですね。SQL文作成直後の部分、

php

1print $sql."<br>"; //ここでSQLが表示され、 2print_r($data); //ここでSQLに渡しているパラメータが表示されますね

■結果が思うように表示されない

まずは結果を取得している部分です。

php

1$rows=$stmt->fetchAll();

変数名は $rows です。中身は配列かと思います。(実際にどんな構造になっているかは、dumpとかで実際に確認するのが良いです。)

で、次にいきなり登場する $row です。 おそらく中身は空っぽかな・・?

php

1$partsnumber = $row['partsnumber']; 2$description = $row['description']; 3$unitprice = $row['unitprice']; 4$stockqty = $row['stockqty'];

$row に $rows から1レコード分の結果を入れるところが必要・・・で、
or検索とのことなので、複数レコードが取得できる想定だと思いますので、
本当は結果表示している部分は、結果配列 $rows をループして
テーブル行をたくさん出力できるようにしたかったのではないかなー、と思います。

投稿2018/04/09 01:56

mix-peach

総合スコア1910

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

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

kotetsu0521

2018/04/09 04:52

コメントありがとうございました。$rows→$rowは単純に私が書き間違えていました。 まったく気づきませんでした・・・。おっしゃる通り今は2個しか検索窓を設置していませんが10個まで設置しようと思っているので、検索窓に入力された行数だけ表示されるようになります。なので、ループになります。ご指摘ありがとうございました。
guest

0

ベストアンサー

とりあえずこんな感じ

PHP

1<?php 2$pnk=filter_input(INPUT_POST,"pnk",FILTER_DEFAULT,["options"=>["default"=>[]],"flags"=>FILTER_REQUIRE_ARRAY]); 3$pnk=array_filter(array_unique($pnk),function($x){ 4 return $x!==""; 5}); 6 7try{ 8 $dbh=new PDO($dsn,$user,$password); 9 $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 10 $dbh->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC); 11 $dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES,false); 12 $sql="SELECT partsnumber,description,unitprice,stockqty FROM parts_price WHERE 1 "; 13 $data=[]; 14 if(count($pnk)>0){ 15 $sql.="and partsnumber in("; 16 $sql.=implode(array_fill(0,count($pnk),"?"),","); 17 $sql.=")"; 18 $data=array_merge($data,$pnk); 19 } 20 /* デバッグ用 21 print $sql."<br>"; 22 print_r($data); 23 */ 24 $stmt = $dbh->prepare($sql); 25 $stmt->execute($data); 26 $rows=$stmt->fetchAll(); 27}catch(PDOException $e){ 28 die($e->getMessage()); 29} 30?> 31 32 33結果<br/> <table width="60%" align="center" border="1"> 34<table width="750" border="0"> 35<tr> 36<th scope="col">Parts Number</th> 37<th scope="col">Description</th> 38<th scope="col">Unit Price</th> 39</tr> 40<?php 41if(count($rows)>0){ 42 print "<tr>\n"; 43 foreach($rows as $row){ 44 foreach(["partsnumber","description","unitprice"] as $val){ 45 if($val=="unitprice") $row[$val]=number_format($row[$val]); 46 $$val=htmlspecialchars($row[$val]); 47 } 48print <<<eof 49<td>{$partsnumber}</td> 50<td>{$description}</td> 51<td align="right">{$unitprice}</td> 52 53eof; 54 print "</tr>\n"; 55} 56?> 57</table> 58

投稿2018/04/09 02:02

yambejp

総合スコア114769

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

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

yambejp

2018/04/09 02:03

デバッグ用の表示までできて$rowsを受けているのですから $rowsからテーブルを発生させるだけなんですけどね・・・
kotetsu0521

2018/04/09 04:57

何から何まで本当にありがとうございます。別の方からご指摘があったように$rows→$rowは私の単純な書き間違いでした。また、今回教えていただいたコードで、思うとおりの結果が表示されるようになりました。勉強不足過ぎて本当にすみません。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問