みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

LIKE述語/SQLとPHPを使った検索フォーム

SQLを使って、「名前」(カラム名=name)と「コメント」(カラム名=comment)のテーブルを作りました。

このテーブルに対して、検索フォームを作りました。
このフォームに名前を入力すると、該当する行が検索されるようにしました。

◆入力フォーム form.php

<form action = "kensaku.php" method="post">
名前:<input type="text" name="name">
<input type="submit" name="submit" value="検索">
</form>


◆検索結果 search.php
<?php
function connect() {
return new PDO("mysql:dbname=★;host=★","★","★",
array(
PDO::MYSQL_ATTR_INIT_COMMAND => "SET CHARACTER SET `utf8`"));
}
$pdo = connect();
$st = $pdo->query("SELECT * FROM table WHERE name='" . $_POST["name"] . "' ");
$address = $st->fetchAll();
?>
<?php foreach ($table as $g) { ?>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta name="GENERATOR" content="IBM WebSphere Studio Homepage Builder Version 14.0.8.0 for Windows">
<p>名前<?php echo $g['name'] ?></p>
<p>コメント<?php echo $g['comment'] ?></p>
<?php } ?>


ここで、該当する文言の一部でも検索できるようにしたいです。
※例えば、「山田太郎」を検索する場合に「山」だけでも検索できるように。

LIKEを使えばよいかと思い、
$st = $pdo->query("SELECT * FROM table WHERE name='" . $_POST["name"] . "' ");を
$st = $pdo->query("SELECT * FROM table WHERE name LIKE='%" . $_POST["name"] . "%' ");
と、記述してみましたがだめでした。

どのように記述すればよいか教えていただけないでしょうか。
何卒お願いします。

投稿日時 - 2014-06-10 01:03:04

QNo.8631058

困ってます

質問者が選んだベストアンサー

>ご指摘の通りに書き換えましたが、検索できませんでした。

一番高い可能性としては、POSTされたデータのキャラクターコードと
DBに格納されたキャラクターコードが異なるということです

この手のテストをする場合はキャラクターコードでの差異が出づらい
「英数字のみ」でまずテストをすることをお勧めします。
ここで動作確認ができたら次の段階として日本語検索を試してください

プリペアドステートメントについてはphpマニュアルなどご一読ください

http://www.php.net//manual/ja/pdo.prepared-statements.php

投稿日時 - 2014-06-10 12:42:47

お礼

ありがとうございました!
いろいろいじっていたら、動きました。

プリペアドステートメントについても参考サイトを教えていただき本当にありがとうございました。

まだまだ意味もよくわからずにとにかく作っている状況です。
今後も勉強していきますので、また機会がありましたらよろしくお願いします。

投稿日時 - 2014-06-10 13:59:56

ANo.2

このQ&Aは役に立ちましたか?

11人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.1

>name LIKE='%" . $_POST["name"] . "%' "

だと

name LIKE='%山%'

になっちゃいますね
イコールをとって、

name LIKE '%" . $_POST["name"] . "%' "

にしてください。

ちなみにPOSTされてきたデータをそのままSQLに組み込むのはNGです
PDOをつかっているならプリペアド処理をしてください

投稿日時 - 2014-06-10 09:18:15

お礼

ご回答ありがとうございました。
ご指摘の通りに書き換えましたが、検索できませんでした。
(結果が空白になってしまいます。)

当方、SQLの初心者で、「プリペアド処理」という言葉もはじめて知りました。
何か根本的にやり方が間違っているのでしょうか。
時間をかけて勉強するつもりですが、もし、他にヒントになるようなことがありましたら、教えていただければと思います。

お手数をおかけして申し訳ありませんでした。

投稿日時 - 2014-06-10 11:14:02

あなたにオススメの質問