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

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

新規登録して質問してみよう
ただいま回答率
85.50%
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回答

5613閲覧

複数あいまい検索をしたい

tukimi

総合スコア14

SQL

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

PHP

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

0グッド

1クリップ

投稿2017/07/04 07:32

###前提・実現したいこと

PHPとzammpを使ってます。
あらかじめ、データベースに登録しておいた情報をあいまい検索したいのですが、上手くいきません。
あと○○年~○○年と指定して、検索すると○○年~○○年までの情報が出るようにしたいのです。
以下のソースはbooknameにポストされたものをあいまい検索するものです。
どうsql文を繋げて三つの欄を検索出来るようになるのか、ご教示お願い致します。

###発生している問題・エラーメッセージ

Notice: Undefined variable: errors in C:\xampp\htdocs\book\bookSearch.php on line 14
Notice: Undefined variable: errors in C:\xampp\htdocs\book\bookSearch.php on line 82

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

//検索ワード入力画面

<form action="bookSearch.php" method="post"> <table> <tr> <td>題名 :</td> <td><input type="text" name="bookname"></td> </tr> <tr> <td>著者 :</td> <td><input type="text" name="writer"></td> </tr> <tr> <td>出版年:</td> <td><input type="text" name="year">~</td><td><input type="text" name="year2"></td> </tr> </table> <input type="submit" value="検索"> <input type="reset" value="リセット"> </form>

//検索先

