この記事はだいたい 5 分ほどで読めます。
検索条件を入力して結果を表示する簡単な検索フォームをPHPとMySQLで作ってみました。
確認した環境
- OS Windows10
- XAMPP ver.7.4.6
動かした人
- PHP初心者
- エンジニア歴10数年
- 既婚
目次
仕様
動作仕様
テキストボックスに入力してボタンを押したら、入力した値を部分一致で検索して出力する。
フォルダ構成
5個のファイルで構成しました。
順番に見ていきます。
部品たち
includeフォルダの中に格納したファイルを見ていきます。
header.inc.php
htmlのヘッダ部分をコピペして作成。
<!DOCTYPE html> <html lang="jp"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>検索フォーム</title> </head> <body>
footer.inc.php
htmlのフッタ部分をコピペして作成。
</body> </html>
dbh.inc.php
MySQLの接続部分のみを記述
<?php // phpからMySQLに接続 //ホスト名 $servername = "localhost"; //ユーザー名 $user = "root"; //パスワード $password = ""; //db名 $dbname = "testdb"; // 接続 $conn = mysqli_connect($servername, $user, $password, $dbname); // 接続確認 if (mysqli_connect_errno()) { die('Connect Error (' . mysqli_connect_errno() . ') ' . mysqli_connect_error()); }
searchform.inc.php
検索するテキストボックスとボタン部分。
POSTされたときは入力した値がセットされるようにしました。
<?php $value = ""; if (isset($_POST['name'])) { $value = $_POST['name']; } echo '<form action="search.php" method="POST"> <input type="text" name="name" id="name" placeholder="お名前" value="' . $value . '" > <button type="submit" name="search-button">検索</button> </form>';
続いて本体部分です。
本体部分
index.php
ヘッダを読み込んで検索フォームを読み込んでます。
その次に検索ボタンが押されたかをチェックして、押されていれば検索結果の出力処理を行っています。
最後にフッタを読み込んでいます。
また、関数を内部で2つ作成しています。
<?php include_once 'include/header.inc.php'; include_once 'include/searchform.inc.php'; if (isset($_POST['search-button'])) { //検索結果を出力 getResult(); } include_once 'include/footer.inc.php'; //検索結果 function getResult() { include_once 'include/dbh.inc.php'; // セレクト文作成 $sql = "SELECT user_id , user_last, user_first, user_age FROM users WHERE user_last like ? OR user_first like ?"; //バインド変数 $val1 = "%" . $_POST['name'] . "%"; $val2 = "%" . $_POST['name'] . "%"; // バインド変数の型 $types = "ss"; // ステートメントID取得 $stmt = mysqli_stmt_init($conn); // SQLステートメントを実行する準備 if (!mysqli_stmt_prepare($stmt, $sql)) { echo "SQL ERROR!"; // 接続を閉じる mysqli_close($conn); exit(); } // パラメータにバインドする mysqli_stmt_bind_param($stmt, $types, $val1, $val2); // クエリを実行 mysqli_stmt_execute($stmt); $result = mysqli_stmt_get_result($stmt); // 行数取得 $rows = mysqli_num_rows($result); echo "<h1>検索結果</h1>"; if ($rows > 0) { echo $rows . "件取得しました!<hr>"; getTable($result); } else { //データなし echo "ヒットしませんでした!"; echo "<hr>"; } echo '<a href="index.php">戻る</a>'; // ステートメントを閉じる mysqli_stmt_close($stmt); // 接続を閉じる mysqli_close($conn); } //テーブル作成 function getTable($result) { $fields = mysqli_fetch_fields($result); echo "<table class='searchtable'><tr>"; foreach ($fields as $field) { echo "<th>" . $field->name . "</th>"; } echo "</tr>"; // 値を取得する while ($row = mysqli_fetch_assoc($result)) { echo "<tr>"; foreach ($row as $col) { echo "<td>" . $col . "</td>"; } echo "</tr>"; } echo "</table>"; }
内部関数
getResult
SQL文を作ってデータベースからデータを取得しています。
SQL文は入力された値を部分一致で検索するようにしています。
また、検索対象のカラムはuser_lastとuser_firstとしています。
getTable
検索結果からテーブルを作成しています。
mysqli_fetch_fieldsからフィールド名を取得してテーブルのヘッダに使用しています。
動作確認
ブラウザのurlに localhost/testbと入力します。
表示されました。
検索してみます。
[田]と入力して検索。
検索できました。
user_lastで検索されているようです。
続いて[信]と入力して検索。
いけてる感じです。
user_firstで検索されています。
まとめ
簡単な検索フォームを作成してみました。
バインド変数を使用して検索する部分でパラメータの書き方がポイントかなと思いました。
今回使用したデータベースは以前投稿した記事で作成したものを使用しています。>>【phpMyAdmin】SQL文を使ってレコードの作成・削除・更新をしてみる
おわり。
素人質問で申し訳ありません。
MAMPを使ったローカル環境でテストしています。
検索ボタンを押すとsearch.phpに遷移しNot Foundになってしまいます。
どうしたら良いのでしょうか。
コメントありがとうございます。
確認する環境が無いため未確認ですが、
searchform.inc.php内の
search.php が index.php の誤りかもしれません。