アプリ版:「スタンプのみでお礼する」機能のリリースについて

phpで検索結果画面の制作を勉強中です。
pdoでmysqlデータベースに接続しています。

現在、検索フォームの作成を勉強中です。
検索用のフォームに入力された文字に類似しているという条件(あいまい検索)のもと、
添付画像の上のようなデータベーステーブル内をSELECT COUNTし、
添付画像の下のように、検索に該当するそれぞれのカラムのデータと、そのデータがいくつ存在しているのかを表示させたいです。

SELECT COUNTでGROUP BYを使用すれば結果が取得できると教えていただき、以下のようなphpを記述しました。



//フォームに入力されたテキストをGETで渡し、プログラムで取得し、あいまい検索に対応させる。
$search = '%'.$_GET['search'].'%';
//現在表示している結果表示ページのページ数をURLから取得
$page = $_GET['page'];
//SQLのLIMIT句用にデータのいくつめから取得するか$limitに入れる
$limit = ($page-1) * 20;

//該当するものをグループ化し、それぞれのデータ数をカウントする
try{
$stmt=$db->prepare('SELECT COUNT 【住所】 FROM 【顧客情報】 WHERE search like :search GROUP BY 【住所】 LIMIT :limit , 20');
$stmt->bindValue(':search',$search,PDO::PARAM_STR);
$stmt->bindValue(':limit',$limit,PDO::PARAM_INT);
$stmt->execute();
}catch(PDOException $e){
$error = "エラー:".$e->getMessage();
}
while($row = $stmt->fetch(PDO::FETCH_ASSOC)){
print $row['【住所】'];
}

※検索フォームのタグは省略しています。
※データベース接続は$dbで行っています。
※該当したデータを1ページにつき、20件ずつ表示したいのでLIMIT句を使用しています。



実行したところ、結果はおろか、エラーも何も表示されませんでした。

個人的にはSQL文に間違えがあるというよりも、
while文以降で取得したデータの表示ができていないのではないかと思いますが、
「SELECT COUNT」の結果表示の方法をネットで調べても
答えになるものが中々見つかりませんでした。

また、添付画像の下のように、
取得したデータ名とそのデータの件数を一緒に表示するプログラムが理想なので、
どなたかご教授頂けると有難いです。

ご回答、よろしくお願いします。

※ちなみに、正規化については理解しておりますが、今回は例示として住所を使用しました。

「SELECT COUNTで取得した結果の」の質問画像

A 回答 (3件)

>結果はおろか、エラーも何も表示されませんでした。



PDOのエラーモードはどうされていますか?デフォルトはPDO::ERRMODE_SILENTです。

http://www.php.net/manual/ja/pdo.error-handling. …

PDO::ERRMODE_EXCEPTIONにしたければ、コンストラクタのoptionで指定するか、setAttributeで設定しないといけません。



ちょっと見た限りではSQL文がヘンです

$stmt=$db->prepare('SELECT 【住所】, COUNT(*) as CNT FROM 【顧客情報】 WHERE search like :search GROUP BY 【住所】 LIMIT :limit , 20');

ではないですかねぇ。


(蛇足)
$search = '%'.$_GET['search'].'%';

の部分も

$search = '%' . addcslashes($GET['search'], '\\_%') . '%'

であるべき(likeで意味をもつ文字はエスケープする)。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます!
エラーモードがデフォルトでサイレントになっているのを知りませんでした。
おかげさまで、エラーが出る様になったのでこれからの勉強が少し楽になります。

SQL文のご訂正もありがとうございます!
仰られたとおりに書き直してみたところ、ちゃんと結果が表示されるようになりました!

また、addcslashes()でエスケープする旨まで教えてくださり
、ありがとうございます。

お礼日時:2014/10/29 17:24

>$stmt=$db->prepare('SELECT COUNT 【住所】 FROM 【顧客情報】 WHERE search like :search GROUP BY 【住所】 LIMIT :limit , 20');



なんかSQL文自体が変じゃない?せめて、
SELECT 【住所】,COUNT(*) AS COUNT FROM 【顧客情報】 WHERE search like :search GROUP BY 【住所】 LIMIT :limit ,20

的な?

ちなみに
$pdo = new PDO($dsn, $user,$password);
したら

$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
をしないと文法エラーなどは拾えません。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます!
色々関数を用いてしまうとどうしてもSQL文をどのように書けばいいのかわからなくなってしまい、変なSQL文になってしまいました・・・
文法エラーの拾い方も教えてくださり、ありがとうございます!

お礼日時:2014/10/29 17:24

>個人的にはSQL文に間違えがあるというよりも



sql単体で試したほうが良いと思うけど。
select count ADDRESS from ...
だとしたら構文ミス。

select count(ADDRESS) from ...
じゃないと。

まずはSQLがきちんと実行されているか確かめないとダメ。
んで、住所と件数を並べたいなら
select ADDRESS,count(ADDRESS) from ... group by ADDRESS limit 0,20
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます!
SQL単体では何度か試してみたのですがうまく実行できず、且つ、どこがエラーになっているのかわからなかったため、間違った構文になってしまいました。
COUNTの後に()が必要なのですね!教えてくださり、ありがとうございます!

お礼日時:2014/10/29 17:24

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!