본문 바로가기

Language/PHP

[PHP] PDO

반응형

php_logo

데이터베이스는 웹 어플리케이션 개발에 절대 빠지지 않는 기능이다. php 역시 데이터베이스를 위한 추상화 계층인 PDO를 제공하며 이를 통해 데이터베이스를 간편히 사용할 수 있다. PDO는 php의 내장 기능이며 php프로그램과 데이터베이스 사이의 통신을 단순화하는 역할을 한다.

실습은 다음과 같은 환경에서 진행했다.

php 7
MySQL 5.7

1. 테스트 테이블 생성

MySQL에 실습을 위한 새로운 스키마를 만들고 테이블을 생성했다.
`

CREATE SCHEMA `test_sch` DEFAULT CHARACTER SET utf8 ;

/* test용 테이블 */
CREATE TABLE `world_of_renaissance`.`test_table` (
  `id` INT NOT NULL AUTO_INCREMENT,
  `name` VARCHAR(32) CHARACTER SET 'utf8' NOT NULL,
  `level` INT UNSIGNED NOT NULL DEFAULT 1 COMMENT 'test',
  PRIMARY KEY (`id`),
  UNIQUE INDEX `id_UNIQUE` (`id` ASC))
ENGINE = InnoDB
DEFAULT CHARACTER SET = utf8
COMMENT = 'test';

그리고 개발 db계정에 해당 스키마 및 테이블을 수정할 수 있는 권한을 준다.

> grant all privileges on test_sch.* to 'dev_test'@'%';
> flush privileges;

2. PDO 객체로 접속

<?php
$id = 'idid';
$pw = 'pwpw';
$db = new PDO('mysql:host=127.0.0.1:3306;dbname=dbdb', $id, $pw);

충격! 에러가 뜬다???

PHP Fatal error: Uncaught Error: Class 'PDO' not found in /ooooo/oooo/ooo/db_test.php on line 4

PDO 모듈이 설치되지 않았기 때문이다. yum으로 설치해준다.

yum install --enablerepo=remi-php72 install php-pdo php-pdo_mysql

다시 실행하면 오류 없이 접속이 잘 도니다.

3. 테이블 조작

데이터베이스에 성공적으로 접속하면 저장된 데이터에 접근할 수 있는 객체를 반환한다. 이 객체의 함수를 호출하면 데이터베이스에 쿼리를 전송하거나 쿼리 실행 결과에 접근할 수 있다.
PDO 객체를 통해 테이블 생성 및 데이터 조회/삭제/수정을 해 보자.

1) 테이블 생성

테이블 생성은 exec() 함수를 통해 실행할 수 있다. 인자로 테이블 생성 쿼리를 넣어주면 된다.

<?php
$id = 'idid';
$pw = 'pwpw';

try
{
    $db = new PDO('mysql:host=127.0.0.1:3306;dbname=dbdb', $id, $pw);
    $q = $db->exec(" CREATE TABLE cre_test(
        id INT,
        val VARCHAR(8)
    )");
}
catch(PDOException $e)
{
    print $e;
}

동일하게 exec()로 DROP TABLE 명령을 실행할 수 있다.

2) 데이터 추가

데이터 삽입 역시 exec()함수를 통해 쿼리를 실행하여 수행된다.

<?php
$id = 'idid';
$pw = 'pwpw';

try
{
    $db = new PDO('mysql:host=127.0.0.1:3306;dbname=dbdb', $id, $pw);
    $affectedRows = $db->exec("INSERT INTO test_db(name) VALUES('test_테스트')");
}
catch(PDOException $e)
{
    print $e;
}

실행결과로 반환값 $affectedRows에 해당 SQL에 의해 영향을 받은 Row의 수를 저장한다. 1개의 데이터를 삽입했으므로 1이 저장될 것이다.

데이터 삽입 시 주의할 사항이 있다. SQL문을 담은 문자열에 올바르지 않은 형식의 데이터가 들어가거나, 악의적으로 SQL문을 삽입하여 큰 오류를 발생시킬 수 있다. 이를 방지하기 위해 Prepared 문이라는 유용한 기능이 있따.

$stmt = $db->prepare('INSERT INTO test_table(name) VALUES (?)');
$stmt->execute(array($_POST['form_data_name']));

미리 sql문에 들어갈 데이터의 부분을 ?로 지정해두고 excute로 실행 시 인자로 들어갈 데이터를 주면 해당 데이터가 적절하게 쿼리로 변환어 실행된다.

3) 데이터 갱신/삭제

<?php
$id = 'idid';
$pw = 'pwpw';

try
{
    $db = new PDO('mysql:host=127.0.0.1:3306;dbname=dbdb', $id, $pw);
    $affectedRows = $db->exec("UPDATE test_db SET level = 10 WHERE id = 1");
}
catch(PDOException $e)
{
    print $e;
}
<?php
$id = 'idid';
$pw = 'pwpw';

try
{
    $db = new PDO('mysql:host=127.0.0.1:3306;dbname=dbdb', $id, $pw);
    $affectedRows = $db->exec("DELETE FROM test_table WHERE id = 1");
}
catch(PDOException $e)
{
    print $e;
}

4) 데이터 조회

데이터베이스에서 데이터를 조회하기 위해서는 query()함수로 데이터베이스에 SQL 쿼리를 전달한다. query()는 쿼리의 결과 로우에 접근할 수 있는 PDOStatemetn 객체를 반환한다. 이 객체의 fetch() 함수는 실행할 떄 마다 겨로가 로우를 차례로 반환하며 남은 로우가 없으면 false를 반환한다.

$q = $db->query('SELECT id, name, level FROM test_table');
while ($row = $q->fetch())
{
    print "$row[id], $row[name], $row[level]";
}

fetchAll() 함수로 한 번에 배열에 넣을 수 있다.

$q = $db->query('SELECT id, name, level FROM test_table');
$rows = $q->fetchAll();
반응형

'Language > PHP' 카테고리의 다른 글

[PHP] psr4  (0) 2019.05.13
[PHP] composer 설치  (0) 2019.05.13
[PHP] autoload  (0) 2019.05.10
[PHP] 웹 프로그래밍  (0) 2019.05.04
[PHP] phpstorm code sniffer 설정  (0) 2019.04.23