PHP5.3+SQLite3开发使用小结

   经过长时间的考虑、也为了小站能够继续发扬技术力量,于是,本人将ASP+Access模式转为PHP5.3+SQLite3模式。虽然在PHP行业中较为流行PHP+mysql,不过由于没有资金去购买mysql数据库,更主要的是SQLite3的方便移植。
  我也是刚接触PHP5.3和SQLite3的,很多地方都不懂,感觉并没有想像中的那么好用。但毕竟php是一个趋势,而且现在asp方面已经很不错了(至少我的水平已经不错了,自我感觉良好,嘻嘻 ^_^)。
  好了,技术文章还是少扯废话,来点真实的东西。

环境:PHP5.3.x + SQLite3 + Apache2.2.11测试通过(目前只有PHP5.3.x或更高版本支持SQLite3,切记切记)

  1。首先要说的是sqlite3在php5.3中才能直接使用,小于这个版本的可以通过pdo来使用,当然你完全可以使用sqlite,不过不是最新版本的sqlite3了,我喜欢用最新版本的,而且sqlite3的体积也不大嘛。

  2。经过不懈的努力,终于找到了添加、修改数据的另种方法,不再使用原始的insert、update了,但添加/修改数据还是要靠这个原型的。只是模式有点改变。看招:
           if(is_numeric($iDel)){
           $sql  = "update tbl_Iv set tbl_Title=:sTitle,tbl_tid=:tid,tbl_xg=:xg,tbl_sContent=:sContent,tbl_sAuthor=:sAuthor,tbl_sFrom=:sFrom,tbl_colorID=:colorID,tbl_istj=:istj,tbl_addtime=:addtime,tbl_isDel=0  where tbl_ID=".$iDel;
        }else{
           $sql="insert into tbl_Iv(tbl_sTitle,tbl_tid,tbl_xg,tbl_sContent,tbl_sAuthor,tbl_sFrom,tbl_colorID,tbl_istj,tbl_addtime) values(:sTitle,:tid,:xg,:sContent,:sAuthor,:sFrom,:colorID,:istj,:addtime)";
        }
        //echo $sql;exit();
        $stmt = $conn->prepare($sql);
        $stmt->bindValue(':sTitle', $sTitle, SQLITE3_TEXT);
        $stmt->bindValue(':tid', $tid, SQLITE3_INTEGER);
        $stmt->bindValue(':xg', $xg, SQLITE3_TEXT);
        $stmt->bindValue(':sContent', $sContent, SQLITE3_TEXT);
        $stmt->bindValue(':sAuthor', $sAuthor, SQLITE3_TEXT);

        $stmt->bindValue(':sFrom', $sFrom, SQLITE3_TEXT);
        $stmt->bindValue(':colorID', $colorID, SQLITE3_TEXT);
        $stmt->bindValue(':istj', $istj, SQLITE3_TEXT);
        $stmt->bindValue(':addtime', $addtime, SQLITE3_TEXT);
        $stmt->execute();
        $stmt->close();
  看到了吧,有点不一样,因为原始的那种方式,很有可能会导致添加/修改数据时失败,我的网站是文章网,很有可能在内容中有错误的JS或者未封闭的单引号,如果此时用原始的insert/update时,会造成添加/修改数据时失败。
   在网上找了很久,终于找到了另种添加数据的方式,至少这种方式可以保证添加数据的完整性。在mysql中似乎只有原始的insert/update模式,问了好多人都这么说。

  3。关于sqlite3的数据类型问题,这个最好参考官方所写的文档。因为这个问题,各个sqlite3的工具在添加字段时各不一样。工具的话,建议用最朴素的SQLiteSpy。这样可以对sqlite3的数据类型有深刻的了解。
 
  4。不建议对表结构进行修改。如果你想修改表结构,建议你重新建一个数据库然后将数据导进去。这样做的目的是省些空间,因为修改一次表结构,整个数据库体积会大很多。 
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
1。primary key 与autocrement 的区别
     在使用primary key添加文章的时候,插入失败时,ID不会自动增加;如果字段加上了autocrement的话,ID会自动加1的,插入失败后就会浪费一个ID,但primary key却不会。但在使用primary key时,插入数据时,不要给ID指定数据,否则会按你指定的数据为ID赋值。

