PHP: SQLite - Manual
PHP  
downloads | documentation | faq | getting help | mailing lists | | php.net sites | links | my php.net 
search for in the  
<is_soap_faultsqlite_array_query>
view the version of this page
Last updated: Tue, 21 Dec 2004

CX. SQLite

導入

この拡張モジュールは、SQLLite Embeddable SQL Database Engine 用の 拡張モジュールです。SQLiteは、組込み可能なSQLデータベースエンジン を実装するCライブラリです。SQLiteライブラリをリンクするプログラム は、別のRDBMSプロセスを実行することなくSQLデータベースにアクセス することができます。

SQLiteは、巨大なデータベースサーバーに接続するために使用されるク ライアントライブラリではありません。 SQLiteがそのサーバーなのです。 SQLiteライブラリは、ディスク上のデータベースを直接読み書きします。

注意: より詳細な情報については、SQLiteのWebサイト () を参照して下さい。

インストール

このパッケージに付属するINSTALLファイルを読んで下さい。 または、単にPEARインストーラで"pear install sqlite"を実行して下さ い。SQLite自体も既に含まれており、他のソフトウエアをインストール する必要は全くありません。

Windowsユーザは、DLL版のSQLite拡張モジュールを次の場所から入手可 能です。 ()

PHP 5 では、SQLite 拡張モジュールとエンジンは PHP 自身にバンドルされ、デフォルトでコンパイルされます。

要件

以下の関数を利用可能とするには、SQLiteサポートを有効にしてPHPをコ ンパイルするか、php.iniで動的にSQLite拡張モジュールをロードする必 要があります。

リソース型

SQLiteインターフェイスでは2種類のリソースが使用されています。最初 のリソースはデータベース接続で、2番目は結果セットです。

定義済の定数

関数sqlite_fetch_array()sqlite_current() は、結果配列の種別を表すために定 数を使用します。以下の定数が定義されています。

表 1. SQLite fetch 定数

定数意味
SQLITE_ASSOC カラムは、フィールド名を配列インデックスとする配列に返されます。
SQLITE_BOTH カラムは、数値インデックスとフィールド名による配列インデックス を共に有する配列に返されます。
SQLITE_NUM カラムは、フィールドへの数値インデックスを有する配列に返されま す。このインデックスは0から始まり、結果の先頭フィールドとなりま す。

実行用の設定

これらの関数の動作は、php.iniの設定により変化します。

表 2. SQLite設定オプション

名前デフォルト変更の可否
sqlite.assoc_case0PHP_INI_ALL
PHP_INI_* 定数に関する詳細と定義については、 ini_set()を参照して下さい。

以下に設定ディレクティブに関す る簡単な説明を示します。

sqlite.assoc_case int

ハッシュのインデックスに大文字小文字混用(0)、 大文字(1)、小文字 (2)のど れを使用するかを指定します。

このオプションは、データベーススキーマ中での実際のフィールド名の ケースによらず、カラム名が常に大文字または小文字で返されるような 他のデータベースシステムとの互換性が必要な場合に特に有用です。

SQLiteライブラリは、カラム名をそのままのケース(これは、 スキーマで使用したケースに一致します)で返します。 sqlite.assoc_case0 を指定した場合、そのままのケースは保持されます。このオプションを 1 または 2 に設定した場合、 PHPはハッシュキーのケースをそれぞれ大文字または小文字のキーに変 換します。

このオプションを使用することで若干の性能劣化がありますが、 PHPスクリプトで自分で大文字/小文字変換を行うよりはかなり高速です。

