PHP 検索窓 複数設置 - PHPプロ!Q&A掲示板

4934

  • 募集中!! 0P

PHP 検索窓 複数設置

質問日時 / 2018年3月29日 10:17 (最終編集:3月29日 16:02)    回答数 / 4件

Questioner:  memenaginagi  このエントリーをはてなブックマークに追加 

キーワード / PHP    SQL    データベース   

PHP初心者です。
現在、会員制のショッピングカートを作成しています。ゆくゆくはセッション関数でデータの持ち回しをする予定ですが、それ以前の段階でできるかどうかの疑問があったので、こちらに書き込みさせていただくことにしました。

○やりたいこと
検索窓を複数設置してデータベースから一致したそれぞれの検索結果を表示させる。

search.html
  1. <p>検索したい部品番号を入力してください。最大○件まで検索が可能です。</p>
  2. <p>部品番号の後に必ず「B」をつけてください。(例:1234567B)</p>
  3. <input class="text" type="text" name="pnk1">
  4. <input class="text" type="text" name="pnk2"><br/>
  5. <input type="submit" class="subbtn" value="Search"></div>

view.php
  1. <?php
  2. try
  3. {
  4. require_once('../../common/common.php');
  5.  
  6.   $post=sanitize($_POST);
  7.   $pnk_1=$post['pnk1'];
  8.   $pnk_2=$post['pnk2'];
  9.  
  10. (サーバーへ接続)  
  11.   
  12. $sql='SELECT partsnumber,description,unitprice,stockqty FROM parts_price WHERE partsnumber=? ';
  13. $stmt=$dbh->prepare($sql);
  14. $data[]=$pnk_1;
  15. $stmt->execute($data);
  16.  
  17. $rec=$stmt->fetch(PDO::FETCH_ASSOC);
  18.   $partsnumber=$rec['partsnumber'];
  19.   $description=$rec['description'];
  20.   $unitprice=$rec['unitprice'];
  21.   $stockqty=$rec['stockqty'];
  22.   
  23. $dbh=null;
  24.   
  25. }
  26.  
  27. catch(Exception $e)  
  28. {
  29.   print'該当する部品番号はありません。';
  30.   exit();
  31. }
  32.  
  33. ?>
  34. 部品価格検索<br/>
  35. <br/>
  36. <table width="60%" align="center" border="1">
  37. <tr>
  38. <th scope="col">Parts Number</th>
  39. <th scope="col">Description</th>
  40. <th scope="col">Unit Price</th>
  41. </tr>  
  42.   <td><?php print $partsnumber;?></td>
  43.   <td><?php print $description;?></td>
  44.   <td align="right"><?php print number_format($unitprice)?></td>
  45.   </table>
  46.   
  47.   <br/>
  48. <input type="button" onclick="history.back()" value="戻る">
  49. </form>

現時点で、テキストボックス「pnk_1」に対する検索結果は表示されています。これを同ページ内に同じように「pnk_2」「pnk_3」・・・と検索窓を作り一括検索を行いたい場合、SELECT文以降を単純にコピペして$dataなどの変数を$data2、$data3・・・と変更するだけでいいのでしょうか。


以下、補足です。(追記しました。)
検索窓には、異なる番号を入力するようになります。
 (わかりづらいかもしれませんが・・・。)
pnk_1には「123456」 pkn_2には「789012」という全く異なった番号が入力されて、「検索」ボタンを押すと、「123456」と「789012」の価格と在庫が表示されるという仕組みです。
このようなシステムをphpでできないものかと・・・。

 説明が下手ですが言いたいことは伝わったでしょうか・・・。


本当に初歩的な質問ですみません。
アドバイスよろしくお願い致します。


ツリー一覧

┗A01shimix>これを同ページ内に同じように「pnk_2」「pnk_3」・
 ┗A01-1memenaginagi回答ありがとうございます。 説明不足で申し訳ありま
  ┗A01-1-1shimixであれば、先の回答のとおりですよね(単純なor条件)
   ┗A01-1-1-1memenaginagiアドバイスありがとうございました。 or検索を使えば

回答一覧

並び替え:

A01
answerershimix [3月29日 12:32] (最終編集:3月29日 13:08)

