IT
PHP PDO (PHP Data Objects)
1. PDO 개념
-
PDO는 PHP에서 다양한 데이터베이스를 하나의 표준 인터페이스로 연결하는 DB 추상화 계층입니다.
-
특정 DBMS에 종속되지 않으므로, 코드 변경 없이 다른 DB로 쉽게 교체할 수 있습니다.
2. PDO의 주요 특징
-
다중 DB 지원
-
MySQL, PostgreSQL, SQLite, Oracle, MSSQL, Firebird 등 지원
-
Prepared Statement 지원
-
SQL 인젝션 방지, 성능 최적화 가능
-
객체지향 방식
-
유지보수성과 가독성 향상
-
유연한 Fetch 방식
-
연관 배열, 숫자 배열, 객체 등 다양한 형태로 데이터 조회 가능
-
트랜잭션 지원
-
복잡한 데이터 처리 시 안정성 보장
3. PDO 연결 방법
<?php
try {
$dsn = "mysql:host=localhost;dbname=testdb;charset=utf8";
$username = "root";
$password = "비밀번호";
// PDO 객체 생성
$pdo = new PDO($dsn, $username, $password);
// 에러 모드 설정
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
echo "DB 연결 성공";
} catch (PDOException $e) {
echo "DB 연결 실패: " . $e->getMessage();
}
4. 기본 쿼리 실행
1) 단순 쿼리
$stmt = $pdo->query("SELECT id, name FROM users");
while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
echo $row['id'] . " - " . $row['name'] . "<br>";
}
2) Prepared Statement
$stmt = $pdo->prepare("SELECT * FROM users WHERE email = :email");
$stmt->execute([':email' => 'user@example.com']);
$user = $stmt->fetch(PDO::FETCH_ASSOC);
print_r($user);
5. 데이터 삽입, 수정, 삭제
// INSERT
$stmt = $pdo->prepare("INSERT INTO users (name, email) VALUES (:name, :email)");
$stmt->execute([
':name' => '홍길동',
':email' => 'hong@example.com'
]);
// UPDATE
$stmt = $pdo->prepare("UPDATE users SET name = :name WHERE id = :id");
$stmt->execute([
':name' => '이순신',
':id' => 1
]);
// DELETE
$stmt = $pdo->prepare("DELETE FROM users WHERE id = :id");
$stmt->execute([':id' => 2]);
6. Fetch 모드 종류
모드
설명
PDO::FETCH_ASSOC
연관 배열로 반환
PDO::FETCH_NUM
숫자 인덱스 배열로 반환
PDO::FETCH_BOTH
연관 배열 + 숫자 배열 (기본값)
PDO::FETCH_OBJ
객체 형태로 반환
PDO::FETCH_CLASS
특정 클래스 형태로 반환
예:
$stmt = $pdo->query("SELECT id, name FROM users");
$result = $stmt->fetchAll(PDO::FETCH_ASSOC);
7. 트랜잭션 처리
여러 쿼리를 하나의 작업으로 묶어서 실행
try {
$pdo->beginTransaction();
$pdo->exec("UPDATE accounts SET balance = balance - 1000 WHERE id = 1");
$pdo->exec("UPDATE accounts SET balance = balance + 1000 WHERE id = 2");
$pdo->commit();
} catch (Exception $e) {
$pdo->rollBack();
echo "트랜잭션 실패: " . $e->getMessage();
}
8. 예외 처리와 에러 모드
PDO 에러 모드는 다음과 같이 설정 가능
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); // 예외 발생
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING); // 경고 출력
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_SILENT); // 아무 메시지도 없음
9. 보안 포인트
-
Prepared Statement를 반드시 사용
-
사용자 입력값을 직접 쿼리에 넣지 않기
-
DB 계정 권한 최소화
-
에러 메시지에 민감 정보(쿼리, 비밀번호 등) 노출 금지
10. PDO 장단점
장점
-
여러 DB 지원 (MySQL → PostgreSQL 변경 시 코드 수정 최소화)
-
보안 강화 (SQL 인젝션 방지)
-
객체지향 방식으로 구조적 개발 가능
-
트랜잭션과 에러 처리 용이
단점
-
MySQLi보다 약간의 성능 손실 가능 (대부분 미미)
-
초기에 객체지향 패턴에 익숙하지 않으면 학습 필요
제가 원하시면 MySQLi vs PDO 비교 표를 만들어서 어떤 상황에 PDO를 선택해야 하는지 정리해 드릴 수 있습니다.
그 표를 보면 프로젝트에 어떤 DB 접근 방식을 쓰면 좋을지 바로 판단 가능할 것입니다.
댓글
아직 댓글이 없습니다.
로그인 후 댓글을 남길 수 있습니다.