PHP MySQL Update Data
PHP MySQL Update Data : 데이터 수정하기
PHP와 MySQL을 사용하여 데이터베이스에 저장된 데이터를 **수정(Update)**할 때는 UPDATE SQL 구문을 사용합니다. 데이터베이스에서 기존 데이터를 업데이트하려면, 특정 조건에 맞는 데이터를 찾아서 값을 수정하는 것이 일반적입니다. PHP에서 MySQLi나 PDO를 사용하여 안전하게 데이터를 업데이트할 수 있으며, WHERE 절을 사용하여 특정 레코드만 변경하는 것이 중요합니다.
이 가이드에서는 PHP를 사용해 MySQL에서 데이터를 수정하는 방법, MySQLi와 PDO를 활용한 업데이트 예제, 그리고 보안적인 고려 사항을 설명합니다.
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 구문을 사용하여 특정 조건을 만족하는 데이터를 안전하게 수정할 수 있습니다. MySQLi와 PDO를 사용하여 데이터를 수정할 때는 Prepared Statements를 사용해 SQL 인젝션을 방지하는 것이 중요하며, 사용자 입력에 대한 유효성 검사도 필요합니다. 업데이트 후에는 데이터가 정확히 수정되었는지 검증하는 것이 좋습니다.