PHP Velho Oeste 2024

sqlite_query

SQLiteDatabase->sorgu

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

sqlite_query -- SQLiteDatabase->sorguBelirtilen veritabanında bir sorgu çalıştırıp bir sonuç tanıtıcısı döndürür

Açıklama

sqlite_query ( resource $db , string $sorgu [, int $sonuç_türü [, string &$hata_iletisi ]] ) : resource
sqlite_query ( string $sorgu , resource $db [, int $sonuç_türü [, string &$hata_iletisi ]] ) : resource

Nesne yönelimli kullanım

sorgu ( string $sorgu [, int $sonuç_türü [, string &$hata_iletisi ]] ) : SQLiteResult

Belirtilen veritabanında (db) sorgu ile belirtilen SQL deyimini çalıştırıp elde edilen sonuç kümesi için bir tanıtıcı döndürür.

Değiştirgeler

db

SQLite Veritabanı özkaynağı. Yordamsal kullanımda sqlite_open() işlevi tarafından döndürülür. Nesne yönelimli kullanımda bu değiştirgeye gerek yoktur.

sorgu

Çalıştırılacak sorgu.

Sorgu içindeki verinin düzgün olarak öncelenmiş olması gerekir.

sonuç_türü

İsteğe bağlı bu değiştirgede döndürülen dizinin nasıl oluşturulacağını belirleyen bir sabit belirtilir. SQLITE_ASSOC belirtilirse alanların isimleri indis olarak kullanılır. SQLITE_NUM belirtilirse alanların sıra numaraları indis olarak kullanılır. SQLITE_BOTH için ise hem isimli hem de sayısal indisli bir dizi döner. SQLITE_BOTH bu işlev için öntanımlı değerdir.

hata_iletisi

Bir hata oluştuğunda hata iletisi bu değiştirgeye konur. SQL sözdizimi hataları sqlite_last_error() işlevi ile alınamadığından bu değiştirge özellikle önemlidir.

Bilginize: Diğer veritabanı eklentileri (MySQL gibi) ile uyumluluk için iki ayrı sözdizimi desteklenmektedir. Genelde tercih edilen sözdizimi db değiştirgesinin ilk değiştirge olarak kullanıldığı ilk sözdizimidir.

Dönen Değerler

Hata durumunda FALSE yoksa bir sonuç tanıtıcısı döndürür. Çok sayıda satır döndüren sorgular için sonuç tanıtıcısı sqlite_fetch_array() ve sqlite_seek() gibi işlevlerde kullanılabilir.

Sorgu türünden bağımsız olarak, bir sorgu başarısız olursa bu işlev FALSE döndürür.

sqlite_query() işlevi, üzerinde arama yapılabilen, tamponlu bir sonuç tanıtıcısı döndürür. Satırlara rasgele erişimin gerekli olduğu durumlarda nispeten küçük sonuç kümeleri için oldukça elverişlidir. Tamponlu sonuç için bellekte bir yer ayrılır ve bu tampon gerekli satırlarla doldurulana kadar işlev dönmez. Veriye rasgele değil de sırayla erişmenin yeterli olduğu durumlarda sqlite_unbuffered_query() işlevi daha verimlidir.

Sürüm Bilgisi

Sürüm: Açıklama
5.1.0 hata_iletisi değiştirgesi eklendi.

Notlar

Uyarı

SQLite, noktalı virgüllerle ayrılmış birden fazla sorguyu çalıştırabilir. Bu sayede, bir dosyadan yüklenen SQL betiklerini çalıştırabilirsiniz. Ancak, bu sadece işlev sonucu kullanılmayacaksa işe yarar, kullanılacaksa tek bir SQL deyimi çalıştırılmalıdır. Çok sayıda SQL deyimini çalıştırmak için daima sqlite_exec() işlevini kullanın.

Çok sayıda sorgu çalıştırıldığı durumda bir hata oluşmuşsa FALSE, başarı durumunda ise TRUE döner. Tek SQL deyimlik sorgularda ise başarı durumunda sonuç tanıtıcısı döner.

Ayrıca Bakınız

add a note add a note

User Contributed Notes 7 notes

up
11
helmakil at gmail dot com
16 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
0
glenn at byte-consult dot be
12 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
14 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
18 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
csaba at alum dot mit dot edu
20 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
up
-1
Anonymous
19 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
-2
jason at fatpipeinc dot com
18 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)
To Top