¿Por qué PHP y PostgreSQL son amor a primera consulta?
\n\nEl mundo del desarrollo web está lleno de estereotipos. Uno de ellos dice: «PHP solo es amigo de MySQL». Hay algo de verdad en esto, pero solo hasta que pruebas la combinación PHP y PostgreSQL. Es como pasar de una bicicleta a una moto deportiva: las mismas ruedas, pero la velocidad, maniobrabilidad y fiabilidad son completamente diferentes.
\n\nPostgreSQL no es solo una base de datos. Es un monstruo objeto-relacional que sabe trabajar con JSON, datos geoespaciales, búsqueda de texto completo y transacciones complejas. Y PHP es el director de orquesta ideal para este conjunto. En esta guía lo desglosaremos todo: desde la instalación del controlador hasta la escritura de código listo para producción. ¡Allá vamos!
\n\n1. Instalación y configuración: preparando las herramientas
\n\nAntes de escribir código, asegurémonos de que PHP sabe de la existencia de PostgreSQL. En la mayoría de las distribuciones modernas de PHP (por ejemplo, XAMPP, OpenServer, Docker) la extensión pdo_pgsql ya está presente, pero hay que activarla.
1.1. Habilitamos la extensión en php.ini
\n\nAbra su archivo php.ini y descomente (quite el punto y coma al inicio) la línea:
extension=pdo_pgsql\n\nSi usa Linux, la instalación se ve así:
\n\nsudo apt-get install php-pgsql\nsudo service apache2 restart # o nginx + php-fpm\n\n1.2. Creamos la base de datos y el usuario
\n\nEntramos en la consola de PostgreSQL:
\n\nsudo -u postgres psql\n\nAhora creamos una base de datos y un usuario para nuestro proyecto:
\n\nCREATE DATABASE pythonlib_blog;\nCREATE USER myapp WITH PASSWORD 'SuperSecret123';\nGRANT ALL PRIVILEGES ON DATABASE pythonlib_blog TO myapp;\n\\q\n\nListo. Ahora tenemos una base de datos pythonlib_blog y un usuario myapp.
2. Primera conexión: PDO como estándar
\n\nNunca use las funciones antiguas pg_connect(). En PHP moderno existe PDO (PHP Data Objects) — una interfaz unificada para trabajar con diferentes BD. Es más seguro, más cómodo y soporta consultas preparadas.
2.1. Clase envoltorio para la conexión
\n\nCreemos una clase simple Database que gestione la conexión:
<?php\n\nclass Database {\n private static ?PDO $instance = null;\n private const DB_HOST = 'localhost';\n private const DB_PORT = 5432;\n private const DB_NAME = 'pythonlib_blog';\n private const DB_USER = 'myapp';\n private const DB_PASS = 'SuperSecret123';\n\n public static function getConnection(): PDO {\n if (self::$instance === null) {\n $dsn = "pgsql:host=" . self::DB_HOST . ";port=" . self::DB_PORT . ";dbname=" . self::DB_NAME;\n try {\n self::$instance = new PDO($dsn, self::DB_USER, self::DB_PASS, [\n PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,\n PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,\n PDO::ATTR_EMULATE_PREPARES => false,\n ]);\n } catch (PDOException $e) {\n die("Connection failed: " . $e->getMessage());\n }\n }\n return self::$instance;\n }\n}\n\n¿Por qué es genial? Primero, el singleton — no creamos una nueva conexión en cada solicitud. Segundo, ATTR_EMULATE_PREPARES => false obliga a PostgreSQL a usar consultas preparadas reales, no una emulación del lado de PHP. Esto mejora el rendimiento y la seguridad.
3. Operaciones CRUD: crear, leer, actualizar, eliminar
\n\nAhora lo importante. Supongamos que tenemos una tabla articles para los artículos de pythonlib.ru.
3.1. Creación de la tabla
\n\nEjecute este SQL en su BD (a través de psql o el panel de administración):
\n\nCREATE TABLE articles (\n id SERIAL PRIMARY KEY,\n title VARCHAR(255)