
데이터 소스 네임data source name, DSN
DSN은 PDO가 데이터베이스를 찾아 연결하기 위해 필요한 5가지 데이터를 보유하는 변수다. DSN은 내장 PDO 클래스를 사용하여 PDO 객체를 만드는 데 사용된다.
DSN을 생성하기 위해 5개의 데이터가 변수에 저장된다. 이 5개의 변수를 결합해 DSN을 생성하여 여섯 번째 변수에 저장한다.
$type : 데이터베이스 타입을 담는다. PDO가 다양한 타입의 데이터베이스와 작업할 수 있기 때문에 필요하다. MySQL 및 MariaDB라면, 그 값으로 mysql을 사용한다.
$server : 데이터베이스가 호스팅되는 서버의 호스트명을 담는다. 웹 서버와 동일한 서버에 있다면(예를 들어, MAMP 또는 XAMPP를 실행하고 있다면), localhost를 사용한다. 그리고 동일한 서버가 아니라면, 데이터베이스가 있는 서버의 IP 주소 또는 도메인 네임을 사용한다.
$db는 연결할 데이터베이스의 이름을 담는다.
$port : 데이터베이스의 포트 번호를 담는다. 일반적으로 MAMP는 8889 포트를 그리고 XAMPP는 3306 포트를 사용한다.
$charset : 데이터가 데이터베이스로 전송되는 문자 인코딩이며 데이터를 다시 전송하는 데 사용하는 인코딩이다. 이것은 utf8mb4로 설정된다.
위의 5개의 값을 사용하여 DSN을 생성하여 $dsn에 저장한다.
DSN이 변수에 저장되면, PDO 객체를 만들어 PHP 파일의 코드와 데이터베이스 간의 연결을 관리할 수 있다.
PDO 객체는 PHP의 내장 PDO 클래스를 사용하여 생성된다. PDO 객체는 다음이 필요하다.
연결해야 할 데이터베이스를 찾기 위한 DSN
데이터베이스에 로그인할 수 있는 사용자 계정의 사용자 이름과 비밀번호
PDO 객체를 생성할 때 데이터베이스와 작업하는 방식을 제어하는 옵션을 설정할 수도 있다. 이 옵션은 $options라는 배열에 저장된다.
$username = 'enter-your-username'; $password = 'enter-your-password'; $options = [ PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, PDO::ATTR_EMULATE_PREPARES => false, ];
PDO::ATTR_DEFAULT_FETCH_MODE 옵션은 PHP 코드에서 결과 세트의 각 행을 사용할 수 있게 하는 방법을 PDO에 알려준다. PDO::FETCH_ASSOC 설정은 결과 세트의 각 행이 연관 배열로 저장되어야 함을 나타낸다.
PDO::ATTR_EMULATE_PREPARES 설정은 에뮬레이션 모드라는 것을 켜거나 끈다.
DSN, 사용자 계정 세부 정보, 그리고 옵션이 변수에 저장되었다면, 다른 객체와 같이 생성자를 사용하여 PDO 객체를 생성할 수 있다. PDO 객체는 $pdo라는 변수에 저장된다. PDO는 내장 클래스이기 때문에 페이지에 클래스 정의를 포함할 필요가 없다.
$pdo = new PDO($dsn, $username, $password, $options);
데이터베이스 기반 웹사이트에서 대부분의 페이지는 데이터베이스에 연결하므로, 데이터베이스 연결을 관리하는 PDO 객체를 생성하는 코드는 종종 인클루드 파일에 저장된다.
장점
데이터베이스에 연결하는 각 페이지마다 동일한 코드를 반복할 필요가 없다.
데이터베이스 연결이 업데이트되어야 할 경우, 데이터베이스에 연결하는 모든 페이지가 아니라 하나의 인클루드 파일만 업데이트하면 된다.
사이트의 테스트 버전과 라이브 버전이 있는 경우, 데이터베이스 연결은 하나의 파일에서만 변경한다.
PDO 객체의 query() 메서드는 SQL 쿼리를 실행하고 데이터베이스가 만든 결과 세트를 나타내는 PDOStatement 객체를 생성한다.
PDO 객체의 query() 메서드는 하나의 매개변수를 갖는다. 그것은 데이터베이스가 실행해야 하는 SQL 쿼리다.
query() 메서드가 호출되면 SQL 쿼리가 실행되고 PDOStatement 객체가 반환된다. PDOStatement 객체는 데이터베이스가 쿼리에 대해 생성한 결과 세트를 나타낸다.
$statement = $pdo->query("SELECT forename, surname FROM member");
위의 SQL 쿼리는 사이트의 모든 회원의 이름과 성을 가져온다. 이 PHP 문이 실행되면 PDO 객체는 사이트의 모든 회원의 이름과 성을 나타내는 PDOStatement 객체를 반환한다. 이 객체는 $statement라는 변수에 저장된다.
PDOStatement 객체의 fetch() 메서드는 결과 세트에서 단일 데이터 행을 가져오는 데 사용된다. 이 데이터 행은 연관 배열을 사용하여 표시되며, PHP 페이지의 이후 코드에서 사용할 수 있도록 변수에 저장된다.
$member = $statement->fetch();
쿼리가 빈 레코드 세트를 생성한다면, fetch() 메서드는 false 값을 반환한다.
쿼리가 여러 데이터 행을 만들었다면 PDOStatement 객체의 fetchAll() 메서드는 결과 세트의 모든 데이터를 인덱스 배열로 가져온다. 그 배열의 각 요소는 결과 세트에서 데이터 한 행을 나타내는 연관 배열을 가지고 있다.
$members = $statement->fetchAll();
쿼리가 빈 레코드 세트를 생성한다면, fetchAll() 메서드는 빈 배열을 반환한다.
출처 - 존 두켓, <백엔드 프로그래밍을 위한 PHP & MySQL>, Jpub, 2022