ServBay에서 PHP PostgreSQL 확장 사용하기 (pgsql, PDO_PGSQL)
ServBay는 강력한 통합형 로컬 웹 개발 환경으로, PostgreSQL 데이터베이스 지원을 내장하고 있으며 PHP에서도 필요한 확장을 제공하여 개발자가 PHP 애플리케이션에서 PostgreSQL 데이터베이스에 손쉽게 연결하고 조작할 수 있도록 합니다. ServBay는 모든 지원되는 PHP 버전에 대해 pgsql
과 PDO_PGSQL
확장을 사전 설치 및 기본 활성화하여 제공합니다.
PHP PostgreSQL 확장 개요
PostgreSQL은 안정성, 데이터 무결성 및 풍부한 기능 세트로 잘 알려진 오픈소스 객체-관계형 데이터베이스 시스템입니다. PHP에서 PostgreSQL 데이터베이스와 상호작용하려면 관련 PHP 확장이 필요합니다. ServBay는 크게 두 가지 확장을 제공합니다:
pgsql
확장: PHP의 기본 PostgreSQL 확장으로,pg_
로 시작하는 함수들(예:pg_connect
,pg_query
,pg_fetch_assoc
등)을 통해 PostgreSQL 데이터베이스를 직접 조작할 수 있습니다. PostgreSQL 고유의 기능을 활용할 수 있습니다.PDO_PGSQL
드라이버: PHP Data Objects(PDO) 확장에 포함된 PostgreSQL 전용 드라이버입니다. PDO는 다양한 데이터베이스(MySQL, SQLite, PostgreSQL 등)에 대해 일관된 API를 제공하므로, 보다 이식성 높은 코드를 작성하는 데 도움이 됩니다.
ServBay의 PHP PostgreSQL 확장
ServBay는 모든 지원 PHP 버전에 대해 pgsql
확장과 PDO_PGSQL
드라이버를 사전 설치 및 기본적으로 활성화해 둡니다.
PostgreSQL 확장 활성화 방법
ServBay를 사용하면 pgsql
또는 PDO_PGSQL
확장을 활성화하기 위해 별도의 수동 설정이 필요 없습니다. 이미 설정되어 있으므로 PHP 코드에서 바로 사용할 수 있습니다.
PHP 코드에서 PostgreSQL 사용하기
관련 확장이 활성화된 상태라면, PHP 코드 내에서 pgsql
함수 혹은 PDO 객체를 이용해 PostgreSQL 데이터베이스에 연결 및 조작할 수 있습니다.
사전 조건:
- ServBay 내에서 PostgreSQL 서비스가 실행되고 있어야 합니다.
servbay_db
라는 데이터베이스가 생성되어 있다고 가정합니다.servbay_user
라는 사용자(비밀번호:your_password
)가 생성되어 있고 해당 데이터베이스 접근 권한을 가지고 있다고 가정합니다.servbay_db
내에users
테이블이 존재한다고 가정합니다. 이 테이블에는id
(SERIAL PRIMARY KEY),name
(VARCHAR),email
(VARCHAR),age
(INT) 컬럼이 있습니다.
위 설정은 ServBay 내장 adminer 또는 DBeaver, pgAdmin 같은 기타 데이터베이스 관리 도구로 완료하실 수 있습니다.
다음은 두 가지 방식으로 데이터베이스에 연결하고 기본 조작을 수행하는 예제 코드입니다.
예제 코드 (pgsql
확장 사용)
php
<?php
// --- pgsql 확장 예제 ---
// 데이터베이스 연결 파라미터
$host = "127.0.0.1"; // 또는 'localhost'
$port = "5432"; // PostgreSQL의 기본 포트
$dbname = "servbay_db";
$user = "servbay_user";
$password = "your_password"; // 실제 비밀번호로 변경
// 연결 문자열 생성
$conn_string = "host={$host} port={$port} dbname={$dbname} user={$user} password={$password}";
// PostgreSQL 데이터베이스에 연결
$conn = pg_connect($conn_string);
// 연결 성공 여부 확인
if (!$conn) {
die("pgsql Connection failed: " . pg_last_error());
}
echo "pgsql Connected successfully<br>";
// 데이터 삽입 (참고: pg_query는 바인딩 파라미터를 직접 지원하지 않으니, 수동으로 이스케이프하거나, pg_query_params 사용 권장)
$name = "ServBay Pgsql";
$email = "[email protected]";
$age = 7;
// 안전한 파라미터화 쿼리 실행
$query = "INSERT INTO users (name, email, age) VALUES ($1, $2, $3)";
$result = pg_query_params($conn, $query, array($name, $email, $age));
if ($result) {
echo "pgsql: New record created successfully<br>";
} else {
echo "pgsql Error: " . pg_last_error($conn) . "<br>";
}
// 데이터 조회
$query = "SELECT id, name, email, age FROM users WHERE name = $1";
$result = pg_query_params($conn, $query, array('ServBay Pgsql'));
if ($result) {
echo "pgsql Queried data:<br>";
// 결과 행 존재 여부 확인
if (pg_num_rows($result) > 0) {
// 결과를 연관 배열로 모두 가져오기
$data = pg_fetch_all($result, PGSQL_ASSOC);
foreach ($data as $row) {
echo "id: " . $row["id"]. " - Name: " . $row["name"]. " - Email: " . $row["email"]. " - Age: " . $row["age"]. "<br>";
}
} else {
echo "pgsql: 0 results found<br>";
}
} else {
echo "pgsql Error querying data: " . pg_last_error($conn) . "<br>";
}
// 데이터베이스 연결 종료
pg_close($conn);
?>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
예제 코드 (PDO_PGSQL
사용)
php
<?php
// --- PDO_PGSQL 예제 ---
// 데이터베이스 연결 파라미터
$host = '127.0.0.1'; // 또는 'localhost'
$port = 5432; // PostgreSQL의 기본 포트
$dbname = 'servbay_db';
$username = 'servbay_user';
$password = 'your_password'; // 실제 비밀번호로 변경
// PostgreSQL용 데이터 소스 명(DSN)
$dsn = "pgsql:host=$host;port=$port;dbname=$dbname";
// PDO 연결 옵션
$options = [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, // 예외 발생
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, // 기본값: 연관 배열
// PDO::ATTR_EMULATE_PREPARES => false, // PostgreSQL에서는 보통 불필요
];
try {
// PDO 연결 인스턴스 생성
$pdo = new PDO($dsn, $username, $password, $options);
echo "PDO_PGSQL Connected successfully<br>";
// 데이터 삽입 (Prepared Statement 사용)
$sql = "INSERT INTO users (name, email, age) VALUES (:name, :email, :age)";
$stmt = $pdo->prepare($sql);
$name = 'ServBay PDO Pgsql';
$email = '[email protected]';
$age = 12;
// 파라미터 바인딩 및 실행
$stmt->execute([
':name' => $name,
':email' => $email,
':age' => $age
]);
echo "PDO_PGSQL: New record created successfully<br>";
// 데이터 조회
$stmt = $pdo->prepare("SELECT id, name, email, age FROM users WHERE name = :name");
$stmt->execute([':name' => 'ServBay PDO Pgsql']);
// 모든 결과 가져오기
$users = $stmt->fetchAll(); // 기본 FETCH_ASSOC 사용
if ($users) {
echo "PDO_PGSQL Queried data:<br>";
foreach ($users as $row) {
echo "id: " . $row['id'] . " - Name: " . $row['name'] . " - Email: " . $row['email'] . " - Age: " . $row['age'] . "<br>";
}
} else {
echo "PDO_PGSQL: 0 results found<br>";
}
} catch (\PDOException $e) {
// 연결 또는 쿼리 오류 시 예외 처리
throw new \PDOException($e->getMessage(), (int)$e->getCode());
}
// 스크립트 종료 시 PDO 연결은 자동 해제됨. 별도 close() 필요 없음.
// $pdo = null; // 명시적으로 해제 가능
?>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
코드 배치 방법:
위 예제 코드 중 하나를 .php
파일(예: pg_test_native.php
또는 pg_test_pdo.php
)로 저장하고, ServBay 웹사이트의 루트 디렉토리(예: /Applications/ServBay/www/myproject/
)에 놓은 후 브라우저에서 해당 URL(예: http://myproject.servbay.demo/pg_test_native.php
)로 접속하세요. 사이트와 PostgreSQL 서비스가 ServBay에서 올바르게 설정 및 실행되고 있어야 합니다.
자주 묻는 질문 (FAQ)
Q: ServBay에서 PHP의 PostgreSQL 확장(pgsql
또는 PDO_PGSQL
)을 직접 설치해야 하나요?
A: 별도 설치가 필요 없습니다. ServBay는 관리하는 모든 PHP 버전에 대해 pgsql
확장과 PDO_PGSQL
드라이버를 사전 설치 및 기본 활성화합니다. 추가 설치나 설정 없이 바로 코드에서 사용 가능합니다.
Q: pgsql
확장과 PDO_PGSQL
드라이버의 차이점은 무엇이며, 어떤 것을 사용해야 할까요?
A:
pgsql
확장은 PostgreSQL 전용 함수들(예:pg_connect
,pg_query_params
등)을 제공합니다. PostgreSQL 특화 기능을 깊이 사용하려면 더 직접적입니다.PDO_PGSQL
은 PDO 추상화 계층의 일부입니다. PDO를 사용하면 데이터베이스 코드를 더 이식성 있게 만들 수 있으며, 향후 MySQL 등 다른 DB로 전환할 때 변경 사항이 적습니다. PDO는 준비된 문장(Prepared Statement) 사용을 강제하여 보안 측면에서도 유리합니다.- 추천: 신규 프로젝트이거나 코드 이식성과 보안성을 중시한다면
PDO_PGSQL
사용을 추천합니다. 기존 프로젝트 유지 또는 특수한pgsql
함수 사용이 필요한 경우pgsql
확장도 사용할 수 있습니다.
Q: ServBay의 PostgreSQL 서비스에 접속하는 데 필요한 정보(호스트, 포트, 사용자명, 비밀번호, 데이터베이스 이름)는 어떻게 확인하나요?
A:
- 호스트(Host): 일반적으로
127.0.0.1
또는localhost
입니다. - 포트(Port): PostgreSQL 기본 포트는
5432
입니다. 실제 포트는 ServBay의 PostgreSQL 패키지 관리 화면에서 확인할 수 있습니다. - 사용자명/비밀번호/데이터베이스명: PostgreSQL에서 직접 생성한 것들입니다. ServBay 내장 adminer 또는 pgAdmin, DBeaver 등 다른 PostgreSQL 클라이언트 툴로 데이터베이스, 사용자, 비밀번호 및 권한을 생성·설정할 수 있습니다.
Q: pgsql
확장 사용 시 SQL 인젝션은 어떻게 방지할 수 있나요?
A: 사용자 입력값을 직접 SQL 쿼리 문자열에 연결하지 마세요. 반드시 pg_query_params()
함수를 사용하여 쿼리와 파라미터를 분리하면, 드라이버가 파라미터를 안전하게 처리합니다. 또는 pg_query()
사용 시에는 입력값을 pg_escape_string()
또는 pg_escape_literal()
로 이스케이프 처리해 주세요(pg_query_params
방식이 훨씬 권장됩니다).
결론
ServBay는 PHP의 pgsql
및 PDO_PGSQL
확장을 사전 설치하고 기본 활성화하여, macOS 로컬 환경에서 PHP로 PostgreSQL 데이터베이스에 연결하는 과정을 크게 단순화합니다. 개발자는 확장 설치 및 설정 걱정 없이, 프로젝트에 맞는 적합한 확장(이식성과 보안성을 위해 PDO 권장)을 선택하여 ServBay에서 관리되는 PostgreSQL 서비스를 손쉽게 사용할 수 있습니다. 덕분에 개발자는 애플리케이션 로직에 더욱 집중하면서, PostgreSQL의 강력한 기능을 활용해 신뢰성 높은 웹 앱을 빠르게 구축할 수 있습니다.