(PHP 5, PECL sqlite >= 1.0.0)
sqlite_query -- SQLiteDatabase->query — Führt auf einer Datenbank eine Abfrage durch und liefert das Abfrageergebnis zurück
Objektorientierter Stil (Methode):
Führt eine, durch den Parameter query übergebene, SQL-Anfrage auf der übergebenen Datenbank-Verbindung aus.
Die SQLite-Datenbankressource, zurückgegeben von sqlite_open(), wenn prozedural genutzt. In der objektorientierten Notation wird dieser Parameter nicht benötigt.
Die auszuführende Anfrage.
Daten innerhalb einer Anfrage sollten maskiert werden.
Der optionale Parameter Ergebnis_Typ akzeptiert eine Konstante und bestimmt, wie das zurückgegebene Array indiziert wird. Während mit SQLITE_ASSOC nur assoziative Indizes (Namensfelder) zurückgegeben werden, werden mit SQLITE_NUM nur numerische Indizes (geordnete Feldnummern) zurückgegeben. SQLITE_BOTH gibt sowohl assoziative als auch numerische Indizes zurück. SQLITE_BOTH ist die Standardeinstellung.
Die spezifizierte Variable wird im Falle eines Fehlers gesetzt. Diese ist besonders wichtig, denn SQL-Syntaxfehler können nicht mittels sqlite_last_error() ausgelesen werden.
Hinweis: Zwei alternative Syntaxen werden für die Kompatibilität mit anderen Datenbank-Erweiterungen (wie z.B. MySQL) unterstützt. Die bevorzugte Form ist die erste, bei der der Parameter dbhandle der erste Parameter der Funktion ist.
Diese Funktion gibt ein Ergebnis-Handle zurück. Im Fehlerfall wird FALSE zurückgegeben. Für Anfragen, die Reihen liefern, kann das Abfrageergebnis mit Funktionen, wie sqlite_seek() oder sqlite_fetch_array() augelesen werden.
Ungeachtet des Anfrage-Typs, gibt diese Funktion FALSE zurück, wenn die Anfrage fehlschlägt.
sqlite_query() gib ein gepuffertes Ergebnis, dessen Zeilen einzeln ansprechbar sind. Dies ist für kleine Abfragen nützlich, bei denen man abwechselnd unterschiedliche Zeilen abfragen will. Die gepufferten Ergebnisse belegen Speicher, um das gesamte Ergebnis halten zu können. Dieser Speicher wird erst dann wieder freigegeben, wenn das komplette Ergebnis durchlaufen wurde. Wenn nur ein sequentieller Zugriff auf die Daten nötig ist, wird empfohlen, die performantere Funktion sqlite_unbuffered_query() zu nutzen.
Version | Beschreibung |
---|---|
5.1.0 | error_msg wurde hinzugefügt |
SQLite führt Mehrfach-Anfragen, die durch Semikolon getrennt wurden, aus, so dass Sie Anfragen ausführen können, die aus einer Datei oder über ein Skript geladen wurden. Wie auch immer, das funktioniert nur, wenn das Ergebins der Anfrage nicht benutzt wird. Sollte es doch genutzt werden, wird nur die erste SQL-Anfrage der Liste ausgeführt. Die Funktion sqlite_exec() wird immer Mehrfach-Anfragen ausführen.
Wenn Mehrfach-Anfrage ausgeführt werden, wird die Funktion im Fehlerfall FALSE zurückgeben, anderenfalls jedoch ein undefiniertes Ergebnis (das kann, sollte die Anfrage gelingen, TRUE oder ein Ergebnis-Handle sein).
In follow up to Csaba Gabor's function (see below) that allows for multi-statement queries to be executed via sqlite_query() this alternative implementation avoids a problem with Csaba's version (which prevents multi-statement constructs like CREATE TRIGGER from being parsed correctly).
<?php
function sqlite_query_multi ($db, $query) {
//
// sqlite_query() rewritten to support concatenated SQL statements.
//
// This method works around the sqlite_query() deficiency by splitting
// queries into two parts; the first part comprising all the statements
// except the last one (executed via sqlite_exec) and then the last
// statement (executed via sqlite_query).
//
// This allows the result of the last SELECT statement in a multi-statement
// query to be accessed regardless of the SQL statements that came before it.
// It also allows execution of arbitrary multi-statement programs regardless
// whether the result is needed, subject to the following constraint:
//
// This method requires that the last statement in a multi-statement query
// is a valid "stand-alone" SQL statement. If it is not (eg, the "END;" of
// a multi-statement construct such as CREATE TRIGGER) append an additional
// ";" (ie, a NULL statement). Normally this should not be needed because
// almost all the multi-statement constructs I can think of should have a
// stand-alone statement following them (ie, to makes use of the construct).
//
$pattern = '/^(.*;)(.*;)/s';
if ( preg_match($pattern,$query,$match) ) {
// multi-statement query
sqlite_exec($db,$match[1]);
$result = sqlite_query($db,$match[2]);
} else {
// single-statement query
$result = sqlite_query($db,$query);
}
return (@$result);
}
?>
I suppose this could be useful for users attempting to use a sqlite database for the first time.
<?php
$database = new SQLiteDatabase($yourfile, 0666, $error);
if (!$database) {
$error = (file_exists($yourfile)) ? "Impossible to open, check permissions" : "Impossible to create, check permissions";
die($error);
}
$query = $database->query("SELECT name FROM sqlite_master WHERE type='table'", SQLITE_ASSOC, $query_error); #Lists all tables
if ($query_error)
die("Error: $query_error"); #This means that most probably we catch a syntax error
if (!$query)
die("Impossible to execute query.") #As reported above, this means that the db owner is different from the web server's one, but we did not commit any syntax mistake.
print $query->numRows();
while ($row = $query->fetch())
print($row['name']."\n");
?>
i suppose that the example above is also useful because it will list all the tables created, giving also comprehension of what appens when managing a sqlite database in OO mode.
Correction:
sqlite_query will return NULL if the web server cannot write to the sqlite database file.
(please correct the previous post and delete this one)
sqlite_open will return NULL if the web server cannot write to the sqlite database file.
I saw the following message in my web server error log:
PHP Warning: sqlite_query(): (null) ...
It turns out that the sqlite database file was owned by a user other than the one the web server was running as. In my case, it was a Linux system running Apache (which was running under the context of user apache). The sqlite database file was owned by root. I changed ownership of the file to user apache and now it works! The sqlite_open call now returns a valid result handle.
Jason Aeschilman
While reading the manual at sqlite.org, I can answer for the quotes in strings. You should put two quote to get one.
insert into atable values ( '5 O''Clock');
The function below allows you to submit multiple queries in one shot to a SQLITE database, and will return whatever you would get for the final query.
function sqlite_query_multi ($db, $query) {
// submit multiple queries (separated by ;) to $db
// and return the result from the last one
$multiSQL = "/('[^']*'|\"[^\"]*\"|[^;'\"])*;/";
preg_match_all ($multiSQL, "$query;", $aSQL);
for ($i=sizeof($aSQL=$aSQL[0]);$i--;)
if (!($trim=trim(substr($aSQL[$i],0,-1))))
unset ($aSQL[$i]);
else $aSQL[$i] = "$trim;";
foreach ($aSQL as $i => $sql)
$dbRes = sqlite_query ($db, $sql);
return (@$dbRes);
}
The section below illustrates the above function:
$db = sqlite_open(":memory:", 0666, $sqliteerror);
$query = <<<EOD
CREATE TABLE foo (bar INTEGER PRIMARY KEY, baz TEXT);
INSERT INTO foo VALUES (Null, 'Hi');
INSERT INTO foo VALUES (Null, 'Mom');
SELECT * FROM foo;
EOD;
$dbRes = sqlite_query_multi ($db, $query); // 4 statements
while (sqlite_has_more($dbRes))
var_dump(sqlite_fetch_array($dbRes, SQLITE_ASSOC));
Csaba Gabor