Uso de las extensiones PHP PostgreSQL (pgsql, PDO_PGSQL) en ServBay
ServBay es un potente entorno local integrado para el desarrollo web que incluye soporte nativo para bases de datos PostgreSQL y proporciona las extensiones necesarias para PHP, permitiendo a los desarrolladores conectar y manipular bases de datos PostgreSQL fácilmente desde sus aplicaciones PHP. ServBay instala y habilita por defecto las extensiones pgsql
y PDO_PGSQL
en todas las versiones de PHP que soporta.
Introducción a las extensiones PHP PostgreSQL
PostgreSQL es un sistema de base de datos relacional orientado a objetos de código abierto y gran potencia, conocido por su estabilidad, integridad de datos y conjunto de características avanzadas. Para interactuar con PostgreSQL desde PHP se requieren extensiones específicas. ServBay facilita dos principales:
- Extensión
pgsql
: Es la extensión nativa de PHP para PostgreSQL, que proporciona un conjunto de funciones que comienzan conpg_
(comopg_connect
,pg_query
,pg_fetch_assoc
, etc.) para una operación directa sobre bases de datos PostgreSQL. Permite a los desarrolladores aprovechar funciones específicas de PostgreSQL. - Controlador
PDO_PGSQL
: Forma parte de la extensión PHP Data Objects (PDO) y sirve para conectar bases de datos PostgreSQL. PDO proporciona una capa de abstracción de acceso a bases de datos, permitiendo utilizar una API uniforme con varios sistemas de bases de datos (PostgreSQL, MySQL, SQLite, etc.), lo que ayuda a escribir código más portable.
Extensiones PHP PostgreSQL en ServBay
ServBay se encarga de instalar previamente tanto la extensión pgsql
como el controlador PDO_PGSQL
para cada versión de PHP compatible, asegurando que estén habilitadas por defecto.
Cómo habilitar las extensiones PostgreSQL
En ServBay, no es necesario realizar ningún paso manual para habilitar las extensiones pgsql
o PDO_PGSQL
. Ya están configuradas y listas para usarse directamente en tu código PHP.
Uso de PostgreSQL en código PHP
Una vez habilitadas las extensiones correspondientes, puedes usar las funciones pgsql
o los objetos PDO en tu código PHP para conectar y operar sobre bases de datos PostgreSQL.
Requisitos previos:
- Debes tener el servicio PostgreSQL ejecutándose en ServBay.
- Se supone que has creado una base de datos llamada
servbay_db
. - Se supone que has creado un usuario
servbay_user
con la contraseñayour_password
y los permisos adecuados sobreservbay_db
. - Se asume que en la base de datos
servbay_db
existe una tabla llamadausers
con las columnasid
(SERIAL PRIMARY KEY),name
(VARCHAR),email
(VARCHAR), yage
(INT).
Puedes realizar la configuración anterior usando adminer incluido en ServBay o cualquier otra herramienta de administración de bases de datos (como DBeaver, pgAdmin).
A continuación se muestran ejemplos de código para conectar y realizar operaciones básicas con ambas alternativas:
Ejemplo de código (usando la extensión pgsql
)
<?php
// --- Ejemplo de extensión pgsql ---
// Parámetros de conexión a la base de datos
$host = "127.0.0.1"; // o 'localhost'
$port = "5432"; // Puerto por defecto de PostgreSQL
$dbname = "servbay_db";
$user = "servbay_user";
$password = "your_password"; // Reemplaza con tu contraseña real
// Construir la cadena de conexión
$conn_string = "host={$host} port={$port} dbname={$dbname} user={$user} password={$password}";
// Conectar a la base de datos PostgreSQL
$conn = pg_connect($conn_string);
// Verificar si la conexión fue exitosa
if (!$conn) {
die("pgsql Connection failed: " . pg_last_error());
}
echo "pgsql Connected successfully<br>";
// Insertar datos (Nota: pg_query no soporta vinculación de parámetros directamente, asegúrate de usar pg_query_params para prevenir inyecciones SQL)
$name = "ServBay Pgsql";
$email = "[email protected]";
$age = 7;
// Consulta segura con parámetros usando pg_query_params
$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: Nuevo registro creado exitosamente<br>";
} else {
echo "pgsql Error: " . pg_last_error($conn) . "<br>";
}
// Consultar datos
$query = "SELECT id, name, email, age FROM users WHERE name = $1";
$result = pg_query_params($conn, $query, array('ServBay Pgsql'));
if ($result) {
echo "pgsql Datos consultados:<br>";
// Verificar si se retornaron filas
if (pg_num_rows($result) > 0) {
// Obtener todas las filas como un array asociativo
$data = pg_fetch_all($result, PGSQL_ASSOC);
foreach ($data as $row) {
echo "id: " . $row["id"]. " - Nombre: " . $row["name"]. " - Email: " . $row["email"]. " - Edad: " . $row["age"]. "<br>";
}
} else {
echo "pgsql: 0 resultados encontrados<br>";
}
} else {
echo "pgsql Error al consultar datos: " . pg_last_error($conn) . "<br>";
}
// Cerrar la conexión a la base de datos
pg_close($conn);
?>
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
Ejemplo de código (usando PDO_PGSQL
)
<?php
// --- Ejemplo de PDO_PGSQL ---
// Parámetros de conexión a la base de datos
$host = '127.0.0.1'; // o 'localhost'
$port = 5432; // Puerto por defecto de PostgreSQL
$dbname = 'servbay_db';
$username = 'servbay_user';
$password = 'your_password'; // Reemplaza con tu contraseña real
// Nombre de fuente de datos (DSN) para PostgreSQL
$dsn = "pgsql:host=$host;port=$port;dbname=$dbname";
// Opciones de conexión PDO
$options = [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, // Lanzar excepciones en lugar de advertencias
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, // Obtener arrays asociativos por defecto
// PDO::ATTR_EMULATE_PREPARES => false, // Generalmente innecesario con PostgreSQL
];
try {
// Crear una instancia de conexión PDO
$pdo = new PDO($dsn, $username, $password, $options);
echo "PDO_PGSQL Conectado exitosamente<br>";
// Insertar datos (usando sentencias preparadas)
$sql = "INSERT INTO users (name, email, age) VALUES (:name, :email, :age)";
$stmt = $pdo->prepare($sql);
$name = 'ServBay PDO Pgsql';
$email = '[email protected]';
$age = 12;
// Vincular parámetros y ejecutar
$stmt->execute([
':name' => $name,
':email' => $email,
':age' => $age
]);
echo "PDO_PGSQL: Nuevo registro creado exitosamente<br>";
// Consultar datos
$stmt = $pdo->prepare("SELECT id, name, email, age FROM users WHERE name = :name");
$stmt->execute([':name' => 'ServBay PDO Pgsql']);
// Obtener todos los resultados
$users = $stmt->fetchAll(); // Por defecto, FETCH_ASSOC
if ($users) {
echo "PDO_PGSQL Datos consultados:<br>";
foreach ($users as $row) {
echo "id: " . $row['id'] . " - Nombre: " . $row['name'] . " - Email: " . $row['email'] . " - Edad: " . $row['age'] . "<br>";
}
} else {
echo "PDO_PGSQL: 0 resultados encontrados<br>";
}
} catch (\PDOException $e) {
// Captura y muestra errores de conexión o consulta
throw new \PDOException($e->getMessage(), (int)$e->getCode());
}
// La conexión PDO normalmente se cierra automáticamente al terminar el script, no es necesario llamar a close()
// $pdo = null; // Puedes definir explícitamente a null para cerrar
?>
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
Colocando el código: Guarda cualquiera de los ejemplos anteriores como un archivo .php
(por ejemplo, pg_test_native.php
o pg_test_pdo.php
) y colócalo en el directorio raíz de tu sitio ServBay (por ejemplo, /Applications/ServBay/www/myproject/
). Luego, accede a la URL correspondiente en tu navegador (por ejemplo, http://myproject.servbay.demo/pg_test_native.php
). Asegúrate de que tu sitio y el servicio de PostgreSQL estén correctamente configurados y ejecutándose en ServBay.
Preguntas Frecuentes (FAQ)
P: ¿Tengo que instalar manualmente las extensiones PostgreSQL de PHP (pgsql
o PDO_PGSQL
) en ServBay?
R: No. ServBay ya instala previamente y habilita tanto la extensión pgsql
como el controlador PDO_PGSQL
para todas las versiones de PHP gestionadas. Puedes usarlas directamente en tu código, sin necesidad de instalar ni configurar nada.
P: ¿Cuál es la diferencia entre la extensión pgsql
y el controlador PDO_PGSQL
? ¿Cuál debo usar?
R:
- La extensión
pgsql
ofrece un conjunto de funciones específicas para PostgreSQL (comopg_connect
,pg_query_params
). Si necesitas acceder a características particulares de PostgreSQL de forma nativa, puede ser más directo usarla. PDO_PGSQL
forma parte de la capa de abstracción PDO. Usar PDO permite que tu código de base de datos sea más portable, facilitando migraciones futuras a otras bases de datos (como MySQL) con mínimos cambios. Además, PDO obliga al uso de sentencias preparadas, lo cual es una práctica recomendada de seguridad en el desarrollo PHP moderno.- Recomendación: Para proyectos nuevos o aquellos donde busques portabilidad y seguridad, se recomienda utilizar
PDO_PGSQL
. Si mantienes un proyecto antiguo o necesitas funciones específicas depgsql
, puedes optar por la extensiónpgsql
.
P: ¿Cómo consigo la información necesaria (host, puerto, usuario, contraseña, nombre de base de datos) para conectar al servicio PostgreSQL de ServBay?
R:
- Host: Normalmente
127.0.0.1
olocalhost
. - Puerto: El puerto estándar de PostgreSQL es
5432
. Puedes confirmarlo desde la interfaz de administración de paquetes de PostgreSQL en ServBay. - Usuario / Contraseña / Nombre de base de datos: Son los que configuras al crear la base de datos y el usuario en el servicio PostgreSQL. Puedes utilizar el adminer incorporado en ServBay o cualquier cliente PostgreSQL (como pgAdmin o DBeaver) para gestionar bases de datos, usuarios y permisos.
P: ¿Cómo prevengo la inyección SQL al usar la extensión pgsql
?
R: Evita concatenar directamente la entrada del usuario en las cadenas de consulta SQL. Utiliza la función pg_query_params()
, que permite separar la consulta y los parámetros, dejando que el controlador maneje correctamente el escape de los valores. O, si usas pg_query()
, asegúrate de escapar todas las entradas con pg_escape_string()
o pg_escape_literal()
(aunque pg_query_params
es generalmente una opción mucho más segura).
Conclusión
ServBay simplifica notablemente el proceso de conexión entre PHP y PostgreSQL en entornos locales de macOS, al preinstalar y habilitar por defecto las extensiones pgsql
y PDO_PGSQL
. Esto permite a los desarrolladores olvidarse de la instalación y configuración de extensiones, y centrarse directamente en escribir lógica de aplicación, eligiendo la extensión que mejor se adapte a las necesidades del proyecto (se recomienda utilizar PDO para mayor compatibilidad y seguridad). Así, puedes aprovechar al máximo la potencia de PostgreSQL y crear aplicaciones web fiables y eficientes.