코딩 스쿨 PHP

언어선택 : HTMLCSSJAVAJAVASCRIPTMYSQLSQL PHP

PHP MySQL Where

PHP MySQL Where : 조건에 따른 데이터 조회 및 수정


PHP에서 MySQL 데이터베이스와 상호작용할 때, WHERE 절은 특정 조건에 맞는 데이터를 조회, 수정 또는 삭제할 때 사용됩니다. WHERE 절을 사용하면 데이터베이스에서 조건에 맞는 특정 레코드만 처리할 수 있습니다. 이를 통해 데이터를 효율적으로 필터링하거나, 필요한 레코드만 변경할 수 있습니다.

이 가이드에서는 PHP와 MySQL에서 WHERE 절을 사용하여 데이터 조회 및 수정하는 방법을 설명하며, MySQLiPDO를 활용한 다양한 예제를 제공합니다.


1. WHERE 절의 기본 개념

WHERE 절은 SQL 쿼리에서 특정 조건을 설정하여 해당 조건을 만족하는 **행(row)**만을 조회, 업데이트 또는 삭제하는 데 사용됩니다.

WHERE 절을 사용하는 기본적인 SQL 구문:

SELECT column1, column2 FROM table_name WHERE condition;

  • condition: 데이터를 필터링하는 조건입니다. 예를 들어, WHERE id = 1id가 1인 레코드만 조회합니다.

2. MySQLi를 사용한 WHERE 절

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

SELECT 구문에 WHERE 절을 사용하여 특정 조건에 맞는 데이터를 조회할 수 있습니다.

<?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 WHERE username = ?";
$stmt = $conn->prepare($sql);
$stmt->bind_param("s", $username);

// 사용자 입력 값
$username = "JohnDoe";

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

// 결과 출력
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";
}

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

설명:

  • $stmt->bind_param("s", $username): username파라미터 바인딩하여, SQL 인젝션 공격을 방지합니다.
  • $stmt->get_result(): 쿼리의 결과를 가져와서 출력합니다.

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

<?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 WHERE username = ?";
$stmt = mysqli_prepare($conn, $sql);
mysqli_stmt_bind_param($stmt, "s", $username);

// 사용자 입력 값
$username = "JaneDoe";

// 쿼리 실행
mysqli_stmt_execute($stmt);
$result = mysqli_stmt_get_result($stmt);

// 결과 출력
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_stmt_close($stmt);
mysqli_close($conn);
?>

설명:

  • *mysqli_prepare()*와 **mysqli_stmt_bind_param()*을 사용하여 SQL 인젝션을 방지합니다.
  • username 필드에서 조건에 맞는 데이터만 조회하고 그 결과를 출력합니다.

3. PDO를 사용한 WHERE 절

PDO는 파라미터화된 쿼리를 통해 안전하게 데이터를 처리할 수 있습니다. 조건에 따라 데이터를 필터링하여 조회하거나 수정할 때 매우 유용합니다.

3.1 PDO로 WHERE 절을 사용하여 데이터 조회

<?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 WHERE username = :username";
    $stmt = $pdo->prepare($sql);

    // 사용자 입력 값
    $username = "JohnDoe";

    // 파라미터 바인딩 및 쿼리 실행
    $stmt->execute(['username' => $username]);

    // 결과 출력
    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();
}
?>

설명:

  • :username: Named Parameters를 사용하여, 특정 조건에 맞는 데이터를 안전하게 조회합니다.
  • $stmt->execute(): 배열을 통해 조건을 전달하고, 조회 결과를 출력합니다.

4. WHERE 절을 사용한 데이터 업데이트

UPDATE 구문에 WHERE 절을 추가하여 특정 조건에 맞는 데이터를 수정할 수 있습니다.

4.1 MySQLi 객체 지향 방식으로 데이터 업데이트

<?php
// 데이터 업데이트 SQL 쿼리
$sql = "UPDATE users SET email = ? WHERE username = ?";
$stmt = $conn->prepare($sql);
$stmt->bind_param("ss", $new_email, $username);

// 사용자 입력 값
$new_email = "newemail@example.com";
$username = "JohnDoe";

// 쿼리 실행
if ($stmt->execute()) {
    echo "Record updated successfully";
} else {
    echo "Error updating record: " . $stmt->error;
}

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

