
PHPでWeb検索ページをMAMPで試作中です。
"名前"と"ふりがな"の2つのカラムに対し『部分一致』の検索とradioボタンでグループ選択をするカラムの計3カラムの検索フォーム作ってます。
"支店名"をradioボタンで選択して検索を絞れるようにしたいのですが、うまくいきません。
どなたかご教授お願いいたします。
-------------------------------------------------------
概要: MySQLに1,000件くらいのデータ
例として、
id=>主キー、A.I
name=>教えて太郎、など・・・
furigana=>おしえてたろう、など・・・
group=>支店名(千葉支店、神奈川支店、埼玉支店)
gmap=>http://goo.gl/×××××××/
create table member(
id int,
name varchar(255),
furigana varchar(255),
group varcher(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"];
$group = $_POST["group"];
//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) OR furigana LIKE(:name2) AND group = :group";
// プリペアドステートメントを作る
$stm = $pdo->prepare($sql);
// プレースホルダに値をバインドする
$stm->bindValue(':name', "%{$name}%", PDO::PARAM_STR);
$stm->bindValue(':name2', "%{$name2}%", PDO::PARAM_STR);
$stm->bindValue(':group', "$group", 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 "<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>", $row['group'], "</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文とbindvalueの書き方では、検索できませんでした。
少しづつ変えて試してみたのですが、全然ダメでした。どうかよろしくお願いいたします。
$sql = "SELECT * FROM member WHERE name LIKE(:name) OR furigana LIKE(:name2) AND group = :group";
$stm->bindValue(':group', "$group", PDO::PARAM_STR);
No.2
- 回答日時:
演算子の優先順位により、AND が OR より 優先されます。
https://dev.mysql.com/doc/refman/5.6/ja/operator …
そのため
名前 like ? or 仮名 like ? and 支店 = ?
→ 名前が一致、または、仮名と支店が一致
以下のようにしてはいかがでしょうか
(名前 like ? or 仮名 like ?) and 支店 = ?
→ 名前または仮名が一致、そして支店も一致
Ogre7077さん、ご教授ありがとうございます。リファレンスを見るという基本的なことが身についてませんでした。
今回はカラム名を'group'から'kubun'と変更してやり直してみたところ、名前とふりがなは部分一致、支店名はradioボタン'kubun'で完全一致の抽出ができました。
大変勉強になりました。また、よろしくお願いします。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Dosブロンプトでtabを出力したい
-
文字列から期間算出 09-12 12-12
-
4桁の乱数の発生
-
checkboxでの複数選択削除がわ...
-
switch文の中でforeach
-
syntax error, unexpected 'ech...
-
echoとprintの使い分け
-
PHPでの画像の形式の変換
-
VBScriptでのWEBページのソース...
-
VB.NETでボリュームを取得・設...
-
PHP 指定した期間だけ表示した...
-
DTOとEntityの差は何ですか。
-
PHP4からPHP5へ移行した際、セ...
-
WordでExcelデータを差込...
-
昨日の日付を取得するVBscript
-
VBブラウザに表示されているテ...
-
ミュージックのアートワークを...
-
C言語で地図を描きたい
-
ログイン画面をはさんだ後、自...
-
こんなことはPHPで可能なのでし...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Dosブロンプトでtabを出力したい
-
shシェルスクリプト 空白行の...
-
バッチファイルで、全てのウィ...
-
findstrのerrorlevel
-
バッチファイルでpingの結果を...
-
switch()文で値の大小比較
-
syntax error, unexpected 'ech...
-
phpでcookieがうまく保存されない
-
小数点以下0の非表示
-
pdftkを使った処理をバッチファ...
-
Windowsのsetコマンドでの小数...
-
ifの条件(不等号)を動的に埋...
-
ゼロとNULLを区別して number_f...
-
PHPで訪問回数を表示するカウン...
-
bashの関数の引数にスペースが...
-
DBのハッシュ化したパスワード...
-
PHPで$_GET[’m’]の意味が分か...
-
WindowsのイベントログをExcel...
-
コマンドプロンプト フォルダ内...
-
php mysql SELECT文でテーブル...
おすすめ情報
yambejpさん毎回ありがとうございます。
今回は支店名で絞り込みが出来るといいなぁ。と仲間の意見があり久し振りにコードを書き足してみたのですが知識が及ばずこの結果です。
SQLSTATE(42000]: syntax error or access violation: 1064 You have an error in your SQL syntax check the manual that corresponds to your MySQL server version for the right syntax to use near 'group at line 1
↑↑↑
htmlの検索ファームで検索ボタンをクリックすると上記のシンタックスエラーが表示されました。
sql文の書き方が間違ってると思ったのですが、そもそも 'group' が使えないという事でしょうか...。