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

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

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

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

PHP

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

Q&A

解決済

2回答

520閲覧

PHPで検索機能を作成していますが、NULLになります。

dog57

総合スコア131

MySQL

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

PHP

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

0グッド

0クリップ

投稿2017/12/08 14:13

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 );

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

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

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

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

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

guest

回答2

0

ベストアンサー

質問文に書かれている現象は再現しませんでした。

PHP7.1
MySQL5.7
Webサーバー: ビルトインサーバー

php

1<!DOCTYPE HTML> 2<html lang="ja"> 3 <head> 4 <meta charset="UTF-8"> 5 <title></title> 6 </head> 7 <body> 8 <div id="content"> 9 <div class="container"> 10 11 <!-- title --> 12 <h2 class="title">行ってみたい国名を登録してみよう!</h2> 13 14 <!-- 検索フォーム --> 15 <form method="post" action="search.php"> 16 <div class="input-group col-sm-offset-2 col-sm-8"> 17 <input type="text" class="form-control" name="search"> 18 <span class="input-group-btn"> 19 <button class="btn btn-default" type="submit"> 20 <i class='glyphicon glyphicon-search'></i> 21 </button> 22 </span> 23 </div> 24 </form> 25 </div> 26 </div> 27 </body> 28</html>

php

1<?php 2// 開発時にこれを書かないのはNG 3ini_set('display_errors', true); 4error_reporting(E_ALL); 5 6// エラーメッセージの初期化 7$errors = []; 8 9// XSS対策 サニタイズ(無毒化) 10function h($string) 11{ 12 return htmlspecialchars($string, ENT_QUOTES, "UTF-8"); 13} 14 15try { 16 $dsn = "mysql:host=localhost;dbname=test;charset=utf8mb4"; 17 $user = "***"; 18 $password = "***"; 19 $dbh = new PDO($dsn, $user, $password); 20 21 //例外処理を投げる(スロー)ようにする 22 $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 23 $statement = $dbh->prepare('SELECT * FROM country WHERE nation LIKE :search or rank like :search or food like :search or reason like :search'); 24 25 if ($statement) { 26 $search = filter_input(INPUT_POST, "search"); 27 28 // プレースホルダーへ実際の値を設定する 29 // $statement->bindValue(":search", $like_search, PDO::PARAM_STR); 30 $statement->bindValue(":search", '%' . preg_replace('/(?=[!_%])/', '!', $search) . '%', PDO::PARAM_STR); 31 32 if ($statement->execute()) { 33 // レコード件数取得 34 $row_count = $statement->rowCount(); 35 36 $rows = $statement->fetchAll(); 37 } else { 38 $errors["error"] = "検索失敗しました。"; 39 } 40 41 // データベース切断 42 // $dbh = null; 不要 43 } 44} catch (PDOexception $e) { 45 print('Error:' . $e->getMessage()); 46 $errors["error"] = "データベース接続失敗しました。"; 47} 48?> 49<!DOCTYPE html> 50<html lang="ja"> 51 <head> 52 <meta charset="utf-8"> 53 <title>確認フォーム</title> 54 <meta name="viewport" content="width=device-width, initial-scale=1.0"> 55 <link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/css/bootstrap.min.css" rel="stylesheet" media="screen"> 56 <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/font-awesome/4.4.0/css/font-awesome.min.css"> 57 </head> 58 <body> 59 60 <?php if (count($errors) == 0): ?> 61 62 <?php echo h($search); ?>で検索しました。 63 <p><?php echo h($row_count) ?>件です。</p> 64 65 <table class="table table-hover"> 66 <thead> 67 <tr> 68 <th>順位</th> 69 <th></th> 70 <th>食べたい食べ物</th> 71 <th>理由</th> 72 </tr> 73 </thead> 74 <tbody> 75 <?php foreach ($rows as $row) : ?> 76 <tr> 77 <th><?php echo h($row["rank"]) ?></th> 78 <td><?php echo h($row["nation"]) ?></td> 79 <td><?php echo h($row["food"]) ?></td> 80 <td><?php echo h($row["reason"]) ?></td> 81 </tr> 82 <?php endforeach; ?> 83 </tbody> 84 </table> 85 86 <?php elseif (count($errors) > 0): ?> 87 <?php foreach ((array) $errors as $value) : ?> 88 <p><?php echo h($value); ?></p> 89 <?php endforeach; ?> 90 <?php endif; ?> 91 92 <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script> 93 <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/js/bootstrap.min.js"></script> 94 </body> 95</html>

投稿2017/12/08 16:48

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

dog57

2017/12/08 23:57

あいまい検索で検索できますか?
dog57

2017/12/09 00:58

解決できました。ありがとうございます!
退会済みユーザー

退会済みユーザー

2017/12/09 03:19

どのように解決したのかを記述してください。
guest

0

実験していないので、なんとも言えませんが、

$statement->bindValue(":search", $like_search, PDO::PARAM_STR);

って、プレースホルダーの個数分必要だった気がします。

投稿2017/12/08 16:19

nnahito

総合スコア2004

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問