ADOdb dokumentáció - 2 rész - Gyakorlati példák

Címkék: web, adodb, adatbázis, php
Létrehozva: 2007. január 25. 12:06
Gyakorlati példák az ADOdb használazához.

ADOdb gyakorlati példáktartalomjegyzék

Egyedi hibakezelők használata és PEAR_Error
Data Source Names
Gyorsítótárazás
Pivot tables

Gyakorlati példák bemutatása

Példa 1: SELECT

Feladat: Csatlakozás az Access Northwind DSN-el, mutassad meg mindegyik sor első 2 oszlopát.

Ebben a példában létrehozunk egy ADOConnection objektumot, ami képviseli a kapcsolatot az adatbázisnak. A kapcsolatot kezdeményezünk PConnect -tel, ami egy állandó kapcsolat. Amikor lekérdezni akarjuk az adatbázist, hívunk egy ADOConnection.Execute() fügvényt. Ez visszaküld egy olyan ADORecordSet objektumot, ami egy olyan mutató, ami tartalmazza az aktuális sort egy tömben fields[]. Arra használjuk MoveNext(), hogy sorról sorra mozgasson.

NB: egy hasznos funkció, amit nem használnak ebben a példában, SelectLimit, ami megengedi nekünk, hogy korlátozzuk a megmutatni kívánt sorok számát.

<?
include('adodb.inc.php');         # load code common to ADOdb
$conn = &ADONewConnection('access');       # create a connection
$conn->PConnect('northwind');   # connect to MS-Access, northwind DSN
$recordSet = &$conn->Execute('select * from products');
if (!$recordSet) 
        print $conn->ErrorMsg();
else
while (!$recordSet->EOF) {
       print $recordSet->fields[0].' '.$recordSet->fields[1].'<BR>';
      $recordSet->MoveNext();
}  $recordSet->Close(); # optional
$conn->Close(); # optional
 ?>

Az $recordSet visszatért elraktározza az aktuális sort az $recordSet->fields tömbben, amit indexel oszlopszámmal, (kezdve nullától). Arra használjuk a MoveNext() funkciót, hogy lépjen a következő sorba. Az EOF értáke true -ra állítódik, amikor az állomány végére értünk. Ha egy hiba történik Execute(), visszatérő értéke (false) hamis a recordset helyett.

Az $recordSet->fields[] tömböt létrehozza a PHP adatbázis kiterjesztés. Néhány adatbázis-kiterjesztés egyszer indexel szám által és nem indexeli a sort mezőnév által. Érvényes indexelés név szerint - az asszociációs tömb - használd a SetFetchMode funkciót. Each recordset saves and uses whatever fetch mode was set when the recordset was created in Execute() or SelectLimit().

