September 3, 2010, Friday, 245

Php sqlite

出自TechWiki

跳轉到: 導航, 搜索

目錄

[編輯] 介紹

資料庫在處理大量的資料上是很必要的,但如果資料固定且量不多,或是資料庫只會在單機上使用,且沒有讓多人使用的需求的話,就不一定需要特別架一個資料庫系統;因此,可以使用類似 SQLite 這樣的嵌入式資料庫(embedded SQL database)。
SQLite 與其他一般資料庫差異不大,一般的 SQL-92 語法都能夠使用,而且不需要建立一個資料庫系統,要使用的時候,只要在編譯程式的時候將 SQLite 程式庫一起編入就可以使用。另外,SQLite 的資料庫(database)都是以單一檔案的形式存於磁碟中,不需要再安裝資料庫伺服器軟體,所以要把資料庫複製或建立在你的電腦上是相單簡單快速。
SQLite 是一個很小的 C 語言程式庫,且本身就完全包含資料庫引擎的功能,而且可以嵌入至其他程式中,完全不用額外的設定。其特性如下:
      • 支援ACID (Atomic, Consistent, Isolated, Durable) transaction。
      • Zero-configuration:無須管理者的設定及管理。
      • 支援大部分SQL92的語法。
      • 資料庫存在於一個單一的檔案中。
      • 資料庫系統所在機器的位元組順序(Byte order)無關。
      • 支援大小至2 terabytes (2^41 bytes)。
      • 記憶體需求小:小於3萬行的C語言程式碼。小於250KB的程式空間。
      • 大部分的資料庫操作皆快於一般資料庫系統。
      • 簡單易用的API。
      • 支援TCL。也有其他語言的支援可用。
      • 註解詳細的程式碼,以及超過90%的測試。
      • 程式庫自己包含完整的功能,無須其他額外的程式或程式庫。
      • 為public domain,可免費使用。
      • serverless
      • cross-platform - 使用unicode
      • 不會進行data type檢查


[編輯] 安裝

[編輯] for Linux(rpm)

I、下載 SQLite

wget http://www.sqlite.org/sqlite-3.5.4.tar.gz


2、解壓縮與編譯

tar zxvf sqlite-3.5.4.tar.gz
cd sqlite-3.5.4
./configure
make
make install

ps.若make的時候有發生找不到tcl相關的library時,可以利用下列指令:

./configure --disable-tcl --prefix=/usr/local/sqlite-3.3.5


亦或者下載 sqlite 與 tcl 相關的 library 即可:

apt-get install libsqlite3-tcl


[編輯] for linux(套件管理程式安裝)

可以利用 apt-get(Ubuntu/Debian)或 yum(Fedora)來直接下載,

  1. apt-get install sqlite

若 SQLite 要與 PHP 搭配使用,則需要為 PHP 特別安裝套件,可利用各個 distros 的套件管理軟體來安裝(以Ubuntu為例):

    • for PHP4:
apt-get install php4-sqlite
    • for PHP5:
apt-get install php5-sqlite


[編輯] for Windows