目次
sqlite_array_query -- 指定したデータベースに対してクエリを実行し、配列を返す
sqlite_busy_timeout --  ビジータイムアウト時間を設定またはビジーハンドラを無効にする
sqlite_changes --  直近のSQLステートメントにより変更されたレコード数を返す
sqlite_close -- オープンされたSQLiteデータベースを閉じる
sqlite_column -- カレントの結果セットのレコードからカラムを1列取得する
sqlite_create_aggregate -- SQLステートメントで使用する集約UDFを登録する
sqlite_create_function --  SQLステートメントで使用するために"通常の"ユーザ定義関数を登録する
sqlite_current -- 結果セットからカレントのレコードを配列として取得する
sqlite_error_string -- エラーコードの説明を返す
sqlite_escape_string -- クエリパラメータ用に文字列をエスケープする
sqlite_exec --  Executes a result-less query against a given database
sqlite_factory --  Opens a SQLite database and creates an object for it
sqlite_fetch_all --  Fetches all rows from a result set as an array of arrays
sqlite_fetch_array -- 結果セットから次のレコードを配列として取得する
sqlite_fetch_column_types --  Return an array of column types from a particular table
sqlite_fetch_object --  Fetches the next row from a result set as an object
sqlite_fetch_single -- Fetches the first column of a result set as a string
sqlite_fetch_string -- 結果セットから文字列として先頭カラムを取得する
sqlite_field_name -- 特定のフィールドの名前を返す
sqlite_has_more -- まだレコードがあるかないかを返す
sqlite_has_prev -- Returns whether or not a previous row is available
sqlite_last_error -- データベースに関する直近のエラーコードを返す
sqlite_last_insert_rowid -- 直近に挿入されたレコードのrowidを返す
sqlite_libencoding -- リンクされているSQLiteライブラリのエンコーディングを返す
sqlite_libversion -- リンクされているSQLiteライブラリのバージョンを返す
sqlite_next -- 次の行番号へシークする
sqlite_num_fields -- 結果セットのフィールド数を返す
sqlite_num_rows -- 結果セットのレコード数を返す
sqlite_open --  SQLiteデータベースをオープンする。データベースが存在しない場合は作 成する
sqlite_popen --  SQLiteデータベースへの持続的ハンドルをオープンする。存在しない場合 には、データベースを作成する
sqlite_prev -- Seek to the previous row number of a result set
sqlite_query -- 指定したデータベースに対してクエリを実行し、結果ハンドル を返す
sqlite_rewind -- 先頭レコード番号へシークする
sqlite_seek -- 特定のレコード番号へシークする
sqlite_single_query --  Executes a query and returns either an array for one single column or the value of the first row
sqlite_udf_decode_binary --  UDFにパラメータとして渡されたバイナリデータをデコードする
sqlite_udf_encode_binary --  UDFから返す前にバイナリデータをエンコードする
sqlite_unbuffered_query --  事前取得していないクエリを実行し、全てのデータをバッファリングする


add a note add a note User Contributed Notes
SQLite
dotwho at NOSPAM dot mac dot com
10-Feb-2005 02:03
This may have been obvious to others, but I had a tough time finding the info.

The default location for the actual database file is the same location of the php doc that created the database. You can alter this behavior by specifying the full path in the creation call:

<php
$db = sqlite_open("/absolute/path/my_sqlite.db");
?>

Note that if you used the default location, the db file may be served up by the webserver if it is in a the http document path. This is obviously a security risk that should be avoided.

//Max
hunreal+php at gmail dot com
16-Jan-2005 04:42
Check the db/table if exist

