MYSQL

MySQL Prepared Statement

0hee 2024. 6. 25. 12:03

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를 통해 데이터베이스 작업을 보다 안전하고 효율적으로 수행할 수 있으며, 이는 현대 웹 개발에서 매우 중요한 요소입니다.