4.08. PHP에서 MySQL 값 가져오기

PHP에서 MySQL 데이터베이스에서 데이터를 가져오기 위한 코드를 알아본다.

function db_select($query, $param=array()){
    $pdo = db_get_pdo();
    try {
        $st = $pdo->prepare($query);
        $st->execute($param);
        $result =$st->fetchAll(PDO::FETCH_ASSOC);
        $pdo = null;
        return $result;
    } catch (PDOException $ex) {
        return false;
    } finally {
        $pdo = null;
    }
}

var_dump(db_select("select * from tbl_person"));
echo "<br />";
var_dump(db_select("select * from tbl_person where person_id = ?", array(1)));
echo "<br />";
var_dump(db_select("select * from tbl_person where person_id = :person_id", array('person_id' => 1)));

위 코드는 db_get_pdo() 함수를 사용하므로 db.php 파일 아래에 이어붙인다.

브라우저에서 결과를 확인한다.

array(1) { [0]=> array(3) { ["person_id"]=> string(1) "1" ["name"]=> string(3) "yse" ["age"]=> string(2) "30" } } 

브라우저에서 결과를 확인한 후에는 var_dump와 echo 부분은 삭제한다.

function db_select($query, $param=array()){
    $pdo = db_get_pdo();
    try {
        $st = $pdo->prepare($query);
        $st->execute($param);
        $result =$st->fetchAll(PDO::FETCH_ASSOC);
        $pdo = null;
        return $result;
    } catch (PDOException $ex) {
        return false;
    } finally {
        $pdo = null;
    }
}

// 여기서부터 삭제
var_dump(db_select("select * from tbl_person"));
echo "<br />";
var_dump(db_select("select * from tbl_person where person_id = ?", array(1)));
echo "<br />";
var_dump(db_select("select * from tbl_person where person_id = :person_id", array('person_id' => 1)));
// 여기까지 삭제

MySQL에 저장된 값을 가지고 오는 일은 많이 사용되기 때문에 db_select 라는 이름으로 함수화했다.

function db_select($query, $param=array()){

$pdo 는 MySQL에 접속하는 객체다.

$pdo = db_get_pdo();

$st = $pdo->prepare($query);

pdo 객체에서 쿼리를 세팅하면서 statement 객체 $st 를 리턴받는다.
StatemenT 객체는 실제로 쿼리를 실행하는 역할이다. 조금 더 구체적으로 말하면 prepare statement라고 해서 쿼리 문자열을 직접 만들어내는 대신 플레이스 홀더(? 혹은 :이름)를 통해 쿼리에 파라미터를 전달하는 객체다.
프리페어 스테이트먼트(prepare statement)는 플레이스 홀더를 통해 전달된 파라미터들의 SQL Injection을 방지하는 역할을 한다.


쿼리를 실행한다.

$st->execute($param)

실행한 데이터 전부를 가지고 온다.

$st->fetchAll(PDO::FETCH_ASSOC);

fetchAll 은 데이터를 전부 가지고 오는 메소드다. PDO::FETCH_ASSOC 는 데이터를 연관배열로 가지고 오라는 뜻이다. 참고로 fetch_style은 아래와 같다.

이름설명예제

FETCH_ASSOC 연관배열로 데이터를 가지고 온다. fetchAll(PDO::FETCH_ASSOC)
FETCH_CLASS 객체 형태로 데이터를 가지고 온다. 뒤에 | 기호로 객체 타입을 지정한다. fetchAll(PDO::FETCH_CLASS | UserDataType)
FETCH_OBJ 익명 객체 형태로 데이터를 가지고 온다. 자동으로 컬럼이 멤버변수화된다. fetchAll(PDO::FETCH_OBJ)
FETCH_NUM 순차배열 형태로 데이터를 가지고 온다. fetchAll(PDO::FETCH_NUM)
FETCH_BOTH FETCH_ASSOC + FETCH_NUM fetchAll(PDO::FETCH_BOTH)

만일 쿼리가 실패할 경우 fetchAll 메소드는 false 를 반환한다. 쿼리가 정상 실행되지 않았는지 확인하려면 우선 쿼리 실행 결과가 !== false 인지 확인하고 나서 다음 프로세스를 진행하면 된다.


객체를 null 로 초기화해야 데이터베이스 커넥션이 끊긴다.

$pdo = null;

쿼리가 실패하거나 다른 문제가 생기더라도 데이터베이스와의 연결을 끊는다.

finally {
    $pdo = null;
}

연결을 제 때 끊어주지 않으면 데이터베이스 커넥션이 무한대로 늘어나서 성능에 영향을 미치거나 too many connections 오류를 맞이할 수도 있으므로 반드시 쿼리를 실행하고 나면 연결을 끊어야 한다.
finally는 오류가 발생해도 실행되는 구문이므로 쿼리의 성공/실패 여부와 관계없이 연결이 끊김을 보장할 수 있다.


db_select 함수 사용법은 아래와 같다.

파라미터가 없는 경우 db_select(쿼리 문자열); 형태로 사용한다.

db_select("select * from tbl_person");

쿼리에 전달할 파라미터가 있는 경우 db_select(쿼리 문자열, array(파라미터들)) 형식으로 사용한다.

db_select("select * from tbl_person where person_id = ?", array(1))
db_select("select * from tbl_person where person_id = :person_id", array('person_id' => 1))

쿼리에 파라미터를 전달하는 방법은 두개가 있다.

첫번째로는 쿼리 문자열 안에 ? 로 넣는 것이다. 이 때 파라미터 배열은 순차 배열로 전달하며 ? 의 갯수만큼 순서대로 적용된다.

db_select("select * from tbl_person where person_id = ?", array(1))

?가 배열의 값 1로 대체되었다. 위 구문은 아래와 같은 쿼리를 실행한다.

select * from tbl_person where person_id = 1

두번째는 쿼리 문자열 안에 :키 로 넣을 수 있다. 파라미터 배열은 연관 배열로 전달하며 각 키에 바인딩된다.

db_select("select * from tbl_person where person_id = :person_id", array('person_id' => 1))

위 구문은 아래와 같은 쿼리를 실행한다.

Copyselect * from tbl_person where person_id = 1