PHP MySQL Delete Data
PHP MySQL Delete Data : 데이터 삭제하기
PHP와 MySQL을 사용하여 데이터베이스에서 데이터를 삭제할 때는 DELETE SQL 구문을 사용합니다. DELETE 구문은 특정 조건에 맞는 데이터를 삭제하거나, 조건이 없을 경우 모든 데이터를 삭제할 수 있습니다. 하지만 데이터베이스에서 데이터를 삭제할 때는 주의가 필요하며, 특히 WHERE 절을 적절히 사용하여 특정 데이터만 삭제해야 합니다.
이 가이드에서는 PHP를 사용해 MySQL에서 데이터를 삭제하는 방법, MySQLi와 PDO를 활용한 삭제 예제, 그리고 보안적인 고려 사항을 설명합니다.
1. MySQL에서 데이터 삭제(SQL 구문)
MySQL에서 데이터를 삭제하기 위한 DELETE 구문은 다음과 같습니다:
DELETE FROM table_name WHERE condition;
table_name
: 데이터를 삭제할 테이블의 이름입니다.condition
: 특정 조건을 만족하는 데이터를 삭제하는 데 사용됩니다. 예를 들어,WHERE id = 1
은 id가 1인 데이터를 삭제합니다.
예시: users 테이블에서 id가 1인 사용자 삭제
DELETE FROM users 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 = "DELETE FROM users WHERE id = ?";
$stmt = $conn->prepare($sql);
$stmt->bind_param("i", $id);
// 삭제할 사용자 ID
$id = 1;
// 쿼리 실행
if ($stmt->execute()) {
echo "Record deleted successfully";
} else {
echo "Error deleting record: " . $stmt->error;
}
// 연결 종료
$stmt->close();
$conn->close();
?>
설명:
$stmt->bind_param("i", $id)
: id 값이 정수(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 = "DELETE FROM users WHERE id = ?";
$stmt = mysqli_prepare($conn, $sql);
mysqli_stmt_bind_param($stmt, "i", $id);
// 삭제할 사용자 ID
$id = 2;
// 쿼리 실행
if (mysqli_stmt_execute($stmt)) {
echo "Record deleted successfully";
} else {
echo "Error deleting record: " . mysqli_stmt_error($stmt);
}
// 연결 종료
mysqli_stmt_close($stmt);
mysqli_close($conn);
?>
설명:
mysqli_prepare()
: 절차적 방식에서 준비된 SQL 쿼리를 실행합니다.mysqli_stmt_bind_param()
: SQL 쿼리에 조건을 안전하게 바인딩하여, SQL 인젝션을 방지합니다.
3. PDO를 사용한 데이터 삭제
PDO는 파라미터화된 쿼리를 사용하여 안전하게 데이터를 삭제할 수 있습니다.
<?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 = "DELETE FROM users WHERE id = :id";
$stmt = $pdo->prepare($sql);
// 삭제할 사용자 ID
$id = 3;
// 파라미터 바인딩 및 쿼리 실행
$stmt->execute(['id' => $id]);
echo "Record deleted successfully";
} catch (PDOException $e) {
echo "Error deleting record: " . $e->getMessage();
}
?>
설명:
:id
: Named Parameters를 사용하여 안전하게 조건을 설정하고 데이터를 삭제합니다.$stmt->execute()
: 바인딩된 값을 사용해 쿼리를 실행합니다.
4. 모든 데이터 삭제 (주의사항)
WHERE 절 없이 DELETE 구문을 실행하면, 테이블의 모든 데이터가 삭제될 수 있습니다. 이를 방지하기 위해 WHERE 절을 항상 사용하는 것이 좋습니다.
예시: 테이블의 모든 데이터 삭제
DELETE FROM users;
이 쿼리는 users 테이블의 모든 레코드를 삭제합니다.
- 경고: WHERE 절이 없으면 테이블의 모든 데이터가 삭제되므로, 꼭 필요한 경우에만 사용해야 합니다.
5. 삭제된 데이터 복구
MySQL에서 DELETE 구문을 사용하면 데이터가 물리적으로 삭제되기 때문에 복구가 어렵습니다. 중요한 데이터를 삭제할 경우, 백업 또는 논리적 삭제를 고려해야 합니다.
5.1 논리적 삭제 (Soft Delete)
논리적 삭제는 데이터를 실제로 삭제하지 않고, 삭제된 것처럼 처리하는 방식입니다. 일반적으로 deleted_at 같은 열을 추가하여, 데이터가 삭제된 시점을 기록하는 방식으로 처리합니다.
UPDATE users SET deleted_at = NOW() WHERE id = 1;
이 방식은 데이터 복구가 가능하다는 장점이 있으며, 데이터를 물리적으로 제거하지 않기 때문에 데이터 무결성을 유지할 수 있습니다.
6. 보안 고려 사항
6.1 SQL 인젝션 방지
DELETE 구문에서도 사용자 입력에 따라 삭제 조건이 결정될 경우, SQL 인젝션의 위험이 있습니다. 이를 방지하기 위해 반드시 **파라미터화된 쿼리(Prepared Statements)**를 사용해야 합니다.
MySQLi에서 SQL 인젝션 방지:
$stmt = $conn->prepare("DELETE FROM users WHERE id = ?");
$stmt->bind_param("i", $id);
PDO에서 SQL 인젝션 방지:
$stmt = $pdo->prepare("DELETE FROM users WHERE id = :id");
$stmt->execute(['id' => $id]);
6.2 데이터 확인 및 유효성 검사
데이터를 삭제하기 전에, 삭제하려는 데이터가 올바른지 확인하는 것이 중요합니다. 삭제할 대상이 잘못 설정되면, 원치 않는 데이터 손실이 발생할 수 있습니다.
예를 들어, ID 값이 정수인지 확인하거나, 삭제할 데이터가 존재하는지 먼저 확인하는 과정이 필요합니다.
if (filter_var($id, FILTER_VALIDATE_INT)) {
// 유효한 ID일 경우 쿼리 실행
}
요약
PHP와 MySQL을 사용하여 데이터를 삭제할 때는, DELETE 구문과 WHERE 절을 사용해 특정 조건을 만족하는 데이터를 안전하게 삭제할 수 있습니다. MySQLi와 PDO 모두 파라미터화된 쿼리를 사용하여 SQL 인젝션을 방지할 수 있으며, 데이터를 삭제하기 전에 항상 유효성 검사와 데이터 확인을 거치는 것이 중요합니다. 또한 **논리적 삭제(Soft Delete)**를 사용하면, 데이터 복구가 필요할 때 유용하게 사용할 수 있습니다.