度々お世話になります。
MySQLの検索で狙った結果がどうしても取れず、
万策尽きたので質問をさせていただきます。
やりたいこと
情報テーブルのtitleから、ユーザが検索した情報を表示したい。
「hoge」でhogefugaを表示。
「fuga」でhogefugaとfugaを表示
「hoge fuga」でhogefugaとfuganekohogeを表示。
情報テーブル
id | title |
---|---|
1 | hogefuga |
2 | fuga |
3 | fuganekohoge |
php
1try { 2 $con = new PDO( 3 'mysql:host=localhost;dbname=hoge;charset=utf8mb4', 4 'root', 5 '', 6 [ 7 PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, 8 PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, 9 ] 10 ); 11 12} catch (PDOException $e) { 13 14 header('Content-Type: text/plain; charset=UTF-8', true, 500); 15 exit($e->getMessage()); 16 17}
html
1<h3 class="leave-comment-text">Search</h3> 2<form action="search.php" method="get"> 3 <input name="keywords" placeholder="Search" type="text"> 4 <button class="submit" type="submit" name="submit"> <i class="fa fa-search" aria-hidden="true"></i> </button> 5</form>
php
1if(isset($_GET['submit'])) { 2 $keywords = $_GET['keywords']; 3 } 4$kw = mb_convert_kana($keywords, 's'); 5$kw_arr = preg_split('/[\s]+/', $kw, -1, PREG_SPLIT_NO_EMPTY); 6$keywordCondition = []; 7foreach ($kw_arr as $keyword) { 8$keywordCondition[] = 'watch_title LIKE "%' . $keyword . '%"'; 9} 10$keywordCondition = implode(' AND ', $keywordCondition);
試したこと
php
1$search = $con->query(" 2SELECT * FROM kensaku 3WHERE $keywordCondition 4LIMIT $page_1, $per_page // ページャー 5"); 6 7$searches = $search->fetchAll(PDO::FETCH_OBJ);
上記だと求めた検索結果が出ますが、
セキュリティ的に良くないと伺ったのでprepareを使用することにしました。
上手くいかないコード
php
1$search = $con->prepare(" 2SELECT * FROM watch 3WHERE :keywordCondition 4LIMIT :page_1, :per_page 5"); 6$search->bindValue(':keywordCondition', $keywordCondition, PDO::FETCH_OBJ); 7$search->bindValue(':page_1', (int)$page_1, PDO::PARAM_INT); 8$search->bindValue(':per_page', (int)$per_page, PDO::PARAM_INT); 9$search->execute(); 10$searches = $search->fetchAll(PDO::FETCH_OBJ);
上記の$search->bindValue(':keywordCondition', $keywordCondition, PDO::FETCH_OBJ);
の部分の第3引数に様々な定数があったので下記URLより全パターン試しましたが、
白紙か、テーブルの全てのtitleが出力されました(絞り込みできない)
https://www.php.net/manual/ja/pdo.constants.php
php
1$search = $con->prepare(" 2SELECT * FROM watch 3WHERE ? 4LIMIT ?, ? 5"); 6$search->bindValue(1, $keywordCondition, PDO::FETCH_OBJ); 7$search->bindValue(2, (int)$page_1, PDO::PARAM_INT); 8$search->bindValue(3, (int)$per_page, PDO::PARAM_INT); 9$search->execute(); 10$searches = $search->fetchAll(PDO::FETCH_OBJ);
名前付きプレースホルダだと上手く行かないと思い、
疑問符プレースホルダでも試してみましたが名前付きプレースホルダの時と
同様に白紙か、テーブルの全てのtitleが出力されました(絞り込みできない)
以上、期待した結果を得るためのお知恵をお貸し頂ければと思います。
どうぞよろしくお願いいたします。
回答2件
あなたの回答
tips
プレビュー