본문 바로가기
코딩,프로그램

php7.3버전에서 회원관리 list.php 파일 코드 참고용

by successmylife 2025. 2. 23.

아래는 PHP 7.3 환경에서도 문제없이 동작하도록 수정한 코드입니다. 주된 변경 사항은 다음과 같습니다.

  1. 컬럼별 개별 바인딩 적용
    • 각 컬럼을 LIKE :searchX 형태로 바인딩하여 SQL 인젝션 방지 및 PHP 7.3 호환성 유지.
  2. $stmh = $pdo->query($sql); → $stmh = $pdo->prepare($sql);
    • prepare()를 사용하여 bindValue()를 적용할 수 있도록 변경.
  3. bindValue()를 루프 내에서 개별 적용
    • foreach ($bindParams as $paramName => $paramValue) { $stmt->bindValue($paramName, $paramValue, PDO::PARAM_STR); }

🔹 수정된 전체 코드

<?php
require_once($_SERVER['DOCUMENT_ROOT'] . "/session.php");

if (!isset($_SESSION["level"]) || $_SESSION["level"] > 5) {
    sleep(1);
    header("Location:" . $WebSite . "login/login_form.php");
    exit;
}

include $_SERVER['DOCUMENT_ROOT'] . '/load_header.php';

$title_message = '회원관리';
?>

<title> <?=$title_message?> </title>

<body>

<? include $_SERVER['DOCUMENT_ROOT'] . '/myheader.php'; ?>

</head>

<?php
$tablename = "member";

require_once($_SERVER['DOCUMENT_ROOT'] . "/lib/mydb.php");
$pdo = db_connect();

if (isset($_REQUEST["mode"])) {
    $mode = $_REQUEST["mode"];
} else {
    $mode = "";
}

if (isset($_REQUEST["search"])) {
    $search = $_REQUEST["search"];
} else {
    $search = "";
}

// 기본 SQL 쿼리
$sql = "SELECT * FROM {$DB}.{$tablename} ORDER BY num DESC";

if ($mode == "search" && !empty($search)) {
    // 테이블의 모든 컬럼 가져오기
    $columns = [];
    $stmt = $pdo->query("SHOW COLUMNS FROM " . $DB . "." . $tablename);
    while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
        $columns[] = $row['Field'];
    }

    // LIKE 검색 조건 및 바인딩용 배열 생성
    $searchConditions = [];
    $bindParams = [];
    foreach ($columns as $index => $col) {
        $paramName = ":search{$index}"; // 개별 바인딩을 위해 동적 파라미터 생성
        $searchConditions[] = "$col LIKE $paramName";
        $bindParams[$paramName] = "%$search%";
    }

    if (!empty($searchConditions)) {
        $sql = "SELECT * FROM {$DB}.{$tablename} WHERE " . implode(" OR ", $searchConditions) . " ORDER BY num DESC";
    }
}

// SQL 실행
$stmt = $pdo->prepare($sql);
if ($mode == "search" && !empty($search)) {
    foreach ($bindParams as $paramName => $paramValue) {
        $stmt->bindValue($paramName, $paramValue, PDO::PARAM_STR);
    }
}
$stmt->execute();
$results = $stmt->fetchAll(PDO::FETCH_ASSOC);
?>

<form name="board_form" id="board_form" method="post" action="list.php?mode=search&search=<?=$search?>">

