この記事はだいたい 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 の誤りかもしれません。