회원관리 검색기능 - Search

이태현·2025년 8월 12일

Web 개발

목록 보기
20/53
post-thumbnail

member.php - 전체코드

  <?php

  $g_title = "해커들의 놀이터";
  $js_array = ['js/member.js'];

  $menu_code = "member";

  include "inc_common.php";
  include "inc_header.php";
  include "../inc/dbconfig.php";
  include "../inc/member.php"; // 회원관리 Class
  include "../inc/lib.php"; // 페이지네이션


  $sn = (isset($_GET["sn"]) && $_GET["sn"] != "" && is_numeric($_GET["sn"])) ? $_GET["sn"] : "";
  $sf = (isset($_GET["sf"]) && $_GET["sf"] != "") ? $_GET["sf"] : "";

  $paramArr = ["sn" => $sn, "sf" => $sf];
  // $total, $limit, $page_limit, $page, $param

  $mem = new Member($db);

  $total = $mem->total($paramArr);
  $limit = 5;
  $page_limit = 5;
  $page = (isset($_GET["page"]) && $_GET["page"] != "" && is_numeric($_GET["page"])) ? $_GET["page"] : 1;
  $param = "";

  $memArr = $mem->list($page, $limit, $paramArr);

  ?>
  <main class="border rounded-2 p-5 " style="height: calc(100vh - 265px);">

    <div class="container">
      <h3 class="">회원관리</h3>
    </div>

    <table class="table table-border">
      <tr>
        <th>번호</th>
        <th>아이디</th>
        <th>이름</th>
        <th>이메일</th>
        <th>등록일시</th>
        <th>관리</th>
      </tr>
      <?php
      foreach ($memArr as $row) {

        // 2025-07-23 22-35
        // $row["create_at"] = substr($row["create_at"], 0, 16);
      ?>
        <tr>
          <td><?= $row["idx"]; ?></td>
          <td><?= $row["id"]; ?></td>
          <td><?= $row["name"]; ?></td>
          <td><?= $row["email"]; ?></td>
          <td><?= $row["create_at"]; ?></td>
          <td>
            <button class="btn btn-primary btn-sm">수정</button>
            <button class="btn btn-danger btn-sm">삭제</button>
          </td>
        </tr>
      <?php
      }
      ?>
    </table>
    <div class="container d-flex gap-2 w-50">
      <select class="form-select w-25" name="sn" id="sn">
        <option value="1">이름</option>
        <option value="2">아이디</option>
        <option value="3">이메일</option>
      </select>
      <input type="text" class="form-control w-25" id="sf" name="sf">
      <button class="btn btn-primary w-25" id="btn_search">검색</button>
      <button class="btn btn-success" id="btn_all">전체목록</button>
    </div>

    <div class="d-flex justify-content-between align-items-start mt-5">
      <?php
      $param = "&sn=" . $sn . "&sf=" . $sf;
      echo my_pagination($total, $limit, $page_limit, $page, $param);
      ?>
      <button class="btn btn-primary" id="btn_excel">엑셀로 저장</button>
    </div>

  </main>

  <?php
  include "inc_footer.php";
  ?>

검색기능 - UI

    <div class="container d-flex gap-2 w-50">
      <select class="form-select w-25" name="sn" id="sn">
        <option value="1">이름</option>
        <option value="2">아이디</option>
        <option value="3">이메일</option>
      </select>
      <input type="text" class="form-control w-25" id="sf" name="sf">
      <button class="btn btn-primary w-25" id="btn_search">검색</button>
      <button class="btn btn-success" id="btn_all">전체목록</button>
    </div>

검색기능 - JS

document.addEventListener("DOMContentLoaded", () => {
  const btn_search = document.querySelector("#btn_search")

  btn_search.addEventListener("click", () => {
    const sf = document.querySelector("#sf")

    if (sf.value == "") {
      alert("검색어를 입력해 주세요.")
      sf.focus()
      return false
    }

    const sn = document.querySelector("#sn")
    location.href = "./member.php?sn=" + sn.value + "&sf=" + sf.value
  })

  const btn_all = document.querySelector("#btn_all")

  btn_all.addEventListener("click", () => {
    location.href = "member.php"
  })
})

회원목록 불러오기 - DB

  // 회원목록
  public function list($page, $limit, $paramArr)
  {
    $start = ($page - 1) * $limit;

    $where = "";
    if ($paramArr["sn"] != "" && $paramArr["sf"]) {
      switch ($paramArr["sn"]) {
        case 1:
          $sn_str = "name";
          break;
        case 2:
          $sn_str = "id";
          break;
        case 3:
          $sn_str = "email";
          break;
      }
      $where = " WHERE " . $sn_str . "=:sf";
    }

    $sql = "SELECT idx, id, name, email, DATE_FORMAT(create_at,'%Y-%m-%d %H-%i') AS create_at 
    FROM member " . $where . "
    ORDER BY idx DESC LIMIT " . $start . "," . $limit;

    $stmt = $this->conn->prepare($sql);

    if ($where != "") {
      $stmt->bindParam(":sf", $paramArr["sf"]);
    }

    $stmt->setFetchMode(PDO::FETCH_ASSOC);
    $stmt->execute();

    return $stmt->fetchAll();
  }
  • 기존 페이지 네이션 부분에 case 문을 사용하여 조건에 맞는 값을 가지고 검색을 해줄 겁니다.

switch ($paramArr["sn"]) {
        case 1:
          $sn_str = "name";
          break;
        case 2:
          $sn_str = "id";
          break;
        case 3:
          $sn_str = "email";
          break;
      }
  • 조건을 주고 검색해 보겠습니다.

검색조건 - Name

검색결과 - Name

  • 조건을 이름으로 주고 bob이라는 이름을 검색해 보겠습니다.

검색조건 - ID

  • 조건을 아이디로 주고 test1이라는 아이디를 검색해 보겠습니다.

검색결과 - ID

검색조건 - Email

  • 조건을 이메일로 주고 test@test.com77이라는 이메일을 검색해 보겠습니다.

검색결과 - Email

DB 데이터 총 개수 구하기 - DB

  // DB 데이터 총 데이터 개수 구하기
  public function total($paramArr)
  {
    $where = "";
    if ($paramArr["sn"] != "" && $paramArr["sf"]) {
      switch ($paramArr["sn"]) {
        case 1:
          $sn_str = "name";
          break;
        case 2:
          $sn_str = "id";
          break;
        case 3:
          $sn_str = "email";
          break;
      }
      $where = " WHERE " . $sn_str . "=:sf";
    }
    $sql = "SELECT COUNT(*) cnt FROM member" . $where;
    $stmt = $this->conn->prepare($sql);
    if ($where != "") {
      $stmt->bindParam(":sf", $paramArr["sf"]);
    }
    $stmt->setFetchMode(PDO::FETCH_ASSOC);
    $stmt->execute();
    $row = $stmt->fetch();

    return $row["cnt"];
  }
  • 총 데이터 구하는 값도 똑같이 위에 부분에서 추가되는 부분을 그대로 복사해옵니다.

마무리

오랜만에 글을 작성하네요. 그동안 기사 시험 준비하고 장염 걸려서 고생하고 아주 시간 가는 줄 몰랐네요.

다음 시간에는 엑셀 저장을 해보겠습니다.

긴 글 봐주셔서 감사합니다.

profile
이해하고 분석하고 지배한다

0개의 댓글