Az adatbázis osztály használata

A JoomlaWiki wikiből

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

Miért kellene használni a Joomla! adatbázis osztályát?

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.

A lekérdezés előkészítése

  1. // Az adatbázis objektum átadása
  2. $db =& JFactory::getDBO();
  3.  
  4. $query = "SELECT * FROM #__example_table WHERE id = 999999;";
  5. $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:

  1. $query = "
  2.   SELECT * 
  3.     FROM ".$db->nameQuote('#__example_table')."  
  4.     WHERE ".$db->nameQuote('id')." = ".$db->quote('999999').";
  5.   ";

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.

setQuery($query)

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.

  1. $db =& JFactory::getDBO();
  2. $query = "/* Érvényes SQL utasítás */";
  3. $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 kérés végrehajtása

Alapvető kérés végrehajtás

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ű:

  1. $db =& JFactory::getDBO();
  2. $query = "/* Érvényes SQL utasítás */";
  3. $db->setQuery($query);
  4. $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.

Kérés végrehajtási információ

  • getAffectedRows()
  • explain()
  • insertid()

Beszúrás kérés végrehajtása

  • insertObject()

Lekérdezés eredménye

Az adatbázis osztály számos metódust tartalmaz a lekérdezések eredményének feldolgozásához.

Egy érték eredményként

Használjuk a loadResult() funkciót, amikor egy egyszerű értéket várunk az adatbázis lekéréstől.

id name email 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:

  1. $db =& JFactory::getDBO();
  2. $query = "
  3.   SELECT COUNT(*)
  4.     FROM ".$db->nameQuote('#__my_table')."
  5.     WHERE ".$db->nameQuote('name')." = ".$db->quote($value).";
  6.   ";
  7. $db->setQuery($query);
  8. $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):

  1. $db =& JFactory::getDBO();
  2. $query = "
  3.   SELECT ".$db->nameQuote('field_name')."
  4.     FROM ".$db->nameQuote('#__my_table')."
  5.     WHERE ".$db->nameQuote('some_name')." = ".$db->quote($some_value).";
  6.   ";
  7. $db->setQuery($query);
  8. $result = $db->loadResult();

Egy sor eredményként

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 email username
1 John Smith johnsmith@example.com johnsmith
2 Magda Hellman magda_h@example.com magdah
3 Yvonne de Gaulle ydg@example.com ydegaulle

loadRow()

A loadRow() a tábla egy sorának indexelt tömbjével tér vissza:

  1. . . .
  2. $db->setQuery($query);
  3. $row = $db->loadRow();
  4. 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á:

  1. $row['index'] // Pl. $row['2']

Megjegyzés:

  • A tömb indexei 0-val kezdődő numerikus értékek.
  • Habár a funkció ismételt meghívásával további sorokhoz juthatunk hozzá, a több sorral visszatérő funkciók használata hasznosabb lehet.

loadAssoc()

A loadAssoc() egy rekordot ad vissza asszociatív tömbként:

  1. . . .
  2. $db->setQuery($query);
  3. $row = $db->loadRow();
  4. 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á:

  1. $row['name'] // Pl. $row['name']

Megjegyzés:

  • Habár a funkció ismételt meghívásával további sorokhoz juthatunk hozzá, a több sorral visszatérő funkciók használata hasznosabb lehet.

loadObject()

A loadObject() funkció egy PHP objektummal tér vissza, amely a tábla egy rekordját tartalmazza:

  1. . . .
  2. $db->setQuery($query);
  3. $result = $db->loadObject();
  4. 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á:

  1. $row->index // Pl. $row->email

Megjegyzés:

  • Habár a funkció ismételt meghívásával további sorokhoz juthatunk hozzá, a több sorral visszatérő funkciók használata hasznosabb lehet.

Egy oszlop eredményként

Az összes ilyen eredményt betöltő funkció az adatbázis egy oszlopával tér vissza.

id name email username
1 John Smith johnsmith@example.com johnsmith
2 Magda Hellman magda_h@example.com magdah
3 Yvonne de Gaulle ydg@example.com ydegaulle

loadResultArray()

