Datenbanken
Verwendung von Datenbanken.
SELECT
$res = $GLOBALS['TYPO3_DB']->exec_SELECTquery('uid,name,email','tt_address','pid = '.$id);
Ein Recordset wird zurückgegeben. Das DBAL wird den where clause (pid=$id) nicht nach SQL-injection prüfen, deshalb sollte intval verwendet werden da es ein Integer Wert ist.
$res = $GLOBALS['TYPO3_DB']->exec_SELECTquery('uid,name,email','tt_address','pid = '.intval($id));
Die EnableFields Methode sollte verwendet werden um Einträge auszuschliessen, die gelöscht wurden, versteckt sind oder durch {start,end} time eingeschränkt. Die Funktion gibt einen string für den WHERE clause zurück:
$where = 'pid = '.intval($id);
$where .= $this->cObj->enableFields('tt_address');
$res = $GLOBALS['TYPO3_DB']->exec_SELECTquery('uid,name,email','tt_address',$where);
Wenn kein WHERE clause vorhanden ist muss das führende AND gelöscht werden:
$where = preg_replace('/^ AND/', '', $where);
Methode zum Escaping von Query-Teilen
string $GLOBALS['TYPO3_DB']->quoteStr(string);
Das Resultset kann folgendermaßen angezeigt werden:
while($row = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($res)) {
do_something_with_the_data($row);
}
$GLOBALS['TYPO3_DB']->sql_free_result($res);
Das Resultset sollte freigegeben werden mit der Methode sql_free_result.
Das exec_SELECTquery benötigt folgende Parameter:
/**
* Creates and executes a SELECT SQL-statement
* Using this function specifically allow us to handle the LIMIT feature independently of DB.
* Usage count/core: 340
*
* @param string List of fields to select from the table. This is what comes right
* after "SELECT ...". Required value.
* @param string Table(s) from which to select. This is what comes right after "FROM ...".
* Required value.
* @param string Optional additional WHERE clauses put in the end of the query. NOTICE: You
* must escape values in this argument with $this->quoteStr() yourself! DO NOT
* PUT IN GROUP BY, ORDER BY or LIMIT!
* @param string Optional GROUP BY field(s), if none, supply blank string.
* @param string Optional ORDER BY field(s), if none, supply blank string.
* @param string Optional LIMIT value ([begin,]max), if none, supply blank string.
* @return pointer MySQL result pointer / DBAL object
*/
function exec_SELECTquery($select_fields,$from_table,$where_clause,$groupBy=,$orderBy=,$limit=)
DELETE
Löschen durch exec_DELETEquery, benötigt zwei Parameter: die Tabelle und das WHERE statement:
$GLOBALS['TYPO3_DB']->exec_DELETEquery('tt_address','uid='.intval($uid));
Ebenfalls intval() verwenden.
UPDATE
Update durch exec_UPDATEquery. benötigt drei Parameter: die Tabell, das WHERE statement und ein assoziatives Array mit Feldnamen => Werte Paaren. Injection sicher durch t3lib_db->quotestr.
$GLOBALS['TYPO3_DB']->exec_UPDATEquery('tt_address','uid='.intval($uid),array('email'=>$email,
'name'=>$name));
Die Where statements, Feld- und Tabellennamen sollten durch addslashes oder ähnliches laufen wenn sie aus Variablen kommen.
INSERT
Identisch zum Update command, nur kein Where clause.
$GLOBALS['TYPO3_DB']->exec_INSERTquery('tt_address',array('name'=>$name,
'email'=>$email));
Mit sql_insert_id() kann die id des letzten eigefügten Datensatzes ermittelt werden.
Debugging
Bei DBAL sehen alle SQL Fehler aus als würden sie von der t3lib_db class kommen. Debugging durch Setzen von:
$GLOBALS['TYPO3_DB']->debugOutput = TRUE
Dies sichert alle gebauten Queries in (nicht unbedingt ausgeführt) in den debug_lastBuiltQuery Parametern der Klasse. Wenn debugOutput gesetzt ist, werden alle Fehler angezeigt.
Cleaning functions
Die DBAL prüft einige Variablen, aber man muss sich selbst kümmern dass kein SQL injection exploits möglich sind. Hierfür gibt es mehrere Hilfsfunktionen. Verwende intval wennd as Feld ein Integer ist. DBAL stellt zwei Funktionen zur Verfügung um Integer Arrays und Listen zu säubern:
$GLOBALS['TYPO3_DB']->cleanIntList($list);
$GLOBALS['TYPO3_DB']->cleanIntArray($arr);
Um Strings zu escapen kann die Methode quoteStr($str,$table) verwendet werden.
(Siehe wiki.typo3.org/index.php/Table_of_Contents_%28XDG%29)