|
|
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_case | 0 | PHP_INI_ALL |
PHP_INI_* 定数に関する詳細と定義については、
ini_set()を参照して下さい。
以下に設定ディレクティブに関す
る簡単な説明を示します。
- sqlite.assoc_case
int
ハッシュのインデックスに大文字小文字混用(0)、
大文字(1)、小文字 (2)のど
れを使用するかを指定します。
このオプションは、データベーススキーマ中での実際のフィールド名の
ケースによらず、カラム名が常に大文字または小文字で返されるような
他のデータベースシステムとの互換性が必要な場合に特に有用です。
SQLiteライブラリは、カラム名をそのままのケース(これは、
スキーマで使用したケースに一致します)で返します。
sqlite.assoc_case に 0
を指定した場合、そのままのケースは保持されます。このオプションを
1 または 2 に設定した場合、
PHPはハッシュキーのケースをそれぞれ大文字または小文字のキーに変
換します。
このオプションを使用することで若干の性能劣化がありますが、
PHPスクリプトで自分で大文字/小文字変換を行うよりはかなり高速です。
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) {
$result = sqlite_query($db,"SELECT COUNT(*) FROM sqlite_master WHERE type='table' AND name='$mytable'");
$count = intval(sqlite_fetch_single($result));
return $count > 0;
}
?>
alexs at alphacomolex dot info
28-Oct-2004 10:41
the OO version.
<?php
function sqlite_table_exists($db,$mytable) {
$result = $db->query("SELECT name FROM sqlite_master WHERE type='table'");
$tables = $result->fetchAll();
if (count($tables) == 0) {
return FALSE ;
}
foreach ($tables as $table) {
if ($table['name'] == $mytable) {
return(TRUE);
}
}
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
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 ;)
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
| |