데이터베이스에서 데이터 가져오기(3)

minah moon·2023년 9월 2일

PHP

목록 보기
46/58
post-thumbnail

SQL 문을 실행하는 함수

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 객체의 메서드 중 하나가 결과 세트에서 데이터를 수집해야 한다.

함수는 다음의 매개변수 세 개를 갖는다.

  • $pdo는 데이터베이스에 대한 연결을 관리하는 데 사용되는 PDO 객체에 대한 것이다.
  • $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

0개의 댓글