코딩 스쿨 PHP

언어선택 : HTMLCSSJAVAJAVASCRIPTMYSQLSQL PHP

PHP MySQL Limit Data

PHP MySQL Limit Data : 데이터 제한하여 조회하기


PHP와 MySQL에서 LIMIT 절은 조회할 데이터의 양을 제한할 때 사용됩니다. LIMIT을 사용하면 데이터베이스에서 가져올 레코드 수를 제한할 수 있으며, 이를 통해 페이징이나 부분 데이터 처리를 할 수 있습니다. 특히 많은 양의 데이터를 처리할 때는 성능을 최적화하고 불필요한 데이터 처리를 줄이기 위해 LIMIT 절이 매우 유용합니다.

이 가이드에서는 PHP를 사용해 MySQL에서 LIMIT을 활용한 데이터 조회 방법, MySQLiPDO를 사용한 LIMIT 예제, 그리고 페이징 처리에 대해 설명합니다.


1. MySQL에서 LIMIT 사용(SQL 구문)

LIMIT 절은 SQL 쿼리에서 반환할 데이터의 최대 개수를 제한합니다.

LIMIT 절의 기본 구문:

SELECT column1, column2 FROM table_name LIMIT number;

  • LIMIT number: 반환할 최대 행의 수를 지정합니다.

예시: users 테이블에서 최대 5명의 사용자를 조회

SELECT id, username, email FROM users LIMIT 5;


2. MySQLi를 사용한 LIMIT

2.1 MySQLi 객체 지향 방식으로 LIMIT 사용

<?php
// MySQL 데이터베이스 연결 정보
$host = "localhost";
$username = "root";
$password = "";
$database = "my_database";

// MySQL 데이터베이스 연결
$conn = new mysqli($host, $username, $password, $database);

// 연결 확인
if ($conn->connect_error) {
    die("Connection failed: " . $conn->connect_error);
}

// 데이터 조회 SQL 쿼리 (최대 5개의 레코드)
$sql = "SELECT id, username, email FROM users LIMIT 5";
$result = $conn->query($sql);

// 결과 출력
if ($result->num_rows > 0) {
    while ($row = $result->fetch_assoc()) {
        echo "ID: " . $row["id"] . " - Username: " . $row["username"] . " - Email: " . $row["email"] . "<br>";
    }
} else {
    echo "No results found";
}

// 연결 종료
$conn->close();
?>

설명:

  • LIMIT 5: 쿼리에서 최대 5개의 레코드만 조회합니다.
  • $result->fetch_assoc(): 조회된 데이터를 연관 배열로 가져와서 출력합니다.

2.2 MySQLi 절차적 방식으로 LIMIT 사용

<?php
// MySQL 데이터베이스 연결 정보
$host = "localhost";
$username = "root";
$password = "";
$database = "my_database";

// MySQL 데이터베이스 연결
$conn = mysqli_connect($host, $username, $password, $database);

// 연결 확인
if (!$conn) {
    die("Connection failed: " . mysqli_connect_error());
}

// 데이터 조회 SQL 쿼리 (최대 3개의 레코드)
$sql = "SELECT id, username, email FROM users LIMIT 3";
$result = mysqli_query($conn, $sql);

// 결과 출력
if (mysqli_num_rows($result) > 0) {
    while ($row = mysqli_fetch_assoc($result)) {
        echo "ID: " . $row["id"] . " - Username: " . $row["username"] . " - Email: " . $row["email"] . "<br>";
    }
} else {
    echo "No results found";
}

// 연결 종료
mysqli_close($conn);
?>

설명:

  • LIMIT 3: 쿼리에서 최대 3개의 레코드를 조회합니다.
  • mysqli_fetch_assoc(): 데이터를 연관 배열로 가져와 출력합니다.

3. PDO를 사용한 LIMIT

PDO를 사용하여 데이터를 조회할 때도 LIMIT 절을 적용할 수 있습니다.

<?php
// 데이터베이스 연결 정보
$host = "localhost";
$dbname = "my_database";
$username = "root";
$password = "";

try {
    // PDO 객체 생성 및 MySQL 서버 연결
    $pdo = new PDO("mysql:host=$host;dbname=$dbname", $username, $password);
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

    // 데이터 조회 SQL 쿼리 (최대 4개의 레코드)
    $sql = "SELECT id, username, email FROM users LIMIT 4";
    $stmt = $pdo->query($sql);

    // 결과 출력
    while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
        echo "ID: " . $row['id'] . " - Username: " . $row['username'] . " - Email: " . $row['email'] . "<br>";
    }
} catch (PDOException $e) {
    echo "Error: " . $e->getMessage();
}
?>

설명:

  • LIMIT 4: 쿼리에서 최대 4개의 레코드를 조회합니다.
  • $stmt->fetch(PDO::FETCH_ASSOC): 조회된 데이터를 연관 배열로 가져와 출력합니다.

4. LIMIT과 OFFSET을 사용한 페이징 처리

LIMIT 절과 함께 OFFSET을 사용하면 특정 페이지의 데이터만 조회할 수 있습니다. 이를 통해 **페이징(pagination)**을 구현할 수 있습니다.

  • OFFSET: 조회를 시작할 위치를 지정합니다. OFFSET 0은 첫 번째 레코드부터 시작, OFFSET 10은 11번째 레코드부터 시작합니다.

