시작하기 전에
PHP는 급격하게 성장하며 더 나은 프로그래밍 언어가 되고 있다. 보통 동적인 언어가 생겨나면 그 언어는 프로그래머가 거리낌없이 기업 애플리케이션을 만들 수 있도록 하기 위해 더 엄격해진다.
PHP의 경우 더 나은 PHP는 객체 지향 PHP를 의미한다. 이 뜻은 여러분이 더 많은 객체를 사용하고, 더 나은 코드 테스트를 할 수 있고, 재사용 가능한 컴포넌트를 작성하고, 일반적으로 여러분의 연봉이 오른다는 의미이다.
PDO를 사용하는 것은 객체지향과 재사용 가능한 애플리케이션의 데이터베이스 층을 만드는 첫단계이다. 이 문서의 나머지 부분에서 볼 내용과 같이 PDO로 객체지향 코드를 작성하는 것은 생각보다 더 간단하다.
PDO 존재를 확인하기
만일 여러분이 PHP 5.5.X나 그 이상을 사용한다면 이미 PDO를 포함하고 있을 확률이 있다. 확인하기 위하여 간단하게 리눅스, Mac OS X, 윈도우 명령 프롬프트에서 터미널을 열고 다음과 같은 명령어를 따라하라.
<?php phpinfo();?>
를 통해서 PDO를 검색해 PDO가 있는지 확인해본다.
PDO가 있을 경우에 이 부분은 건너 뛰어도 된다.
PDO가 없을경우에 설치를 진행해야하는데 진행 방법은 의외로 간단하다.
mysql로 접속해
sudo yum --enablerepo=remi,remi-php56 install php-pdo
sudo yum --enablerepo=remi,remi-php56 install php-mysqlnd
를 차례대로 입력한다.
그다음 php.ini 파일에 접속을 하여서
;extension=php_pdo_mysql.dll의 ; 주석을 제거한다.
이제 사용환경 설정은 끝났으니 기본적인 연결을 알아보겠다.
PDO의 선언의 기본은 try catch 안에서 한다.
$db_info['host'] = 'localhost';
$db_info['database'] = 'database_name';
$db_info['user'] ='id';
$db_info['password'] = 'pw';
try{
$con = new PDO('mysql:host='.$db_info['host'].';dbname='.$db_info['database'].';charset=utf8',
$db_info['user'], $db_info['password']);
$con->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
$con->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
}catch(PDOException $e) {
echo $e->getMessage();
}
- PDO::ATTR_EMULATE_PREPARES : 이 속성은 Preppared Statement 를 데이터베이스가 지원 하지 않을 경우 에뮬레이션 하는 기능으로 false 를 지정하서 데이터베이스의 기능을 사용하도록 한다.
- PDO::ATTR_ERRMODE : 이 속성은 PDO 객체가 에러를 처리하는 방식을 결정한다.
$query = "SELECT COUNT(*) AS cnt FROM member WHERE member_id = ?";
$result = $con->prepare($query);
$result->execute(array($member_id));
$row = $result->fetchAll(PDO::FETCH_NUM);
인젝션 방어를 위해서 PDO에서는 placeholder를 사용하는데, 변수가 들어갈 곳에 ?를 넣는다.
그리고 스테이트먼트를 생성하고, 배열을 통해 변수 값을 ?에 순서에 맞게 집어넣는다.
PDO::FETCH_NUM : 숫자 인덱스 배열 반환
PDO::FETCH_ASSOC : 컬럼명이 키인 연관배열 반환
PDO::FETCH_BOTH : 위 두가지 모두
PDO::FETCH_OBJ : 컬럼명이 프로퍼티인 인명 객체 반환
변수가 없을경우에는
$query = "SELECT COUNT(*) AS cnt FROM member";
$result = $con->prepare($query);
$result->execute();
$row = $result->fetchAll(PDO::FETCH_NUM);
이렇게 써도 무방하다.
'SERVER > MYSQL' 카테고리의 다른 글
[MYSQL] MySql 컬럼명 변경 및 컬럼 추가 (0) | 2018.12.28 |
---|---|
[mySql] mySql과 mySqli의 차이 (0) | 2017.12.04 |
[mySql] this is incompatible with sql_mode=only_full_group_by 에러 (0) | 2017.11.28 |
[mySql] INDEX 추가/삭제하기 (0) | 2017.11.28 |
[mySql] 테이블에서 실행되고 있는 쿼리문 보기 및 죽이기 (0) | 2017.11.28 |