<div class="container-fluid justify-content-center">

    <div class="d-flex mt-3 mb-3 justify-content-center align-items-center">
        <span class="text-secondary fs-5 ">&nbsp;&nbsp; <?=$title_message?> &nbsp;&nbsp;</span>
        <button type="button" class="btn btn-dark btn-sm mx-2" onclick='location.reload()'>  
            <i class="bi bi-arrow-clockwise"></i>
        </button>
    </div>

    <div class="d-flex mt-2 mb-2 justify-content-center">
        <button type="button" class="btn btn-dark btn-sm mx-1" onclick="popupCenter('initsettings.php', '소속관리', 600, 800);return false;"> 소속관리 </button>
        <button type="button" class="btn btn-dark btn-sm mx-1" onclick="popupCenter('setline.php', '결재라인 등록', 600, 500);return false;"> 결재라인 </button>
        <input type="text" name="search" id="search" value="<?=$search?>" class="form-control mx-1" style="width:200px;" onkeydown="JavaScript:SearchEnter();" placeholder="검색어">
        <button type="button" id="searchBtn" class="btn btn-dark btn-sm mx-1">
            <ion-icon name="search-outline"></ion-icon>
        </button>
        <button type="button" class="btn btn-dark btn-sm mx-1" onclick="popupCenter('write_form.php', '등록', 600, 750);return false;"> 
            <ion-icon name="pencil-outline"></ion-icon> 신규 
        </button>
    </div>

    <div class="row d-flex">
        <table class="table table-hover" id="myTable">
            <thead class="table-primary">
                <tr>
                    <th class="text-center"> 번호 </th>
                    <th class="text-center"> ID </th>
                    <th class="text-center"> P/W </th>
                    <th class="text-center"> 성명 </th>
                    <th class="text-center"> 재직/퇴직 </th>
                    <th class="text-center"> 생년월일 </th>
                    <th class="text-center"> 입사일 </th>
                    <th class="text-center"> HP </th>
                    <th class="text-center"> 레벨 </th>
                    <th class="text-center"> 소속회사 </th>
                    <th class="text-center"> 파트 </th>
                    <th class="text-center"> 직위 </th>
                    <th class="text-center"> 회계권한 </th>
                    <th class="text-center"> 전자결재 </th>
                    <th class="text-center"> numorder </th>
                    <th class="text-center"> 주소 </th>
                </tr>
            </thead>
            <tbody>

<?php
try {
    $stmh = $stmt;  // 검색조건에 맞는 쿼리 실행된 객체
    $total_row = $stmh->rowCount();
    $start_num = $total_row;    

    while ($row = $stmh->fetch(PDO::FETCH_ASSOC)) {
        include '_row.php';
?>

    <tr onclick="redirectToView('<?=$num?>')">
        <td class="text-center"> <?= $start_num ?> </td>
        <td class="text-center"> <?= $id ?> </td>
        <td class="text-center"> <input type="password" class="form-control w120px" value="<?= $pass ?>" readonly> </td>
        <td class="text-center"> <?= $name ?> </td>
        <td class="text-center text-danger fw-bold"> <?= ($quitDate === '0000-00-00' || $quitDate === '' || $quitDate === null) ? '' : '퇴직' ?> </td>
        <td class="text-center"> <?= ($birthday === '0000-00-00' || $birthday === '' || $birthday === null) ? '' :  $birthday ?> </td>
        <td class="text-center"> <?= ($enterDate === '0000-00-00' || $enterDate === '' || $enterDate === null) ? '' :  $enterDate ?> </td>
        <td class="text-center"> <?= $hp ?> </td>
        <td class="text-center"> <?= $lv ?> </td>
        <td class="text-center"> <?= $division ?> </td>
        <td class="text-center"> <?= $part ?> </td>
        <td class="text-center"> <?= $position ?> </td>
        <td class="text-center"> <?= $authority ?> </td>
        <td class="text-center"> <?= $eworks_lv ?> </td>
        <td class="text-center"> <?= $numorder ?> </td>
        <td class="text-center"> <?= $address ?> </td>
    </tr>

<?php
        $start_num--;
    }
} catch (PDOException $Exception) {
    print "오류: " . $Exception->getMessage();
}
?>
            </tbody>
        </table>
    </div>
</div>
</form>
</body>
</html>

이제 PHP 7.3에서도 정상 작동할 것입니다. 🚀😊

반응형