본문 바로가기

PHP

[PHP] PDO로 데이터베이스 접속하기

앞으로 티스토리 대신 blog.stackframe.dev에서 블로깅을 합니다. 이 블로그는 남겨 둘 예정입니다.

PHP 5.1 부터 PDO라는 객체가 제공되었습니다. 이 객체를 통해 다양한 데이터베이스에 동일한 인터페이스로 접근이 가능합니다. 예전처럼 데이터베이스마다 따로 제공되던 함수(mysqli_* 등)와 연결 해제, 결과 데이터 할당 해제를 신경쓰지 않고도 편하게 그리고 SQL injection 걱정 없이 프로그래밍이 가능합니다.

 

먼저 PHP에서 사용하는 데이터베이스의 PDO 드라이버 확장 모듈을 사용하도록 설정해야 합니다. php.ini에서 자신이 사용할 데이터베이스의 pdo 확장 모듈을 주석해제하거나 입력합니다. 저는 PostgreSQL을 사용하므로 extension=pdo_pgsql를 주석해제 했습니다. 중요한 점은 사용하는 시스템의 패키지 매니저와 레포지토리에 따라 확장 모듈이 다른 패키지로 분리되어 있을 수 있습니다. 제가 사용하는 아치리눅스는 php-pgsql 이란 패키지로 분리되어 제공되었습니다.

 

아래는 PHP에서 데이터베이스에 접속하는 코드입니다.

<?php
$pdo = new PDO('pgsql:host=localhost;dbname=database_name','db_user_id','password');
$pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES,false);
$pdo->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);

PDO 클래스의 생성자의 첫 번째 인자는 DSN(Data Source Name)으로 호스트, 포트, 사용할 데이터베이스 이름 등을 설정합니다. 이것은 String 형으로 되어있으며 사용하는 DBMS에 따라 다릅니다. https://www.php.net/manual/en/pdo.drivers.php 여기서 각 DBMS의 DSN 형태를 볼 수 있습니다.

두 번째 인자는 DBMS에 접속하기위한 사용자 ID, 세 번째 인자는 비밀번호입니다.

네 번째 인자는 PDO 드라이버 옵션인데 사용되는 경우를 저는 본 적이 없습니다.

 

setAttribute()메소드로 2가지 설정을 하는데 첫 번째 설정은 prepared statement를 native하게 사용가능하면 드라이버 단에서 에뮬레이션하지 못하게 합니다.

두 번째 설정은 PDO를 사용한 쿼리를 실행할 때 Exception을 던지도록 설정합니다. 리턴 값을 확인하지 않고 try catch 구문으로 에러처리를 할 수 있습니다.

'PHP' 카테고리의 다른 글

[PHP] PDO로 쿼리하기  (0) 2019.04.29
htmlspecialchars로 XSS 공격 방어하기  (0) 2018.12.23