2。默认时间值
     For CURRENT_TIME, the format is HH:MM:SS.
     For CURRENT_DATE, YYYY-MM-DD.
     The format for CURRENT_TIMESTAMP is "YYYY-MM-DD HH:MM:SS".
     看清楚格式了吧,示例:
      create table t_t(
       id integer primary key,
       addtime date default CURRENT_TIMESTAMP
       );
   这样,以后插入数据时,时间就会自动添加了,想截取时间的话,可以用date('Y-m-d')或者date(‘H:i:s')。

3。时间函数
     The date() function returns the date in this format: YYYY-MM-DD.
     The time() function returns the time as HH:MM:SS.
     The datetime() function returns "YYYY-MM-DD HH:MM:SS".
    例如:select date();

4。 ID tiny primary key
       如果加了tiny 的话,这个ID列是不是自动增长的,换句话说你需要给它指定值。

5。 转时间戳
       select strftime('%s','now') / //1313539701
       select strftime('%s', '2011-08-15 20:20:20'); //1313539701

6。数据类型:

   标准SQLite3分为以下几种数据类型:
   1。NULL
   2。INTEGER
   3。REAL
   4。TEXT
   5。BLOB
   更多详细信息请参考: http://sqlite.org/datatype3.html


数据操作部分:
1。连接数据库:
   $conn = new SQLITE3($filename,$mode,$password)
   第一个参数是路径,第二个参数是可选参数(SQLITE3_OPEN_READONLY|SQLITE3_OPEN_READWRITE|SQLITE3_OPEN_CREATE)
   SQLITE3_OPEN_READONLY: 数据库为只读模式
   SQLITE3_OPEN_READWRITE:数据库为读写模式
   SQLITE3_OPEN_CREATE   : 如果数据库不存在则创建(默认)
   第三个参数是密码。(目前还没有完全支持PHP+SQLite3密码的免费的软件,虽然有个wxSQLite3但它的加密模式与SQLite3的加密模式 不一样,如果谁的英文好的话,请联系我。曾经向wxSQLite3的作者问过此问题,AES128的加密模式分为好几种,估计,如果他能转换一下模式的 话,应该可以在PHP5.3模式下正常工作,到时候就可以用到免费的加密软件了。^_^)

2。添加数据:
   ①   $sql  = "insert into replay(articleID,replayContent,addtime) values($ID,$replay,datetime())";  这种添加数据的方式有弊病:如果内容为文章的话,可能会出现未封闭的引号,导致添加数据时失败。
     
   ②   $sql  = "insert into replay(articleID,replayContent,addtime) values(:ID,:replay,datetime())";
   $conn = new SQLITE3($dbfile,SQLITE3_OPEN_READWRITE);
   $stmt = $conn->prepare($sql);
   $stmt->bindValue(':ID',$id,SQLITE3_INTEGER);
   $stmt->bindValue(':replay',$replay,SQLITE3_TEXT);
   $stmt->bindValue(':addtime',date('Y-m-d H:i:s'),SQLITE3_TEXT);
   $stmt->execute();
   添加数据时,如果设置了primary key autoincrement的话,系统会自动加1的,如果不写autoincrement系统也会自动加1,但如果你给ID指定了值的话,系统会按照你加的值为准。其实primary key已经够用了。

   感觉这种添加数据的方式最完美了,就像ASP一样,特别是在文章系统中,不会出现什么问题。

3。查询数据:
   ①$result= $conn->query($sql);
     while($row = $result->fetchArray(SQLITE3_ASSOC)) {
   $loc = $loc . "<a href='/article/list-".$row["ID"]."-1.html'>".$row['ClassName']."</a>";
     }
     SQLITE3_ASSOC取字段对应的名称

   ②$result= $conn->querySingle($sql,true); 返回一个数组,相当于一条记录

   ③$result= $conn->querySingle($sql,false);返回一个数字
  
   ④今天:select count(ID) from Info where julianday(date())-julianday(date(addtime))=0

   ⑤选择前15条记录:select * from _table order by ID desc limit 15 offset 0

   ⑥$conn->exec("delete from _table where id=110");

   ⑦echo $conn->lastErrorMsg();

   ⑧echo $conn->changes();

   ⑨echo $conn->lastErrorCode();

   ⑩$conn->close();
    

数据库工具:
   1。SQLite Administrator(http://sqliteadmin.orbmu2k.de)
      此工具支持SQLite2/3,但用它创建表,添加数据时有可能会出现乱码,至少在我测试时是这样的(多国语言绿色版)。
   2。SQLiteSpy(http://www.yunqa.de)
      此工具只支持SQLite3(只有英文版,还比较稳定,我一直在用)。


参考网站:
    PHP操作SQLite3语法:http://cn.php.net/manual/en/book.sqlite3.php
    SQLite3语法:              http://sqlite.org/lang.html
    SQLite3时间函数:       http://sqlite.org/lang_datefunc.html
    SQLite3数据类型:       http://sqlite.org/datatype3.html

300*300
 文章首页关于迷茫时代关于我写意人生
版权所有:迷茫时代 All rights reserved   
执行时间:0.00595 秒