PHP+mySQLで、あるキーワードがDBの中に含まれているかどうかを確認するプログラムを作成しています。


●テーブル情報

create table sample ( data varchar(32) not null );
insert into sample (data) value ('日曜日'); … ①
insert into sample (data) value ('みかん'); … ②
insert into sample (data) value ('木曜日'); … ③

●動作結果

まずは、MySQL上でやりたいこと。これは、期待通りの動作(①と③が表示)を行います。

  SELECT * FROM sample WHERE data like '%曜%;

次にPHP上で実現したいのですが、なにも検索されず困っています。

  $key = '%曜%';
  $db = DB::connect($dsn);
  $db->query("SELECT * FROM sample WHERE data like ?, array($key));

どこに問題があるのか、ご指摘のほどよろしくお願いいたします。

回答の条件
  • URL必須
  • 1人3回まで
  • 登録:2009/11/17 14:55:48
  • 終了:2009/11/17 21:39:50

ベストアンサー

id:horonict No.3

horonict回答回数257ベストアンサー獲得回数512009/11/17 16:04:08

ポイント34pt

問題点

$key = '%曜%';
$db->query("SELECT * FROM sample WHERE data like ?, array($key));
  1. クオーテーションが閉じていません+足りません
  2. プレースホルダが1つの場合は、対応するのは配列ではなく普通の変数です。

改善策

$db->query("SELECT * FROM sample WHERE data like '?';", $key);

http://www.hm-lab.net/archives/category/code

id:cochoo

早速のご指摘ありがとうございます。

1に関しては記述ミスです。

2に関しては仰るとおりですが、先述の通り汎用関数化のため、1つの引数でも配列を使用していました。

array($key)と$key[0]は同じ解釈と思っていました。

原因は、日本語コードの問題でした(初歩的ミスで申し訳ありません)

プログラムは以下でちゃんと動作しています。

 $db = DB::connect($dsn);

 $rs = $db->query("SELECT * FROM sample WHERE data like ?, array($key));

 while ($row = $rs->fetchRow()) { echo $row[0]; }

 $rs->free();

解決いたしましたので、これで質問を終了させていただきます。

みなさん、どうもありがとうございました。

2009/11/17 21:39:26

その他の回答(2件)

id:aiaida333 No.1

aiaida333回答回数166ベストアンサー獲得回数42009/11/17 15:33:34

ポイント23pt

まず、MYSQLないにホントにデータが入っているか確認しましたか?

データを入れる もんもんは出来ているのですが、

データを表示するプログラムが書いてないと思います。


http://www.yahoo.co.jp

id:cochoo

ご指摘ありがとうございます。質問の中で、ご指摘のプログラムの箇所を書き忘れていました。

  $key = '%曜%';

  $db = DB::connect($dsn);

  $db->query("SELECT * FROM sample WHERE data like ?, array($key));

  while ($row = $rs->fetchRow()) { echo $row[0]; }

  $rs->free();

上記処理で、なにも表示されませんでした。

2009/11/17 20:44:58
id:SOBA No.2

SOBA回答回数65ベストアンサー獲得回数62009/11/17 15:55:48

ポイント23pt

$db->query("SELECT * FROM sample WHERE data like " . $key);

もしかして$keyって配列でスか?

 

http://q.hatena.ne.jp/answer

id:cochoo

いいえ、$keyは変数です。

$db->query("SELECT * FROM sample WHERE data like " . $key);

…としなかったのは、複数のプレースホルダを指定する処理が他にありまして、同じような書き方にしているためです。

例:

$db->query("SELECT * FROM sampletable WHERE data1=? AND data=?", array($key1, $key2));

ちなみに、ご指摘の方法でも結果は表示されませんでした。

説明不足ですいません。

2009/11/17 20:49:43
id:horonict No.3

horonict回答回数257ベストアンサー獲得回数512009/11/17 16:04:08ここでベストアンサー

ポイント34pt

問題点

$key = '%曜%';
$db->query("SELECT * FROM sample WHERE data like ?, array($key));
  1. クオーテーションが閉じていません+足りません
  2. プレースホルダが1つの場合は、対応するのは配列ではなく普通の変数です。

改善策

$db->query("SELECT * FROM sample WHERE data like '?';", $key);

http://www.hm-lab.net/archives/category/code

id:cochoo

早速のご指摘ありがとうございます。

1に関しては記述ミスです。

2に関しては仰るとおりですが、先述の通り汎用関数化のため、1つの引数でも配列を使用していました。

array($key)と$key[0]は同じ解釈と思っていました。

原因は、日本語コードの問題でした(初歩的ミスで申し訳ありません)

プログラムは以下でちゃんと動作しています。

 $db = DB::connect($dsn);

 $rs = $db->query("SELECT * FROM sample WHERE data like ?, array($key));

 while ($row = $rs->fetchRow()) { echo $row[0]; }

 $rs->free();

解決いたしましたので、これで質問を終了させていただきます。

みなさん、どうもありがとうございました。

2009/11/17 21:39:26

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません