1. PHP로부터 DB 접속
ㅇ MySQL 등 DB 접속을 위한 3가지 API
- mysql_ : MySQL 라이브러리 (PHP 5.5 부터 제거 대상, PHP 7.0 부터 폐기)
- mysqli_ : MySQL Improved 라이브러리 (PHP 5.0부터 도입)
- PDO : PHP Data Objects (PDO) interface (PHP 5.1부터 도입)
. 객체지향 프로그래밍으로 사용 가능
. PDO 확장 기능이 제공하는 클래스
. 가능 DB : MySQL,PostgreSQL,Oracle,SQLite,ODBC,MS-SQL 등
2. mysqli_ 접속 방법
ㅇ (절차식 프로그래밍 방식)
ㅇ (객체지향 프로그래밍 방식)
- $mysqli = new mysqli('hostname', 'username', 'password', 'databasename');
$mysqli = new mysqli('hostname','username','password','databasename');
if($mysqli->connect_errno) die('db 접속 실패',$mysqli->connect_error);
3. PDO 접속 및 사용 방법
ㅇ PDO 접속 방법
- $pdo = new PDO(dsn, 'username', 'password');
. dsn (Data Source Name) : 'dbtype:host=hostname;dbname=databasename'
. dbtype : MySQL 등 DBMS 종류 (例, mysql 등)
. hostname : 서버의 호스트명 (例, localhost 등)
. databasename : 대상 데이터베이스명
. $pdo : 커넥션 식별 정보를 갖고 반환되는 PDO 객체
try {
$pdo = new PDO('mysql:host=localhost;dbname=test','username','password');
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
// 문제 발생시, 오류 숨기지 않고 오류 처리
} catch (PDOException $e) {
echo "데이터베이스에 접속할 수 없습니다!";
echo $e->getMessage(); // 예외 발생 메세지
echo $e->getFile(); // 예외 발생 파일명(스크립트명)
echo $e->getLine(); // 스크립트 내 예외 발생 위치
exit;
}
ㅇ PDO 오류처리방식 ☞ PHP 홈 : Errors and error handling 참조
- 3가지 모드로 동작 : 침묵(silent,기본), 경고(warning), 예외(exception)
. PDO::ERRMODE_SILENT (default), PDO::ERRMODE_WARNING, PDO::ERRMODE_EXCEPTION
- 침묵 모드 (default)
. 실행중 문제 발생하면, 예외 발생 없이, PDO 관련 메소드가 false를 반환
. 이에따른 errorInfo() 메서드를 이용하면, 자세한 오류 정보를 얻을 수 있음
- 경고 모드 : $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING);
. 실행중 문제 발생하면, 예외 발생 없이, 경고 수준의 오류 메세지 발생
- 예외 모드 : $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
. 모든 문제를 자세히 알려줌 (예외 처리 안하면, 프로그램 실행이 중단됨)
ㅇ PDO 사용방법
- SQL 쿼리 (단순 열람)
. $affectedRowsNums = $pdo->exec($sql);
.. exec() 메소드는, 쿼리 수행 결과에 따라 변경된 레코드 개수 만을 반환함
.. 주로, create table, insert into, update, delete 등의 sql 명령에 적합
- SQL 쿼리 (결과 레코드 집합 반환)
. $result = $pdo->query($sql);
.. query() 메소드는, 모든 결과 레코드 집합이 담긴 PDOStatement 객체를 반환
- SQL 쿼리 결과 처리
while ($row = $result->fetch()) {
// 매 레코드(row) 마다 처리
}