人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

PHPとMySQLでデータ検索し表示するプログラムを作成しています。
htmlからデータを受け取って
$part = htmlspecialchars($_POST['part']);
$pdo = new PDO("mysql:dbname=product", "root");
$st = $pdo->prepare("SELECT * FROM riso_parts WHERE part = ?");
$st->execute(array($part));
で正しく検索し表示出来ていて、ワイルドカードでの検索をさせたいのですが、LIKEを使用するのはわかるのですが、上記の場合にはどのように使用すれば良いかが判りません。
$st = $pdo->prepare("SELECT * FROM riso_parts WHERE part LIKE %?%");
では無理でした。
どなたか、ご教示をお願い致します。

●質問者: gontakun_55
●カテゴリ:コンピュータ ウェブ制作
○ 状態 :終了
└ 回答数 : 2/2件

▽最新の回答へ

1 ● degucho
●0ポイント

試してませんが
$st = $pdo->prepare("SELECT * FROM riso_parts WHERE part LIKE CONCAT('%',?,'%')");
とかですかね。
パターンマッチ用の文字列を正しく作れば良いので
$st = $pdo->prepare("SELECT * FROM riso_parts WHERE part LIKE ?");
$st->execute("%".array($part)."%");
のほうがよいかな


gontakun_55さんのコメント
最初のは、アスタリスク無しならヒットするのですが、無しだとヒットしないですね。 2番目のは、 Notice: Array to string conversion in C:\xampp\htdocs\aaa.php on line 14 Warning: PDOStatement::execute() expects parameter 1 to be array, string given in C:\xampp\htdocs\aaa.php on line 14 と、 $st->execute("%".array($part)."%"); でのエラーが表示されます。

2 ● a-kuma3
●200ポイント ベストアンサー

bind する方の文字に % を含めると良いようです。
https://stackoverflow.com/questions/583336/how-do-i-create-a-pdo-parameterized-query-with-a-like-statement

$query = $database->prepare('SELECT * FROM table WHERE column LIKE ?');
$query->execute(array('value%'));

ただ、これだと、質問のコードでの $part に % が含まれてると、ちょっと期待通りにはならないので、更にひと手間加える必要があるようです。
https://qiita.com/ritukiii/items/ccb81128757fda8bdb3c

$sql = 'select * from books where title like ?';
$stmt = $dbh->prepare($sql);
$stmt->execute(array(sprintf('%%%s%%', addcslashes($title, '\_%')));

gontakun_55さんのコメント
最初のはアスタリスク無しで検索するとヒットし表示するのですが、アスタリスク有りで検索すると何もヒットしないようです。 2番目のも動きは同じでした。 何が原因なんでしょうかね?

a-kuma3さんのコメント
試しているのは、質問のまんまではないですよね、きっと。 - execute するまでの間にアスタリスクを変更している処理がある - LIKE じゃなくて REGEXP を使ってる といったあたりを思いつきました。

gontakun_55さんのコメント
ん?上記2つをしてて、その影響で出来てないってことでしょうか? それとも、上記2つを試すってことでしょうか?

a-kuma3さんのコメント
>> ん?上記2つをしてて、その影響で出来てないってことでしょうか? << 上記のどちらかが原因になっている可能性はないでしょうか、というつもりで書きました。 少なくとも、回答に書いている範囲ではアスタリスクは特別扱いになってませんので。

gontakun_55さんのコメント
なるほど、そういうことですね。 だとすると、上記2つはしてないですね。 質問のソースの $st = $pdo->prepare("SELECT * FROM riso_parts WHERE part = ?"); $st->execute(array($part)); ここだけ色々弄ってます。 $result = $st->fetchAll(); を追加して、foreachの箇所を$resultに変更したのもやってみましたが、 結果はだめでした。

a-kuma3さんのコメント
アスタリスクを混ぜたのを指定したときに、execute する直前で、アスタリスクは変数 $part に、そのままの形で残ってるんでしょうか?

gontakun_55さんのコメント
はい、それは確認済みでechoで表示させるとアスタリスク込の検索文字列が表示されます。 ちなみに、sprintの出力を表示してみました。 %test-*% このアスタリスクっているのでしょうか? 削除する必要があるんですかね? 更にアスタリスクを付けずに検索したらヒットしました! %test-% う?ん、アスタリスクを付けずに検索させればいいのか・・・・ なんか想像してたのと違いますが、何とか目的は果たせそうです。 ありがとうございました!

a-kuma3さんのコメント
そのアスタリスクって、test-0123 とかをひっかけるためのワイルドカードのつもりで入れてます? であれば、アスタリスクは無しで。 SQL では、ワイルドカード的なのは % と _ です。 MS-Access は、* と ? ですが。

gontakun_55さんのコメント
え? なんと! 大変お粗末なオチでしたwww ありがとうございました。
関連質問

●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