2010年9月2日 星期四

[PHP]-使用PDO操作sqlite

PHP5以後除了使用mysql_connect這種舊的方法連接資料庫之外,
加入了PDO的新功能可以用來連接資料庫,好處在於在效能上改善很多,
而且未來在將系統移植道不同的資料庫時也比較方便。

因為在PHP 5以前的php4/php3都是一堆的數據庫擴展來跟各個數據庫的連接和處理,
什麼 php_mysql.dll、php_pgsql.dll、php_mssql.dll、php_sqlite.dll等等擴展
來連接MySQL、 PostgreSQL、MS SQL Server、SQLite,同樣的,
我們必須借助 ADOdb、PEAR::DB、PHPlib::DB之類的數據庫抽象類來幫助我們,
無比煩瑣和低效。

以下是各種不同資料庫中的dsn(數據源)設定方法:

MySQL:
mysql:host={IP HOST}; dbname={DB NAME}

MSSQL︰
mssql:host={IP HOST};dbname={DB NAME}

Orcale:
oci:host={IP HOST};dbname={DB NAME}

SQLite:
sqlite:{DB PATH + DB NAME}

若是要設定預設的編碼,例如要設為使用UTF8,可在dsn中設定charset=UTF8即可。

簡介SQLite
1. ACID事務
2. 零配置 – 無需安裝和管理配置
3. 儲存在單一磁盤文件中的一個完整的數據庫
4. 數據庫文件可以在不同字節順序的機器間自由的共享
5. 支持數據庫大小至2TB
6. 足夠小, 大致3萬行C代碼, 250K
7. 比一些流行的數據庫在大部分普通數據庫操作要快
8. 簡單, 輕鬆的API
9. 包含TCL綁定, 同時通過Wrapper支持其他語言的綁定
10. 良好註釋的源代碼, 並且有著90%以上的測試覆蓋率
11. 獨立: 沒有額外依賴
12. Source完全的Open, 你可以用於任何用途, 包括出售它
要注意的是,如果在linux上使用sqlite,資料檔和資料檔所在目錄的權限一定要開,
這裡特別要強調的是,本身所在目錄的權限也要。

雖然SQLite允許忽略數據類型,下面仍列出常見的數據類型:
CREATE TABLE ex(
a VARCHAR(10),
b NVARCHAR(15),
c TEXT,
d INTEGER,
e FLOAT,
f BOOLEAN,
g CLOB,
h BLOB,
i TIMESTAMP,
j NUMERIC(10,5),
k VARYING CHARACTER (24),
l NATIONAL VARYING CHARACTER(16)
);

下面列舉一些利用PDO操作SQLite的範例:
create table
$dbh = new PDO('sqlite:example.db');
if (!$dbh) die ($error);

$stm = "CREATE TABLE User(id INTEGER PRIMARY KEY, name, birthday1, birthday2, ".
            "birthday0, gender, marry, education, job, tel1, tel2, ext, pw, ".
            "city, district, address, email)";
$dbh->exec($stm);
可以在欄位後面直接加INTEGER PRIMARY KEY指定為primary key,這個欄位值
同時也具有auto increment特性。
也可以利用下列語法指定索引鍵:
CREATE INDEX id_index on table_name(id)

select data from table
$dbh = new PDO('sqlite:example.db');
$sth = $dbh->prepare("SELECT * FROM User");
$sth->execute();
$result_set = $sth->fetchAll();
result_set的格式會如下:
Array
([0] => Array(
[id] => 1
[0] => 1
[name] => heiyeluren
[1] => heiyeluren
[gender] => 男
[2] => 男
[time] => 2006-10-28 23:14:23
[3] => 2006-10-28 23:14:23
)

prepare statement 型式
$dbh = new PDO('sqlite:example.db');
$sth = $dbh->prepare("SELECT * FROM User WHERE email = ?");
$sth->execute(array($_SESSION['user']));
$result = $sth->fetch();

攔截錯誤訊息
$dbh = new PDO('sqlite:example.db');
$rs = $dbh->query("SELECT * FROM User");
if ($dbh->errorCode() != 00000){
 echo $dbh->errorInfo();
 exit;
}
PDO和PDOStatement對象有errorCode() 和 errorInfo() 方法,
如果沒有任何錯誤, errorCode() 返回的是: 00000 ,
否則就會返回一些錯誤代碼。errorInfo() 返回的一個數組,
包括PHP定義的錯誤代碼和MySQL的錯誤代碼和錯誤信息,數組結構如下:
Array
(
[0] => 42S22
[1] => 1054
[2] => Unknown column aaa in field list
)

PDO的一些method參數說明
$dbh = new PDO('sqlite:example.db');
$dbh->setAttribute(PDO::ATTR_CASE, PDO::CASE_UPPER);
$rs = $dbh->query("SELECT * FROM User");
$rs->setFetchMode(PDO::FETCH_ASSOC);
$result_set = $rs->fetchAll();
setAttribute() 方法是設置部分屬性
PDO::CASE_LOWER -- 強制列名是小寫
PDO::CASE_NATURAL -- 列名按照原始的方式
PDO::CASE_UPPER -- 強制列名為大寫

setFetchMode方法來設置獲取結果集的返回值的類型
PDO::FETCH_ASSOC -- 關聯數組形式
PDO::FETCH_NUM -- 數字索引數組形式
PDO::FETCH_BOTH -- 兩者數組形式都有,這是缺省的
PDO::FETCH_OBJ -- 按照對象的形式,類似於以前的 mysql_fetch_object()

沒有留言:

張貼留言