회원가입, 로그인, 게시판 등 데이터 저장 및 조회
상품, 주문, 재고 관리 등 웹 서비스 핵심 데이터 관리
통계 및 로그 분석
MySQL 전용
절차지향(Procedural) 또는 객체지향(Object-oriented) 방식 모두 지원
예: mysqli_connect()
다양한 DB 지원 (MySQL, PostgreSQL, SQLite, Oracle 등)
보안과 유연성 측면에서 더 권장됨
예: new PDO()
<?php
// DB 연결
$conn = mysqli_connect("localhost", "root", "비밀번호", "testdb");
// 연결 확인
if (!$conn) {
die("DB 연결 실패: " . mysqli_connect_error());
}
// 데이터 조회
$sql = "SELECT id, name FROM users";
$result = mysqli_query($conn, $sql);
if (mysqli_num_rows($result) > 0) {
// 결과 출력
while ($row = mysqli_fetch_assoc($result)) {
echo "ID: " . $row["id"] . " 이름: " . $row["name"] . "<br>";
}
} else {
echo "데이터 없음";
}
// 연결 종료
mysqli_close($conn);
?>
<?php
try {
$pdo = new PDO("mysql:host=localhost;dbname=testdb;charset=utf8", "root", "비밀번호");
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$stmt = $pdo->query("SELECT id, name FROM users");
while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
echo "ID: {$row['id']} 이름: {$row['name']}<br>";
}
} catch (PDOException $e) {
echo "DB 오류: " . $e->getMessage();
}
?>
SQL 인젝션 방지를 위해 Prepared Statement를 사용하는 것이 안전합니다.
$stmt = mysqli_prepare($conn, "INSERT INTO users (name, email) VALUES (?, ?)");
mysqli_stmt_bind_param($stmt, "ss", $name, $email);
$name = "홍길동";
$email = "hong@example.com";
mysqli_stmt_execute($stmt);
$stmt = $pdo->prepare("INSERT INTO users (name, email) VALUES (:name, :email)");
$stmt->execute([
':name' => '홍길동',
':email' => 'hong@example.com'
]);
함수/메서드 |
설명 |
---|---|
mysqli_connect() / new PDO() |
DB 연결 |
mysqli_query() / $pdo->query() |
SQL 실행 |
mysqli_prepare() / $pdo->prepare() |
준비된 문 실행 |
mysqli_fetch_assoc() / $stmt->fetch() |
결과 행 가져오기 |
mysqli_num_rows() |
결과 행 개수 |
mysqli_close() |
연결 종료 |
데이터베이스 작업 중 오류가 발생하면 로그를 남기고 예외 처리하는 것이 좋습니다.
try {
$pdo = new PDO(...);
} catch (PDOException $e) {
error_log("DB 연결 실패: " . $e->getMessage());
die("서비스 오류");
}
SQL 인젝션 방지 → Prepared Statement 사용
DB 계정 권한 최소화
에러 메시지에 민감 정보 노출 금지
입력값 검증 필수
여러 쿼리를 하나의 작업으로 처리할 때 사용
try {
$pdo->beginTransaction();
$pdo->exec("INSERT INTO accounts (user, balance) VALUES ('A', 1000)");
$pdo->exec("INSERT INTO accounts (user, balance) VALUES ('B', 2000)");
$pdo->commit();
} catch (Exception $e) {
$pdo->rollBack();
echo "트랜잭션 실패: " . $e->getMessage();
}
간단한 MySQL 전용 프로젝트 → MySQLi
다양한 DB 지원, 보안, 유지보수 → PDO
Prepared Statement와 트랜잭션을 잘 활용하면 보안과 안정성이 향상됨