Bookmark and Share

Lee's 程序人生

HTML CSS Javascript XML AJAX ATLAS C# C++ 数据结构 软件工程 设计模式 asp.net Java 数字图象处理 Sql 数据库
  博客园  :: 首页  :: 新随笔  :: 联系 :: 管理

php与sqlite3

Posted on 2014-03-07 19:53  analyzer  阅读(646)  评论(0编辑  收藏  举报
目前下载的支持php的套装软件(如xampp,phpnow,easyphp)都默认不支持sqlite3.dll的扩展,除非你重新编译,需要php支持sqlite3,可以采用pdo方式
打开php.ini的扩展:
extension=php_pdo_sqlite.dll
extension=php_sqlite.dll
 
=====================================
PDO扩展为PHP访问数据库定义了一个轻量级的、一致性的接口,它提供了一个数据访问抽象层,这样,无论使用什么数据库,都可以通过一致的函数执行查询和获取数据。PDO随PHP5.1发行,在PHP5.0的PECL扩展中也可以使用
 
PDO是一个“数据库访问抽象层”,作用是统一各种数据库的访问接口,与mysql和mysqli的函数库相比,PDO让跨数据库的使用更具有亲和力;与ADODB和MDB2相比,PDO更高效。
目前而言,实现“数据库抽象层”任重而道远,使用PDO这样的“数据库访问抽象层”是一个不错的选择。
 
PDO中包含三个预定义的类,它们分别是 PDO、PDOStatement 和 PDOException
=====================================
 
常用语句
参考 :http://cn.php.net/manual/en/book.sqlite3.php
 
//创建数据库
$dbname2=”database/eit/20120825.db”;
$dbh2 = new PDO(“sqlite:”.$dbname2);       //建立连接,确保无此文件
$dbh2->exec(“CREATE TABLE [program] ([id] INTEGER  NOT NULL PRIMARY KEY AUTOINCREMENT,[channel_id] INTEGER  NULL,[time_start] NUMERIC  NULL,[time_end] NUMERIC  NULL,[type_name] TEXT  NULL,[title] TEXT  NULL,[director] TEXT  NULL,[present] TEXT  NULL,[description] TEXT  NULL);”); 
 
//建立连接
$dbname=”database/database.db”;
$dbh = new PDO(“sqlite:”.$dbname); 
 
//添加行
$sql=”insert into program (channel_id,title,time_start,time_end) values (“.$program_now["channel_id"].”,’”.$program_name.”‘,”.$program_now["time_start"].”,”.$program_now["time_end"].”)”;
$dbh_out->exec($sqlt);
 
//删除行
$sql=”delete from property”;
$dbh->exec($sql);
 
//修改行
$sql=”update property set level=”.$level.” where orin_id=”.$id;
$dbh->exec($sql);
 
//单条查询
$sql=”select * from property where id=1″;
$result=$db->  query ( $sql );
$row = $results->  fetch ();//单条数据
echo (  $  row  ["orin_id"], $  row  ["parent_id"], $  row  ["name"]  );
 
//多条查询 普通方式
$sql=”select * from property”;
$results = $db->query( $sql );
while ($row = $results->  fetchAll ()) {
    var_dump($row);
}
 
//多条查询 statement方式
$sql=”select * from property”;
$sth = $dbh->prepare($sql);
$sth->execute();
$result = $sth->fetchAll();
echo(count($result));//查询结果的数量
foreach($result as $row)
{
$channel_list_arr[$channel_list_index]=array($row["orin_id"], $row["parent_id"], $row["name"]);
}
 
//事务处理
$dbh->beginTransaction();
$dbh->commit();
 
=====================================
使用事务操作数据库,尤其是频繁读写数据库文件,效率会有明显提升!

从2.0版开始,SQLite支持带有回退和原子性的提交的事务处理。

可选的事务名称会被忽略。SQLite目前不允许嵌套事务。

在事务之外,不能对数据库进行更改。如果当前没有有效的事务,任何修改数据库的命令(基本上除了SELECT以外的所有SQL命令)会自动启动一个事务。命令结束时,自动启动的事务会被提交。

可以使用BEGIN命令手动启动事务。这样启动的事务会在下一条COMMIT或ROLLBACK命令之前一直有效。但若数据库关闭 或出现错误且选用ROLLBACK冲突判定算法时,数据库也会ROLLBACK。查看ON CONFLICT子句 获取更多关于ROLLBACK冲突判定算法的信息。

在SQLite 3.0.8或更高版本中,事务可以是延迟的,即时的或者独占的。“延迟的”即是说在数据库第一次被访问之前不获得锁。 这样就会延迟事务,BEGIN语句本身不做任何事情。直到初次读取或访问数据库时才获取锁。对数据库的初次读取创建一个SHARED锁 ,初次写入创建一个RESERVED锁。由于锁的获取被延迟到第一次需要时,别的线程或进程可以在当前线程执行BEGIN语句之后创建另外的事务 写入数据库。若事务是即时的,则执行BEGIN命令后立即获取RESERVED锁,而不等数据库被使用。在执行BEGIN IMMEDIATE之后, 你可以确保其它的线程或进程不能写入数据库或执行BEGIN IMMEDIATE或BEGIN EXCLUSIVE. 但其它进程可以读取数据库。 独占事务在所有的数据库获取EXCLUSIVE锁,在执行BEGIN EXCLUSIVE之后,你可以确保在当前事务结束前没有任何其它线程或进程 能够读写数据库。

有关SHARED, RESERVED, 和EXCLUSIVE锁可以参见这里

SQLite 3.0.8的默认行为是创建延迟事务。SQLite 3.0.0 到3.0.7中延迟事务是唯一可用的事务类型。SQLite 2.8或更早版本中,所有的事务 都是独占的。

COMMIT命令在所有SQL命令完成之前并不作实际的提交工作。这样若两个或更多个SELECT语句在进程中间而执行COMMIT时,只有全部SELECT 语句结束才进行提交。

执行COMMIT可能会返回SQLITE_BUSY错误代码。这就是说有另外一个线程或进程获取了数据库的读取锁,并阻止数据库被改变。当COMMIT获得该错误代码时,事务依然是活动的,并且在COMMIT可以在当前读取的线程读取结束后再次试图读取数据库。

我要啦免费统计