domenica, gennaio 02, 2011

Basi di Dati: PHP e Database

PHP e Database

Esistono librerie di accesso ad un DB, oppure librerie che cercano di standardizzare l'accesso a tutti i DB (es. Pear).

MySQL

mysql_connect

resource mysql_connect ([ string $server = ini_get("mysql.default_host") [, string $username = ini_get("mysql.default_user") [, string $password = ini_get("mysql.default_password") [, bool $new_link = false [, int $client_flags = 0 ]]]]] )
Tenta la connessione ad un db

mysql_pconnect

Tenta la connessione ad un db, é persistente, cioè fa connection pooling

mysql_select_db

bool mysql_select_db ( string $database_name [, resource $link_identifier ] )
permette di scegliere il db a cui connettersi tra quelli ospitati sul server.

mysql_query

resource mysql_query ( string $query [, resource $link_identifier ] )
Invia una query. $query deve essere una stringa sql valida. Rende un puntatore all'area di memoria che contiene i dati.

Posso anche richiamare mysql_num_rows(puntatoreresodaquery) per sapere il numero di righe ritornate da una select o mysql_affected_rows(puntatoreresodaquery)

mysql_fetch_array

array mysql_fetch_array ( resource $result [, int $result_type = MYSQL_BOTH ] )
Legge un record risposto dalla query e lo carica in un array. Il parametro result_type può valere MYSQL_ASSOC (nome del campo come indice dell'array), MYSQL_NUM (indice dell'array numerico) o MYSQL_BOTH (entrambi, default).
Dopo avere chiamato mysql_query richiamo mysql_fetch_array per caricare il primo record e il cursore della query passa avanti al secondo record (se c'è). Quando non viene trovato il record viene ritornato un array vuoto (o null). Tipicamente si fa:

while ($row = mysql_fetch_array(…

mysql_free_result

Libera I risultati letti da una query

mysql_close

Chiude la connessione al database

Postregs

pg_connect

resource pg_connect ( string $connection_string [, int $connect_type ] )
Connette ad un database, prevede una stringa di connessione.
La stringa di connessione si compone di tante coppie nomevalore=valore separate da spazi. Valori possibili: host, port, dbname, user, password.
Es.: pg_connect("host=myhost port=1000 dbname=mydb user=michele password=michpass")

pg_pconnect

Analogo a pg_connect, ma persistente con connection pooling.

pg_query

Anche in questo caso ha delle funzioni per contare le righe ritornate: pg_num_rows, pg_affected_rows

pg_fetch_array

array pg_fetch_array ( resource $result [, int $row [, int $result_type ]] )
Effettua il fetch in un array. E' possibile specificare il tipo di array ritornato con le costanti: PGSQL_ASSOC, PGSQL_NUM e PGSQL_BOTH

pg_free_result

pg_close

PHP e Pear

Pear sta per Php Extension and Application Repository
Insieme di pacchetti molto ampio (posta elettronica, xml, database)
Va installata l'applicazione di Pear. Dopodiché da linea di comando si possono decidere quali pacchetti di pear installare

Pear e Database

Devo mettere nei file php che lo usano: require_once "DB.php";

connect

Si passa una uri per connettersi ad un database. dbtype://username:password@protocol+hosts/database?options=value
Es: "pgsql://michele:michipass@localhost/bdd"
Connessione:
$db = DB::connect("pgsql://michele:michipass@localhost/bdd");

Subito dopo i metodi di pear sarebbe opportuno richiamare DB::isError($db) per verificare eventuali errori.

query()

query($query, $par=array())
Restituisce false se non ci sono risultati, altrimenti un oggetto con i risultati della richiesta.
$query è una stringa sql, ma al posto dei valori delle where è opportuno mettere il carattere ? così facendo si crea un parametro. Il valore dei parametri viene passato nel successivo argomento.

limitQuery()

limitQuery($query, $from, $count, $par=array())
Come query, ma ritorna solo un certo numero di record, precisamente $count record a partire da $from.

prepare()/execute()

$s=prepare($query)
$result=execute($s, $params=array())
Prepare analizza una query senza inviarla al server. Execute la invia al server.

simpleQuery()

Per le query che non rendono risultati (esempio una CREATE TABLE)

Modalità di fetch

Ho 3 modalità di fetch: DB_FETCHMODE_ORDERED (array con indice numerico), DB_FETCHMODE_ASSOC (array con chiave nome del campo), DB_FETCHMODE_OBJECT (oggetto, anche definito dal programmatore.
Posso impostare la modalità di fetch a livello di connessione (per tutte le query): $db->setFetchMode(DB_FETCHMODE_...); (con $db risultato della DB::connect)
oppure a livello di singola riga: $riga = $result->fetchRow(DB_FETCHMODE_...); oppure $result->fetchInto($riga, DB_FETCHMODE_...); (con $result pari al ritornato dal metodo query)

Per effettuare il fetch in un oggetto user-defined (definito dal programmatore) devo usare $db->setFetchMode(DB_FETCHMODE_OBJECT, "nomeClasse"). L'oggetto deve evere un singolo costruttore che riceve un array (con chiave = nome dei campi)

Nessun commento: