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

SQL과 재고 관리 시스템의 완벽한 구현

by successmylife 2025. 1. 22.

오늘은 PHP를 사용하여 웹 기반 재고 관리 시스템을 구현하는 방법을 알아봅니다. 특히 데이터베이스에서 조건 검색 기능을 강화하는 데 초점을 맞춰 설명하겠습니다. 본 게시글에서는 SQL과 PHP를 통해 효율적으로 데이터를 검색하고 재고 상태를 확인하는 방법을 초보자도 쉽게 따라

할 수 있도록 친절하게 다룰 예정입니다.

 

 


세션 관리와 접근 제어

먼저 재고 관리 시스템은 보안이 중요하기 때문에 사용자 접근 제어가 필수입니다. 이를 위해 PHP 세션을 활용합니다. 아래는 사용자의 접근 권한을 확인하는 간단한 코드입니다:

require_once($_SERVER['DOCUMENT_ROOT'] . "/session.php");
$title_message = '제1공장 원자재 재고현황';

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

위 코드는 사용자가 권한이 없을 경우 로그인 페이지로 리디렉션하도록 설계되었습니다. 이렇게 간단한 세션 관리만으로도 기본적인 보안을 확보할 수 있습니다.


데이터베이스 연결과 초기화

PHP와 MySQL을 사용해 데이터를 효율적으로 관리하려면 데이터베이스 연결 코드가 필요합니다. 이를 위해 PDO(PHP Data Object)를 활용합니다.

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

데이터베이스 연결 함수인 db_connect()는 데이터베이스에 안전하게 연결되도록 설정합니다. 이를 통해 재고 데이터를 가져올 준비가 완료됩니다.


재고 검색 기능 구현하기

재고 검색의 핵심은 SQL을 사용해 데이터베이스에서 효율적으로 데이터를 가져오는 것입니다. 사용자가 입력한 검색 조건에 따라 데이터를 필터링하려면 SELECT 문과 LIKE 연산자를 적절히 활용해야 합니다.

사용자 입력 받기

사용자로부터 입력받은 데이터를 처리하기 위해 아래와 같이 POST 데이터를 가져옵니다:

$steel_item = trim($_POST["Bigsearch"] ?? '전체');
$search = trim($_POST["search"] ?? '');

여기서 Bigsearch는 철판 종류, search는 세부 규격 검색에 사용됩니다. 두 값은 SQL 쿼리의 조건으로 활용됩니다.

SQL 조건 처리

사용자가 입력한 search 값이 있든 없든 유연하게 처리하려면 SQL 구문을 동적으로 생성해야 합니다. 다음은 search와 steel_item 모두를 고려한 SQL 예제입니다:

if ($steel_item === '전체') {
    $stmt_unique = $pdo->prepare("
        SELECT DISTINCT TRIM(steel_item) AS steel_item, TRIM(spec) AS spec
        FROM eworks
        WHERE is_deleted IS NULL AND spec LIKE :search1
        UNION
        SELECT DISTINCT TRIM(proditem) AS steel_item, TRIM(prodspec) AS spec
        FROM steelmake
        WHERE is_deleted IS NULL AND prodspec LIKE :search2
        UNION
        SELECT DISTINCT TRIM(steel_item) AS steel_item, TRIM(spec) AS spec
        FROM steel
        WHERE is_deleted IS NULL AND spec LIKE :search3
    ");
    $stmt_unique->execute([
        ':search1' => "%$search%",
        ':search2' => "%$search%",
        ':search3' => "%$search%"
    ]);
}

LIKE 연산자는 부분 일치를 검색하는 데 유용합니다. 위 코드는 UNION을 사용하여 여러 테이블에서 데이터를 검색하며, 철판 종류와 규격을 모두 확인할 수 있도록 설계되었습니다.

데이터 처리 및 반환

검색된 데이터를 배열로 가져온 후, 이를 사용하여 재고를 계산하거나 사용자에게 표시할 수 있습니다. 아래는 검색된 데이터를 반복 처리하는 코드입니다:

$unique_items = $stmt_unique->fetchAll(PDO::FETCH_ASSOC);

foreach ($unique_items as $item) {
    $item_code = $item['steel_item'];
    $item_spec = $item['spec'];
    $result = searchStock($pdo, $item_code, $item_spec);

    if ($result['stock'] !== null && $result['stock'] > 0) {
        $stock_result[] = [
            'steel_item' => $item_code,
            'spec'       => $item_spec,
            'stock'      => $result['stock']
        ];
    }
}

여기서 searchStock 함수는 재고 계산을 수행하며, 검색된 데이터를 기반으로 재고 수량을 반환합니다.


UI와 데이터 연동

검색된 데이터를 사용자에게 보여주기 위해 HTML 테이블을 사용합니다. 아래는 간단한 테이블 렌더링 예제입니다:

<table class="table table-hover" id="myTable">
    <thead class="table-primary">
        <tr>
            <th class="text-center" style="width: 200px;">원자재 종류</th>
            <th class="text-center" style="width: 200px;">규격</th>
            <th class="text-center" style="width: 100px;">재고수량</th>
        </tr>
    </thead>
    <tbody>
        <?php foreach ($stock_result as $stock): ?>
            <tr>
                <td class="text-center"><?= htmlspecialchars($stock['steel_item'], ENT_QUOTES, 'UTF-8') ?></td>
                <td class="text-center"><?= htmlspecialchars($stock['spec'], ENT_QUOTES, 'UTF-8') ?></td>
                <td class="text-center"><?= number_format($stock['stock']) ?></td>
            </tr>
        <?php endforeach; ?>
    </tbody>
</table>

위 코드는 PHP 배열 $stock_result에 저장된 데이터를 HTML 테이블로 렌더링합니다. number_format을 사용해 재고 수량을 보기 좋게 포맷팅했습니다.


동적 필터와 JavaScript

검색 조건이 변경될 때마다 데이터를 즉시 갱신하려면 JavaScript를 활용할 수 있습니다. 예를 들어, 사용자가 입력한 검색어를 폼 데이터로 전송해 결과를 갱신합니다:

$(document).ready(function() {
    $("#searchBtn").click(function() {
        $("#board_form").submit();
    });
});

또한 DataTables 라이브러리를 사용해 테이블을 정렬, 검색, 페이징할 수 있습니다. 다음은 기본 설정 예제입니다:

$('#myTable').DataTable({
    paging: true,
    ordering: true,
    searching: true,
    pageLength: 25,
    lengthMenu: [25, 50, 100, 200, 500, 1000],
    language: {
        lengthMenu: "Show _MENU_ entries",
        search: "Live Search:"
    },
    order: [[0, 'desc']]
});

요약

PHP와 SQL을 활용한 재고 관리 시스템은 효율적인 데이터 검색과 사용자 친화적인 UI를 제공할 수 있습니다. 위에서 설명한 방법을 적용하면 다양한 조건에서 데이터를 검색하고 재고 상태를 확인할 수 있습니다. 이를 통해 재고 관리의 정확성과 생산성을 동시에 향상시킬 수 있습니다.

반응형