$db_name='db';
$db=new SQLiteDatabase($db_name, 0666, $error);
if ($error) exit($error);
$q=$db->query("PRAGMA table_info(test)");
if ($q->numRows()!=2) {
   if (!@$db->queryexec("
       CREATE TABLE test (
           id INTEGER NOT NULL PRIMARY KEY,
           text VARCHAR ( 255 ) NOT NULL
           )")
   ) exit ("Create SQLite Database Error\n");
}
nicolas dot toniazzi at free dot fr
16-Nov-2004 03:24
The same in 3 lines.

<?php
function sqlite_table_exists($db,$mytable) {
 
/* counts the tables that match the name given */
 
$result = sqlite_query($db,"SELECT COUNT(*) FROM sqlite_master WHERE type='table' AND name='$mytable'");

 
/* casts into integer */
 
$count = intval(sqlite_fetch_single($result));

 
/* returns true or false */
 
return $count > 0;
}
?>
alexs at alphacomolex dot info
28-Oct-2004 10:41
the OO version.
<?php
function sqlite_table_exists($db,$mytable) {
  
// ask the database kindly what tables is has.
  
$result = $db->query("SELECT name FROM sqlite_master WHERE type='table'");
  
$tables = $result->fetchAll();
  
// if there's no items in the array then our taget is not going to exists.
  
if (count($tables) == 0) {
       return
FALSE ;
   }
  
// loop over the tables to see if there's a table we're looking for.
  
foreach ($tables as $table) {
       if (
$table['name'] == $mytable) {
           return(
TRUE);
       }
   }   
  
// there was no such table, informe the user the bad news.
  
return(FALSE);
}
?>
artooro at gmail dot com
22-Oct-2004 01:26
If you need to check if a table exists, you can use a function like this:
<?php
//Returns TRUE if table exists and FALSE otherwise
//  $mytable = table you want to check for

function sqlite_table_exists($mytable) {
$db = sqlite_open('mydb.sqlite', 0666, $sqliteerror);
  
$query = sqlite_query($db, "SELECT name FROM sqlite_master WHERE type='table'");
  
$tables = sqlite_fetch_array($query);
   if (
$tables != '') {
       foreach (
$tables as $table) {
           if (
$table == $mytable) {
               return(
"TRUE");
           }
           else {
               return(
"FALSE");
           }
       }
   }
   else {
       return(
"FALSE");
   }
}
?>

A function like this could be used to create the table if it's not already created, etc.
j-pieper at NOSPAM dot web dot de
19-Oct-2004 10:18
If you want to create a table in your database which should have an integer primary key, you cannot declare the row like this:

id int(16) primary key
or
id integer(16) primary key

When you declare it like this it could be that the id isn�t auto increment. You have to declare it like this:

id integer primary key
filip at filipdewaard dot com
10-Sep-2004 06:39
I've written a short article about the (lack of) use of SQLite in-memory databases: . Hopefully it will help somebody out there ;)
philip
08-Aug-2004 09:59
SQLite tutorials:
 *
 *
 *
jon at jenseng dot com
20-Jul-2004 09:50
Since SQLite doesn't support ALTER TABLE statements or renaming tables, modifying an existing table is a bit cumbersome. You have to:

1. create a temporary table
2. copy the original table into the temporary table
3. delete the original
4. recreate the original with new column definitions
5. copy the contents back
6. delete the temporary table

As this is rather unwieldy, I've created a wrapper class that allows for ALTER TABLE queries and does the dirty work for you. It has integrated error handling to ensure that queries are completely valid and it allows for complex statements such as:

ALTER TABLE foo ADD bar VARCHAR(27), DROP bar2, CHANGE bar3 foobar INTEGER, ADD bar4 DATE

Documentation:


Source:
david at acz dot org
15-Jul-2004 01:29
You can use the PECL SQLite extension as a static (built into the executable) PHP module with PHP 4.  Download the extension tarball and extract it.  Move it to ext/sqlite in the PHP source directory.  Delete configure and run buildconf.

Example below.  Change version numbers as appropriate:

$ tar -xzvf php-4.3.8.tar.gz
$ tar -xzvf SQLite-1.0.2.tgz
$ mv SQLite-1.0.2 php-4.3.8/ext/sqlite
$ cd php-4.3.8
$ rm configure
$ ./buildconf --force

If everything worked, then you should now be able to build PHP with SQLite support:

$ ./configure --help | grep sqlite
  --with-sqlite          Include sqlite support

I think this method will work for other PECL extensions.
13-May-2004 02:46
PHP5 compile time option --enable-sqlite-utf8

See the note about buggy utf-8 support
csaba at alum dot mit dot edu
14-Apr-2004 03:16
If you want to get the list of all the columns in a table (and associated information), PRAGMA is helpful (see for details):

if (!($db=@sqlite_open("delme.db",0666,$sqliteerror))) die("Can't open database");
@sqlite_query ($db, 'DROP TABLE foo;');
sqlite_query($db, "CREATE TABLE foo (bar INTEGER PRIMARY KEY, baz VARCHAR(5));");
$aTableStruct = sqlite_array_query($db, "PRAGMA table_info('foo');", SQLITE_ASSOC);
for ($i=0,$aNames=array();$i<sizeof($aTableStruct);++$i)
   $aNames[]=$aTableStruct[$i]['name'];
var_dump ($aNames);    // => ['bar', 'baz']

Note also that if you want to use more than one database in the same connection using "ATTACH DATABASE ..." then you should supply the complete database filename.

Csaba Gabor
cricket at djcricket dot com
31-Mar-2004 05:30
To elaborate on vpupkin at comcast dot net's post about the INSERT query problem, you will be unable to execute any manipulation queries (INSERT/UPDATE/DELETE/ect) on the SQLite database file unless the directory the SQLite database file resides in is writable by the webserver.

The reason for this is because SQLite needs to write a lock file to the hard drive. After a processes finishes writting, it deletes the lock file. Other processes check for the lock file before writting to the SQLite database file and if present, delay writting until the lock file is no longer present.
jlsalinas at spamsucks dot gmx dot net
14-Feb-2004 02:22
For those looking for a function similar to mysql_list_tables, here you have:

if (! function_exists ('sqlite_list_tables')) {
   function sqlite_list_tables (&$dblink) {
       $tables = array ();
      
       $sql = "SELECT name FROM sqlite_master WHERE (type = 'table')";
       if ($res = sqlite_query ($dblink, $sql)) {
           while (sqlite_has_more($res)) {
               $tables[] = sqlite_fetch_single($res);
           }
       }
      
       return $tables;
   }
}

And a related funtion, to test if a given table exists:

if (! function_exists ('sqlite_table_exists')) {
   function sqlite_table_exists (&$dblink, $table) {
       $sql = "SELECT count(name) FROM sqlite_master WHERE ((type = 'table') and (name = '$table'))";
       if ($res = sqlite_query ($dblink, $sql)) {
           return sqlite_fetch_single($res) > 0;
       } else {
           return false; // or throw exception
       }
   }
}

Of course it would be preferable to have these functions included in the library, to avoid potential changes internal to SQLite; but we'll have to stick to this method until then.
05-Feb-2004 04:11
Since this extension is rather new and few tutorials/articles talk about it... here's one worthy of a link:
vpupkin at comcast dot net
01-Dec-2003 04:53
if you are going to send INSERT queries, you will need to make the folder, where you put your "file.db", writable by a web server user, otherwise you'll receive error message - "Unable to open database . . . ". File permissions are not enough (phpinfo - SQLite Lib 2.8.3)
Minots Estich� <minots at D0X dot de>
22-Nov-2003 02:47
If you gone in trouble while/with installation of sqlite,
you can try the installation steps I�ve done at
RedHat9 with PHP4.3.4 and Apache 1.3.28
via the Linux shell:

# wget
# tar xzf SQLite-1.0.tgz
# cd sqlite
# export PHP_PREFIX="/usr"
# $PHP_PREFIX/bin/phpize
# ./configure
# make
# make install

After that add following to php.ini and restart Apache:

[sqlite]
extension="sqlite.so"
ng4rrjanbiah at rediffmail dot com
07-Nov-2003 03:19
Very nice MS PowerPoint presentation titled "SQLite and PHP" (author: Wez Furlong) can be downloaded at [134 KB]

HTH,
R. Rajesh Jeba Anbiah

<is_soap_faultsqlite_array_query>
 Last updated: Tue, 21 Dec 2004
show source | credits | sitemap | contact | advertising | mirror sites 
Copyright © 2001-2005 The PHP Group
All rights reserved.
This unofficial mirror is operated at: /
Last updated: Mon Mar 14 08:13:06 2005 Local time zone must be set--see zic manual page