A loadResultArray() egy oszlop indexelt tömbjével tér vissza:

  1. . . .
  2. $db->setQuery($query);
  3. $column= $db->loadResultArray();
  4. 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á:

  1. $column['index'] // Pl. $column['2']

Megjegyzés:

  • A tömb indexei 0-val kezdődő numerikus értékek.
  • A loadResultArray() ugyanaz, mint a loadResultArray(0).

loadResultArray($index)

A loadResultArray($index) a tábla egy oszlopának indexelt tömbjével tér vissza:

  1. $query = "
  2.   SELECT name, email, username
  3.     FROM . . . ";
  4. . . .
  5. $db->setQuery($query);
  6. $column= $db->loadResultArray(2);
  7. 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á:

  1. $column['index'] // Pl. $column['2']

A loadResultArray($index) lehetővé teszi, hogy átjárjuk az eredmény különböző oszlopain:

  1. . . .
  2. $db->setQuery($query);
  3. for ( $i = 0; $i <= 2; $i++ ) {
  4.   $column= $db->loadResultArray($i);
  5.   print_r($column);
  6. }

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:

  • A tömb indexei 0-val kezdődő numerikus értékek.

Több sor eredményként

Az összes ilyen eredményt betöltő funkció az adatbázis több rekordját adja vissza.

id name email username
1 John Smith johnsmith@example.com johnsmith
2 Magda Hellman magda_h@example.com magdah
3 Yvonne de Gaulle ydg@example.com ydegaulle

loadRowList()

A loadRowList() a lekérdezés eredményében lévő rekordok indexelt tömbjeinek indexelt tömbjével tér vissza:

  1. . . .
  2. $db->setQuery($query);
  3. $row = $db->loadRowList();
  4. 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á:

  1. $row['index'] // Pl. $row['2']

Az egyes értékekhez a következő módon juthatunk hozzá:

  1. $row['index']['index'] // Pl. $row['2']['3']

Megjegyzés:

  • A tömb indexei 0-val kezdődő numerikus értékek.

loadAssocList()

A loadAssocList() a rekordok asszociatív tömbjének indexelt tömbjével tér vissza:

  1. . . .
  2. $db->setQuery($query);
  3. $row = $db->loadAssocList();
  4. 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á:

  1. $row['index'] // Pl. $row['2']

Az egyes értékekhez a következő módon juthatunk hozzá:

  1. $row['index']['column_name'] // Pl. $row['2']['email']

loadAssocList('key')

A loadAssocList('key') a rekordok asszociatív - 'key' által indexelt - tömbjének asszociatív tömbjével tér vissza:

  1. . . .
  2. $db->setQuery($query);
  3. $row = $db->loadAssocList('username');
  4. 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á:

  1. $row['key_value'] // Pl. $row['johnsmith']

Az egyes értékekhez a következő módon juthatunk hozzá:

  1. $row['key_value']['column_name'] // Pl. $row['johnsmith']['email']

Megjegyzés:

  • A kulcsnak egy érvényes oszlopnévnek kell lennie; nem szükséges, hogy index vagy elsődleges kulcs legyen. Viszont ha nem egyedi értékeket tartalmaz, lehetséges hogy visszaadott eredmény nem megbízható.

loadObjectList()

A loadObjectList() a rekordok PHP objektumainak indexelt tömbjével tér vissza.

  1. . . .
  2. $db->setQuery($query);
  3. $result = $db->loadObjectList();
  4. 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á:

  1. $row['index'] // Pl. $row['2']

Az egyes értékekhez a következő módon juthatunk hozzá:

  1. $row['index']->name // Pl. $row['2']->email

getNumRows()

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.

  1. . . .
  2. $db->setQuery($query);
  3. $db->query();
  4. $num_rows = $db->getNumRows();
  5. print_r($num_rows);
  6. $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

Tippek és trükkök

Az utóbbi időben nagyon sokan használnak ehhez hasonló kérést:

  1. 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:

  1. $query = "SELECT * FROM #__example2";
  2. $database->setQuery($query);
  3. $query = "SELECT * FROM #__example WHERE id IN (". implode(",", $database->loadArray()) .")";

A cikk forrása: Joomla! Documentation


msn kaydol