PHPでWeb検索ページをMAMPで試作中です。
"名前"と"ふりがな"の2つのカラムに対し『部分一致』の検索が出来るコードがうまく出来ません。
"名前"だけの1カラムに対しての『部分一致』の検索は以下のコードで出来てます。
どなたかご教授お願いいたします。
-------------------------------------------------------
概要: MySQLに1,000件くらいのデータ
例として、
id=>主キー、A.I
name=>教えて太郎、など・・・
furigana=>おしえてたろう、など・・・
gmap=>http://goo.gl/×××××××/
create table member(
id int,
name varchar(255),
furigana varchar(255),
gmap varcher(255)
);
以下のコードは、htmlで作った検索フォームのページからPOSTで検索文字を渡されてきたphpコードです。
--------------------------------------------------------
例として、
<?php
省略
.
.
.
// 文字エンコードの検証
省略
.
.
.
// 検索文字が未設定、空のときはエラー
省略
.
.
// データベースユーザ
$user = '×××';
$password = 'c';
// 利用するデータベース
$dbName = 'testdb';
// MySQLサーバ
$host = 'localhost:×××××';
// MySQLのDSN文字列
$dsn = "mysql:host={$host};dbname={$dbName};charset=utf8";
?>
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="utf-8">
<title>名前検索</title>
</head>
<body>
<div>
<?php
//検索フォームから渡されてきた値
$name = $_POST["name"];
//MySQLデータベースに接続する
try {
$pdo = new PDO($dsn, $user, $password);
// プリペアドステートメントのエミュレーションを無効にする
$pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
// 例外がスローされる設定にする
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
// SQL文を作る
$sql = "SELECT * FROM member WHERE name LIKE(:name)";
// プリペアドステートメントを作る
$stm = $pdo->prepare($sql);
// プレースホルダに値をバインドする
$stm->bindValue(':name', "%{$name}%", PDO::PARAM_STR);
// SQL文を実行する
$stm->execute();
// 結果の取得(連想配列で受け取る)
$result = $stm->fetchAll(PDO::FETCH_ASSOC);
if(count($result)>0){
echo "名前に「{$name}」が含まれているレコード";
// テーブルのタイトル行
echo "<table>";
echo "<thead><tr>";
echo "<th>", "ID", "</th>";
echo "<th>", "名前", "</th>";
echo "<th>", "ふりがな", "</th>";
echo "<th>", "地図", "</th>";
echo "</tr></thead>";
// 値を取り出して行に表示する
echo "<tbody>";
foreach ($result as $row){
// 1行ずつテーブルに入れる
echo "<tr>";
echo "<td>", $row['id'], "</td>";
echo "<td>", $row['name'], "</td>";
echo "<td>", $row['furigana'], "</td>";
echo "<td><a href=\"{$row['gmap']}\" target=\"_blank\">Googleマップ</a></td>";
echo "</tr>";
}
echo "</tbody>";
echo "</table>";
} else {
echo "名前に「{$name}」は見つかりませんでした。";
}
} catch (Exception $e) {
echo '<span class="error">エラーがありました。</span><br>';
echo $e->getMessage();
}
?>
<hr>
<p><a href="<?php echo $gobackURL ?>">戻る</a></p>
</div>
</body>
</html>
---------------------------------------------------------
以下を試してみました、
$sql = "SELECT * FROM member WHERE name LIKE(:name)";の部分を
$sql = "SELECT * FROM member WHERE name LIKE(:name) or furigana LIKE(:name)";のようにしてみたのですが、エラーになってしまい。
$sql = "SELECT * FROM member WHERE name OR furigana LIKE(:name)";のようにすると、furiganaの1カラム検索になってしまいました。
---------------------------------------------------------
"名前"でも"ふりがな"でも検索出来るようにしたいです。
どうか、よろしくお願いいたします。
No.1ベストアンサー
- 回答日時:
原因は
>$pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
静的なプレースホルダは同じ名前を流用できません。
別名で指定してあげるか、同値をtrueにしてください
$sql = "SELECT * FROM member WHERE name LIKE(:name) or furigana LIKE(:name2)";
$stmt = $pdo->prepare($sql);
$stmt->bindValue(':name', "%{$name}%", PDO::PARAM_STR);
$stmt->bindValue(':name2', "%{$name}%", PDO::PARAM_STR);
yambejpさん、詳しい説明ありがとうございます。
プレースホルダにそんな決まりがあったんですね。何冊かある参考書に書いてあったような・・・。
実際、コードを書くと全然応用が利かなくて、yambejpさんには感謝します。
これで、どんな漢字の名称なのか分からなくても、ふりがなで検索出来るようになりました。
yambejpさんいつもありがとうございます。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
都道府県穴埋めゲーム
都道府県の名前を1人1つずつ投稿してください。全ての都道府県が出たら締め切ります!
-
フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
あなたが普段思っている「これまだ誰も言ってなかったけど共感されるだろうな」というあるあるを教えてください
-
映画のエンドロール観る派?観ない派?
映画が終わった後、すぐに席を立って帰る方もちらほら見かけます。皆さんはエンドロールの最後まで観ていきますか?
-
海外旅行から帰ってきたら、まず何を食べる?
帰国して1番食べたくなるもの、食べたくなるだろうなと思うもの、皆さんはありますか?
-
天使と悪魔選手権
悪魔がこんなささやきをしていたら、天使のあなたはなんと言って止めますか?
-
like検索の複数キーワードで、プレースホルダを利
PHP
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・人生のプチ美学を教えてください!!
- ・10秒目をつむったら…
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
#1062 - '0' は索引 'PRIMARY' ...
-
テーブル名が可変の場合のクエ...
-
SQLでカラムを追加し、条件に合...
-
【初歩】ラジオボタンをつかっ...
-
SQLです教えてください。
-
SQLです教えてくださいお願いし...
-
SQLです教えてくださいお願いし...
-
SQLです教えてくださいお願いし...
-
「総降水量が100mm以上になる...
-
〜のような結果を出すためのSQL...
-
このSQLあってますか?教えてく...
-
SQLです!!教えてください。あ...
-
SQLです!!教えてください。あ...
-
SQLです!!教えてください。あ...
-
SQLです教えてくださいお願いし...
-
SQLです教えてくださいお願いし...
-
SQLです下記の問合せを行うクエ...
-
SQLです。下記の問合せを行うク...
-
Xサーバーのバックアップで全サ...
-
エラー 1068 (42000): 複数の主...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
プレースホルダを使った複数カ...
-
php+MySqlでの検索ページ
-
フォームから送信した値とMySQL...
-
mysql+php リストボックスにつ...
-
PHPでMySQLを使った検索のプロ...
-
mysqlとphpを使った入力画面で...
-
PearDBで項目を1回だけ適切に表...
-
PHP&MYSQLでの検索システムにつ...
-
PHPを使って、1ページ内で新規...
-
PHPにてSQLから取得したデータ...
-
PHP+MYSQLで検索画面を作成し...
-
PDOでDB ページング
-
接続ができません
-
ODP.NETのバージョン確認
-
副問合せにLIKE文を使う方法は...
-
SQLのVARCHARとVARCHAR2の違い
-
MySQLカラム名は日本語と英数字...
-
like句を使って日本語を検索す...
-
プライマリーキーの昇順でソー...
-
VBAで変数内に保持された二次配...
おすすめ情報