若要下載命令列模式的 SQLite 程式來存取與修改 SQLite 資料庫,可以至(http://www.sqlite.org/download.html)下載預先編譯過的程式。


for PHP 4:

1、到這裡(http://pecl4win.php.net/ext.php/php_sqlite.dll)下載 php_sqlite.dll

2、php.ini 加上 extension=php_sqlite.dll

3、重新啟動 Web Server 即可。


forPHP 5:

PHP 5 已經包含 SQLite 模組了,所以只需要載入模組即可。

修改 php.ini,將 ;extension=php_sqlite.dll 將前面的分號去掉。

最後一樣重新啟動 Web Server 即可。

[編輯] 如何使用sqlite(command-line)

以下我們就對建立資料庫、建立資料表、新增資料、查詢資料、更改資料、移除資料、sqlite 命令列選項等幾個項目做簡單的介紹。


[編輯] 建立資料庫檔案

用 sqlite 建立資料庫的方法很簡單,只要在 shell 下鍵入:sqlite db_name

如果目錄下沒有 db_name,sqlite 就會建立這個資料庫。 進入了sqlite之後,會看到以下文字:

SQLite version 2.8.17
 
Enter ".help" for instructions
sqlite>

這時如果使用.help可以取得求助,.quit則是離開

所有的SQL指令都是以分號(;)結尾的。如果遇到兩個減號(--)則代表註解,sqlite 會略過去。


[編輯] 建立資料表(table)

假設我們要建一個名叫 tbl 的資料表,只要鍵入以下指令就可以了: sqlite > create table tbl(one, two);

這樣我們就建立了一個名叫 tbl 的資料表,裡面有 one、two 兩個欄位。

create table指令的語法為:create table table_name(field1, field2, field3, ...);

table_name 是資料表的名稱;fieldx 則是欄位的名字;

sqlite 的欄位不會檢查是屬於哪一種資料型態:sqlite的欄位可以儲存任何東西:文字、數字、大量文字(blob),它會在適時自動轉換。


[編輯] 加入一筆資料

接下來我們要加入資料了,語法為:

insert into table_name values(data1, data2, data3, ...);

例如: insert into tbl values ('hello!', 10); insert into tbl values ('goodbye’, 20);

如果該欄位沒有資料,我們可以填NULL。


[編輯] 查詢資料

利用 SQL 語法裡的 select :

select columns from table_name where expression;


最常見的用法,當然是倒出所有資料庫的內容: select * from tbl;

如果資料太多了,我們或許會想限制筆數: select * from tbl limit 10;

有時候我們只想知道資料庫一共有多少筆資料: select count(*) from film;


[編輯] 如何更改或刪除資料

瞭解 select 的用法非常重要,因為要在 sqlite 更改或刪除一筆資料,也是靠同樣的語法。

例如有一筆資料打錯了,可利用這樣的指令來修改: update tbl set one = 'hello!' where one='hollo!';

就會把one欄位裡,被打成 hollo! 的那筆(或多筆)資料,改回成hello!。


[編輯] 其他 sqlite 的特別用法

1、sqlite 可以在 shell 底下直接執行命令:

sqlite3 ur_db.db "select * from tbl;"


2、資料庫備份:

sqlite3 ur_db.db ".dump" > output.sql

echo '.dump' | sqlite ur_db.db | gzip -c > ur_db.dump.gz


利用輸出的資料,可以建立一個相同的資料庫(其實就是標準的SQL資料庫備份):


sqlite3 film.db < output.sql

zcat ex1.dump.gz | sqlite3 ex2


3、查詢資料庫的 schema

資料庫的 schema 是特別存於名為 sqlite_master 的資料表,可利用 "SELECT" 指令來查詢,如下所示:
$ sqlite3 db_name
SQlite vresion 2.817
Enter ".help" for instructions
sqlite> select * from sqlite_master;
type = table
name = tbl
tbl_name = tbl
rootpage = 3
sql = create table tbl(title, length)
sqlite>


4、更改輸出的格式

sqlite 能夠將查詢的結果以8種不同的格式輸出(csv、column、html、insert、line、tabs、tcl),你可以利用指令 "mode" 來改變輸出格式,預設的格式為 list ,在這個模式下,查詢的結果都是一行一行列出,而預設的分隔符號為 "|" ,如下所示:
sqlite> .mode list
sqlite> select * from tbl;
aaa|232
bbb|454


你也可以利用指令 ".separator" 來改變分隔符號,例如:

sqlite> .separator ", "
sqlite> select * from tbl;
aaa, 232
bbb, 454
sqlite>


在 "line" 模式中,每一個欄位都會獨自與一行顯示出來,而每一筆資料會以一個空行來分隔,如下所示:

sqlite> .mode line
sqlite> select * from tbl;
title = aaa
length = 232
 
title = bbb
length = 454
sqlite>


在 column 模式中,每一筆資料都會顯示於獨立的一列,並且以欄位來分隔,如下所示:

sqlite> .mode column
sqlite> select * from tbl;
title length
---------- ----------
aaa 232
bbb 454
sqlite>


另外一個有用的模式為 "insert",此模式的輸出格式類似於 SQL 語法中的 INSERT 格式,可用於日後要輸入資料於其他資料庫中:

sqlite> .mode insert
sqlite> select * from tbl;
INSERT INTO table VALUES('aaa',232);
INSERT INTO table VALUES('bbb',454);
sqlite>


最後一個輸出模式為 "html",此模式下 sqlite 會將查詢結果輸出為類似 XHTML 表格,如下所示:

sqlite> .mode html
sqlite> select * from tbl;
<TR><TH>title</TH><TH>length</TH></TR>
<TR><TD>aaa</TD>
<TD>232</TD>
</TR>
<TR><TD>bbb</TD>
<TD>454</TD>
</TR>
sqlite>


[編輯] 查詢資料庫的 schema

sqlite 提供很多方便且有用的指令來查詢資料庫的 schema:

列出資料庫中的資料表,利用 ".tables":

sqlite> .tables
tbl
sqlite>
".schema" 指令顯示出原來建立資料表與索引的指令,可以用於重建目前的資料庫用:
sqlite> .schema
create table tbl(title, length);
sqlite>


這邊就先介紹 SQLite 到這邊,我將會在下一篇說明如何在 PHP 上使用 SQLite。


[編輯] PHP 與 SQLite

[編輯] 安裝

[編輯] Linux

利用 PEAR installer 來安裝,利用下列指令:pecl install sqlite


或是利用套件管理軟體來安裝(以Ubuntu為例):

  • for PHP4:
# apt-get install php4-sqlite
  • for PHP5:
# apt-get install php5-sqlite


[編輯] Windows
  • for PHP 4:
  #需先下載DLL版本的SQLite extension,先到這裡(http://pecl4win.php.net/ext.php/php_sqlite.dll)下載 php_sqlite.dll
  #php.ini 加上 extension=php_sqlite.dll
  #重新啟動 Web Server 即可。
  • for PHP 5:
PHP 5 已經包含 SQLite 模組了,所以只需要載入模組即可。
不過 PHP 5.1.0 之後,使用者需手動啟動此一模組,修改 php.ini 將 ;extension=php_sqlite.dll 前面的分號去掉。
但是,在 PHP 5.1.0 之後 SQLite 3以上的版本必須要與 PDO 一起搭配使用,
所以需在php.ini中加入:
extension=php_pdo.dll
extension=php_pdo_sqlite.dll
最後一樣重新啟動 Web Server 即可。
但經過測試,SQLite 3搭配PDO使用,會發生問題,因此,後面的例子將會以SQLite 2為主且不搭配PDO來說明。


[編輯] 範例1

  • sqlite_open:開啟一個SQLite資料庫,若不存在的話,會產生一個新的資料庫
其語法如下所示:resource sqlite_open ( string $filename [, int $mode [, string &$error_message ]] )
    • filename:SQLite資料庫的檔名,若不存在則會產生一個新的;此外,若要對此資料庫進行修改或新增資料,PHP需有對此檔案修改的權限。
    • Mode:檔案的種類,sqlite預設且建議使用0666。
    • error_message:此字串用來儲存描述錯誤的訊息,可省略。
  • sqlite_close:關閉已經打開使用的SQLite資料庫
其語法如下:void sqlite_close ( resource $dbhandle )
  • sqlite_query:執行對資料庫進行查詢
其語法如下:resource sqlite_query ( resource $dbhandle , string $query )
    • dbhandle:SQLite Database resource
    • query:要執行的查詢語法.


以下是一個簡單的範例,開始我先利用sqlite建立好的ex3.db:

<?PHP
 
$db = sqlite_open('ex3.db', 0666, $sqliteerror);
$query = sqlite_query($db, "SELECT * FROM tbl");
 
var_dump($query);
 
sqlite_close($db);
 
?>


[編輯] 範例2

sqlite_array_query 是另一種查詢的方法,結果將回傳一個陣列,並且將內容輸出。下面是一個簡單的範例:

<?PHP
$db = sqlite_open('ex3.db', 0666, $sqliteerror);
$query = sqlite_array_query($db, "SELECT * FROM tbl", SQLITE_ASSOC);
 
//Object-oriented style
//$dbhandle = new SQLiteDatabase('ex3.db');
//$query = $dbhandle->arrayQuery('SELECT * FROM tbl', SQLITE_ASSOC);
 
foreach ($query as $entry) {
echo Title: ' . $entry['title'] . ' Length: ' . $entry['length'];
echo "<br>";
}
 
?>

這邊要注意的點是,除了一般的寫法之外,還有物件導向的寫法,至於要選用哪一種,就看使用者習慣。


這邊大概講了部分 PHP 與 SQLite 如何搭配使用,其實不只有這些,詳細的資訊可以參考:PHP:SQLite,有所有功能的詳細說明與範例。