해리의 데브로그

The PHP Practitioner 06 - PDO (1)

|

Laracasts - The PHP Practitioner 강의를 듣고 정리한 포스팅 입니다.

1. PDO

PHP Database Object의 약자로, 데이터베이스에 접근하는 공통 API를 제공하는 것을 목적으로 만들어 짐. Prepared statement를 제공하므로 SQL Injection 방어에 사용될 수 있음.

2. PDO 조작

PDO를 통해 데이터베이스에 연결하기

  • new PDO(DSN-Data Source Name, 아이디, 비밀번호)
  • 데이터베이스 연결에 실패할 경우 PDOException 을 발생시키도록 try-catch 로 예외처리가능
try {
    $pdo = new PDO('mysql:host=localhost;dbname=mytodo;', 'root', '111111');
} catch (PDOException $e) {
    die($e->getMessage());
}

데이터베이스 접근 & 조회하기: 쿼리문 작성(prepare) - 실행(execute) - 가져오기(fetch)

# SQL 실행
$statement = $pdo->prepare('select * from todos'); # SQL문 작성
$statement ->execute(); #실행

# 데이터 갖고오기
var_dump($statement->fetchAll()); #모든 데이터 갖고오기
# fetch result override: 결과를 오브젝트(제너릭 클래스의 인스턴스)로 fetch해옴 
var_dump($statement->fetchAll(PDO::FETCH_OBJ));
# 응용
$results = $statement->fetchAll(PDO::FETCH_OBJ);
var_dump($results[0]->description);

결과를 커스텀 클래스의 인스턴스에 저장하여 호출도 가능함.

  • PDO::FETCH_CLASS 사용
#index.php
require 'Task.php';

$tasks = $statement->fetchAll(PDO::FETCH_CLASS, 'Task');

var_dump($tasks[0]->foobar());

#Task.php
<?php

class Task
{
    public $description;
    public $completed;

    public function foobar()
    {
        return 'foobar';
    }

}

3. 최종 리팩토링

동작하는 부분을 함수로 만들어 function.php으로 옮긴 후 require 로 index.php에서 호출하여 사용

# index.php
<?php

require 'Task.php';
require 'function.php';

$pdo = connectToDb();
$tasks = fetchAllTasks($pdo);

require 'index.view.php';

#function.php

<?php

function connectToDb()
{
    try {
        return new PDO('mysql:host=localhost;dbname=mytodo;', 'root', '111111');
    } catch (PDOException $e) {
        die($e->getMessage());
    }
}

function fetchAllTasks($pdo)
{
    $statement = $pdo->prepare('select * from todos');
    $statement ->execute();

    //$tasks = $statement->fetchAll(PDO::FETCH_OBJ);
    return $statement->fetchAll(PDO::FETCH_CLASS, 'Task');
}

Comments