>これを同ページ内に同じように「pnk_2」「pnk_3」・・・と検索窓を作り
>一括検索を行いたい

pnk_1とpnk_2, pnk_3は検索条件がどう違うのですか?




もし単純にor条件でいいのであれば、input要素のname属性値を配列にしてしまうのが楽だとおもいます。

<input class="text" type="text" name="pnk[]">
<input class="text" type="text" name="pnk[]">
<input class="text" type="text" name="pnk[]"><br/>

  1. <?php
  2.  
  3. // 省略
  4.  
  5. // POSTデータ(入力されたもの)を配列に格納
  6. $data = [];
  7. foreach ($_POST['pnk'] as $val) {
  8.   if (trim($val) === "") { continue}
  9.   $data[] = trim($val);
  10. }
  11. // SQL文を用意
  12. $sql = 'SELECT partsnumber,description,unitprice,stockqty FROM parts_price';
  13. // 条件が入力されていたら、or で繋ぐ
  14. if (count($data) > 0) {
  15.   $sql .= ' where ' . implode('or'array_fill(0count($data)'(partsnumber=?)'));
  16. }
  17. $stmt=$dbh->prepare($sql);
  18. $stmt->execute($data);
  19.  
  20. // 以下省略

この意見に回答する

ツリーへ TOPへ

A01-1
replyermemenaginagi [3月29日 14:17]

回答ありがとうございます。
説明不足で申し訳ありません。追記します。
検索窓には、異なる番号を入力するようになります。
(わかりづらいかもしれませんが・・・。)
pnk_1には「123456」 pkn_2には「789012」という全く異なった番号が入力されて、「検索」ボタンを押すと、「123456」と「789012」の価格と在庫が表示されるという仕組みです。
このようなシステムをphpでできないものかと・・・。

説明が下手ですが言いたいことは伝わったでしょうか・・・。

よろしくお願い致します。

この意見に回答する

ツリーへ TOPへ

A01-1-1 参考になった
replyershimix [3月30日 07:39] (最終編集:3月30日 07:44)

であれば、先の回答のとおりですよね(単純なor条件)

(検証したスクリプト)
  1. <form actopn="" method="post">
  2. <input class="text" type="text" name="pnk[]">
  3. <input class="text" type="text" name="pnk[]">
  4. <input class="text" type="text" name="pnk[]"><br/>
  5. <input type="submit">
  6. </form>
  7. <?php
  8. if (!$_POST) { exit}
  9.  
  10. $data = [];
  11. foreach ($_POST['pnk'] as $val) {
  12.   if (trim($val) === "") { continue}
  13.   $data[] = trim($val);
  14. }
  15. // SQL文を用意
  16. $sql = 'SELECT partsnumber,description,unitprice,stockqty FROM parts_price';
  17. // 条件が入力されていたら、or で繋ぐ
  18. if (count($data) > 0) {
  19.   $sql .= ' where ' . implode('or'array_fill(0count($data)'(partsnumber=?)'));
  20. }
  21. printf('%s<br>'htmlspecialchars($sqlENT_QUOTES));
  22. echo "<pre>";
  23. print_r($data);
  24. echo "</pre>";

この意見に回答する

ツリーへ TOPへ

A01-1-1-1
replyermemenaginagi [3月30日 12:43]

アドバイスありがとうございました。 or検索を使えばいいのですね。
教えていただいたコードで試してみたのですけど、今のことろコードを書く位置が違うのか、誤って必要な部分を自分で削除してしまったのかで上手く表示はできていません。(なぜかSELECT文が表示されてます)
なんとか思考錯誤しながら表示できるように頑張ってみたいと思います。
ありがとうございました。

この意見に回答する

ツリーへ TOPへ

<<質問一覧へ



Pick Up Q&A

Q
ログファイルの中の空のデータ行を削除したい
 このエントリーをはてなブックマークに追加 
A
ログのデータ個数(列数)が固定で、空のログが"<><><>"だと既知であれば if ($line === "<><><>") { continue; } で読み飛ばしてもいいのでは? ...

>>続きを読む

まずは配列や文字列の扱いから、じっくり勉強して行きましょう。

▲解説者:岡本(アシアル株式会社 教育コーディネーター兼 システムエンジニア)