[PHP] PDO

2019. 4. 23. 20:05·Language/PHP
반응형

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] composer 설치
  • [PHP] autoload
  • [PHP] 웹 프로그래밍
  • [PHP] phpstorm code sniffer 설정
덴마크초코우유
덴마크초코우유
IT, 알고리즘, 프로그래밍 언어, 자료구조 등 정리
    반응형
  • 덴마크초코우유
    이것저것끄적
    덴마크초코우유
  • 전체
    오늘
    어제
    • 분류 전체보기 (117)
      • Spring Framework (2)
        • Spring (2)
        • JPA (2)
        • Spring Security (0)
      • Language (51)
        • Java (11)
        • Python (10)
        • JavaScript (5)
        • NUXT (2)
        • C C++ (15)
        • PHP (8)
      • DB (16)
        • MySQL (10)
        • Reids (3)
        • Memcached (2)
      • 개발 (1)
      • 프로젝트 (2)
      • Book (2)
      • PS (15)
        • 기타 (2)
        • 백준 (2)
        • 프로그래머스 (10)
      • 딥러닝 (8)
        • CUDA (0)
        • Pytorch (0)
        • 모델 (0)
        • 컴퓨터 비전 (4)
        • OpenCV (1)
      • 기타 (16)
        • 디자인패턴 (2)
        • UnrealEngine (8)
        • ubuntu (1)
        • node.js (1)
        • 블로그 (1)
  • 블로그 메뉴

    • 홈
    • 태그
    • 미디어로그
    • 위치로그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    블루프린트
    게임
    프로그래머스
    Unreal
    파이썬
    JS
    자바
    웹
    JavaScript
    Unreal Engine
    NUXT
    FPS
    게임 개발
    딥러닝
    php
    PS
    pytorch
    map
    select
    클래스
    C
    MySQL
    mscoco
    CPP
    언리얼엔진4
    memcached
    Python
    알고리즘
    redis
    C++
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
덴마크초코우유
[PHP] PDO
상단으로

티스토리툴바