MySQL Prepared Statements는 SQL 쿼리를 미리 준비하고 실행하는 메커니즘으로, 보안과 성능 측면에서 여러 가지 이점을 제공합니다. PHP에서 `mysqli` 또는 `PDO_MySQL` 확장을 통해 사용할 수 있습니다. 주요 특징과 이점을 설명하자면 다음과 같습니다:
### 주요 특징
1. **쿼리 준비와 실행의 분리**:
- SQL 쿼리를 한 번 준비하고 여러 번 실행할 수 있습니다. 이는 쿼리의 구조를 고정하고 값만 변경하는 방식입니다.
- 예:
```php
$stmt = $mysqli->prepare("SELECT * FROM users WHERE username = ?");
$stmt->bind_param("s", $username);
$stmt->execute();
```
2. **매개변수 바인딩**:
- 쿼리에 입력되는 값은 매개변수로 처리됩니다. 이는 SQL 인젝션 공격을 방지하는 데 매우 유용합니다.
- 매개변수의 데이터 타입을 지정하여 (`s`는 string, `i`는 integer, `d`는 double, `b`는 blob) 보안성을 높입니다.
3. **다양한 데이터 타입 지원**:
- Prepared Statements는 다양한 데이터 타입을 안전하게 처리할 수 있습니다. 예를 들어, 문자열, 정수, 부동 소수점 등을 다룰 수 있습니다.
### 사용 예제
#### 1. `mysqli`를 이용한 Prepared Statements
```php
$mysqli = new mysqli("localhost", "username", "password", "database");
if ($mysqli->connect_error) {
die("Connection failed: " . $mysqli->connect_error);
}
// 쿼리 준비
$stmt = $mysqli->prepare("INSERT INTO users (username, email) VALUES (?, ?)");
$stmt->bind_param("ss", $username, $email); // 매개변수 바인딩
// 값 설정
$username = "johndoe";
$email = "johndoe@example.com";
// 쿼리 실행
$stmt->execute();
echo "New record created successfully";
$stmt->close();
$mysqli->close();
```
#### 2. `PDO_MySQL`를 이용한 Prepared Statements
```php
try {
$pdo = new PDO("mysql:host=localhost;dbname=database", "username", "password");
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
// 쿼리 준비
$stmt = $pdo->prepare("INSERT INTO users (username, email) VALUES (:username, :email)");
// 값 설정 및 바인딩
$stmt->bindParam(':username', $username);
$stmt->bindParam(':email', $email);
$username = "johndoe";
$email = "johndoe@example.com";
// 쿼리 실행
$stmt->execute();
echo "New record created successfully";
} catch (PDOException $e) {
echo "Error: " . $e->getMessage();
}
$pdo = null;
```
### 이점
1. **보안성**: SQL 인젝션 공격을 효과적으로 방지할 수 있습니다. 모든 입력 값이 자동으로 이스케이프 처리됩니다.
2. **성능 향상**: 동일한 쿼리를 반복적으로 실행할 때 성능이 향상됩니다. 데이터베이스 서버는 쿼리 구문을 한 번만 파싱하고 여러 번 실행할 수 있습니다.
3. **가독성**: 코드의 가독성이 향상되며, 매개변수와 쿼리 구조가 명확하게 분리됩니다.
Prepared Statements를 통해 데이터베이스 작업을 보다 안전하고 효율적으로 수행할 수 있으며, 이는 현대 웹 개발에서 매우 중요한 요소입니다.