$db->SetFetchMode(ADODB_FETCH_NUM);
       $rs1 = $db->Execute('select * from table');
    $db->SetFetchMode(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')

Hogy megkapd a kiválasztott sorok segmenseinek a számát, használd a $recordSet->RecordCount(). Vedd észre, hogy ha 1 sorral tér vissza, ha a sorok száma nem tud meghatározott lenni.

Példa 2: Haladó SELECT

Válassz ki egy táblát, mutassad meg az első két oszlopot. Ha a második oszlop egy dátum vagy a dátumbélyeg, formázzad újra a dátumot US formátumba.

<?
include('adodb.inc.php');         # load code common to ADOdb
$conn = &ADONewConnection('access');       # create a connection
$conn->PConnect('northwind');   # connect to MS-Access, northwind dsn
$recordSet = &$conn->Execute('select CustomerID,OrderDate from Orders');
if (!$recordSet) 
       print $conn->ErrorMsg();
else
while (!$recordSet->EOF) {
       $fld = $recordSet->FetchField(1);         $type = $recordSet->MetaType($fld->type);

    if ( $type == 'D' || $type == 'T') 
        print $recordSet->fields[0].' '.
         $recordSet->UserDate($recordSet->fields[1],'m/d/Y').'<BR>';
        else       print $recordSet->fields[0].' '.$recordSet->fields[1].'<BR>';

    $recordSet->MoveNext();
} $recordSet->Close(); # optional
$conn->Close(); # optional
 ?>

Ebben a példában ellenőrizzük a második oszlop fajtáját, amire használjuk a FetchField().This returns an object with at least 3 fields.

  • name: az oszlop neve
  • type: az oszlop mezőtípusa
  • max_length: max mezőhossz. Néhány adatbázis, mint például MySQL, nem küldi vissza a mező maximális hosszát helyesen. Ezekben az esetekben max_length -t 1-re fogja állítani.

Amikor arra használjuk a MetaType(), hogy lefordítsa a native típust egy általános típusra. Jelenleg a következő általános típusokat határozzákmeg:

  • C: olyan karaktermezők, amiket be kellene vezetni, egy <input type="text> címke.
  • X: TeXt, olyan nagy szövegmezők, amiket mutatni kellene egy <textarea>
  • B: Blobs, vagy Binary Large Objects. Jellemzően képek.
  • D: Dátummező
  • T: Dátumbélyeg mező
  • L: Logikai mező (boolean vagy darab-mező)
  • I: Egész szám mező
  • N: Szám mező. Includes autoincrement, számszerű, lebegőpont, reális és egész szám.
  • R: Sorozatos mező. Folytatásos sorozatot tartalmaz, autoincrement egész számok. Az adatbázis kiválasztásokért működik.

If the metatype is of type date or timestamp, then we print it using the user defined date format with UserDate(), which converts the PHP SQL date string format to a user defined one. Another use for MetaType() is data validation before doing an SQL insert or update.

Példa 3: INSERT

Illessz be egy sort az Orders táblába, ami olyan dátumokat és szövegeket tartalmaz, amiknek szükségük van egy részletre mielőtt őket az adatbázis tudja csatolni, eg: the single-quote in the word John's.

<?
include('adodb.inc.php');         # load code common to ADOdb
$conn = &ADONewConnection('access');       # create a connection

$conn->PConnect('northwind');   # connect to MS-Access, northwind dsn
$shipto = $conn->qstr("John's Old Shoppe");

$sql = "insert into orders (customerID,EmployeeID,OrderDate,ShipName) ";
$sql .= "values ('ANATR',2,".$conn->DBDate(time()).",$shipto)";

if ($conn->Execute($sql) === false) {
    print 'error inserting: '.$conn->ErrorMsg().'<BR>';
}
?>

Ebben a példában látjuk a haladó dátumot és szöveget, hogy kezelik ADOdb lehetőségeit. The unix timestamp (which is a long integer) is appropriately formated for Access with DBDate(), and the right escape character is used for quoting the John's Old Shoppe, which is John''s Old Shoppe and not PHP's default John's Old Shoppe with qstr().

Figyeljed meg az Execute fögvény hiba-kezelését. Hamis küldivissza az Execute() ha egy hiba történt. A hibaüzenetet megmutatjuk a ErrorMsg()-el. Feljegyzés:php_track_errors might have to be enabled for error messages to be saved.

Példa 4: Hibakezelés

<?
include('adodb.inc.php');         # load code common to ADOdb
$conn = &ADONewConnection('access');       # create a connection
$conn->PConnect('northwind');   # connect to MS-Access, northwind dsn
$shipto = $conn->qstr("John's Old Shoppe");
$sql = "insert into orders (customerID,EmployeeID,OrderDate,ShipName) ";
$sql .= "values ('ANATR',2,".$conn->FormatDate(time()).",$shipto)";
$conn->debug = true; if ($conn->Execute($sql) === false) print 'error inserting'; ?>

A fenti példában hibakereső módot használunk azáltal, hogy hibakeresést állítottunk be, debug = true. Ez a végrehajtás előtt fogja megmutatni a SQL utasítást, és szintén mutatni fog bármilyen hibaüzeneteket. Nem szükséges ebben az esetben hívni ErrorMsg(). Mert megmutatod a recordset -et, lássad a rs2html() példát.

Lássad a Custom Error Handlers szekciót szintén.

Példa 5: MySQL és menük

Csatlakozunk agora nevű MySQL adatbázishoz, és létrehoz egy <select> menüt egy SQL utasításból, hol az <option> feliratok az 1. oszlopban vannak, és az értékek amiket visszaküldünk a szerverre a 2. oszlopban.

<?
include('adodb.inc.php'); # load code common to ADOdb
$conn = &ADONewConnection('mysql');  # create a connection
$conn->PConnect('localhost','userid','','agora');# connect to MySQL, agora db
$sql = 'select CustomerName, CustomerID from customers';
$rs = $conn->Execute($sql);
print $rs->GetMenu('GetCust','Mary Rosli');
?>

Itt meghatározunk a menü nevét a 'GetCustot' -al, amiből a 'Mary Rosli' lesz a kiválasztott értek (selected). See GetMenu(). Valamint vannak olyan fögvények, amik tömbként küldikvissza a recordsetet, pl: GetArray(), és asszociációs tömbként a kulccsal, ami az első oszlop: GetAssoc().

Példa 6: Azonnal csatlakozás 2 adatbázishoz

<?
include('adodb.inc.php');       # load code common to ADOdb
$conn1 = &ADONewConnection('mysql');  # create a mysql connection
$conn2 = &ADONewConnection('oracle');  # create a oracle connection

$conn1->PConnect($server, $userid, $password, $database);
$conn2->PConnect(false, $ora_userid, $ora_pwd, $oraname);

$conn1->Execute('insert ...');
$conn2->Execute('update ...');
?>

Példa 7: UPDATE és INSERT SQL generálás

ADOdb 4.56 óta támogatjuk AutoExecute(), melyik egyszerűsít le dolgokat azáltal, hogy GetInsertSQL() és GetUpdateSQL(). nyújt egy haladó csomagolást. Például egy INSERT -et végre tudnuk hajtani:

$record["firstname"] = "Bob"; 
    $record["lastname"] = "Smith"; 
    $record["created"] = time(); 
    $insertSQL = $conn->AutoExecute($rs, $record, 'INSERT');
és egy UPDATE:
$record["firstname"] = "Caroline"; 
    $record["lastname"] = "Smith"; # Update Caroline's lastname 
from Miranda to Smith 
    $insertSQL = $conn->AutoExecute($rs, $record, 'UPDATE', 'id = 1');

Ennek a szekciónak a többi része elavult:

ADOdb 1.31 és későbbi verziók két új recordset fügvény: GetUpdateSQL( ) és GetInsertSQL(). Ez megengedi neked, hogy végrehajts egy "SELECT * FROM táble kérés WHERE...", lehetővé teszi, hogy az $rs->fields, egy másolata módosítsa a mezőket, azután automatikusan frissítésre vagy beillesztésre létrehozza a SQL-et a táblázatba.

Megmutatjuk, hogy a fügvényeket hogyan használhatják, amikor a következővel csatlakozol egy táblához: (ID, FirstName, LastName, Created).

Mielőtt ezeket a funkciókat hívhatják, neked inicializálnod kell a recordsetet azáltal, hogy létrehozol, egy select-et a táblán. Ötlet és kód Jonathan Younger jyounger#unilab.com. ADOdb 2.42 óta, a recordset-ben le tud hagyni a tábla nevet GetInsertSQL ($rs -ben), és az létrehoz egy beillesztésmintát a táblához.

<?
#==============================================
# SAMPLE GetUpdateSQL() and GetInsertSQL() code
#==============================================
include('adodb.inc.php');
include('tohtml.inc.php');

#==========================
# This code tests an insert

$sql = "SELECT * FROM ADOXYZ WHERE id = -1"; 
# Select an empty record from the database

$conn = &ADONewConnection("mysql");  # create a connection
$conn->debug=1;
$conn->PConnect("localhost", "admin", "", "test"); # connect to MySQL, testdb
$rs = $conn->Execute($sql); # Execute the query and get the empty recordset

$record = array(); # Initialize an array to hold the record data to insert

# Set the values for the fields in the record
# Note that field names are case-insensitive
$record["firstname"] = "Bob";
$record["lastNamE"] = "Smith";
$record["creaTed"] = time();

# Pass the empty recordset and the array containing the data to insert
# into the GetInsertSQL function. The function will process the data and return
# a fully formatted insert sql statement.
$insertSQL = $conn->GetInsertSQL($rs, $record);

$conn->Execute($insertSQL); # Insert the record into the database

#==========================
# This code tests an update

$sql = "SELECT * FROM ADOXYZ WHERE id = 1"; 
# Select a record to update

$rs = $conn->Execute($sql); 
# Execute the query and get the existing record to update


$record = array(); # Initialize an array to hold the record data to update

# Set the values for the fields in the record
# Note that field names are case-insensitive
$record["firstname"] = "Caroline";
$record["LasTnAme"] = "Smith"; # Update Caroline's lastname from Miranda to Smith

# Pass the single record recordset and the array containing the data to update
# into the GetUpdateSQL function. The function will process the data and return
# a fully formatted update sql statement with the correct WHERE clause.
# If the data has not changed, no recordset is returned
$updateSQL = $conn->GetUpdateSQL($rs, $record);

$conn->Execute($updateSQL); # Update the record in the database
$conn->Close();
?>
$ADODB_FORCE_TYPE

Az AutoExecute(), GetUpdateSQL() és GetInsertSQL() viselkedését alakíthatjuk, amikor üres vagy nulla értékű PHP változó használunk SQL utasításben, van egy ellenörző globalis változó az $ADODB_FORCE_TYPE . Állítsuk be ezt az értéket a lentiek közül az egyikre. Az alapértelmezett ADODB_FORCE_VALUE (3):

0 = ignore empty fields. All empty fields in array are ignored.
1 = force null. All empty, php null and string 'null' 
    fields are changed to sql NULL values.
2 = force empty. All empty, php null and string 'null' 
    fields are changed to sql empty '' or 0 values.
3 = force value. Value is left as it is. Php null and 
    string 'null' are set to sql NULL values and 
    empty fields '' are set to empty '' sql values.

define('ADODB_FORCE_IGNORE',0);
define('ADODB_FORCE_NULL',1);
define('ADODB_FORCE_EMPTY',2);
define('ADODB_FORCE_VALUE',3);

Köszönet Niko -nak (nuko#mbnet.fi) az $ADODB_FORCE_TYPE kódért.

Feljegyzés: az ADODB_FORCE_NULLS állandó 4.52 óta elavult és figyelmen kívül hagyják. Állíts be az $ADODB_FORCE_TYPE = ADODB_FORCE_NULL -ra megfelelő viselkedéstért.

4.62 óta, a használni kivánt tábla névet felül tudjuk bírálni az $rs->tableName beállításával az AutoExecute(), GetInsertSQL() vagy GetUpdateSQL() meghívása előtt.

Példa 8: Lapozás kivitelezése, előző és követtkező oldal

A következő kód létrehoz egy nagyon egyszerű recordset lapozót, ahol előre hátra tudsz lépni a recordset -ben.

include_once('../adodb.inc.php');
include_once('../adodb-pager.inc.php');
session_start();

$db = NewADOConnection('mysql');

$db->Connect('localhost','root','','xphplens');

$sql = "select * from adoxyz ";

$pager = new ADODB_Pager($db,$sql);
$pager->Render($rows_per_page=5);

Ez létre fog hozni egy olyan alapvető rekordlapozót, ami így néz:

|< << >> >|
ID First Name Last Name Date Created
36 Alan Turing Sat 06, Oct 2001
37 Serena Williams Sat 06, Oct 2001
38 Yat Sun Sun Sat 06, Oct 2001
39 Wai Hun See Sat 06, Oct 2001
40 Steven Oey Sat 06, Oct 2001
Page 8/10

A sorok száma egy időben a lapon a Render($rows) metódus által állíthatók. Ha nem adsz meg értéket a Render() -nek, ADODB_Pager alapértelmezett értéke 10 rekord/oldal.

Tudod irányítani az oszlopcímeket azáltal, hogy módosítod a SQL-edet, (támogatott a legtöbb adatbázis által):

$sql = 'select id as "ID", firstname as "First Name", lastname as "Last Name", 
      created as "Date Created" from adoxyz';

A fenti kódot az adodb/tests/testpaging.php példában találhatjuk, és az ADODB_Pager osztályt meg itt adodb/adodb-pager.inc.php. Az ADODB_Pager kódot módosíthatja egy programozó, hogy a szövegkapcsolatokat felválthassák képek, és az unalmas fehér háttér cseréljenek le érdekesebb színekre.

Szintén meg tudod engedni a html kiírását azáltal, hogy beállítod a $pager->htmlSpecialChars = false -ra.

A kód egy részét, amit használtunk itt, Iván Oliva és Cornel G adták.

Példa 9: Exportálás CSV-be vagy Tab-Delimited formátumba

Bemutatunk néhány segédfügvényt, hogy exportálhassunk vesszővel-elválasztott-érték (CSV) és tab-delimited formátumokba:

include_once('/path/to/adodb/toexport.inc.php');
include_once('/path/to/adodb/adodb.inc.php');
 $db = &NewADOConnection('mysql');
$db->Connect($server, $userid, $password, $database);

$rs = $db->Execute('select fname as "First Name", 
                    surname as "Surname" from table');

print "<pre>";
print rs2csv($rs); # return a string, CSV format
print '<hr>';

$rs->MoveFirst(); # note, some databases do not support MoveFirst
print rs2tab($rs,false); # return a string, tab-delimited
                   # false == suppress field names in first lineprint '<hr>';
$rs->MoveFirst();
rs2tabout($rs); # send to stdout directly (there is also an rs2csvout function)
print "</pre>";

$rs->MoveFirst();
$fp = fopen($path, "w");
if ($fp) {
  rs2csvfile($rs, $fp); # write to file (there is also an rs2tabfile function)
  fclose($fp);
}

Carriage-returns or newlines are converted to spaces. Mezőnevek az első sor szövegében lesznek. A szövegek határolójelei kettős idézőjelek. Ez alkalmazkodik az Excel import-export működéséhez.

Összes fenti fögvény szabadon választható utolsó paramétere, $addtitles melynek alapértemezésben true. Mikor false a mezőnevek az első sorban lesznek.

Példa 10: Recordset szűrők

Sometimes we want to pre-process all rows in a recordset before we use it. For example, we want to ucwords all text in recordset.

include_once('adodb/rsfilter.inc.php');
include_once('adodb/adodb.inc.php');

// ucwords() every element in the recordset
function do_ucwords(&$arr,$rs)
{
      foreach($arr as $k => $v) {
            $arr[$k] = ucwords($v);
   }
}

$db = NewADOConnection('mysql');
$db->PConnect('server','user','pwd','db');

$rs = $db->Execute('select ... from table');
$rs = RSFilter($rs,'do_ucwords');

The RSFilter function takes 2 parameters, the recordset, and the name of the filter function. It returns the processed recordset scrolled to the first record. The filter function takes two parameters, the current row as an array, and the recordset object. For future compatibility, you should not use the original recordset object.

Példa 11: Okos tranzakciók

Ez egy régi módja a tranzakciókat használatának:
$conn->BeginTrans();
$ok = $conn->Execute($sql);
if ($ok) $ok = $conn->Execute($sql2);
if (!$ok) $conn->RollbackTrans();
else $conn->CommitTrans();
Ez nagy projekteknél nagyon bonyolult, mert neked követned kell a hibastátuszt. Smart Templaterendszerrel sokkal egyszerűbb. Elindíthatsz egy ügyes tranzakciót azáltal, hogy hívod StartTrans():
$conn->StartTrans();
$conn->Execute($sql);
$conn->Execute($Sql2);
$conn->CompleteTrans();
CompleteTrans() érzékeli, hogy egy SQL hiba mikor történik, és végrehajtja Rollback/Commit megfelelően. Jellegzetesen kényszeríteni egy visszaigazolást még akkor is, ha hiba nem történt, használjad FailTrans(). Észreveszi, hogy a visszaigazolás kész CompleteTrans(), és nincs FailTrans().
$conn->StartTrans()
$conn->Execute($sql)
if (!CheckRecords()) $conn*->FailTrans()
$conn->Execute($Sql2)
$conn->CompleteTrans()

Szintén meg tudsz állni, ha egy tranzakció elromlott miközben használta HasFailedTrans(), amely visszatér true -val, ha FailTrans() hívták, vagy volt a SQL végrehajtásban egy hiba. Győződj meg arról úgy, hogy meghívod a HasFailedTrans(), mielőtt hívodnád a CompleteTrans(),, a StartTrans/CompleteTrans között egyetlen ellenörzéssel.

Végezetül a StartTrans/CompleteTrans egymásbaágyazható, és csak a legkülső blokkot hajtják végre. Ezzel szemben a BeginTrans/CommitTrans/RollbackTrans nem egymásbaágyazható.

$conn->StartTrans();
$conn->Execute($sql);
  $conn->StartTrans();    # ignored   if (!CheckRecords()) $conn->FailTrans();   $conn->CompleteTrans(); # ignored $conn->Execute($Sql2); $conn->CompleteTrans();

Feljegyzés: Savepoints jelenleg nem támogatott.

Egyedi hibakezelők használata és PEAR_Error

ADOdb PHP5 kivételeket támogatása. Beillesztjük az adodb-exceptions.inc.php -t és és a kivételekkel hibákat fogunk el.

include("../adodb-exceptions.inc.php"); 
    include("../adodb.inc.php");     
 try { 
            $db = NewADOConnection("oci8://scott:bad-password@mytns/"); 
      } catch (exception $e) { 
         var_dump($e); 
            adodb_backtrace($e->gettrace());
       }

ADOdb szintén nyújt két egyedi kezelőt, amit tudsz módosítani a szükségeid szerint. Az első az adodb-errorhandler.inc.php fájlban van. Ez alkalmazza a szabványos PHP error_reporting fügvényt, mely irányítja, hogy hibaüzenetek jelenjenek meg, és trigger_error -t, hogy melyik hibakezelőt hívja meg alapértelmezéstként .

A fenti fájl ezeket tartalmazhatja, amikor meghívják a trigger_error($errorstring,E_USER_ERROR) fügvényt
(a) Connect() vagy PConnect() megbukik
(b) egy olyan funkciónak, ami SQL futtat, mint például Execute() vagy SelectLimit(), van egy hibája.
(c) GenID() úgy tűnik, hogy bemegy egy végtelen ciklusba.

Az $errorstring -et létrehozza ADOdb és hasznos hibaelhárításinformációt fog tartalmazni, ami hasonló az error.log adatokhoz, amiket lent létrehoztak. Ennek a fájlnak adodb-errorhandler.inc.php beépítettnek kellene lennie, mielőtt létrehozol bármilyen ADOConnection objektumot.

Ha meghatározod error_reporting(0) -ot, hibákat nem fognak beleilleszteni a hibakezelők sem. Ha beállítottad error_reporting(E_ALL),, minden hibát tudomásul vesznek a hibakezelők. Még mindig használni lehet az ini_set("display_errors, 0-t vagy 1-et) a hibák kijelzésének a irányítására.

<?php
error_reporting(E_ALL); # pass any error messages triggered to error handler
include('adodb-errorhandler.inc.php');
include('adodb.inc.php'); include('tohtml.inc.php'); $c = NewADOConnection('mysql'); $c->PConnect('localhost','root','','northwind'); $rs=$c->Execute('select * from productsz'); #invalid table productsz'); if ($rs) rs2html($rs); ?>

Ha naplóba akarod írni a hibaüzenetet, akkor meghatározod a következő szabadon választható állandókat, ADODB_ERROR_LOG_TYPE és ADODB_ERROR_LOG_DEST ADODB_ERROR_LOG_TYPE a hibanapló-üzenet-típusok (lásd error_log -ot a PHP kézikönyvben). Ebben az esetben 3-as lesz az hibakezelés tipusának értéke, az ADODB_ERROR_LOG_DEST segítségével pedig egy fájlba írjuk a bejegyzéseket.

<?php
error_reporting(E_ALL); # report all errors
ini_set("display_errors", "0"); # but do not echo the errors
define('ADODB_ERROR_LOG_TYPE',3);
define('ADODB_ERROR_LOG_DEST','C:/errors.log');
include('adodb-errorhandler.inc.php');
include('adodb.inc.php'); include('tohtml.inc.php'); $c = NewADOConnection('mysql'); $c->PConnect('localhost','root','','northwind'); $rs=$c->Execute('select * from productsz'); ## invalid table productsz if ($rs) rs2html($rs); ?>
A következő üzenet lesz bejegyezve az error.log fájlba:
(2001-10-28 14:20:38) mysql error: [1146: Table 'northwind.productsz' 
 doesn't exist] in EXECUTE("select * from productsz")

PEAR_ERROR

A második hibakezelő adodb-errorpear.inc.php.This will create a PEAR_Error derived object whenever an error occurs. The last PEAR_Error object created can be retrieved using ADODB_Pear_Error().
<?php
include('adodb-errorpear.inc.php'); include('adodb.inc.php'); include('tohtml.inc.php'); $c = NewADOConnection('mysql'); $c->PConnect('localhost','root','','northwind'); $rs=$c->Execute('select * from productsz'); #invalid table productsz'); if ($rs) rs2html($rs); else {       $e = ADODB_Pear_Error();
echo '<p>',$e->message,'</p>';
} ?>

Tudsz használni egy PEAR_Error származtatott osztályt azáltal, hogy meghatározod az állandó ADODB_PEAR_ERROR_CLASS -t, mielőtt az adodb-errorpear.inc.php fájl beillesztenéd. For easy debugging, you can set the default error handler in the beginning of the PHP script to PEAR_ERROR_DIE, which will cause an error message to be printed, then halt script execution:

include('PEAR.php');
PEAR::setErrorHandling('PEAR_ERROR_DIE');

Note that we do not explicitly return a PEAR_Error object to you when an error occurs. We return false instead. You have to call ADODB_Pear_Error() to get the last error or use the PEAR_ERROR_DIE technique.

MetaError és MetaErrMsg

Ha neked olyan hibaüzenetekre van szükséged, amik többszörös adatbázisokon keresztül dolgoznak, akkor használd a MetaError(), ami visszad egy virtuális hibaszámot a PEAR DB hibaszámrendszere alapján, és MetaErrMsg().

Hibaüzenetek

Hibaüzeneteket letrehozásáról a statikus eljátrás gondoskodik, ADOConnnection::outp($msg,$newline=true). Alapból ez küldi az üzeneteket az ügyfélnek. Felül tudod bírálni ezt hiba-naplóvezetés végrehajtásával.

Data Source Names (DSN)

Mi mostmár támogatjuk a PEAR stílusú DSN csatlakozást. Egy DSN formátumú kapcsolatszál:

$dsn = "$driver://$username:$password@$hostname/$databasename";

Egy példa:

$username = 'root';
   $password = '';
   $hostname = 'localhost';
   $databasename = 'xphplens';
   $driver = 'mysql';
   $dsn = "$driver://$username:$password@$hostname/$databasename"
   $db = NewADOConnection(); 
   # DB::Connect($dsn) also works 
   # if you include 'adodb/adodb-pear.inc.php' at the top
   $rs = $db->query('select firstname,lastname from adoxyz');
   $cnt = 0;
   while ($arr = $rs->fetchRow()) {
             print_r($arr); print "<br>";
   }

Több információ és kapcsolatpélda a DSN formátumról

PEAR kompatibilitás

Támogatjuk DSN-t (fent látható), és a következő funkciókat:
 DB_Common        query - returns PEAR_Error on error     limitQuery - return PEAR_Error on error         prepare - does not return PEAR_Error on error   execute - does not return PEAR_Error on error   setFetchMode - supports ASSOC and ORDERED       errorNative     quote   nextID  disconnect              getOne  getAssoc        getRow  getCol    DB_Result    numRows - returns -1 if not supported   numCols         fetchInto - does not support passing of fetchmode       fetchRows - does not support passing of fetchmode       free

Recordset-ek gyorsítótárazása

ADOdb mostmár támogatja a rekordok gyósítótárazását a következő fügvényekkel: CacheExecute(), CachePageExecute( ) és CacheSelectLimit( ).
Hasonlóak a nem tárazó fügvényekhez eltekintve attól, hogy az első paraméterük a $secs2cache.

Egy példa:

include('adodb.inc.php'); # load code common to ADOdb
$ADODB_CACHE_DIR = '/usr/ADODB_cache';
$conn = &ADONewConnection('mysql');  # create a connection
$conn->PConnect('localhost','userid','','agora');# connect to MySQL, agora db
$sql = 'select CustomerName, CustomerID from customers';
$rs = $conn->CacheExecute(15,$sql);

Az első paraméter másodpercek száma, hogy meddig tárolja el az utasítást. Ugyanannál az utasításnál legközelebb az $ADODB_CACHE_DIR -ból kapjuk meg az eredményt. Hogy kiürítsd a gyorsítótárat, hívd meg a CacheExecute() -ot első paraméterét nullára állítva. Alternatívának használd a CacheFlush($sql) -t.

A biztonság kedvéért, ajánljuk neked a register_globals=off beállítását a php.ini -ben, ha használod $ADODB_CACHE_DIR -t.

ADOdb 1.80 -tól, a secs2cache paraméter szabadon választható a CacheSelectLimit() és CacheExecute() fögvényeknél is. Ha nem hsználod ezt, akkor a $connection->cacheSecs paraméter lesz az alapértelmezett, ami 60 perc.

$conn->Connect(...);
      $conn->cacheSecs = 3600*24; # cache 24 hours
   $rs = $conn->CacheExecute('select * from table');

Vegyed észre, hogy magic_quotes_runtime-nak kikapcsolva kell lennie. Több információ, valamint a $ADODB_FETCH_MODE-ot utólag nem változtathatjuk meg..

Pivot Tables

Since ADOdb 2.30, we support the generation of SQL to create pivot tables, also known as cross-tabulations. For further explanation read this DevShed Cross-Tabulation tutorial. We assume that your database supports the SQL case-when expression.

In this example, we will use the Northwind database from Microsoft. In the database, we have a products table, and we want to analyze this table by suppliers versus product categories. We will place the suppliers on each row, and pivot on categories. So from the table on the left, we generate the pivot-table on the right:

Supplier Category
supplier1 category1
supplier2 category1
supplier2 category2
-->
  category1 category2 total
supplier1 1 0 1
supplier2 1 1 2

The following code will generate the SQL for a cross-tabulation:

# Query the main "product" table
# Set the rows to SupplierName
# and the columns to the values of Categories
# and define the joins to link to lookup tables 
# "categories" and "suppliers"
#
 include "adodb/pivottable.inc.php";
 $sql = PivotTableSQL(
  $gDB,                                   # adodb connection
  'products p ,categories c ,suppliers s',# tables
  'SupplierName',                         # rows (multiple fields allowed)
  'CategoryName',                         # column to pivot on 
  'p.CategoryID = c.CategoryID and s.SupplierID= p.SupplierID' # joins/where
);

This will generate the following SQL:

SELECT SupplierName,
SUM(CASE WHEN CategoryName='Beverages' THEN 1 ELSE 0 END) AS "Beverages",
SUM(CASE WHEN CategoryName='Condiments' THEN 1 ELSE 0 END) AS "Condiments",
SUM(CASE WHEN CategoryName='Confections' THEN 1 ELSE 0 END) AS "Confections",
SUM(CASE WHEN CategoryName='Dairy Products' THEN 1 ELSE 0 END) AS "Dairy Products",
SUM(CASE WHEN CategoryName='Grains/Cereals' THEN 1 ELSE 0 END) AS "Grains/Cereals",
SUM(CASE WHEN CategoryName='Meat/Poultry' THEN 1 ELSE 0 END) AS "Meat/Poultry",
SUM(CASE WHEN CategoryName='Produce' THEN 1 ELSE 0 END) AS "Produce",
SUM(CASE WHEN CategoryName='Seafood' THEN 1 ELSE 0 END) AS "Seafood",
SUM(1) as Total
FROM products p ,categories c ,suppliers s WHERE p.CategoryID = c.CategoryID and s.SupplierID= p.SupplierID
GROUP BY SupplierName

You can also pivot on numerical columns and generate totals by using ranges. This code was revised in ADODB 2.41 and is not backward compatible. The second example shows this:

$sql = PivotTableSQL(
        $gDB,                                    # adodb connection
       'products p ,categories c ,suppliers s', # tables
 'SupplierName',                  # rows (multiple fields allowed)    array(                                         # column ranges       ' 0 '      => 'UnitsInStock <= 0',       "1 to 5"   => '0 < UnitsInStock and UnitsInStock <= 5',       "6 to 10"  => '5 < UnitsInStock and UnitsInStock <= 10',       "11 to 15" => '10 < UnitsInStock and UnitsInStock <= 15',       "16+"      => '15 < UnitsInStock'       ),       ' p.CategoryID = c.CategoryID and s.SupplierID= p.SupplierID', # joins/where       'UnitsInStock',                          # sum this field       'Sum '                                   # sum label prefix );

Which generates:

SELECT SupplierName,
SUM(CASE WHEN UnitsInStock <= 0 THEN UnitsInStock ELSE 0 END) AS "Sum 0 ",
SUM(CASE WHEN 0 < UnitsInStock and UnitsInStock <= 5 THEN UnitsInStock ELSE 0 END) AS "Sum 1 to 5",
SUM(CASE WHEN 5 < UnitsInStock and UnitsInStock <= 10 THEN UnitsInStock ELSE 0 END) AS "Sum 6 to 10",
SUM(CASE WHEN 10 < UnitsInStock and UnitsInStock <= 15 THEN UnitsInStock ELSE 0 END) AS "Sum 11 to 15",
SUM(CASE WHEN 15 < UnitsInStock THEN UnitsInStock ELSE 0 END) AS "Sum 16+",
SUM(UnitsInStock) AS "Sum UnitsInStock",
SUM(1) as Total,
FROM products p ,categories c ,suppliers s WHERE p.CategoryID = c.CategoryID and s.SupplierID= p.SupplierID
GROUP BY SupplierName