A Joomla! egy kifinomult adatbázis absztrakciós réteget tartalmaz, hogy egyszerűsítse a külső bővítmények használatát. Ez az útmutató bemutatja ennek a rétegnek a használatát.
Tartalomjegyzék |
A Joomlát úgy építették fel, hogy több, különböző típusú SQL adatbázis renszert tudjon használni és hogy különböző környezetekben tudjon futni különböző tábla előtagokkal. Ezen funkciókon felül az osztály automatikusan létrehozza az adatbázis kapcsolatot. Az objektum példányosítása mellett elég 2 sornyi kód, hogy különböző formákban megkapjuk az eredményeket az adatbázisból. A Joomla! adatbázis rétege biztosítja a maximális kompatibilitást és rugalmasságot a bővítmények számára.
// Az adatbázis objektum átadása$db =& JFactory::getDBO();
$query = "SELECT * FROM #__example_table WHERE id = 999999;";
$db->setQuery($query);
Először átadjuk az adatbázis objektumot, majd előkészítjük a kérést. Használhatjuk a normális SQL szintaxist, az egyetlen dolog amit meg kell változtatni a tábla előtag. Ahhoz, hogy ez a lehető legrugalmasabb legyen, a Joomla! egy helyőrző előtagot használ: "#__". A következő lépésben, a $db->setQuery()-ben ez a helyőrző lecserélődik a megfelelő előtagra.
Ha nem információt akarunk az adatbázisból lekérdezni, hanem egy sort akarunk beszúrni, akkor még egy funkcióra lesz szükségünk. Az összes string típusú értéket idézőjelek közé kell tenni. Például a MySQL a `` jeleket használja nevekhez és a jeleket az értékekhez. A Joomla! rendelkezik néhány funkcióval, amely elvégzi ezt számunkra és biztosítja a kód kompatibilitást a különböző adatbázisok között. A neveket átadhatjuk a $db->nameQuote($name), az értékeket pedig a $db->Quote($value) funkciónak.
Egy példa erre:
$query = "
SELECT * FROM ".$db->nameQuote('#__example_table')."
WHERE ".$db->nameQuote('id')." = ".$db->quote('999999').";
";
Akármit is akarunk tenni, át kell adnunk a kérést a $db->setQuery() funkciónak. Habár a kérést közvetlenül a $db->setQuery() függvény paraméterébe is írhatnánk, ezt gyakran először egy $query nevű változóba mentjük, majd ezt a változót adjuk át a függvénynek. Ezzel tiszta és olvasható kódot készíthetünk.
A setQuery($query) metódus egy adatbázis kérést hoz létre későbbi futtatásra vagy a query() metódus vagy egy eredményt betöltő metódus által.
$db =& JFactory::getDBO();
$query = "/* Érvényes SQL utasítás */";
$db->setQuery($query);
Megjegyzés: A $query változónak egy érvényes SQL utasításnak kell lennie, átadható string típusú paraméterként, vagy változóként is; általában a változó részesül előnyben, mert olvasható kódot eredményez és a hibakeresésben is segíthet.
A setQuery() funkció három további paramétert fogad: $offset, $limit - mindkettőt több oldalas listáknál használjuk; és $prefix - egy alternatív tábla előtag. Mindhárom változó rendelkezik alapértelmezett értékkel, ezért általában figyelmen kívül lehet hagyni.
A query() metódus egy alapvető módszer SQL kérések végrehajtására az adatbázisban. A Joomlában leggyakrabban az adatbázis adatok frissítésére, illetve kezelésére használjuk, egyszerűen azért, mert a számos eredményt betöltő metódus a query() metódust beépítve tartalmazza.
A szintaxis nagyon egyszerű:
$db =& JFactory::getDBO();
$query = "/* Érvényes SQL utasítás */";
$db->setQuery($query);
$result = $db->query();
Megjegyzés: A query() egy megfelelő adatbázis forrást ad vissza sikeres végrehajtás esetén, ellentkező esetben FALSE értéket.
Az adatbázis osztály számos metódust tartalmaz a lekérdezések eredményének feldolgozásához.
Használjuk a loadResult() funkciót, amikor egy egyszerű értéket várunk az adatbázis lekéréstől.
| id | name | username | |
|---|---|---|---|
| 1 | John Smith | johnsmith@example.com | johnsmith |
| 2 | Magda Hellman | magda_h@example.com | magdah |
| 3 | Yvonne de Gaulle | ydg@example.com | ydegaulle |
Ez gyakran a 'count' kérés eredménye, amelyben megkapjuk a rekordok számát:
$db =& JFactory::getDBO();
$query = "
SELECT COUNT(*)FROM ".$db->nameQuote('#__my_table')."
WHERE ".$db->nameQuote('name')." = ".$db->quote($value).";
";
$db->setQuery($query);
$count = $db->loadResult();
Vagy amikor a tábla egy sorának egy mezőjét akarjuk visszakapni (vagy esetleg az eredményben szereplő első sor egy mezőjét):
$db =& JFactory::getDBO();
$query = "
SELECT ".$db->nameQuote('field_name')."
FROM ".$db->nameQuote('#__my_table')."
WHERE ".$db->nameQuote('some_name')." = ".$db->quote($some_value).";
";
$db->setQuery($query);
$result = $db->loadResult();
Az összes ilyen eredményt betöltő funkció az adatbázis egy rekordjával tér vissza még akkor is, ha több rekord felel meg a kérésben beállított feltételnek. Több rekord átadásához újból meg kell hívni a funkciót.
| id | name | username | |
|---|---|---|---|
| 1 | John Smith | johnsmith@example.com | johnsmith |
| 2 | Magda Hellman | magda_h@example.com | magdah |
| 3 | Yvonne de Gaulle | ydg@example.com | ydegaulle |
A loadRow() a tábla egy sorának indexelt tömbjével tér vissza:
. . .
$db->setQuery($query);
$row = $db->loadRow();
print_r($row);
A fenti kód ezt eredményezi:
Array ( [0] => 1 [1] => John Smith [2] => johnsmith@example.com [3] => johnsmith )
Az egyes értékekhez a következőképpen juthatunk hozzá:
$row['index'] // Pl. $row['2']
Megjegyzés:
A loadAssoc() egy rekordot ad vissza asszociatív tömbként:
. . .
$db->setQuery($query);
$row = $db->loadRow();
print_r($row);
Ez a kód a következőt eredményezi:
Array ( [id] => 1 [name] => John Smith [email] => johnsmith@example.com [username] => johnsmith )
Az egyes értékekhez a következő módon juthatunk hozzá:
$row['name'] // Pl. $row['name']
Megjegyzés:
A loadObject() funkció egy PHP objektummal tér vissza, amely a tábla egy rekordját tartalmazza:
. . .
$db->setQuery($query);
$result = $db->loadObject();
print_r($result);
Ez a kód a következőt eredményezi:
stdClass Object ( [id] => 1 [name] => John Smith [email] => johnsmith@example.com [username] => johnsmith )
Az egyes értékekhez a következő módon juthatunk hozzá:
$row->index // Pl. $row->email
Megjegyzés:
Az összes ilyen eredményt betöltő funkció az adatbázis egy oszlopával tér vissza.
| id | name | username | |
|---|---|---|---|
| 1 | John Smith | johnsmith@example.com | johnsmith |
| 2 | Magda Hellman | magda_h@example.com | magdah |
| 3 | Yvonne de Gaulle | ydg@example.com | ydegaulle |
A loadResultArray() egy oszlop indexelt tömbjével tér vissza:
. . .
$db->setQuery($query);
$column= $db->loadResultArray();
print_r($column);
Ez a kód a következőt eredményezi:
Array ( [0] => John Smith [1] => Magda Hellman [2] => Yvonne de Gaulle )
Az egyes értékekhez a következő módon juthatunk hozzá:
$column['index'] // Pl. $column['2']
Megjegyzés:
A loadResultArray($index) a tábla egy oszlopának indexelt tömbjével tér vissza:
$query = "
SELECT name, email, usernameFROM . . . ";
. . .
$db->setQuery($query);
$column= $db->loadResultArray(2);
print_r($column);
Ez a kód a következőt eredményezi:
Array ( [0] => johnsmith@example.com [1] => magda_h@example.com [2] => ydg@example.com )
Az egyes értékekhez a következő módon juthatunk hozzá:
$column['index'] // Pl. $column['2']
A loadResultArray($index) lehetővé teszi, hogy átjárjuk az eredmény különböző oszlopain:
. . .
$db->setQuery($query);
for ( $i = 0; $i <= 2; $i++ ) {
$column= $db->loadResultArray($i);
print_r($column);
}Ez a kód a következőt eredményezi:
Array ( [0] => John Smith [1] => Magda Hellman [2] => Yvonne de Gaulle ) Array ( [0] => johnsmith@example.com [1] => magda_h@example.com [2] => ydg@example.com ) Array ( [0] => johnsmith [1] => magdah [2] => ydegaulle )
Megjegyzés:
Az összes ilyen eredményt betöltő funkció az adatbázis több rekordját adja vissza.
| id | name | username | |
|---|---|---|---|
| 1 | John Smith | johnsmith@example.com | johnsmith |
| 2 | Magda Hellman | magda_h@example.com | magdah |
| 3 | Yvonne de Gaulle | ydg@example.com | ydegaulle |
A loadRowList() a lekérdezés eredményében lévő rekordok indexelt tömbjeinek indexelt tömbjével tér vissza:
. . .
$db->setQuery($query);
$row = $db->loadRowList();
print_r($row);
Ez a kód a következőt eredményezi (a tisztább kód érdekében sortörést alkalmazva):
Array ( [0] => Array ( [0] => 1 [1] => John Smith [2] => johnsmith@example.com [3] => johnsmith ) [1] => Array ( [0] => 2 [1] => Magda Hellman [2] => magda_h@example.com [3] => magdah ) [2] => Array ( [0] => 3 [1] => Yvonne de Gaulle [2] => ydg@example.com [3] => ydegaulle ) )
Az egyes sorokhoz a következő módon juthatunk hozzá:
$row['index'] // Pl. $row['2']
Az egyes értékekhez a következő módon juthatunk hozzá:
$row['index']['index'] // Pl. $row['2']['3']
Megjegyzés:
A loadAssocList() a rekordok asszociatív tömbjének indexelt tömbjével tér vissza:
. . .
$db->setQuery($query);
$row = $db->loadAssocList();
print_r($row);
Ez a kód a következőt eredményezi (a tisztább kód érdekében sortörést alkalmazva):
Array ( [0] => Array ( [id] => 1 [name] => John Smith [email] => johnsmith@example.com [username] => johnsmith ) [1] => Array ( [id] => 2 [name] => Magda Hellman [email] => magda_h@example.com [username] => magdah ) [2] => Array ( [id] => 3 [name] => Yvonne de Gaulle [email] => ydg@example.com [username] => ydegaulle ) )
Az egyes sorokhoz a következő módon juthatunk hozzá:
$row['index'] // Pl. $row['2']
Az egyes értékekhez a következő módon juthatunk hozzá:
$row['index']['column_name'] // Pl. $row['2']['email']
A loadAssocList('key') a rekordok asszociatív - 'key' által indexelt - tömbjének asszociatív tömbjével tér vissza:
. . .
$db->setQuery($query);
$row = $db->loadAssocList('username');
print_r($row);
Ez a kód a következőt eredményezi (a tisztább kód érdekében sortörést alkalmazva):
Array ( [johnsmith] => Array ( [id] => 1 [name] => John Smith [email] => johnsmith@example.com [username] => johnsmith ) [magdah] => Array ( [id] => 2 [name] => Magda Hellman [email] => magda_h@example.com [username] => magdah ) [ydegaulle] => Array ( [id] => 3 [name] => Yvonne de Gaulle [email] => ydg@example.com [username] => ydegaulle ) )
Az egyes sorokhoz a következő módon juthatunk hozzá:
$row['key_value'] // Pl. $row['johnsmith']
Az egyes értékekhez a következő módon juthatunk hozzá:
$row['key_value']['column_name'] // Pl. $row['johnsmith']['email']
Megjegyzés:
A loadObjectList() a rekordok PHP objektumainak indexelt tömbjével tér vissza.
. . .
$db->setQuery($query);
$result = $db->loadObjectList();
print_r($result);
Ez a kód a következőt eredményezi (a tisztább kód érdekében sortörést alkalmazva):
Array ( [0] => stdClass Object ( [id] => 1 [name] => John Smith [email] => johnsmith@example.com [username] => johnsmith ) [1] => stdClass Object ( [id] => 2 [name] => Magda Hellman [email] => magda_h@example.com [username] => magdah ) [2] => stdClass Object ( [id] => 3 [name] => Yvonne de Gaulle [email] => ydg@example.com [username] => ydegaulle ) )
Az egyes sorokhoz a következő módon juthatunk hozzá:
$row['index'] // Pl. $row['2']
Az egyes értékekhez a következő módon juthatunk hozzá:
$row['index']->name // Pl. $row['2']->email
A getNumRows() funkció az eredményben lévő és olvasásra várakozó sorok számát adja vissza. Hogy megkapjuk a getNumRows() függvény visszaadott értékét, a kérés után, de az eredmény betöltése előtt kell meghívnunk.
. . .
$db->setQuery($query);
$db->query();
$num_rows = $db->getNumRows();
print_r($num_rows);
$result = $db->loadResultList();
Ez a kód a következőt eredményezi:
3
Megjegyzés: Ha a getNumRows() funkciót a loadResultList() - vagy ehhez hasonló metódus - után hívjuk meg, akkor egy PHP hibaüzenetet kaphatunk:
Warning: mysql_num_rows(): 80 is not a valid MySQL result resource in D:\xampp\htdocs\joomla1.5a\libraries\joomla\database\database\mysql.php on line 344
Az utóbbi időben nagyon sokan használnak ehhez hasonló kérést:
SELECT * FROM #__example WHERE id IN (SELECT * FROM #__example2);
Az ilyen típusú kérések csak a MySQL 4.1 és későbbi verzióiban lehetségesek. Ugyanezt elérhetjük a kérés két részre osztásával:
$query = "SELECT * FROM #__example2";
$database->setQuery($query);
$query = "SELECT * FROM #__example WHERE id IN (". implode(",", $database->loadArray()) .")";
A cikk forrása: Joomla! Documentation