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 %?%");
では無理でした。
どなたか、ご教示をお願い致します。

回答の条件
  • 1人50回まで
  • 登録:
  • 終了:2017/10/11 14:09:46
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:a-kuma3 No.2

回答回数4973ベストアンサー獲得回数2154

ポイント200pt

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, '\_%')));
他7件のコメントを見る
id:a-kuma3

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

2017/10/11 13:18:25
id:gontakun_55

え?
なんと!
大変お粗末なオチでしたwww

ありがとうございました。

2017/10/11 14:08:48

その他の回答1件)

id:degucho No.1

回答回数281ベストアンサー獲得回数75

試してませんが
$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)."%");
のほうがよいかな

id: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)."%");
でのエラーが表示されます。

2017/10/11 08:45:43
id:a-kuma3 No.2

回答回数4973ベストアンサー獲得回数2154ここでベストアンサー

ポイント200pt

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, '\_%')));
他7件のコメントを見る
id:a-kuma3

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

2017/10/11 13:18:25
id:gontakun_55

え?
なんと!
大変お粗末なオチでしたwww

ありがとうございました。

2017/10/11 14:08:48

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

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

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

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

回答リクエストを送信したユーザーはいません