<?php header("Content-type: text/html; charset=utf-8"); if(empty($_POST)) { header("Location: book_up.php"); exit(); }else { //名前入力判定 if(!isset($_POST['bookname']) || $_POST['bookname'] ===""){ $errors['bookname'] = "題名が入力されていません。"; } } if(count($errors) === 0){ $dsn ='mysql:host=localhost;dbname=book;charset=utf8'; $user='root'; $password=''; try{ $dbh = new PDO($dsn,$user,$password); $statement = $dbh->prepare("SELECT * FROM hondana WHERE bookname LIKE (:bookname) "); if($statement){ $bookname = $_POST['bookname']; $like_bookname="%".$bookname."%"; $statement->bindValue(':bookname', $like_bookname, PDO::PARAM_STR); if($statement->execute()){ $row_count = $statement->rowCount(); while ($row = $statement->fetch()) { $rows[]= $row; } } else { $errors['error'] = "検索失敗しました。"; } $dbh = null; } } catch (PDOException $e){ print('Error:'.$e->getMessage()); $errors['error'] = "データベース接続失敗しました。"; } } ?> <!DOCTIPE html> <html> <head> <meta charset="utf-8"> <title></title> </head> <body> <h2>図書検索について</h2> 図書を登録できます。 <p>図書検索フォーム</p> <?php if (count($errors) === 0): ?> <p>【<?=htmlspecialchars($bookname,ENT_QUOTES, 'UTF-8')."】で検索しました。"?></p> <p><?=$row_count?>件です。</p> <table rules="all" border="1"> <tr><td>id</td><td>name</td></tr> <?php foreach($rows as $row){ ?> <tr> <td><?=$row['code']?></td> <td><?=htmlspecialchars($row['bookname'],ENT_QUOTES,'UTF-8')?></td> <td><?=htmlspecialchars($row['writer'],ENT_QUOTES,'UTF-8')?></td> <td><?=htmlspecialchars($row['year'],ENT_QUOTES,'UTF-8')?></td> </tr> <?php } ?> <?php elseif(count($errors) > 0): ?> <?php foreach($errors as $value){ echo "<p>".$value."</p>"; } ?> </table> <?php endif; ?>
<a href="book_up.php">戻る</a>
</body> </html>

###試したこと
課題に対してアプローチしたことを記載してください

###補足情報(言語/FW/ツール等のバージョンなど)
より詳細な情報

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

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

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

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

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

miyahan

2017/07/04 07:41

データベースの構造がまったく分からないので答えられません。またPHPのコードが非常に見づらいのできちんとインデントしてもらえますか?
kei344

2017/07/04 07:48

質問文のコードはそれぞれコードブロックで囲んでいただけませんか? ```(バッククオート3つ)で囲み、前後に改行をいれるか、コードを選択して「<code>」ボタンを押すとコードブロックになります。
tukimi

2017/07/04 08:55

miyahanさん>見づらくてすみません。PHPは初心者なもので、どの辺りでインデントをすればいいのか分からないのです。
tukimi

2017/07/04 08:55

kei344さん>分かりました、やってみます
kei344

2017/07/05 01:51

まだ質問が「受付中」になっていますが、いったん「解決済」にされてはいかがでしょうか。また、解決されていないなら状況を質問文に追記ください。
guest

回答2

0

ベストアンサー

とりあえず、動くものをサンプルとして提示します。

検索フォーム(ソースにコメントもしていますが、Centerタグはやめましょう…)

PHP

1<!DOCTYPE html> 2<html> 3 <head> 4 <title>A.php</title> 5 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 6 </head> 7 <body> 8 <!--centerタグはやめましょう…--> 9 <div style="text-align:center"> 10 <form action="bookSearch.php" method="post"> 11 <table style="margin: 0px auto;"> 12 <tr style="border: solid"> 13 <td>題名 :</td> 14 <td><input type="text" name="bookname"></td> 15 </tr> 16 <tr> 17 <td>著者 :</td> 18 <td><input type="text" name="writer"></td> 19 </tr> 20 <tr> 21 <td>出版年:</td> 22 <td><input type="text" name="year"></td> 23 <td><input type="text" name="year2"></td> 24 </tr> 25 </table> 26 <input type="submit" value="検索"> 27 <input type="reset" value="リセット"> 28 </form> 29 </div> 30</body> 31</html>

で、検索のフォームです。
まずは、yambejp様の指摘通り、質問文のエラーは$errorsが定義されていないよ!というものです。
その為、初期化しておきましょう。
次に、

検索すると○○年~○○年までの情報が出るようにしたいのです

という部分ですが、日付入力の有無を見て、SQLを動的に組み立てれば良いのではないかと思います。

PHP

1<?php 2header("Content-type: text/html; charset=utf-8"); 3$errors=array();//ここで$errorsを初期化! 4if(empty($_POST)) { 5 header("Location: book_up.php"); 6 exit(); 7}else { 8 //名前入力判定 9 if(!isset($_POST['bookname']) || $_POST['bookname'] ===""){ 10 $errors['bookname'] = "題名が入力されていません。"; 11 } 12} 13 14if(count($errors) === 0){ 15 $dsn ='mysql:host=localhost;dbname=test;charset=utf8'; 16 $user='test'; 17 $password='test'; 18 try{ 19 $dbh = new PDO($dsn,$user,$password); 20 $sql = "SELECT * FROM hondana "; 21 $sql .= "WHERE bookname LIKE :bookname "; 22 //Validationはかけて下さいね…(今回はFromがあれば必ずToがある前提です。) 23 if($_POST['year']){ 24 $sql .= "And year >= :year and year <= :year2"; 25 } 26 $statement = $dbh->prepare($sql); 27 if($statement){ 28 $statement->bindValue(':bookname', "%".$_POST['bookname']."%", PDO::PARAM_STR); 29 if($_POST['year']){ 30 $statement->bindValue(':year', $_POST['year'], PDO::PARAM_INT); 31 $statement->bindValue(':year2', $_POST['year2'], PDO::PARAM_INT); 32 } 33 if($statement->execute()){ 34 $row_count = $statement->rowCount(); 35 while ($row = $statement->fetch()) { 36 $rows[]= $row; 37 } 38 }else { 39 $errors['error'] = "検索失敗しました。"; 40 } 41 $dbh = null; 42 } 43 }catch (PDOException $e){ 44 print('Error:'.$e->getMessage()); 45 $errors['error'] = "データベース接続失敗しました。"; 46 } 47} 48?> 49<!DOCTIPE html> 50<html> 51 <head> 52 <meta charset="utf-8"> 53 <title></title> 54 </head> 55 <body> 56 <h2>図書検索について</h2> 57 図書を登録できます。 58 <p>図書検索フォーム</p> 59 <?php if (count($errors) === 0): ?> 60 <p><?=htmlspecialchars($_POST['bookname'],ENT_QUOTES, 'UTF-8')."】で検索しました。"?></p> 61 <p><?=$row_count?>件です。</p> 62 <table rules="all" border="1"> 63 <th><tr><td>id</td><td>name</td></tr></th> 64 <?php foreach($rows as $row){ ?> 65 <tr> 66 <td><?=$row['code']?></td> 67 <td><?=htmlspecialchars($row['bookname'],ENT_QUOTES,'UTF-8')?></td> 68 <td><?=htmlspecialchars($row['writer'],ENT_QUOTES,'UTF-8')?></td> 69 <td><?=htmlspecialchars($row['year'],ENT_QUOTES,'UTF-8')?></td> 70 </tr> 71 <?php } ?> 72 <?php elseif(count($errors) > 0): ?> 73 <?php 74 foreach($errors as $value){ 75 echo "<p>".$value."</p>"; 76 } 77 ?> 78 </table> 79<?php endif; ?> 80 81<a href="book_up.php">戻る</a> 82 83</body> 84</html>

投稿2017/07/04 08:22

motuo

総合スコア3027

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

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

tukimi

2017/07/05 06:17

エラーもなくなり、無事動きました! ありがとうございました。
guest

0

コメント「//名前入力判定」の後ろあたりに

$errors=[];

をいれて、$errors自体を初期化しておいてください

投稿2017/07/04 07:40

yambejp

総合スコア114581

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

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

tukimi

2017/07/04 08:37

ありがとうございます! エラーがなくなりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問