SunshinePHP Developer Conference 2015

sqlite_query

SQLiteDatabase->query

(PHP 5 < 5.4.0, PECL sqlite >= 1.0.0)

sqlite_query -- SQLiteDatabase->queryFührt auf einer Datenbank eine Abfrage durch und liefert das Abfrageergebnis zurück

Beschreibung

resource sqlite_query ( resource $dbhandle , string $query [, int $result_type = SQLITE_BOTH [, string &$error_msg ]] )
resource sqlite_query ( string $query , resource $dbhandle [, int $result_type = SQLITE_BOTH [, string &$error_msg ]] )

Objektorientierter Stil (Methode):

SQLiteResult query ( string $query [, int $result_type = SQLITE_BOTH [, string &$error_msg ]] )

Führt eine, durch den Parameter query übergebene, SQL-Anfrage auf der übergebenen Datenbank-Verbindung aus.

Parameter-Liste

dbhandle

Die SQLite-Datenbankressource, zurückgegeben von sqlite_open(), wenn prozedural genutzt. In der objektorientierten Notation wird dieser Parameter nicht benötigt.

query

Die auszuführende Anfrage.

Daten innerhalb einer Anfrage sollten maskiert werden.

result_type

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.

error_msg

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.

Rückgabewerte

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.

Changelog

Version Beschreibung
5.1.0 error_msg wurde hinzugefügt

Anmerkungen

Warnung

SQlite ist in der Lage durch Simikolon getrennte Anfragen in einem Schub auszuführen. Diese können aus einer Datei geladen oder durch ein Skript bereitgestellt werden. 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).

Siehe auch

add a note add a note

User Contributed Notes 7 notes

up
8
helmakil at gmail dot com
6 years ago
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.
up
1
glenn at byte-consult dot be
2 years ago
Not a lot of examples on using the oo style of using sqlite files.  Maybe this helps someone trying to figure out all the names of the tables inside an sqlite file.

<?php

/* Just extend the class, add our method */
class MySQLiteDatabase extends SQLiteDatabase {

  
/* A neat way to see which tables are inside a valid sqlite file */
  
public function getTables()  {
     
$tables=array();
     
$q = $this->query(sprintf("SELECT name FROM sqlite_master WHERE type='table' ORDER BY name"));
     
$result = $q->fetchAll();
      foreach(
$result as $tot_table) {
        
$tables[]=$tot_table['name'];
      }
      return(
$tables);
   }
}

/* a sqlite file */
$database="BLAHBLAH.sqlite";

if (
file_exists($database)) {
  
$db = new MySQLiteDatabase($database, 0666, $err);
   if (
$err) {
     
trigger_error($err);
   } else {
     
print_r($db->getTables());
   }
}

/* this sqlite db had 2 tables:
   Array
   (
   [0] => Account
   [1] => Device
   )

*/
?>
up
0
bruce at causal dot com
5 years ago
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);
}
?>
up
0
jason at fatpipeinc dot com
8 years ago
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)
up
0
jason at fatpipeinc dot com
8 years ago
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
up
0
Anonymous
10 years ago
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');
up
0
csaba at alum dot mit dot edu
10 years ago
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
To Top