PHP Conference China 2020



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

sqlite_query -- SQLiteDatabase::queryВыполняет запрос к базе данных и возвращает идентификатор результата


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 ]] ) : resource

Объектно-ориентированный стиль (метод):

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

Выполняет SQL-запрос query к указанному дескриптору базы данных.

Список параметров


Ресурс базы данных SQLite, полученный из функции sqlite_open() в случае использования процедурного подхода. Параметр не требуется при использовании объектно-ориентированного подхода.


Выполняемый запрос.

Данные в запросе должны быть корректно экранированы.


Необязательный параметр result_type принимает константу, определяющую, как будет индексирован возвращаемый массив. При использовании SQLITE_ASSOC будет возвращен ассоциативный массив, а при использовании SQLITE_NUM - числовой. SQLITE_BOTH вернет массив как с ассоциативными, так и с числовыми индексами. Значением по умолчанию для этой функции является SQLITE_BOTH.


Указанная переменная будет заполнена в случае возникновения ошибки. Это особенно важно, так как ошибки синтаксиса SQL не возвращаются функцией sqlite_last_error().

Замечание: Поддерживаются два альтернативных синтаксиса для совместимости с другими расширениями баз данных (например, MySQL). Предпочитаемая форма - первая, в которой параметр dbhandle является первым параметром функции.

Возвращаемые значения

Функция возвращает идентификатор результата запроса или FALSE в случае возникновения ошибки. Для запросов, возвращающих данные, этот идентификатор может использоваться в качестве аргумента таких функций как sqlite_fetch_array() и sqlite_seek().

Независимо от типа запроса, в случае возникновения ошибки функция возвращает FALSE.

sqlite_query() возвращает буферизованный результирующий набор, по которому также можно перемещаться в различных направлениях. Её следует использовать для запросов, возвращающих относительно небольшое количество записей, если вам необходим случайный доступ к записям. Дескриптор буферизованного результата выделит память для всего возвращаемого результата и не возвратит ее, пока весь результат не будет полностью получен. Если вам необходим только последовательный доступ к записям, рекомендуется использовать намного более производительную функцию sqlite_unbuffered_query().

Список изменений

Версия Описание
5.1.0 Добавлен параметр error_msg



SQLite выполнит несколько запросов, разделенных точкой с запятой, что можно использовать, например, для выполнения запросов, прочитанных из файла. Однако, это работает только в случае, если результат функции не используется - если он используется, то будет выполнен только первый запрос. Функция sqlite_exec() всегда выполняет все запросы.

При выполнении нескольких запросов, функция возвращает FALSE в случае возникновения ошибки, иначе возвращаемое значение будет неопределенным (оно может быть как TRUE, так и идентификатором результата запроса).

Смотрите также

  • sqlite_unbuffered_query() - Выполняет запрос без буферизации результатов
  • sqlite_array_query() - Выполняет запрос к базе данных и возвращает результат в виде массива

add a note add a note

User Contributed Notes 7 notes

helmakil at gmail dot com
12 years ago
I suppose this could be useful for users attempting to use a sqlite database for the first time.
= new SQLiteDatabase($yourfile, 0666, $error);
if (!
$database) {
$error = (file_exists($yourfile)) ? "Impossible to open, check permissions" : "Impossible to create, check permissions";
$query = $database->query("SELECT name FROM sqlite_master WHERE type='table'", SQLITE_ASSOC, $query_error); #Lists all tables
if ($query_error)
"Error: $query_error"); #This means that most probably we catch a syntax error
if (!$query)
"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())
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.
glenn at byte-consult dot be
8 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.


/* 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()  {
$q = $this->query(sprintf("SELECT name FROM sqlite_master WHERE type='table' ORDER BY name"));
$result = $q->fetchAll();
$result as $tot_table) {

/* a sqlite file */

if (
file_exists($database)) {
$db = new MySQLiteDatabase($database, 0666, $err);
   if (
$err) {
   } else {

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

bruce at causal dot com
11 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).
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
$result = sqlite_query($db,$match[2]);
    } else {
// single-statement query
$result = sqlite_query($db,$query);
    return (@
jason at fatpipeinc dot com
14 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
csaba at alum dot mit dot edu
16 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
INSERT INTO foo VALUES (Null, 'Hi');
INSERT INTO foo VALUES (Null, 'Mom');
$dbRes = sqlite_query_multi ($db, $query);  // 4 statements
while (sqlite_has_more($dbRes))
    var_dump(sqlite_fetch_array($dbRes, SQLITE_ASSOC));

Csaba Gabor
15 years ago
While reading the manual at, I can answer for the quotes in strings. You should put two quote to get one.

insert into atable values ( '5 O''Clock');
jason at fatpipeinc dot com
14 years ago

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)
To Top