코딩 스쿨 PHP

언어선택 : HTMLCSSJAVAJAVASCRIPTMYSQLSQL PHP

PHP MySQL Order By

PHP MySQL Order By : 데이터 정렬하기


MySQL의 ORDER BY 절은 데이터를 정렬하여 조회할 때 사용됩니다. PHP와 함께 사용하면 데이터베이스에서 가져온 데이터를 오름차순(ASC) 또는 **내림차순(DESC)**으로 정렬할 수 있습니다. 데이터 정렬은 사용자에게 데이터의 가독성을 높이거나 원하는 우선순위로 데이터를 제공하는 데 유용합니다.

이 가이드에서는 PHP와 MySQL을 사용해 ORDER BY 절을 적용하여 데이터를 정렬하는 방법, MySQLiPDO를 사용한 예제, 그리고 실용적인 정렬 방식에 대해 설명합니다.


1. ORDER BY 절의 기본 개념

ORDER BY 절은 SQL 쿼리에서 데이터를 특정 **열(column)**을 기준으로 오름차순 또는 내림차순으로 정렬합니다.

ORDER BY 절의 기본 구문:

SELECT column1, column2 FROM table_name ORDER BY column_name ASC|DESC;

  • ORDER BY: 데이터를 정렬할 기준 열을 지정합니다.
  • ASC: 오름차순 정렬(기본값).
  • DESC: 내림차순 정렬.

예시: users 테이블에서 username을 기준으로 오름차순 정렬

SELECT id, username, email FROM users ORDER BY username ASC;


2. MySQLi를 사용한 ORDER BY

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

<?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 쿼리
$sql = "SELECT id, username, email FROM users ORDER BY username ASC";
$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();
?>

설명:

  • ORDER BY username ASC: username 열을 기준으로 데이터를 오름차순으로 정렬합니다.
  • $result->fetch_assoc(): 정렬된 데이터를 연관 배열로 가져옵니다.

2.2 MySQLi 절차적 방식으로 ORDER BY 사용

<?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 쿼리
$sql = "SELECT id, username, email FROM users ORDER BY username DESC";
$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);
?>

설명:

  • ORDER BY username DESC: username을 기준으로 데이터를 내림차순으로 정렬합니다.
  • mysqli_fetch_assoc(): 절차적 방식에서 정렬된 데이터를 연관 배열로 가져와 출력합니다.

3. PDO를 사용한 ORDER BY

PDO를 사용하면 정렬된 데이터를 유연하게 조회할 수 있습니다. Named Parameters 또는 Positional Parameters를 사용하여 동적으로 정렬 기준을 설정할 수 있습니다.

3.1 PDO로 ORDER BY 사용

<?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 쿼리
    $sql = "SELECT id, username, email FROM users ORDER BY username ASC";
    $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();
}
?>

설명:

  • $pdo->query(): SQL 쿼리를 실행하여 데이터를 조회하고 정렬합니다.
  • $stmt->fetch(PDO::FETCH_ASSOC): 정렬된 데이터를 연관 배열로 가져와 출력합니다.

4. 동적으로 ORDER BY 정렬 설정

사용자로부터 정렬 기준을 입력받아 동적으로 ORDER BY 절을 설정할 수 있습니다. 다만, 이때는 SQL 인젝션을 방지하기 위해 반드시 유효성 검사를 해야 합니다.

4.1 동적으로 정렬 기준을 설정하는 예시

MySQLi 객체 지향 방식:

<?php
// 사용자 입력 값
$order_by = $_GET['order_by']; // 사용자로부터 정렬 기준을 입력받음
$order = $_GET['order'];       // 'ASC' 또는 'DESC' 값 입력

// 허용된 정렬 기준 확인 (SQL 인젝션 방지)
$allowed_columns = ['username', 'email'];
$allowed_order = ['ASC', 'DESC'];

if (!in_array($order_by, $allowed_columns) || !in_array($order, $allowed_order)) {
    die("Invalid sorting parameters");
}

// 데이터 조회 및 정렬 SQL 쿼리
$sql = "SELECT id, username, email FROM users ORDER BY $order_by $order";
$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();
?>

PDO 방식:

<?php
try {
    // 사용자 입력 값
    $order_by = $_GET['order_by']; // 사용자로부터 정렬 기준을 입력받음
    $order = $_GET['order'];       // 'ASC' 또는 'DESC' 값 입력

    // 허용된 정렬 기준 확인 (SQL 인젝션 방지)
    $allowed_columns = ['username', 'email'];
    $allowed_order = ['ASC', 'DESC'];

    if (!in_array($order_by, $allowed_columns) || !in_array($order, $allowed_order)) {
        die("Invalid sorting parameters");
    }

    // 데이터 조회 및 정렬 SQL 쿼리
    $sql = "SELECT id, username, email FROM users ORDER BY $order_by $order";
    $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();
}
?>

설명:

  • 사용자 입력 값을 기준으로 동적으로 정렬 기준을 설정할 수 있습니다.
  • SQL 인젝션 방지를 위해, 허용된 열 이름과 정렬 순서를 미리 정의하고 검사해야 합니다.

5. 다중 열 정렬

ORDER BY 절에서는 여러 열을 기준으로 정렬할 수 있습니다. 우선순위에 따라 여러 기준을 적용하여 데이터를 정렬할 때 유용합니다.

예시: username을 기준으로 오름차순 정렬하고, email을 기준으로 내림차순 정렬

SELECT id, username, email FROM users ORDER BY username ASC, email DESC;

MySQLi 객체 지향 방식:

<?php
// 데이터 조회 및 다중 열 정렬 SQL 쿼리
$sql = "SELECT id

, username, email FROM users ORDER BY username ASC, email DESC";
$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();
?>

PDO 방식:

<?php
// 데이터 조회 및 다중 열 정렬 SQL 쿼리
$sql = "SELECT id, username, email FROM users ORDER BY username ASC, email DESC";
$stmt = $pdo->query($sql);

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

설명:

  • ORDER BY username ASC, email DESC: 여러 열을 기준으로 데이터를 정렬할 수 있습니다. 먼저 username을 기준으로 오름차순 정렬한 뒤, 그 다음으로 email을 내림차순 정렬합니다.

6. 보안 고려 사항

6.1 SQL 인젝션 방지

동적 정렬 기준을 사용하여 데이터를 정렬할 때, SQL 인젝션의 위험이 있습니다. 이를 방지하기 위해, 사용자 입력값을 검증하고 허용된 열 이름과 정렬 순서만 사용해야 합니다.

$allowed_columns = ['username', 'email'];
$allowed_order = ['ASC', 'DESC'];

if (!in_array($order_by, $allowed_columns) || !in_array($order, $allowed_order)) {
    die("Invalid sorting parameters");
}

6.2 데이터 유효성 검사

정렬 기준과 정렬 순서는 사용자로부터 입력받을 때, 미리 정의된 값만 허용하는 것이 중요합니다. 이를 통해 보안 취약점을 줄일 수 있습니다.


요약

PHP와 MySQL을 사용하여 ORDER BY 절을 통해 데이터를 정렬하면, 오름차순(ASC) 또는 **내림차순(DESC)**으로 원하는 대로 데이터를 정렬할 수 있습니다. MySQLiPDO를 사용하여 다양한 방식으로 정렬된 데이터를 조회할 수 있으며, 다중 열 정렬을 통해 여러 기준으로 데이터를 정렬할 수도 있습니다. 사용자 입력을 받아 동적으로 정렬할 때는 반드시 SQL 인젝션을 방지하기 위한 유효성 검사를 수행해야 합니다.


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