The PHP Practitioner 06 - PDO (1)
29 Dec 2019 | Laracast PHPLaracasts - 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