Skip navigation.

ADOdb Tutorial in Italian

  		Tu dici eether ed io dico eyether,
  		dici neether ed io dico nyther;  
		Eether, eyether, neether, nyther - 
		scappiamo da tutta questa cosa ! 

Tu dici eether ed io dico eyether, dici neether ed io dico nyther; Eether, eyether, neether, nyther - scappiamo da tutta questa cosa !

Amo questa canzone, particolarmente la versione di canto in duetto di Louis Armstrong e di Ella. È la storia di quanto sia difficile per due persone in amore essere compatibili. È il compromesso e l'individuazione della terra comune ed è quello che è in sostanza questo articolo.

PHP è sinonimo di facile e divertente generazione di Siti Web dinamici. Per generare questi Siti Web noi abbiamo bisogno di utilizzare le basi di dati per richiamare le informazioni di inizio attività, per spruzzare le notizie dinamiche sul Web page e per immagazzinare i post dei forum. Così diciamo che stavamo usando il DBMS popolare "MySQL" per questo. La vostra azienda ha fatto un lavoro così fantastico che il Sito Web è più popolare di quello dei vostri sogni più incredibili. E trovate che MySQL non ti permette scalbilità per controllare la quota di lavoro; tempo di cambiare le DBMS.

Purtroppo in PHP ogni DBMS è raggiunta un po'diversamente. Per collegarvi a MySQL, usereste mysql_connect(); quando decidete di fare un update ad Oracle o a Microsoft SQL Server, usereste ocilogon() o mssql_connect() rispettivamente. a cosa peggiore è che i parametri che usate per differenti funzioni di connessione sono ancora differenti. Una base di dati dice patata, l'altra base di dati dice pa-tah-taa. OH-OH.

Non scappiamo da tutta questa cosa!

Una libreria d'involucro (wrapper) per DBMS quale è ADODB viene in aiuto quando dovete assicurare la portabilità. Vi fornisce utilizzando delle common API una comunicazione con tutti i DBMS supportati in modo da non scappare da questa cosa.

ADODB sta per Active Data Objects DataBase (spiacenti, ma gli smanettoni (computer guys) non sono a volte molto originali). ADODB attualmente sostiene MySQL, PostgreSQL, Oracle, Interbase, Microsoft SQL SERVER, Access, FoxPro, Sybase, ODBC ed ADO. Tu puoi fare il download di ADODB da adodb.sourceforge.net.

Esempio Di MySQL

Il database più comunemente usata con PHP è MySQL, suppongo che dovreste avere familiarità con il seguente codice. Connette il server di MySQL in localhost, e al database mydb, ed esegue una espressione SELECT in SQL. I risultati sono stampati, una linea per riga.

$db = mysql_connect("localhost", "root", "password");
mysql_select_db("mydb",$db);
$result = mysql_query("SELECT * FROM employees",$db);
if ($result === false) die("failed"); 
while ($fields = mysql_fetch_row($result)) {
 for ($i=0, $max=sizeof($fields); $i < $max; $i++) {
        print $fields[$i].' ';
 }
 print "<br>n";
} 

Il suddetto codice è stato colorato per sezione. La prima sezione è la fase del collegamento. Il secondo è l'esecuzione dell'SQL e l'ultima sezione sta visualizzando i campi. Il ciclo while esplora le righe del risultato, mentre il ciclo for esplora i campi in una fila.

Qui è il codice equivalente in ADODB

	 
 include("adodb.inc.php");
 $db = NewADOConnection('mysql');
 $db->Connect("localhost", "root", "password", "mydb");
 $result = $db->Execute("SELECT * FROM employees");
 if ($result === false) die("failed");  
 while (!$result->EOF) {
    for ($i=0, $max=$result->FieldCount(); $i < $max; $i++)
           print $result->fields[$i].' ';
    $result->MoveNext();
    print "<br>n";
 } 

Ora effettuare il porting su Oracle è semplice quanto cambianre la seconda linea in NewADOConnection('oracle'). Continuiamo con il codice...

Connessione al DBMS

include("adodb.inc.php");
	  $db = NewADOConnection('mysql');
	  $db->Connect("localhost", "root", "password", "mydb");

Il codice della connessione è ancora un poco più sofisticato di MySQL perché i nostri bisogni sono più specializzati. In ADODB, usiamo un metodo orientato agli oggetti per gestire la complessità del controllo al supporto di DBMS multipli. Abbiamo diverse classi per controllare differenti database. Se non avete dimestichezza di con la programmazione Object Oriented, non vi preoccupate -- la complessità è interamente nascosta dalla funzione NewADOConnection().

Per risparmiare memoria, carichiamo soltanto lo specifico codice PHP relativo al databasea cui vi state collegando. Facciamo questo chiamando NewADOConnection(databasedriver). I database driver che potete utilizzare sono mysql, mssql, oracle, oci8, postgres, sybase, vfp, access, ibase e molti altri.

