
SQL 쿼리를 실행하여 결과 세트를 반환하는 PDO를 얻으려면 두세 개의 구문이 필요하다. 사용자 정의 함수를 작성하면 하나의 함수에서 할 수 있다.
SQL 쿼리가 매개변수를 사용하지 않는다면, PDO 객체의 query() 메서드는 SQL 쿼리를 실행하여 결과 세트를 나타내는 PDOStatement 객체를 반환한다.
$statement = $pdo->query($sql);
SQL 쿼리가 매개변수를 사용한다면, PDO 객체의 prepare() 메서드를 호출하여 쿼리를 나타내는 PDOStatement 객체를 생성해야 한다. 그런 다음 쿼리를 실행하기 위해 PDOStatement 객체의 execute()를 호출해야 한다.
$statement = $pdo->prepare($sql); $statement->execute($sql);
이러한 단계 이후, PDOStatement 객체의 메서드 중 하나가 결과 세트에서 데이터를 수집해야 한다.
함수는 다음의 매개변수 세 개를 갖는다.
$sql은 실행될 SQL 쿼리에 대한 것이다.
$arguments는 SQL 매개변수 이름과 그에 대한 값의 배열이다. 이 인수가 제공되지 않는다면 디폴트값은 null이다.
이 함수는 제공된 인수가 없는지 확인한다.
만약에 제공되지 않았다면, query() 메서드를 실행하고 생성된 PDOStatement 객체를 반환한다.
만약에 제공되었다면, PDOStatement 객체를 생성하기 위해 prepare() 메서드를 호출하고, 쿼리를 실행하기 위해 객체의 execute() 메서드를 호출한 다음, PDOStatement 객체를 반환한다.
function pdo(PDO $pdo, string $sql, array $arguments = null) { if (!arguments) { return $pdo->query($sql); } $statement = $pdo->prepare($sql); $statement->execute($arguments); return $statement; }
사용자 정의 pdo() 함수가 호출되면, 메서드 체이닝을 사용하여 쿼리를 실행하고 단일 구문으로 데이터를 반환한다.
PDOStatement 객체가 생성되고 SQL 문이 실행되면, 결과 세틍서 데이터를 가져와서 변수에 저장하기 위해 다음의 세 가지 메서드 중 하나가 호출된다.
fetch()는 단일 행의 데이터를 가져온다.
fetchAll()은 여러 행의 데이터를 가져온다.
fetchColumn()은 단일 칼럼에서 값을 가져온다.
함수 또는 메서드가 객체를 반환할 때, 메서드 체이닝은 동일한 구문에서 반환되는 객체의 메서드를 호출하게 한다.
다음의 pdo() 함수가 호출되면 PDOStatement 객체가 반환된다. 이 함수 호출 다음으로 객체 연산자, 그리고 반환된 PDOStatement 객체의 메서드에 대한 호출이 온다.
$members = pdo($pdo, $sql)->fetchAll(); $member = pdo($pdo, $sql, $arguments)->fetch();
PDO는 결과 세트의 각 데이터 행을 배열이 아닌 객치로 나타낼 수 있다. PDO의 페치 모드는 데이터가 어떻게 표현되어야 하는지를 지정한다.
- 배열
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC;
- 객체
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_OBJ;
각 PDOStatement 객체에는 개별 PDOStatement 객체에 대한 페치 모드를 설정하는 데 사용되는 setFetchMode()라는 메서드가 있다. 이 메서드는 디폴트 페치 모드를 덮어쓴다.
setFetchMode()는 execute() 메서드 다음에 호출된다. 이 메서드의 하나의 매개변수는 사용할 페치 모드다. 다음은 결과 세트의 각 데이터 행이 객체로 반환되어야 한다는 설정이다.
$statement->setFetchMode(PDO::FETCH_OBJ);
페치 모드는 fetch() 그리고 fetchAll() 메서드의 인수로 지정할 수도 있다. 결과 세트에서 여러 행의 데이터를 가져오기 위해 fetchAll()을 사용하면, 각 객체는 인덱스 배열의 각 요소에 저장된다.
출처 - 존 두켓, <백엔드 프로그래밍을 위한 PHP & MySQL>, Jpub, 2022