前提・実現したいこと
検索フォームを利用して、MySQLサーバーから複数のキーワード検索を行いたいです。
検索の条件として、カラム毎に検索フォームが設けられている方法ではなくて、
1つの検索フォームにて、2つ以上のカラムを(複数のキーワードを検索)検索する方法です。
例えば、下記のテーブルから、エアコン有など、1つのカラムでの検索はできますが、
【エアコン有 プリウス】 という2つのカラム検索が出来ません。
(【】は、一つの検索フォームとして解釈してください。)
エアコン有 | カローラ | 新車|
エアコン有 | カローラ | 新車|
エアコン無 | カローラ | 新車|
エアコン有 | カローラ | 中古|
エアコン有 | カローラ | 中古|
エアコン無 | プリウス | 新車|
エアコン有 | プリウス | 新車|
エアコン有 | プリウス | 新車|
エアコン有 | プリウス | 新車|
エアコン無 | プリウス | 中古|
エアコン有 | プリウス | 中古|
エアコン有 | プリウス | 中古|
発生している問題・エラーメッセージ
未入力です検索結果は0件です。 検索結果がありません。と表示されてしまいます。
該当のソースコード
<?php session_start(); ?> <!DOCTYPE html> <html lang="ja"> <head> <title>PHPのテスト</title> </head> <body> <hr> 会員名簿一覧 <hr> [ <a href="form.html">新規登録</a>] <br> <form name="form1" method="post" action="list.php"> 名前:<input type="text" name="search_key"><input type="submit" value="検索する"> </form> <?php require_once("MYDB.php"); $pdo = db_connect(); if(empty($_PORTS['check_data'])){ echo "未入力です"; } // 削除処理 削除するデータ項目fに「2」のフラグを立てる。データそのものを削除しない方法 if(isset($_GET['action']) && $_GET['action'] == 'delete' && $_GET['id'] > 0 ){ try { $pdo->beginTransaction(); $id = $_GET['id']; $sql = "DELETE FROM test WHERE id = :id"; $sql = "UPDATE test SET f='2' WHERE id = :id"; $stmh = $pdo->prepare($sql); $stmh->bindValue(':id', $id, PDO::PARAM_INT ); $stmh->execute(); $pdo->commit(); print "データを" . $stmh->rowCount() . "件、削除しました。<br>"; } catch (PDOException $Exception) { $pdo->rollBack(); print "エラー:" . $Exception->getMessage(); } } // 挿入処理 if(isset($_POST['action']) && $_POST['action'] == 'insert'){ try { $pdo->beginTransaction(); $sql = "INSERT INTO test (test1, test2, test3) VALUES ( :test1, :test2, :test3 )"; $stmh = $pdo->prepare($sql); $stmh->bindValue(':test1', $_POST['test1'], PDO::PARAM_STR ); $stmh->bindValue(':test2', $_POST['test2'], PDO::PARAM_STR ); $stmh->bindValue(':test3', $_POST['test3'], PDO::PARAM_STR ); $stmh->execute(); $pdo->commit(); print "データを" . $stmh->rowCount() . "件、挿入しました。<br>"; } catch (PDOException $Exception) { $pdo->rollBack(); print "エラー:" . $Exception->getMessage(); } } // 更新処理 if(isset($_POST['action']) && $_POST['action'] == 'update'){ // セッション変数よりidを受け取ります $id = $_SESSION['id']; try { $pdo->beginTransaction(); $sql = "UPDATE test SET test1 = :test1, test2 = :test2, test3 = :test3 WHERE id = :id"; $stmh = $pdo->prepare($sql); $stmh->bindValue(':test1', $_POST['test1'], PDO::PARAM_STR ); $stmh->bindValue(':test2', $_POST['test2'], PDO::PARAM_STR ); $stmh->bindValue(':test3', $_POST['test3'], PDO::PARAM_STR ); $stmh->bindValue(':id', $id, PDO::PARAM_INT ); $stmh->execute(); $pdo->commit(); print "データを" . $stmh->rowCount() . "件、更新しました。<br>"; } catch (PDOException $Exception) { $pdo->rollBack(); print "エラー:" . $Exception->getMessage(); } // 使用したセッション変数を削除する unset($_SESSION['id']); } // 検索および現在の全データを表示します try { if(isset($_POST['search_key']) && $_POST['search_key'] != ""){ $search_key = '%' . $_POST['search_key'] . '%'; $sql= "SELECT * FROM test WHERE test1 like :test1 OR test2 like :test2 OR test3 like :test3"; $stmh = $pdo->prepare($sql); $stmh->bindValue(':test1', $search_key, PDO::PARAM_STR ); $stmh->bindValue(':test2', $search_key, PDO::PARAM_STR ); $stmh->bindValue(':test3', $search_key, PDO::PARAM_STR ); $stmh->execute(); }else{ // $sql= "SELECT * FROM test "; // 削除フラグ「2」となっているものを表示させない。「2」以外のものを表示させる。 $sql= "SELECT * FROM test WHERE f <>2"; $stmh = $pdo->query($sql); } $count = $stmh->rowCount(); print "検索結果は" . $count . "件です。<br>"; } catch (PDOException $Exception) { print "エラー:" . $Exception->getMessage(); } if($count < 1){ print "検索結果がありません。<br>"; }else{ ?> <table border="1"> <tbody> <tr><th>番号</th><th>test1</th><th>test2</th><th>test3</th><th> </th><th> </th></tr> <?php while ($row = $stmh->fetch(PDO::FETCH_ASSOC)) { ?> <tr> <td><?=htmlspecialchars($row['id'], ENT_QUOTES)?></td> <td><?=htmlspecialchars($row['test1'], ENT_QUOTES)?></td> <td><?=htmlspecialchars($row['test2'], ENT_QUOTES)?></td> <td><?=htmlspecialchars($row['test3'], ENT_QUOTES)?></td> <td><a href=updateform.php?id=<?=htmlspecialchars($row['id'], ENT_QUOTES)?>>更新</a></td> <td><a href=list.php?action=delete&id=<?=htmlspecialchars($row['id'], ENT_QUOTES)?>>削除</a></td> </tr> <?php } ?> </tbody></table> <?php } ?> </body> </html>
試したこと
検索の組み立てがイメージ出来ません。(初心者で申し訳ありません。)
Windows10にてapacheとMySQLを稼働
mysql Ver 15.1 Distrib 10.4.14-MariaDB
PHP 7.4.11 (cli)
ここにより詳細な情報を記載してください。