Help us understand the problem. What is going on with this article?

【PHP】ユーザーの検索機能

PHPについて学習内容を備忘録としてまとめます。
ユーザーの検索機能を実装しましたので、作成方法を記載します。

anime.gif

検索フォーム作成

まずはユーザーを検索するためのフォーム画面を表示させます。
内部では入力した値が入ったユーザー名を検索する処理を行います。

//ユーザーを検索するフォーム
<form method="post" action="#" class="search_container">
    <input type="text" name="search_input" placeholder="ユーザー検索">
    <input type="submit" name="search_user">
</form>

placeholderを設定しフォーム画面にはデフォルトでユーザー検索と表示させます。

検索機能を動かす

先ほど作成した検索フォームと同じphpファイルに下記コードをかきます。
header関数があるのでなるべくファイルの上部にかくことを推奨します。

<?php
if (!empty($_POST['search_user'])){
    $hoge = $_POST['search_input'];
    header("Location:user_list.php?type=search&query=${hoge}");
  }
?>

こちらは検索フォームが検索されたときに動く処理です。

user_list.phpはユーザー一覧画面になっており、今回の検索機能を実装する対象のファイルなのですが、
検索機能が動いたときにuser_list.phpにリダイレクトしtype=searchtypeの値を指定し、query=${hoge}で検索フォームの値を取り出しています。

検索機能の処理

それでは受け取った値を元にユーザーを表示させていきます。

$page_type = $_GET['type'];

switch ($page_type) {
    case 'all';
    $users = get_users('all','');
    break;

    case 'search':
    $users = get_users('search',$_GET['query']);
    break;
  }

foreach((array)$users as $user): 

 print'<br />';
 print '<a href="../user/user_disp.php?user_id='.$user['id'].'">'.$user['name'].'</a>'; 

endforeach

まず$page_type = $_GET['type'];でURLからtypeの値を取り出して$page_typeに渡します。
そして$page_typeの値によって出力するユーザーを変更します。
ユーザーを取り出す際にはget_users関数を使って取り出します。

get_users関数は下記のようになっています。

  function get_users($type,$query){
    try {
      $dsn='mysql:dbname=shop;host=localhost;charset=utf8';
      $user='root';
      $password='';
      $dbh=new PDO($dsn,$user,$password);

      switch ($type) {
        case 'all':
        $sql = "SELECT id,name,password,profile
                FROM user
                WHERE delete_flg = 0";
        $stmt = $dbh->prepare($sql);
        $stmt->execute();
        return $stmt->fetchAll();
        break;

        case 'search':
          $sql = "SELECT id,name,password,profile
                  FROM user
                  WHERE name LIKE CONCAT('%',:input,'%') AND delete_flg = 0";
          $stmt = $dbh->prepare($sql);
          $stmt->bindValue(':input', $query);
          $stmt->execute();
          return $stmt->fetchAll();
        break;
      }
    } catch (\Exception $e) {
      error_log('エラー発生:' . $e->getMessage());
      set_flash('error',ERR_MSG1);
    }
  }

引数で渡された値を元に処理を分岐して$queryの値から取り出すユーザーを指定しています。
WHERE name LIKE CONCAT('%',:input,'%')で検索フォームに入力された値が入っているユーザー名を出力しています。

foreach((array)$users as $user): 

 print'<br />';
 print '<a href="../user/user_disp.php?user_id='.$user['id'].'">'.$user['name'].'</a>'; 

endforeach

最後に取り出したユーザー名を表示させれば実装完了です。

参考URL

https://qiita.com/nyann123/items/7320d98d17768986add0

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away