- Queries - rex_sql
- getQueryType
- datetime
- setDBQuery
- setDebug
- prepareQuery
- execute
- setQuery
- setTable
- setRawValue
- setValue
- setArrayValue
- setDateTimeValue
- setValues
- setArrayValue
- setDateTimeValue
- setValues
- hasValues
- isValueOf
- setWhere
- getValue
- getArrayValue
- getDateTimeValue
- getRow
- getTables
- getTablesAndViews
- hasValue
- in
- isNull
- getRows
- getFields
- getWhere
- select
- update
- insert
- replace
- delete
- flush
- flushValues
- hasNext
- reset
- getLastId
- getDBArray
- getArray
- getErrno
- getMysqlErrno
- getError
- hasError
- setNewId
- getFieldnames
- getTablenames
- escape
- escapeIdentifier
- addGlobalUpdateFields
- addGlobalCreateFields
- rewind
- current
- key
- next
- valid
- showCreateTable
- showTables (deprecated)
- showColumns
- getServerVersion
- factory
- checkDbConnection
- Informationen über Datenbank-Version/-Typ einholen
Die Klasse rex_sql
ist der Datenbankwrapper, über den REDAXO alle Datenbankzugriffe erzeugt und verwaltet. Die Klasse steht dem Entwickler für eigene Datenbankzugriffe zur Verfügung. Es wird empfohlen alle Datenbankzugriffe über diese Klasse vorzunehmen. Sowohl im Frontend als auch im Backend besteht eine aktive Datenbankverbindung, die für die Zugriffe genutzt werden kann.
In der rex_sql Klasse werden häufig Parameter in der Form function($query, $params)
verwendet. Es wird empfohlen die Werte an den Query über die params zu übergeben.
Beispiel:
$sql = rex_sql::factory();
$sql->setQuery('SELECT name, id FROM rex_article WHERE parent_id = :pid', ['pid'=>5]);
Die meisten Funktionen geben das aktuelle rex_sql Objekt zurück.
getQueryType($qry)
Gibt den Typ der Abfrage $sql zurück oder false
wenn die Abfrage keinen Typ enthält.
Mögliche Rückgabewerte sind SELECT, SHOW, UPDATE, INSERT, DELETE, REPLACE, CREATE, CALL, OPTIMIZE oder false. Die Syntax wird nicht geprüft.
datetime($timestamp = null)
Gibt einen Datumsstring im SQL Datetime Format (Y-m-d H:i:s) aus dem übergebenen Timestamp zurück. Standard ist die aktuelle Zeit.
setDBQuery($query, array $params = [], array $options = [])
Setzt eine Abfrage ($query) ab und wechselt die DBID falls vorhanden.
Beispiel:
$sql = rex_sql::factory();
$sql->setDBQuery('SELECT id, name FROM rex_article WHERE id > :id',['id'=>5]);
setDebug($debug = true)
Schaltet die Debug Funktion von rex_sql ein. Damit wird das rex_sql Objekt bei ausgeführter Query per dump() ausgegeben.
prepareQuery($qry)
Erstellt aus einer übergebenen SQL Abfrage ein PDO Statement.
execute(array $params = [], array $options = [])
Führt das vorbereitete Statement aus. Im Fehlerfall wird eine Exception vom Typ rex_sql_exception erzeugt. Mit dem Parameter $options
kann das Pufferverhalten beeinflusst werden.
$sql = rex_sql::factory();
$sql->prepareQuery('SELECT id, name FROM rex_article WHERE id > :id');
$sql->execute(['id'=>10]);
Das Beispiel setzt eine Abfrage mit Platzhaltern. Die Werte für die Platzhalter werden mit execute
übergeben. Damit lässt sich dann beispielsweise eine Abfrage mehrfach verwenden, indem die Parameter verändert werden.
setQuery($query, array $params = [], array $options = [])
Setzt die SQL Query, übernimmt die Parameter, setzt das Objekt mit flush
zurück und führt das Statement aus.
$res = $sql->setQuery('SELECT id, name FROM rex_article WHERE id > :id',['id'=>10]);
setTable($table)
Setzt den Tabellennamen und gibt das rex_sql Objekt zurück.
setRawValue($colName, $value)
Setzt den Raw Wert einer Tabelle und gibt das rex_sql Objekt zurück.
setValue($colName, $value)
Setzt einen einzelnen Wert value
für eine Spalte colName
und gibt das rex_sql Objekt zurück.
setArrayValue($colName, array $value)
Setzt den Inhalt eines Arrays value
für eine Spalte colName
. Der Wert wird per json_encode
codiert.
setDateTimeValue($colName, $timestamp)
Formatiert einen timestamp
in das SQL Datumsformat und setzt ihn für die Spalte columnName
. Das rex_sql Objekt wird zurückgegeben.
setValues(array $valueArray)
Setzt ein Array als Inhalt. Der Schlüssel des Arrays muss dem passenden Feldnamen der Tabelle entsprechen.
setArrayValue($colName, array $value)
Ein Array in der Datenbank ablegen. Der Wert von array wird per json_encode
codiert. Siehe auch getArrayValue
setDateTimeValue($colName, $timestamp)
Legt in der Spalte $colName
einen Timestamp im Format Y-m-d H:i:s
ab. Wird in $timestamp
kein Wert übergeben, wird der aktuelle Unix Timestamp verwendet.
setValues(array $valueArray)
Ein assoziatives Array ablegen, wobei die keys
den Feldnamen entsprechen, die values
den Werten.
$sql->setValues(['vorname'=>'Rupert','nachname'=>'Neudeck']);
hasValues()
Gibt true
zurück, wenn das rex_sql Objekt Werte enthält, ansonsten false
. Es sind keine Parameter erlaubt.
isValueOf($feld, $prop)
Prüft den Wert einer Spalte der aktuellen Zeile ob ein Wert enthalten ist. Wenn für $prop = ""
übergeben wird, wird stets true
zurückgegeben.
setWhere($where, $whereParams = null)
Setzt die WHERE
-Bedingung der Abfrage.
$sql->setWhere(['id' => 3, 'field' => '']);
ergibt id = 3 AND field = ''
$sql->setWhere([['id' => 3, 'field' => '']]);
ergibt id = 3 OR field = ''
mit Parameter:
$sql->setWhere('myid = :id OR anotherfield = :field', ['id' => 3, 'field' => '']);
ergibt myid = 3 OR anotherfield = ''
Es wird nicht empfohlen den gesamten Where-String mit Parametern und Werten zu übergeben:
$sql->setWhere('myid="35" OR abc="zdf"');
(deprecated)
getValue($colName)
Gibt den Wert von colName
des aktuellen Datensatzes zurück. Wird für colName
kein Wert übergeben, wird ein Fehler vom Typ rex_sql_exception
generiert.
Wenn der Name des Feldes in der Form tablename.fieldname
übergeben wurde, wird direkt auf den Tabellennamen zugegriffen. Andernfalls versucht die Funktion den Feldnamen in der Abfrage zu finden. Ist dieser nicht eindeutig, wird ein Fehler generiert.
getArrayValue($colName)
Das in colName
abgelegte Array wird per json_decode
decodiert und zurückgegeben. Sie auch setArrayValue
.
getDateTimeValue($colName)
Gibt den in colName
abgelegte als String abgelegten Datum-Zeit Wert als Unix Timestamp zurück. Siehe auch setDateTimeValue
.
getRow($fetch_type = PDO::FETCH_ASSOC)
Gibt den Wert der aktuellen Zeile zurück. Über fetch_type
kann festgelegt werden von welchem Typ das Ergebnis ist. So gibt PDO::FETCH_OBJ
das Ergebnis als Objekt zurück. Standard ist PDO::FETCH_ASSOC
, womit ein assoziatives Array zurückgegeben wird.
hasValue($feldname)
Prüft, ob eine Spalte vorhanden ist. Gibt true
zurück, wenn die Spalte gefunden wurde, flase
, wenn sie nicht gefunden wurde. Die Funktion kann auch mit einem vorangestellten Alias aufgerufen werden: tablename.feldname
.
in(array $values)
Bereitet ein Array von ints und/oder strings vor für den Einsatz in einem mysql IN (...) statement:
$sql = rex_sql::factory();
$sql->setQuery('SELECT * FROM my_table WHERE my_col IN ('.$sql->in(['foo', 'bar']).')');
isNull($feldname)
Prüft, ob das Feld mit dem Namen feldname
null ist. Es wird true
oder false
zurückgegeben.
getRows()
Gibt die Anzahl der Zeilen für eine gesetze Abfrage zurück.
getFields()
Gibt die Anzahl der Spalten für eine gesetze Abfrage zurück.
getWhere()
Gibt das aktuelle where
Statement zurück.
select($fields = '*')
Setzt eine Select-Abfrage auf die aktuelle Tabelle mit dem aktuellen where
Statement ab. Die Angabe von fields
ist optional, Standard ist *
.
update()
Setzt eine Update-Anweisung auf die angegebene Tabelle mit den gesetzten Werten (z.B. mit setValue
oder setValues
) und mit setWhere
gesetzten WHERE Parametern ab.
insert()
Setzt eine Insert-Anweisung auf die angegebene Tabelle mit den gesetzten Werten (z.B. mit setValue
oder setValues
). Bei Verstoß gegen eine NOT NULL Regel wird eine rex_sql_exception ausgelöst.
replace()
Setzt eine Replace-Anweisung auf die angegebene Tabelle mit den gesetzten Werten (z.B. mit setValue
oder setValues
) und mit setWhere
gesetzten WHERE Parametern ab.
delete()
Setzt eine Delete-Anweisung auf die angegebene Tabelle mit den WHERE Parametern ab, die mit setWhere
gesetzten wurden.
flush()
Setzt alle Werte auf den Ursprungszustand zurück. Gibt das rex_sql Objekt zurück.
flushValues()
Stellt alle Values, die mit setValue
oder setValues
gesetzt wurden, zurück.
hasNext()
Gibt true
zurück, wenn das Resultset einen weiteren Datensatz enthält, ansonsten false
.
reset()
Setzt den Cursor des Resultsets zurück zum Anfang. Identisch mit rewind
.
getLastId()
Gibt die letzte InsertId zurück.
getDBArray($query = null, array $params = [], $fetchType = PDO::FETCH_ASSOC)
Lädt das komplette Resultset in ein Array und gibt dieses zurück. Wechselt die DBID, falls vorhanden. Identisch mit getArray
.
getArray($query = null, array $params = [], $fetchType = PDO::FETCH_ASSOC)
Lädt das komplette Resultset in ein Array und gibt dieses zurück. Wechselt die DBID, falls vorhanden. Identisch mit getDBArray
.
getErrno()
Gibt die zuletzt aufgetretene Fehlernummer zurück.
getMysqlErrno()
Gibt die treiberspezifische MySql Fehlernummer zurück.
getError()
Gibt ein Array mit Informationen des zuletzt aufgetretenen Fehlers zurück. Der Aufbau des Arrays entspricht folgendem Muster:
[0] => 5-stelliger Fehlercode
[1] => Fehlernummer des MySQL Treibers
[2] => Fehlerbeschreibung
hasError()
Prüft, ob ein Fehler aufgetreten ist. Bei einem Rückgabewert von true
ist ein Fehler aufgetreten, bei false
nicht.
setNewId($field, $start_id = 0)
Setzt eine Spalte auf den nächstmöglichen auto_increment
Wert. Um zu verhindern, dass das rex_sql Objekt verändert wird, wird in dieser Funktion ein eigenes rex_sql Objekt verwendet.
getFieldnames()
Gibt die Spaltennamen des Resultsets zurück.
getTablenames()
Gibt die Tabellennamen des Resultsets zurück.
escape($value)
Escaped den übergeben Wert für den DB Query.
escapeIdentifier($name)
Escaped den übergebenen Wert und fügt Backticks am Anfang und am Ende dazu.
Aus "Das sind Backticks: ``"
wird "``Das sind Backticks: `````"
addGlobalUpdateFields($user = null)
Standardfelder updatedate
und updateuser
setzen. updatedate
ist der aktuelle Wert von time() als Date Time String (über setDateTimeValue
).
user
ist standardmäßig der Login Name des aktuellen REDAXO Backend User oder ein übergebener String.
addGlobalCreateFields($user = null)
Standardfelder createdate
und createuser
setzen. createdate
ist der aktuelle Wert von time() als Date Time String (über setDateTimeValue
).
user
ist standardmäßig der Login Name des aktuellen REDAXO Backend User oder ein übergebener String.
rewind()
Setzt den Cursor des Resultsets zurück zum Anfang. Identisch mit reset
.
current()
Gibt das aktuelle rex_sql Objekt zurück.
key()
Gibt den aktuellen Wert des Zeigers im Resultset zurück.
next()
Setzt den Zeiger im Resultset um einen Datensatz vor.
valid()
Gibt true
zurück, wenn das Resultset einen weiteren Datensatz enthält, ansonsten false
. Identisch mit hasNext
.
rex_sql::showCreateTable($table, $DBID = 1)
(public static)
Erstellt das CREATE TABLE Statement um die Tabelle $table
der Datenbankverbindung $DBID
zu erstellen. Die Tabelle $table
muss vorhanden sein, sonst wird ein Fehler ausgegeben.
rex_sql::showTables($DBID = 1, $tablePrefix = null)
(public static)
Sucht alle Tabellen der Datenbankverbindung $DBID
. Falls $tablePrefix
gesetzt ist, werden nur dem Prefix entsprechende Tabellen gesucht. Es wird ein Array mit den Namen aller in der Datenbank vorhandenen Tabellen zurückgegeben.
Die Funktion ist seit Version 5.6.2 deprecated. Es wird die Verwendung der nicht statischen Funktion getTablesAndViews
empfohlen.
$sql->getTables($tablePrefix = null)
Sucht alle Tabellen der Datenbankverbindung $DBID
. Falls $tablePrefix gesetzt ist, werden nur dem Prefix entsprechende Tabellen gesucht. Als Rüclgabe erhält man ein Array der Tabellennamen.
$sql->getTablesAndViews($tablePrefix = null)
Sucht alle Tabellen der Datenbankverbindung $DBID
. Falls $tablePrefix
gesetzt ist, werden nur dem Prefix entsprechende Tabellen gesucht. Es wird ein Array mit den Namen aller in der Datenbank vorhandenen Tabellen und Views zurückgegeben. Ersetzt die statische Funktion showTables
.
rex_sql::showColumns($table, $DBID = 1)
(public static)
Gibt ein Array mit den Spalten der Tabelle $table
zurück. Die Spalten werden ebenfalls als Array zurückgegeben.
[
[0] => [
"name" => "pid",
"type" => "int(11)",
"null" => "NO",
"key" => "PRI",
"default" => null,
"extra" => "auto_increment"
],
[1] => [
"name" => "id",
"type" => "int(11)",
"null" => "NO",
"key" => "MUL",
"default" => null,
"extra" => ""
]
]
getServerVersion($DBID = 1)
(public static)
Gibt die Serverversion zurück.
factory($DBID = 1)
(public static)
Factory Methode. Erstellt eine neue Instanz des rex_sql Objekte und gibt diese zurück.
Standardmäßig wird auf die im System definierte Datenbankresource zugegriffen, die auch von REDAXO selbst genutzt wird. Optional unterstützt REDAXO eine weitere Datenbankquelle. Die Konfiguration kann in der Datei redaxo/data/core/config.yml
eingetragen werden. Diese Datenbank ist dann über $sql2 = rex_sql::factory(2)
angesprochen werden.
checkDbConnection($host, $login, $pw, $dbname, $createDb = false)
(public static)
Prüft die übergebenen Zugangsdaten auf Gültigkeit und legt ggf. die Datenbank an.
Zusätzlich zu rex_sql::getServerVersion()
gibt es zusätzlich zwei nicht-statische Methoden:
$sql->getDbType()
: liefert entweder "MySQL" (=== rex_sql::MYSQL) oder "MariaDB" (=== rex_sql::MARIADB)
$sql->getDbVersion()
: liefert die vereinfachte Version im Format X.Y.Z
Letztere ist vor allem für MariaDB praktisch, da MariaDB vor ihre eigene Version immer "5.5.5-" setzt.
Beispiel
$sql = rex_sql::factory();
$dbVersion = $sql->getDbVersion();
$dbType = $sql->getDbType();
Ich würde die Methoden bei der utf8mb4-Umsetzung nutzen.