IT
PHP 데이터베이스(Database)
1. PHP에서 데이터베이스 사용 목적
-
회원가입, 로그인, 게시판 등 데이터 저장 및 조회
-
상품, 주문, 재고 관리 등 웹 서비스 핵심 데이터 관리
-
통계 및 로그 분석
2. PHP에서 사용하는 주요 DB 연결 방법
1) MySQLi (MySQL Improved)
-
MySQL 전용
-
절차지향(Procedural) 또는 객체지향(Object-oriented) 방식 모두 지원
-
예: mysqli_connect()
2) PDO (PHP Data Objects)
-
다양한 DB 지원 (MySQL, PostgreSQL, SQLite, Oracle 등)
-
보안과 유연성 측면에서 더 권장됨
-
예: new PDO()
3. MySQLi 예제 (절차지향 방식)
<?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);
?>
4. PDO 예제 (객체지향 방식, 권장)
<?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();
}
?>
5. 데이터 삽입 (Prepared Statement 사용)
SQL 인젝션 방지를 위해 Prepared Statement를 사용하는 것이 안전합니다.
MySQLi
$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);
PDO
$stmt = $pdo->prepare("INSERT INTO users (name, email) VALUES (:name, :email)");
$stmt->execute([
':name' => '홍길동',
':email' => 'hong@example.com'
]);
6. 주요 데이터베이스 함수
함수/메서드
설명
mysqli_connect() / new PDO()
DB 연결
mysqli_query() / $pdo->query()
SQL 실행
mysqli_prepare() / $pdo->prepare()
준비된 문 실행
mysqli_fetch_assoc() / $stmt->fetch()
결과 행 가져오기
mysqli_num_rows()
결과 행 개수
mysqli_close()
연결 종료
7. 에러 처리
데이터베이스 작업 중 오류가 발생하면 로그를 남기고 예외 처리하는 것이 좋습니다.
try {
$pdo = new PDO(...);
} catch (PDOException $e) {
error_log("DB 연결 실패: " . $e->getMessage());
die("서비스 오류");
}
8. 보안 주의사항
-
SQL 인젝션 방지 → Prepared Statement 사용
-
DB 계정 권한 최소화
-
에러 메시지에 민감 정보 노출 금지
-
입력값 검증 필수
9. 트랜잭션 (PDO)
여러 쿼리를 하나의 작업으로 처리할 때 사용
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();
}
10. 결론
-
간단한 MySQL 전용 프로젝트 → MySQLi
-
다양한 DB 지원, 보안, 유지보수 → PDO
-
Prepared Statement와 트랜잭션을 잘 활용하면 보안과 안정성이 향상됨
댓글
아직 댓글이 없습니다.
로그인 후 댓글을 남길 수 있습니다.