설명:

  • $stmt->bind_param(): 파라미터 바인딩을 통해 이메일을 업데이트할 사용자 조건을 설정합니다.
  • 업데이트가 성공적으로 수행되면 성공 메시지를 출력합니다.

4.2 PDO로 데이터 업데이트

<?php
try {
    // 데이터 업데이트 SQL 쿼리
    $sql = "UPDATE users SET email = :email WHERE username = :username";
    $stmt = $pdo->prepare($sql);

    // 사용자 입력 값
    $new_email = "newemail@example.com";
    $username = "JohnDoe";

    // 파라미터 바인딩 및 쿼리 실행
    $stmt->execute(['email' => $new_email, 'username' => $username]);

    echo "Record updated successfully";
} catch (PDOException $e) {
    echo "Error updating record: " . $e->getMessage();
}
?>

설명:

  • :email, :username: 파라미터 바인딩을 사용하여 특정 사용자의 이메일을 업데이트합니다.
  • *$stmt->execute()*를 통해 쿼리를 실행하여 데이터를 수정합니다.

5. WHERE 절을 사용한 데이터 삭제

DELETE 구문에 WHERE 절을 추가하여 조건에 맞는 데이터를 삭제할 수 있습니다.

5.1 MySQLi 객체 지향 방식으로 데이터 삭제

<?php
// 데이터 삭제 SQL 쿼리
$sql = "DELETE FROM users WHERE username = ?";
$stmt = $conn->prepare($sql);
$stmt->bind_param("s", $username);

// 사용자 입력 값
$username = "JohnDoe";

// 쿼리 실행
if ($stmt->execute()) {
    echo "Record deleted successfully";
} else {
    echo "Error deleting record: " . $stmt->error;
}

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

5.2 PDO로 데이터 삭제

<?php
try {
    // 데이터 삭제 SQL 쿼리
    $sql = "DELETE FROM users WHERE username = :username";
    $stmt = $pdo->prepare($sql);

    // 사용자 입력 값
    $username = "JohnDoe";

    // 파라미터 바인딩 및 쿼리 실행
    $stmt->execute(['username' => $username]);

    echo "Record deleted successfully";
} catch (PDO

Exception $e) {
    echo "Error deleting record: " . $e->getMessage();
}
?>

설명:

  • DELETE 구문을 통해 특정 사용자를 삭제합니다.
  • WHERE 절을 사용하지 않으면 테이블 전체 데이터가 삭제될 수 있으므로 주의해야 합니다.

6. 보안 고려 사항

6.1 SQL 인젝션 방지

사용자 입력을 기반으로 쿼리를 실행할 때는 SQL 인젝션의 위험이 있습니다. 이를 방지하기 위해 **파라미터화된 쿼리(Prepared Statements)**를 사용하여 쿼리와 데이터를 분리해야 합니다.

MySQLi에서 SQL 인젝션 방지:

$stmt = $conn->prepare("SELECT id, username, email FROM users WHERE username = ?");
$stmt->bind_param("s", $username);

PDO에서 SQL 인젝션 방지:

$stmt = $pdo->prepare("SELECT id, username, email FROM users WHERE username = :username");
$stmt->execute(['username' => $username]);

6.2 데이터 유효성 검사

WHERE 절에 사용되는 데이터는 반드시 유효성 검사를 거쳐야 합니다. 이메일, 사용자 이름 등 필터링할 데이터가 올바른 형식인지 확인한 후 쿼리에 적용해야 합니다.

if (filter_var($_POST['email'], FILTER_VALIDATE_EMAIL)) {
    // 유효한 이메일일 경우 쿼리 실행
}


요약

PHP에서 MySQL과 WHERE 절을 사용하여 데이터 조회, 수정, 삭제 작업을 효율적으로 수행할 수 있습니다. MySQLiPDO를 통해 파라미터화된 쿼리를 사용하면 SQL 인젝션을 방지하고, 데이터를 안전하게 처리할 수 있습니다. WHERE 절은 특정 조건에 맞는 데이터를 필터링하고, 데이터베이스 작업을 더욱 효율적이고 안전하게 수행할 수 있는 중요한 도구입니다.


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