PHP

PHP에서 PDO 사용하기

thebasics 2024. 9. 23. 10:00

목차
1. PDO란 무엇인가?
   - PDO의 개요
   - PDO의 장점
2. PDO 설치 및 설정
   - PDO 설치 방법
   - PDO 설정 확인
3. 데이터베이스 연결 및 쿼리 실행
   - 데이터베이스 연결
   - 쿼리 실행 및 결과 처리
4. Prepared Statements를 사용한 안전한 데이터베이스 쿼리
   - Prepared Statements의 개념
   - Prepared Statements 사용법
5. 코드 예제
6. 결론 및 추가 학습 자료


1. PDO란 무엇인가?

PDO의 개요

PDO(Php Data Objects)는 PHP에서 제공하는 데이터베이스 추상화 레이어로, 다양한 데이터베이스에 일관된 방식으로 접근할 수 있게 해주는 인터페이스입니다. PDO는 여러 종류의 데이터베이스 드라이버를 지원하며, 데이터베이스 간의 호환성을 높이고, 보안성을 강화하기 위한 기능을 제공합니다.

PDO의 장점

- 다중 데이터베이스 지원: MySQL, PostgreSQL, SQLite, SQL Server 등 다양한 데이터베이스를 지원합니다.
- Prepared Statements 지원: SQL 인젝션 공격을 방지하기 위해 Prepared Statements를 사용할 수 있습니다.
- 일관된 API: 하나의 API로 다양한 데이터베이스를 사용할 수 있어, 코드의 재사용성이 높아집니다.
- 에러 처리: 예외(Exception)를 통해 더 나은 에러 처리가 가능합니다.


2. PDO 설치 및 설정

PDO 설치 방법

대부분의 PHP 배포판에는 기본적으로 PDO와 주요 데이터베이스 드라이버가 포함되어 있습니다. 그러나 PDO가 설치되지 않은 경우, 다음과 같은 방법으로 설치할 수 있습니다.

리눅스 (Ubuntu)에서 PDO 설치:

sudo apt-get install php-pdo

윈도우에서 PDO 활성화:

'php.ini' 파일에서 다음 줄을 주석 해제하여 PDO와 관련된 확장을 활성화합니다:

extension=pdo_mysql
extension=pdo_pgsql
extension=pdo_sqlite

PDO 설정 확인

PDO가 제대로 설치되었는지 확인하려면 PHP에서 'phpinfo()' 함수를 사용하여 PDO 관련 설정이 표시되는지 확인할 수 있습니다:

<?php
phpinfo();
?>

이 페이지에서 'PDO' 섹션을 찾아 설치된 드라이버를 확인할 수 있습니다.


3. 데이터베이스 연결 및 쿼리 실행

데이터베이스 연결

PDO를 사용하여 데이터베이스에 연결하려면 'PDO' 클래스의 인스턴스를 생성하고, 데이터베이스 연결 문자열(DSN), 사용자명, 비밀번호를 전달합니다.

<?php
try {
    $dsn = 'mysql:host=localhost;dbname=testdb;charset=utf8mb4';
    $username = 'root';
    $password = 'password';
    
    $pdo = new PDO($dsn, $username, $password);
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    echo "Database connection established successfully.";
} catch (PDOException $e) {
    echo "Database connection failed: " . $e->getMessage();
}
?>

이 예제에서는 MySQL 데이터베이스에 연결하며, 연결이 성공하면 메시지를 출력합니다. 'PDO::ATTR_ERRMODE' 속성을 'PDO::ERRMODE_EXCEPTION'으로 설정하여 에러 발생 시 예외가 던져지도록 합니다.

쿼리 실행 및 결과 처리

데이터베이스에 연결한 후, SQL 쿼리를 실행하고 결과를 처리할 수 있습니다. PDO를 사용하면 'query()' 메서드로 간단히 쿼리를 실행할 수 있습니다.

<?php
$query = $pdo->query("SELECT * FROM users");
$users = $query->fetchAll(PDO::FETCH_ASSOC);

foreach ($users as $user) {
    echo $user['name'] . "<br>";
}
?>

이 예제에서는 'users' 테이블의 모든 데이터를 가져와 각 사용자의 이름을 출력합니다. 'fetchAll(PDO::FETCH_ASSOC)' 메서드는 결과를 연관 배열로 반환합니다.


4. Prepared Statements를 사용한 안전한 데이터베이스 쿼리

Prepared Statements의 개념

Prepared Statements는 SQL 인젝션 공격을 방지하기 위해 사용되는 기법으로, SQL 쿼리와 데이터를 분리하여 쿼리를 실행합니다. 이를 통해 입력 데이터가 SQL 쿼리에 삽입되기 전에 안전하게 처리되며, 데이터베이스의 보안성이 강화됩니다.

