Utilizzo delle estensioni PHP PostgreSQL (pgsql, PDO_PGSQL) in ServBay
ServBay, in quanto potente ambiente locale integrato per lo sviluppo Web, offre il supporto nativo a database PostgreSQL e fornisce le estensioni PHP necessarie, rendendo semplice per gli sviluppatori connettersi e lavorare con database PostgreSQL all'interno delle applicazioni PHP. Per tutte le versioni PHP supportate, ServBay pre-installa e abilita di default le estensioni pgsql
e PDO_PGSQL
.
Introduzione alle estensioni PHP PostgreSQL
PostgreSQL è un sistema di database relazionale ad oggetti open source potente e apprezzato per la sua stabilità, integrità dei dati e ricchezza di funzionalità. Per interagire con un database PostgreSQL tramite PHP occorre utilizzare le opportune estensioni PHP. ServBay mette principalmente a disposizione due estensioni:
- Estensione
pgsql
: è l'estensione nativa di PHP per PostgreSQL, che fornisce una serie di funzioni che iniziano conpg_
(comepg_connect
,pg_query
,pg_fetch_assoc
, ecc.), offrendo un'interfaccia diretta alle funzionalità specifiche di PostgreSQL. - Driver
PDO_PGSQL
: fa parte dell'estensione PHP Data Objects (PDO) e permette la connessione a database PostgreSQL tramite PDO. PDO fornisce un livello di astrazione uniforme per l’accesso a diverse tipologie di database (tra cui PostgreSQL, MySQL, SQLite, ecc.), facilitando la scrittura di codice più portabile.
Estensioni PHP PostgreSQL in ServBay
ServBay installa con cura sia l’estensione pgsql
sia il driver PDO_PGSQL
su ogni versione PHP supportata, assicurandone l’abilitazione automatica.
Come abilitare le estensioni PostgreSQL
Con ServBay non è necessario alcun intervento manuale per abilitare le estensioni pgsql
o PDO_PGSQL
: sono già pronte all’uso e configurate, disponibili direttamente nel codice PHP.
Utilizzo di PostgreSQL nel codice PHP
Una volta attivate le estensioni richieste, puoi usare le funzioni di pgsql
o gli oggetti PDO per connetterti e operare sul database PostgreSQL.
Prerequisiti:
- Il servizio PostgreSQL deve essere in esecuzione su ServBay.
- Si suppone sia già stato creato un database denominato
servbay_db
. - Presupponiamo che tu abbia creato un utente chiamato
servbay_user
(passwordyour_password
) con i permessi appropriati suservbay_db
. - Nel database
servbay_db
esiste una tabellausers
con le colonneid
(SERIAL PRIMARY KEY),name
(VARCHAR),email
(VARCHAR),age
(INT).
Puoi utilizzare adminer integrato in ServBay oppure uno strumento di gestione database come DBeaver o pgAdmin per queste configurazioni.
Ecco degli esempi pratici di connessione e di operazioni basilari tramite i due diversi metodi:
Esempio codice (estensione pgsql
)
<?php
// --- Esempio con estensione pgsql ---
// Parametri di connessione al database
$host = "127.0.0.1"; // oppure 'localhost'
$port = "5432"; // Porta predefinita di PostgreSQL
$dbname = "servbay_db";
$user = "servbay_user";
$password = "your_password"; // Sostituisci con la tua password reale
// Composizione della stringa di connessione
$conn_string = "host={$host} port={$port} dbname={$dbname} user={$user} password={$password}";
// Connessione al database PostgreSQL
$conn = pg_connect($conn_string);
// Verifica della connessione
if (!$conn) {
die("pgsql Connessione fallita: " . pg_last_error());
}
echo "pgsql Connessione avvenuta con successo<br>";
// Inserimento dati (nota: pg_query non supporta direttamente l'associazione di parametri, occorre fare escaping manuale o usare pg_query_params per evitare SQL injection)
$name = "ServBay Pgsql";
$email = "[email protected]";
$age = 7;
// Utilizzo di pg_query_params per eseguire query parametrizzate in modo sicuro
$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: Nuovo record inserito correttamente<br>";
} else {
echo "pgsql Errore: " . pg_last_error($conn) . "<br>";
}
// Query sui dati
$query = "SELECT id, name, email, age FROM users WHERE name = $1";
$result = pg_query_params($conn, $query, array('ServBay Pgsql'));
if ($result) {
echo "pgsql Dati ottenuti:<br>";
// Controllo delle righe restituite
if (pg_num_rows($result) > 0) {
// Recupera tutte le righe come array associativo
$data = pg_fetch_all($result, PGSQL_ASSOC);
foreach ($data as $row) {
echo "id: " . $row["id"]. " - Nome: " . $row["name"]. " - Email: " . $row["email"]. " - Età: " . $row["age"]. "<br>";
}
} else {
echo "pgsql: 0 risultati trovati<br>";
}
} else {
echo "pgsql Errore nella query: " . pg_last_error($conn) . "<br>";
}
// Chiusura della connessione
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
Esempio codice (metodo PDO_PGSQL
)
<?php
// --- Esempio con PDO_PGSQL ---
// Parametri di connessione
$host = '127.0.0.1'; // oppure 'localhost'
$port = 5432; // Porta predefinita di PostgreSQL
$dbname = 'servbay_db';
$username = 'servbay_user';
$password = 'your_password'; // Sostituisci con la tua password reale
// Data Source Name (DSN) per PostgreSQL
$dsn = "pgsql:host=$host;port=$port;dbname=$dbname";
// Opzioni PDO
$options = [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, // Lancia eccezioni invece di warning
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, // Recupera record come array associativi di default
// PDO::ATTR_EMULATE_PREPARES => false, // In genere non necessario per PostgreSQL
];
try {
// Crea un'istanza PDO
$pdo = new PDO($dsn, $username, $password, $options);
echo "PDO_PGSQL Connessione avvenuta con successo<br>";
// Inserimento dati (con statement preparato)
$sql = "INSERT INTO users (name, email, age) VALUES (:name, :email, :age)";
$stmt = $pdo->prepare($sql);
$name = 'ServBay PDO Pgsql';
$email = '[email protected]';
$age = 12;
// Associa i parametri ed esegue
$stmt->execute([
':name' => $name,
':email' => $email,
':age' => $age
]);
echo "PDO_PGSQL: Nuovo record inserito correttamente<br>";
// Esecuzione query sui dati
$stmt = $pdo->prepare("SELECT id, name, email, age FROM users WHERE name = :name");
$stmt->execute([':name' => 'ServBay PDO Pgsql']);
// Recupero dei risultati
$users = $stmt->fetchAll(); // Di default FETCH_ASSOC
if ($users) {
echo "PDO_PGSQL Dati ottenuti:<br>";
foreach ($users as $row) {
echo "id: " . $row['id'] . " - Nome: " . $row['name'] . " - Email: " . $row['email'] . " - Età: " . $row['age'] . "<br>";
}
} else {
echo "PDO_PGSQL: 0 risultati trovati<br>";
}
} catch (\PDOException $e) {
// Gestione degli errori di connessione o query
throw new \PDOException($e->getMessage(), (int)$e->getCode());
}
// La connessione PDO viene di norma chiusa automaticamente a fine script; non è necessario chiamare close() esplicitamente
// $pdo = null; // Puoi assegnare null per chiudere la connessione
?>
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
Collocazione del codice: Salva uno degli esempi soprariportati come file .php
(ad es. pg_test_native.php
oppure pg_test_pdo.php
) e inseriscilo nella root del tuo sito ServBay (ad esempio /Applications/ServBay/www/myproject/
), poi visita l’URL corrispondente nel browser (ad esempio http://myproject.servbay.demo/pg_test_native.php
). Accertati che il sito Web e il servizio PostgreSQL siano correttamente configurati e avviati su ServBay.
Domande frequenti (FAQ)
D: Devo installare manualmente le estensioni PHP PostgreSQL (pgsql
o PDO_PGSQL
) su ServBay?
R: No, non è necessario. ServBay pre-installa e abilita automaticamente le estensioni pgsql
e il driver PDO_PGSQL
per tutte le versioni PHP che gestisce. Puoi usarle immediatamente senza nessuna installazione o configurazione aggiuntiva.
D: Qual è la differenza tra l’estensione pgsql
e il driver PDO_PGSQL
? Quale dovrei scegliere?
R:
- L’estensione
pgsql
mette a disposizione funzioni specifiche di PostgreSQL (pg_connect
,pg_query_params
, ecc.). Se devi sfruttare funzionalità avanzate di PostgreSQL, può risultare più diretta. PDO_PGSQL
fa parte dell’astrazione PDO. Usare PDO rende il codice più portabile: se in futuro potresti switching verso un altro database (come MySQL), le modifiche da effettuare saranno minime. Inoltre, PDO impone l’uso di prepared statement, una pratica raccomandata per la sicurezza nelle applicazioni PHP moderne.- Consiglio: Per nuovi progetti o in presenza di necessità di portabilità e sicurezza, meglio usare
PDO_PGSQL
. Se invece stai mantenendo vecchi progetti, oppure hai bisogno di funzionipgsql
specifiche, puoi optare per l’estensionepgsql
.
D: Dove trovo le informazioni necessarie per la connessione al servizio PostgreSQL su ServBay (host, porta, utente, password, nome database)?
R:
- Host: Di solito
127.0.0.1
olocalhost
. - Porta: La porta predefinita di PostgreSQL è
5432
. Puoi verificare quella effettiva nell’interfaccia di gestione dei pacchetti PostgreSQL di ServBay. - Username / Password / Nome database: Sono gli utenti, le password e i nomi di database che hai creato nel servizio PostgreSQL. Puoi utilizzare adminer integrato o altri client come pgAdmin o DBeaver per crearli e gestirne i permessi.
D: Come prevenire SQL injection se uso l’estensione pgsql
?
R: Evita assolutamente di concatenare input dell’utente direttamente nelle query SQL. Usa sempre la funzione pg_query_params()
, che separa i parametri dalla query e si occupa di gestire in modo sicuro i dati in ingresso. In alternativa, se proprio devi usare pg_query()
, esegui sempre l’escaping degli input tramite pg_escape_string()
o pg_escape_literal()
(ma la scelta migliore resta comunque pg_query_params
).
Conclusioni
Grazie alle estensioni PHP pgsql
e PDO_PGSQL
preinstallate e abilitate di default, ServBay semplifica notevolmente la connessione da PHP a PostgreSQL su macOS in ambiente locale. Gli sviluppatori non devono più preoccuparsi della configurazione o installazione di estensioni: possono concentrarsi sulla scelta dell’estensione più adatta al proprio progetto (si raccomanda PDO per sicurezza e portabilità) e iniziare subito a lavorare con la potenza di PostgreSQL nei propri servizi gestiti da ServBay. Questo permette di risparmiare tempo e di focalizzarsi maggiormente sulla logica applicativa e sulla realizzazione di Web App affidabili e performanti.