티스토리 뷰

반응형

데이터베이스에서 원하는 정보를 빠르게 찾을 수 있도록 검색 기능을 구현하는 것은 매우 중요하다. 특히 여러 개의 컬럼에서 하나의 검색어로 데이터를 조회할 수 있도록 만들면, 사용자 경험이 훨씬 좋아진다.

이번 포스팅에서는 MySQL 테이블의 모든 컬럼을 자동으로 검색하는 PHP 코드를 구현하는 방법을 알아본다. 기존에는 특정 컬럼을 지정해 검색하는 방식이 일반적이었지만, 테이블에 새로운 컬럼이 추가되더라도 수정 없이 자동으로 반영될 수 있도록 효율적인 쿼리를 구성할 것이다.

 


1. MySQL에서 특정 컬럼이 아닌 전체 컬럼을 검색해야 하는 이유

일반적으로 데이터베이스에서 검색을 수행할 때는 특정 컬럼을 지정해 검색하는 경우가 많다. 예를 들어, name 또는 email 컬럼에서 특정 값을 찾는 방식이다.

SELECT * FROM users WHERE name LIKE '%검색어%' OR email LIKE '%검색어%';

그러나 이런 방식은 다음과 같은 문제를 가진다.

새로운 컬럼이 추가될 경우, SQL문을 수정해야 한다.
검색 범위가 한정적이라 사용자가 원하는 데이터를 찾지 못할 수 있다.
사용자가 어떤 정보를 검색할지 미리 예측해야 한다.

특히 관리 시스템에서는 검색 범위를 넓혀야 하는 경우가 많다. 예를 들어 **대출 관리 시스템(accountLoan 테이블)**에서 검색할 때, 은행명(bank), 대출 금액(loanAmount), 용도(content), 담당자(crew) 등 모든 컬럼에서 검색이 가능하도록 하면 훨씬 유용하다.


2. MySQL 컬럼 목록을 자동으로 가져와서 검색하는 방법

PHP에서는 MySQL의 SHOW COLUMNS FROM 테이블명 쿼리를 사용하여 특정 테이블의 컬럼 목록을 조회할 수 있다. 이 기능을 활용하면 새로운 컬럼이 추가되더라도 자동으로 검색 대상에 포함할 수 있다.

📌 테이블의 모든 컬럼에서 검색어를 조회하는 PHP 코드

아래 코드는 특정 테이블의 모든 컬럼에서 검색을 수행하는 방법을 보여준다.

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

$order = " ORDER BY loanStartDate ASC, num ASC ";

$sql_conditions = [];
$sql_params = [];

// 테이블 컬럼 목록을 자동으로 가져오기
$columns = [];
$query = $pdo->query("SHOW COLUMNS FROM accountLoan"); // 테이블명 변경 가능
while ($row = $query->fetch(PDO::FETCH_ASSOC)) {
    $columns[] = $row['Field']; // 컬럼 이름 저장
}

// 검색어가 있을 경우 모든 컬럼에서 검색하도록 설정
if (!empty($search)) {
    $search_conditions = [];
    foreach ($columns as $column) {
        $search_conditions[] = "$column LIKE :search"; // 각 컬럼에서 검색
    }
    $sql_conditions[] = "(" . implode(" OR ", $search_conditions) . ")";
    $sql_params[':search'] = "%$search%";
}

// 날짜 필터 적용 (대출일 기준)
$sql_conditions[] = "loanStartDate BETWEEN :fromdate AND :todate";
$sql_params[':fromdate'] = $fromdate;
$sql_params[':todate'] = $todate;

// 삭제된 데이터 제외
$sql_conditions[] = "is_deleted IS NULL";

// 최종 SQL 조합
$sql = "SELECT * FROM accountLoan WHERE " . implode(" AND ", $sql_conditions) . $order;

// SQL 실행
$stmh = $pdo->prepare($sql);
$stmh->execute($sql_params);
$result = $stmh->fetchAll(PDO::FETCH_ASSOC);

 

3. 코드 상세 설명

🔹 1) SHOW COLUMNS FROM 테이블명을 활용하여 컬럼 목록 자동 조회

$query = $pdo->query("SHOW COLUMNS FROM accountLoan"); 
while ($row = $query->fetch(PDO::FETCH_ASSOC)) {
    $columns[] = $row['Field']; 
}
  • SHOW COLUMNS FROM 테이블명을 실행하면, 테이블의 모든 컬럼 정보를 가져올 수 있다.
  • while 문을 사용하여 컬럼 이름을 $columns 배열에 저장한다.

💡 이 방식의 장점?
새로운 컬럼이 추가되더라도 SQL문을 변경할 필요 없음.
자동으로 모든 컬럼을 검색 대상으로 포함함.

🔹 2) 검색어가 있을 경우 모든 컬럼에서 검색 적용

if (!empty($search)) {
    $search_conditions = [];
    foreach ($columns as $column) {
        $search_conditions[] = "$column LIKE :search";
    }
    $sql_conditions[] = "(" . implode(" OR ", $search_conditions) . ")";
    $sql_params[':search'] = "%$search%";
}
  • $search 값이 있으면 모든 컬럼에서 LIKE '%검색어%' 조건을 추가.
  • implode(" OR ", $search_conditions)을 사용하여 여러 개의 컬럼을 OR 조건으로 검색.
  • :search 바인딩을 사용하여 SQL 인젝션 방지.

🔹 3) 날짜 필터 적용 (loanStartDate)

$sql_conditions[] = "loanStartDate BETWEEN :fromdate AND :todate";
$sql_params[':fromdate'] = $fromdate;
$sql_params[':todate'] = $todate;
  • BETWEEN을 사용하여 loanStartDate(대출일)를 기준으로 검색 기간을 설정.

🔹 4) 삭제된 데이터 제외

$sql_conditions[] = "is_deleted IS NULL";
  • is_deleted가 NULL인 데이터만 조회하여 삭제된 데이터는 검색에서 제외.

4. 실제 실행 결과 예시

🔹 검색어: "기업"을 입력했을 경우

SELECT * FROM accountLoan 
WHERE (bank LIKE '%기업%' OR loanAmount LIKE '%기업%' OR content LIKE '%기업%' OR crew LIKE '%기업%' ...) 
AND loanStartDate BETWEEN '2024-01-01' AND '2024-12-31' 
AND is_deleted IS NULL 
ORDER BY loanStartDate ASC, num ASC;

🔍 은행명, 차입금, 용도, 담당자 등 모든 컬럼에서 "기업"이라는 키워드를 포함하는 데이터를 검색


5. 최적화된 PHP 검색 기능 적용하기

이제 데이터베이스에서 검색할 때 특정 컬럼을 지정하는 것이 아니라 자동으로 모든 컬럼에서 검색할 수 있도록 최적화된 방법을 알게 되었다.

이 방식은 새로운 컬럼이 추가되더라도 자동으로 검색 대상에 포함되며, 코드 유지보수가 훨씬 간편해진다. MySQL과 PHP를 활용한 검색 기능을 구현할 때 적극적으로 활용해보자.

이제 데이터 검색 기능을 만들 때 불필요한 코드 수정 없이 더 유연하고 강력한 검색 시스템을 구축할 수 있을 것이다. 🚀

반응형
댓글