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)

Erstellt: 07/2010| Geändert: 10/2015