Allora generiamo una nuova istanza della classe di connessione chiamando NewADOConnection(). Infine connettiamoci al DBMS usando $db->Connect().

Esecuzione di query SQL

$result = $db->Execute("SELECT * FROM employees");
if ($result === false) die("failed")
;

Trasmettendo imediatamente la query SQL al server. Execute() restituirà un oggetto recordset ad esecuzione riuscita. Dovrete controllare $result come facciamo sopra.

Una questione che confonde i principianti è il fatto che abbiamo due tipi di oggetti in ADODB, l'oggetto connessione l'oggetto recordset. Quando usiamo ognuno?

L'oggetto connessione ($db) è responsabile del collegamento al database, della formattazione della vostra query SQL e dell'interrogazione del server del database. L'oggetto recordset ($result) è responsabile del recupero dei risultati e della formattazione della risposta come testo o come array.

L'unica cosa che devo aggiungere è che ADODB fornisce parecchie funzioni di aiuto per formattare query INSERT e UPDATE più facilimente, che rivedremo nella sezione avanzata.

Recupero dei dati

while (!$result->EOF) {
   for ($i=0, $max=$result->FieldCount(); $i < $max; $i++)
       print $result->fields[$i].' ';
   $result->MoveNext();
   print "<br>n";
}

Il paradigma per ottenere i dati è come la lettura di un file. Per ogni linea, controlliamo in primo luogo se abbiamo raggiunto la fine del file (EOF). se non siamo alla fine del file, fai un ciclo attraverso ogni campo nella fila. Poi muoviti alla linea seguente (MoveNext) e ripeti.

$result->fields[] è l'array generato dall'estensione per database di PHP. Alcune estensioni per database non indicizzano l'array con il nome del campo. Per forzare l'indicizzazione per nome - che è un array associativo - usi la variabile globale $ADODB_FETCH_MODE .

	$ADODB_FETCH_MODE = ADODB_FETCH_NUM;
	$rs1 = $db->Execute('select * from table');
	$ADODB_FETCH_MODE = ADODB_FETCH_ASSOC;
	$rs2 = $db->Execute('select * from table');
	print_r($rs1->fields); // shows array([0]=>'v0',[1] =>'v1')
	print_r($rs2->fields); // shows array(['col1']=>'v0',['col2'] =>'v1')

Come potete vedere nell' esempio sopra, entrambi i recordsets immagazzinano ed usano differenti tipi di prelevamento in base al settaggio di $ADODB_FETCH_MODE quando il recordset è stato generato da Execute().

ADOConnection

E' un oggeto che realizza la connessione al database, esegue le query SQL ed ha un insieme delle funzioni pratiche per la standardizzazione delle query SQL per le problemi quali la concatenazione la formattazione delle date.

Altre Funzioni Utili

$recordset->Move($pos) ti sposta a quella fila particolare. ADODB supporta lo spostamento in avanti per tutti i database. Riguardo qualche database non supporterà gli spostamenti all'indietro. Ciò non è normalmente un problema potete fare un caching sempre dei record per simulare lo spostamento indietro.

$recordset->RecordCount() restituisce il numero di record interessati dalla query SQL. Alcuni database restituiranno -1 perché non è supportato.

$recordset->GetArray() restituisce il risultato come un array.

rs2html($recordset) iè una funzione che genera una tabella in linguaggio HTML basata sul $recordset passato ad essa. Un esempio con le linee relative in grassetto:

   include('adodb.inc.php'); 
   include('tohtml.inc.php'); /* includes the rs2html function */
   $conn = &ADONewConnection('mysql'); 
   $conn->PConnect('localhost','userid','password','database');
   $rs = $conn->Execute('select * from table');
   rs2html($rs); /* recordset to html table */ 

Ci sono molte altre funzioni di aiuto che sono elencate nella documentazione disponibile all'indirizzo http://phplens.com/adodb/.

Materiale Avanzato

Insert e Update

Diciamo che desiderate inserire i seguenti dati in un database.

ID = 3
TheDate=mktime(0,0,0,8,31,2001) /* 31st August 2001 */
Note= sugar why don't we call it off

Quando vi muovete verso un'altro database, la vostra query INSERT potrebbe non funzionare più.

Il primo problema è che ogni database utilizza un diverso formato per le date di default. MySQL pretende il formato YYYY-MM-DD, mentre altri database hanno differenti formati di default. ADODB ha una funzione denominata DBDate() che indirizza questo problema alla conversione della data nel formato corretto.

Il problema seguente è che il testo in Note non deve essere citato (messo tra virgolette). In MySQL, non non citiamo ma in alcuni altri database (Sybase, Access, Microsoft SQL Server) citiamo. La funzione che indirizza questo problema è qstr().

Così come usiamo le funzioni? Come questo:

$sql = "INSERT INTO table (id, thedate,note) values (" 
   . $ID . ','
   . $db->DBDate($TheDate) .','
   . $db->qstr($Note).")";