Prepared Statements 사용법

Prepared Statements를 사용하려면 'prepare()' 메서드를 통해 SQL 쿼리를 준비하고, 'bindParam()' 또는 'execute()' 메서드를 사용하여 데이터를 바인딩한 후 쿼리를 실행합니다.

예제:

<?php
$sql = "SELECT * FROM users WHERE email = :email";
$stmt = $pdo->prepare($sql);
$stmt->bindParam(':email', $email);
$email = 'test@example.com';
$stmt->execute();

$user = $stmt->fetch(PDO::FETCH_ASSOC);
echo $user['name'];
?>

이 코드에서는 ':email' 플레이스홀더에 사용자의 이메일을 바인딩하여 SQL 쿼리를 실행합니다. 이는 SQL 인젝션 공격을 방지하는 데 매우 효과적입니다.

또한, 'execute()' 메서드에 데이터를 직접 전달하여 Prepared Statements를 사용할 수도 있습니다:

<?php
$sql = "INSERT INTO users (name, email, password) VALUES (:name, :email, :password)";
$stmt = $pdo->prepare($sql);
$stmt->execute([
    ':name' => 'John Doe',
    ':email' => 'john@example.com',
    ':password' => password_hash('secret', PASSWORD_DEFAULT)
]);

echo "New user inserted successfully.";
?>

이 예제에서는 사용자 데이터를 삽입하며, 입력 데이터를 안전하게 처리하여 데이터베이스에 저장합니다.


5. 코드 예제

다음은 PDO를 사용하여 데이터베이스에 연결하고, 안전하게 쿼리를 실행하는 종합적인 예제입니다.

1. 데이터베이스 연결 및 데이터 조회:

<?php
try {
    $dsn = 'mysql:host=localhost;dbname=testdb;charset=utf8mb4';
    $username = 'root';
    $password = 'password';
    
    $pdo = new PDO($dsn, $username, $password);
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

    $query = $pdo->query("SELECT * FROM users");
    $users = $query->fetchAll(PDO::FETCH_ASSOC);

    foreach ($users as $user) {
        echo $user['name'] . "<br>";
    }
} catch (PDOException $e) {
    echo "Database connection failed: " . $e->getMessage();
}
?>

2. Prepared Statements를 사용한 안전한 데이터 조회:

<?php
$sql = "SELECT * FROM users WHERE email = :email";
$stmt = $pdo->prepare($sql);
$email = 'test@example.com';
$stmt->execute([':email' => $email]);

$user = $stmt->fetch(PDO::FETCH_ASSOC);
echo $user['name'];
?>

3. Prepared Statements를 사용한 데이터 삽입:

<?php
$sql = "INSERT INTO users (name, email, password) VALUES (:name, :email, :password)";
$stmt = $pdo->prepare($sql);
$stmt->execute([
    ':name' => 'Jane Doe',
    ':email' => 'jane@example.com',
    ':password' => password_hash('secret', PASSWORD_DEFAULT)
]);

echo "New user inserted successfully.";
?>

코드 분석:
- 첫 번째 예제는 PDO를 사용하여 데이터베이스에 연결하고, 'users' 테이블의 데이터를 조회하여 출력합니다.
- 두 번째 예제는 Prepared Statements를 사용하여 SQL 인젝션 공격을 방지하면서 안전하게 데이터를 조회합니다.
- 세 번째 예제는 Prepared Statements를 사용하여 사용자 데이터를 안전하게 삽입하는 방법을 보여줍니다.


6. 결론 및 추가 학습 자료

이번 글에서는 PHP에서 PDO를 사용하여 데이터베이스와 상호작용하는 방법에 대해 알아보았습니다. PDO는 다양한 데이터베이스를 지원하며, 일관된 API를 제공하여 데이터베이스 작업을 간편하게 처리할 수 있습니다. 또한, Prepared Statements를 사용하여 SQL 인젝션 공격을 방지하고, 데이터베이스의 보안성을 높일 수 있습니다.

추가 학습 자료:
- [PDO 공식 문서](https://www.php.net/manual/en/book.pdo.php) PDO의 사용법과 옵션에 대한 공식 문서입니다.
- [SQL 인젝션 방지 가이드](https://owasp.org/www-community/attacks/SQL_Injection) OWASP에서 제공하는 SQL 인젝션 공격 방지 가이드입니다.
- [PHP Prepared Statements 예제](https://www.w3schools.com/php/php_mysql_prepared_statements.asp) Prepared Statements의 사용 예제를 다룬 튜토리얼입니다.


이제 PDO를 사용하여 데이터베이스와 안전하고 효율적으로 상호작용할 수 있습니다. 실습을 통해 다양한 데이터베이스 작업을 경험하고, 실제 프로젝트에 적용해보세요!

반응형