예시: 5개의 데이터씩 페이징 처리

SELECT id, username, email FROM users LIMIT 5 OFFSET 10;

  • 이 쿼리는 11번째 레코드부터 5개의 레코드를 조회합니다.

4.1 MySQLi 객체 지향 방식으로 페이징 처리

<?php
// 현재 페이지 번호
$page = isset($_GET['page']) ? (int)$_GET['page'] : 1;
$limit = 5; // 한 페이지에 표시할 레코드 수
$offset = ($page - 1) * $limit; // 시작점 계산

// 데이터 조회 SQL 쿼리
$sql = "SELECT id, username, email FROM users LIMIT ? OFFSET ?";
$stmt = $conn->prepare($sql);
$stmt->bind_param("ii", $limit, $offset);

// 쿼리 실행 및 결과 출력
$stmt->execute();
$result = $stmt->get_result();

while ($row = $result->fetch_assoc()) {
    echo "ID: " . $row["id"] . " - Username: " . $row["username"] . " - Email: " . $row["email"] . "<br>";
}

$stmt->close();
$conn->close();
?>

설명:

  • LIMIT ? OFFSET ?: Prepared Statements로 LIMIT과 OFFSET 값을 동적으로 바인딩합니다.
  • 페이지 번호에 따라 조회할 데이터가 달라집니다.

4.2 PDO로 페이징 처리

<?php
// 현재 페이지 번호
$page = isset($_GET['page']) ? (int)$_GET['page'] : 1;
$limit = 5; // 한 페이지에 표시할 레코드 수
$offset = ($page - 1) * $limit; // 시작점 계산

try {
    // 데이터 조회 SQL 쿼리
    $sql = "SELECT id, username, email FROM users LIMIT :limit OFFSET :offset";
    $stmt = $pdo->prepare($sql);
    $stmt->bindValue(':limit', $limit, PDO::PARAM_INT);
    $stmt->bindValue(':offset', $offset, PDO::PARAM_INT);

    // 쿼리 실행
    $stmt->execute();

    // 결과 출력
    while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
        echo "ID: " . $row['id'] . " - Username: " . $row['username'] . " - Email: " . $row['email'] . "<br>";
    }
} catch (PDOException $e) {
    echo "Error: " . $e->getMessage();
}
?>

설명:

  • :limit, :offset: Named Parameters로 LIMIT과 OFFSET을 바인딩합니다.
  • 현재 페이지에 따라 조회할 데이터 범위가 동적으로 바뀝니다.

5. 페이징 처리에서 페이지 번호 생성

페이징 처리 시 전체 페이지 수를 계산하고, 페이지 번호 링크를 만들어 사용자가 원하는 페이지로 이동할 수 있도록 할 수 있습니다.

5.1 MySQLi 객체 지향 방식으로 전체 페이지 수 계산

<?php
// 총 레코드 수 조회
$result = $conn->query("SELECT COUNT(*) AS total FROM users");
$row = $result->fetch_assoc();
$total_rows = $row['total'];

$total_pages = ceil($total_rows / $limit); // 총 페이지 수 계산

// 페이지 번호 출력
for ($i = 1; $i

 <= $total_pages; $i++) {
    echo "<a href='?page=$i'>$i</a> ";
}
?>

설명:

  • COUNT(*): 전체 레코드 수를 계산하여 총 페이지 수를 계산합니다.
  • 페이지 번호 링크를 출력하여 사용자가 각 페이지로 이동할 수 있게 합니다.

6. 보안 고려 사항

6.1 SQL 인젝션 방지

사용자 입력을 기반으로 LIMIT과 OFFSET 값을 사용할 경우, SQL 인젝션의 위험이 있습니다. 이를 방지하기 위해 Prepared Statements를 사용하여 값을 바인딩하는 것이 중요합니다.

MySQLi에서 Prepared Statements 사용:

$stmt = $conn->prepare("SELECT id, username, email FROM users LIMIT ? OFFSET ?");
$stmt->bind_param("ii", $limit, $offset);

PDO에서 Named Parameters 사용:

$stmt = $pdo->prepare("SELECT id, username, email FROM users LIMIT :limit OFFSET :offset");
$stmt->bindValue(':limit', $limit, PDO::PARAM_INT);
$stmt->bindValue(':offset', $offset, PDO::PARAM_INT);

6.2 페이지 번호 유효성 검사

사용자가 직접 페이지 번호를 입력할 경우, 입력된 페이지 번호가 유효한지 확인하는 것이 중요합니다. 잘못된 페이지 번호가 입력되면 올바르지 않은 쿼리가 실행될 수 있습니다.

$page = isset($_GET['page']) ? (int)$_GET['page'] : 1;
if ($page < 1) {
    $page = 1; // 최소 1 페이지 이상
}


요약

PHP와 MySQL에서 LIMIT 절을 사용하면 데이터베이스에서 조회할 데이터의 양을 제한할 수 있습니다. LIMITOFFSET을 함께 사용하여 페이징 처리를 구현할 수 있으며, MySQLi와 PDO를 사용하여 효율적인 데이터 조회가 가능합니다. Prepared Statements를 사용하여 SQL 인젝션을 방지하는 것이 중요하며, 페이지 번호 유효성 검사를 통해 보안성을 높일 수 있습니다.


copyright ⓒ 스타트코딩 all rights reserved.
이메일 : startcodingim@gamil.com