$db->Execute($sql);

ADODB supporta anche $connection->Affected_Rows() (ritorna il numero di record interessati dall'ultimo UPDATE o DELETE) e $recordset->Insert_ID() (ritorna l'ultimo il numero autoincrementato generato da una query INSERT). Vi avviso che non tutti i database non supportano queste due funzioni.

MetaTipi

Potete scoprire ulteriori informazioni su ciascuno dei campi (uso le parole campi e colonne come sinonimo) che state selezionando chiamando il metodo dell'oggetto recordset FetchField($fieldoffset). Ciò restituirà un oggetto con 3 proprietà: nome, tipo e la massima lunghezza.

Per esempio:
$recordset = $conn->Execute("select adate from table");
$f0 = $recordset->FetchField(0);

Allora $f0->name conterrà 'adata', $f0->type conterrà 'date'.Se la massima lunghezza(max_length) è sconosciuta, sarà settata a -1. Un problema con la gestione di database differenti è che ogni base di dati denomina lo stesso tipo con un nome differente. Per esempio il tipo del timestamp è denominato datetime in una base di dati e time in un altro. Così ADODB ha uno speciale MetaType($type, $$max_length) funzioni che standardizza i tipi a quanto segue:

Un problema con la gestione di database differenti è che ogni base di dati denomina lo stesso tipo con un nome differente. Per esempio il tipo timestamp è denominato datetimein un database e time in un altro. Così ADODB ha una speciale funzione MetaType($type, $max_length) che standardizza i tipi a quanto segue:

C: tipi char e varchar
X: text o una lunga parola (es. più di 255 bytes).
B: blob o immagine binary
D: data
T: timestamp
L: boolean
I: intero
N: numerico (float, double, money)

Nel suddetto esempio della data,

$recordset = $conn->Execute("select adate from table");
$f0 = $recordset->FetchField(0);
$type = $recordset->MetaType($f0->type, $f0->max_length);
print $type; /* should print 'D'
*/

Supporto per la selezione limitata

ADODB ha una funzione denominata $connection->SelectLimit($sql,$nrows,$offset) che permette di recuperare un sotto insieme del recordset. Questa approfitta della nativa SELECT TOP dei prodotti Microsoft e di SELECT ... LIMIT con PostgreSQL e MySQL, e emula se il DBMS utilizzato non lsupporta questo genere di query.

Supporto al Caching

ADODB permette di fare il caching dei vostri recordset nel vostro filesystem, e solo richiamando il server del vostro DBMS dopo un certo periodo di tempo con $connection->CacheExecute($secs2cache,$sql) and $connection->CacheSelectLimit($secs2cache,$sql,$nrows,$offset).

Supporto alla gestione della Sessione in PHP4

ADODB inoltre supporta i gestori di sessione PHP4. Tu puoi immagazzinare le tue variabili di sessione in un database per aumentare la scalabilità utilizzando ADODB. Per ulteriori informazioni, visitando http://phplens.com/phpeverywhere/node/view/37

L'uso commerciale è incoraggiato

Se progettate scrivere le applicazioni commerciali di PHP che desiderate rivendere, dovreste considerare ADODB.È stato liberato sotto la licenza lesser GPL, che significa che puoi integrare esso in applicazioni commerciali, continuando queste ultime a mantenere il loro codice proprietario. L'uso commerciale di ADODB è fortemente consigliato ! Lo stiamo usando internamente per questo motivo.

Conclusioni

Come ringraziamento per aver letto tutto questo articolo, qui pubblichiamo il testo completo della canzone let's call the whole thing off.

   Ritornello 

You say eether and I say eyether, You say neether and I say nyther; Eether, eyether, neether, nyther - Let's call the whole thing off !
You like potato and I like po-tah-to, You like tomato and I like to-mah-to; Potato, po-tah-to, tomato, to-mah-to - Let's call the whole thing off !
But oh, if we call the whole thing off, then we must part. And oh, if we ever part, then that might break my heart.
So, if you like pajamas and I like pa-jah-mas, I'll wear pajamas and give up pa-jah-mas. For we know we Need each other, so we Better call the calling off off. Let's call the whole thing off !
Secondo ritornello
You say laughter and I say lawfter, You say after and I say awfter; Laughter, lawfter, after, awfter - Let's call the whole thing off !
You like vanilla and I like vanella, You, sa's'parilla and I sa's'parella; Vanilla, vanella, choc'late, strawb'ry - Let's call the whole thing off !
But oh, if we call the whole thing off, then we must part. And oh, if we ever part, then that might break my heart.
So, if you go for oysters and I go for ersters, I'll order oysters and cancel the ersters. For we know we Need each other, so we Better call the calling off off. Let's call the whole thing off !

Testo e musica di George and Ira Gershwin, cantate da Fred Astaire e Ginger Rogers nel film "Shall We Dance?"

tri: Thanks to Masini Filippo (fmasini#users.sourceforge.net) for the translation.