PHPで検索機能を作成しています。
あいまい検索で検索できるようにしていますが、下記の画像のように検索フォームから→検索結果画面を見るとNULLになってしまいます。
本当は、キーワードに関連する表をデータベースから持ってきたいのですがNULLになっているのでなっているので全部持ってきてしまっています。
一体なぜでしょうか?
ご教授いただけると嬉しいです。
宜しくお願い致します。
index.html (TOP画面)検索フォームのみ
html
1 <div id="content"> 2 <div class="container"> 3 4 <!-- title --> 5 <h2 class="title" style="margin-top:60px;">行ってみたい国名を登録してみよう!</h2> 6 7 <!-- 検索フォーム --> 8 <form method="post" action="search.php"> 9 <div class="input-group col-sm-offset-2 col-sm-8" style="margin-top:60px;"> 10 <input type="text" class="form-control" name="search"> 11 <span class="input-group-btn"> 12 <button class="btn btn-default" type="submit"> 13 <i class='glyphicon glyphicon-search'></i> 14 </button> 15 </span> 16 </div> 17 </form>
search.php
php
1<?php 2// 開発時にこれを書かないのはNG 3ini_set('display_errors', true); 4error_reporting(E_ALL); 5 6// 文字化け防止 7header("Content-type: text/html; charset=UTF-8"); 8 9require_once(__DIR__. "/db.php"); 10 11// エラーメッセージの初期化 12$errors = array(); 13// 変数の定義 14$search = filter_input(INPUT_POST, 'search'); 15 16 17// XSS対策 サニタイズ(無毒化) 18function h($string) { 19 return htmlspecialchars($string, ENT_QUOTES, "UTF-8"); 20} 21 22 23try { 24 $dbh = new PDO($dsn, $user, $password); 25 //例外処理を投げる(スロー)ようにする 26 $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 27 $statement = $dbh->prepare('SELECT * FROM country WHERE nation LIKE :search or rank like :search or food like :search or reason like :search'); 28 29 if ($statement) { 30 $search = filter_input(INPUT_POST, "search"); 31 $like_search = "%$search%"; 32 33 // プレースホルダーへ実際の値を設定する 34 $statement->bindValue(":search", $like_search, PDO::PARAM_STR); 35 36 var_dump($search); 37 38 39 if ($statement->execute()) { 40 // レコード件数取得 41 $row_count = $statement->rowCount(); 42 43 while ($row = $statement->fetch()) { 44 $rows[] = $row; 45 } 46 } else { 47 $errors["error"] = "検索失敗しました。"; 48 } 49 50 // データベース切断 51 $dbh = null; 52 } 53} catch (PDOexception $e) { 54 print('Error:'.$e->getMessage()); 55 $errors["error"] = "データベース接続失敗しました。"; 56} 57 58 59?> 60 61 62<!DOCTYPE html> 63<html lang="ja"> 64<head> 65 <meta charset="utf-8"> 66 <title>確認フォーム</title> 67 <meta name="viewport" content="width=device-width, initial-scale=1.0"> 68 <link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/css/bootstrap.min.css" rel="stylesheet" media="screen"> 69 <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/font-awesome/4.4.0/css/font-awesome.min.css"> 70 71</head> 72<body> 73 74 75 <?php if (count($errors) == 0): ?> 76 77 <?php echo h($search)."で検索しました。"; ?> 78 <p><?php echo $row_count."件です。"; ?></p> 79 80 <table class="table table-hover"> 81 <thead> 82 <tr> 83 <th>順位</th> 84 <th>国</th> 85 <th>食べたい食べ物</th> 86 <th>理由</th> 87 </tr> 88 </thead> 89 90<?php 91 foreach ($rows as $row) { 92 ?> 93 94 <tbody> 95 <tr> 96 <th><?php echo h($row["rank"])?></th> 97 <td><?php echo h($row["nation"])?></td> 98 <td><?php echo h($row["food"])?></td> 99 <td><?php echo h($row["reason"])?></td> 100 </tr> 101 102 </tbody> 103 104<?php 105 } 106 ?> 107 </table> 108 109 110 <?php elseif (count($errors) > 0): ?> 111 <?php 112 foreach ((array)$errors as $value) { 113 echo "<p>$value</p>"; 114 } 115 ?> 116 <?php endif; ?> 117 118 119</table> 120 121 <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script> 122 <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/js/bootstrap.min.js"></script> 123 </body> 124 125</html> 126
データベース情報
sql
1create table country( 2 id int(11) NOT NULL auto_increment PRIMARY KEY, 3 rank varchar(255) NOT NULL, 4 nation varchar(255) NOT NULL, 5 food varchar(255) NULL, 6 reason varchar(255) NULL 7 );
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/12/08 23:57
2017/12/09 00:58
退会済みユーザー
2017/12/09 03:19