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.
sqlite_query
SQLiteDatabase::query
(PHP 5 < 5.4.0, PECL sqlite >= 1.0.0)
sqlite_query -- SQLiteDatabase::query — Ejecutar una consulta en una base de datos dada y devolver un gestor de resultados
Descripción
$dbhandle
, string $query
[, int $result_type = SQLITE_BOTH
[, string &$error_msg
]] )$query
, resource $dbhandle
[, int $result_type = SQLITE_BOTH
[, string &$error_msg
]] )Estilo orientado a objetos (método):
$query
[, int $result_type = SQLITE_BOTH
[, string &$error_msg
]] )
Ejecuta una sentencia SQL dada por query en
un gestor de base de datos daod.
Parámetros
-
dbhandle -
El recurso de Base de datos de SQLite; devuelto por sqlite_open() cuando se usa procedimentalmente. Este parámetro no es necesario cuando se usa el método orientado a objetos.
-
query -
La consulta a ejectuar.
Los datos dentro de la consulta deberían ser apropiadamente escapados.
-
result_type -
El parámetro opcional
result_typeacepta una constante y determina cómo se indexará el array devuelto. UsarSQLITE_ASSOCdevolverá índices asociativos (los nombres de los campos) mientras queSQLITE_NUMdevolverá sólo índices numéricos (los campos en números ordinales).SQLITE_BOTHdevolverá índices tanto asociativos como numéricos.SQLITE_BOTHes el valor por defecto para esta función. -
error_msg -
La variable especificada será rellenada si ocurre un error. Esto es especialmente importante ya que los errores de sintaxis de SQL no se pueden recoger usando la función sqlite_last_error().
Nota: Dos sintaxis alternativas son soportadas para la compatibilidad con otras extensiones de base de datos (tal como MySQL). La forma preferida es la primera, donde el parámetro
dbhandlees el primero de la función.
Valores devueltos
Esta función devolverá un gestor de resultados o FALSE en caso de error.
Para consultas que devuelven filas, el gestor de resultados se puede usar con
funciones como sqlite_fetch_array() y
sqlite_seek().
Sin tener en cuenta el tipo de consulta, esta función devolverá FALSE si la
consulta falla.
sqlite_query() devuelve un gestor de resultados almacenado en buffer y rasteable. Esto es útil para consultas razonablemente pequeñas donde se necesite la capacidad de acceso a filas aleatorio. Los gestores de resultados almacenados en buffer asignarán memoria para contener el resultado completo y no devolverán hasta que se haya recuperado. Si sólo se necesita acceso secuencial a los datos, se recomienda usar la función con más alto rendimiento sqlite_unbuffered_query() en su lugar.
Historial de cambios
| Versión | Descripción |
|---|---|
| 5.1.0 |
Se añadió el parámetro error_msg
|
Notas
SQLite ejecutará múltiples consultas separadas por puntos y comas, por lo que se puede usar esta función para ejecutar un lote de SQL que se haya cargado desde un fichero o embebido en un script. Sin embargo, esto sólo funcionará cuando el resultado de la función no se use - si se usara, se ejecutaría solamente la primera sentencia SQL. La función sqlite_exec() siempre ejecutará múltiple sentencias SQL.
Cuando se ejecutan múltiples consultas, el valor devuleto por esta función
será FALSE si hubiera un error, pero será indefinido de otro modo (podría
ser TRUE en caso de éxito o podría devolver un gestor de resultados).
Ver también
- sqlite_unbuffered_query() - Ejecutar una consulta que no precargue ni almacene en buffer toda la información
- sqlite_array_query() - Ejecutar una consulta en una base de datos dada y devolver un array
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
)
*/
?>
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);
}
?>
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
