코딩 스쿨 PHP

언어선택 : HTMLCSSJAVAJAVASCRIPTMYSQLSQL PHP

PHP MySQL Update Data

PHP MySQL Update Data : 데이터 수정하기


PHP와 MySQL을 사용하여 데이터베이스에 저장된 데이터를 **수정(Update)**할 때는 UPDATE SQL 구문을 사용합니다. 데이터베이스에서 기존 데이터를 업데이트하려면, 특정 조건에 맞는 데이터를 찾아서 값을 수정하는 것이 일반적입니다. PHP에서 MySQLiPDO를 사용하여 안전하게 데이터를 업데이트할 수 있으며, WHERE 절을 사용하여 특정 레코드만 변경하는 것이 중요합니다.

이 가이드에서는 PHP를 사용해 MySQL에서 데이터를 수정하는 방법, MySQLiPDO를 활용한 업데이트 예제, 그리고 보안적인 고려 사항을 설명합니다.


1. MySQL에서 데이터 수정(SQL 구문)

MySQL에서 데이터를 수정하기 위한 기본 UPDATE 구문은 다음과 같습니다:

UPDATE table_name SET column1 = value1, column2 = value2 WHERE condition;

  • table_name: 데이터를 수정할 테이블 이름입니다.
  • SET: 수정할 열과 새로운 값을 지정합니다.
  • WHERE: 특정 조건을 만족하는 데이터를 수정하는 데 사용됩니다.

예시: users 테이블에서 id가 1인 사용자의 이메일을 수정

UPDATE users SET email = 'newemail@example.com' WHERE id = 1;


2. MySQLi를 사용한 데이터 수정

2.1 MySQLi 객체 지향 방식으로 데이터 수정

<?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 = "UPDATE users SET email = ? WHERE id = ?";
$stmt = $conn->prepare($sql);
$stmt->bind_param("si", $new_email, $id);

// 수정할 값과 조건
$new_email = "newemail@example.com";
$id = 1;

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

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

설명:

  • $stmt->bind_param("si", $new_email, $id): 이메일과 ID 값을 파라미터로 바인딩하며, 이를 통해 SQL 인젝션을 방지합니다. "s"는 문자열, "i"는 정수를 의미합니다.
  • $stmt->execute(): 바인딩된 파라미터를 사용해 쿼리를 실행하고 데이터를 수정합니다.

2.2 MySQLi 절차적 방식으로 데이터 수정

<?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 = "UPDATE users SET email = ? WHERE id = ?";
$stmt = mysqli_prepare($conn, $sql);
mysqli_stmt_bind_param($stmt, "si", $new_email, $id);

// 수정할 값과 조건
$new_email = "newemail@example.com";
$id = 2;

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

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

설명:

  • mysqli_prepare(): SQL 쿼리를 준비하고 **mysqli_stmt_bind_param()*으로 값을 바인딩하여 안전하게 쿼리를 실행합니다.
  • mysqli_stmt_execute(): 수정된 데이터를 데이터베이스에 반영합니다.

3. PDO를 사용한 데이터 수정

PDO를 사용하면 파라미터화된 쿼리를 통해 데이터를 안전하게 수정할 수 있습니다. Prepared Statements를 사용하면 SQL 인젝션을 방지할 수 있습니다.

<?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 = "UPDATE users SET email = :email WHERE id = :id";
    $stmt = $pdo->prepare($sql);

    // 수정할 값과 조건
    $new_email = "newemail@example.com";
    $id = 3;

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

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

설명:

  • *:email*과 :id: Named Parameters를 사용해 데이터를 안전하게 바인딩합니다.
  • $stmt->execute(): 파라미터 바인딩 후, 쿼리를 실행하여 데이터를 수정합니다.

4. 여러 열 수정

UPDATE 구문에서 여러 열을 동시에 수정할 수 있습니다. 예를 들어, 사용자 이름과 이메일을 동시에 업데이트하는 경우:

UPDATE users SET username = 'JaneDoe', email = 'jane@example.com' WHERE id = 1;

MySQLi 객체 지향 방식:

<?php
// 데이터 수정 SQL 쿼리
$sql = "UPDATE users SET username = ?, email = ? WHERE id = ?";
$stmt = $conn->prepare($sql);
$stmt->bind_param("ssi", $username, $email, $id);

// 수정할 값
$username = "JaneDoe";
$email = "jane@example.com";
$id = 1;

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

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

PDO 방식:

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

    // 수정할 값과 조건
    $username = "JaneDoe";
    $email = "jane@example.com";
    $id = 1;

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

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

설명:

  • 여러 열 수정: 하나의 UPDATE 쿼리에서 여러 열을 동시에 수정할 수 있으며, 각각의 값을 바인딩하여 안전하게 처리합니다.

5. 특정 조건에 따른 데이터 수정

WHERE 절을 사용하여 특정 조건에 맞는 데이터만 수정해야 합니다. WHERE 절을 사용하지 않으면, 테이블 내 모든 데이터가 수정될 수 있으므로 주의해야 합니다.

예시: 사용자 이름이 JohnDoe인 사용자의 이메일을 수정

UPDATE users SET email = 'johnnew@example.com' WHERE username = 'JohnDoe';

MySQLi 객체 지향 방식:

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

// 수정할 값과 조건
$new_email = "johnnew@example.com";
$username = "JohnDoe";

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

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


6. 보안 고려 사항

6.1 SQL 인젝션 방지

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

MySQLi에서 SQL 인젝션 방지:

$stmt = $conn->prepare("UPDATE users SET email = ? WHERE id = ?");
$stmt->bind_param("si", $new_email, $id);

PDO에서 SQL 인젝션 방지

:

$stmt = $pdo->prepare("UPDATE users SET email = :email WHERE id = :id");
$stmt->execute(['email' => $new_email, 'id' => $id]);

6.2 데이터 유효성 검사

사용자가 입력한 값이 올바른 형식인지 확인하는 것도 중요합니다. 예를 들어, 이메일을 수정할 때는 입력된 이메일이 유효한지 필터링해야 합니다.

if (filter_var($new_email, FILTER_VALIDATE_EMAIL)) {
    // 유효한 이메일일 경우 쿼리 실행
}


7. 업데이트 후 변경된 데이터 확인

업데이트가 성공적으로 수행된 후, 데이터가 정확히 수정되었는지 확인하려면 SELECT 구문을 사용하여 수정된 데이터를 다시 조회할 수 있습니다.

$sql = "SELECT id, username, email FROM users WHERE id = ?";
$stmt = $conn->prepare($sql);
$stmt->bind_param("i", $id);
$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>";
    }
}


요약

PHP와 MySQL을 사용하여 **데이터를 수정(Update)**할 때는, UPDATE 구문을 사용하여 특정 조건을 만족하는 데이터를 안전하게 수정할 수 있습니다. MySQLiPDO를 사용하여 데이터를 수정할 때는 Prepared Statements를 사용해 SQL 인젝션을 방지하는 것이 중요하며, 사용자 입력에 대한 유효성 검사도 필요합니다. 업데이트 후에는 데이터가 정확히 수정되었는지 검증하는 것이 좋습니다.


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