PHP

簡単な検索フォームの実装手順(PHP×MySQL)

投稿日:2020年6月20日 更新日:

この記事はだいたい 5 分ほどで読めます。

検索条件を入力して結果を表示する簡単な検索フォームをPHPとMySQLで作ってみました。

確認した環境

  • OS Windows10
  • XAMPP ver.7.4.6

動かした人

  • PHP初心者
  • エンジニア歴10数年
  • 既婚
search

仕様

動作仕様

テキストボックスに入力してボタンを押したら、入力した値を部分一致で検索して出力する。

フォルダ構成

testdb

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と入力します。

searchform1

表示されました。

検索してみます。

[田]と入力して検索。

searchform2

検索できました。

user_lastで検索されているようです。

続いて[信]と入力して検索。

searchform3

いけてる感じです。

user_firstで検索されています。

まとめ

簡単な検索フォームを作成してみました。

バインド変数を使用して検索する部分でパラメータの書き方がポイントかなと思いました。

今回使用したデータベースは以前投稿した記事で作成したものを使用しています。>>【phpMyAdmin】SQL文を使ってレコードの作成・削除・更新をしてみる

おわり。

-PHP
-, , ,

執筆者:


  1. とくめい より:

    素人質問で申し訳ありません。
    MAMPを使ったローカル環境でテストしています。

    検索ボタンを押すとsearch.phpに遷移しNot Foundになってしまいます。

    どうしたら良いのでしょうか。

    • kiyo より:

      コメントありがとうございます。
      確認する環境が無いため未確認ですが、
      searchform.inc.php内の
      search.php が index.php の誤りかもしれません。

comment

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

関連記事

programing

【備忘録】mysqli_stmt_get_resultの実装手順(PHP×MySQL)

この記事はだいたい 3 分ほどで読めます。 PHPで条件を付けてSELECT文を発行し、MySQLからデータを取得する方法を記事にしました。 確認した環境 OS Windows10XAMPP ver. …

programmer

【備忘録】 mysqli_connect でデータベースに接続する方法(PHP×MySQL)

この記事はだいたい 5 分ほどで読めます。 mysqli_connect 関数を使ってPHPでMySQLに接続する方法の備忘録です。 確認した環境 OS Windows10XAMPP ver.7.4. …

Search for…

フリーランスのITエンジニアで一人親方のページです

趣味は犬の散歩と洗車と草むしり

[IT系のこと・興味のあること・日常のこと]を記事にしています