開發與使用ADODB的目的就是為了採用不同資料庫時,可以節省許多不必要的麻煩。但是,真的只要用了ADODB,程式設計師不需要考慮其他的問題了嗎? 當然不是那麼簡單,不同的資料庫,在SQL的語法,資料型態與附屬function上有著些許的不同。如果,沒有考慮這些差異,那就辜負了ADODB開發者的苦心了。所以,在ADODA的 文件中包含了一篇名為"Tip on Writing Portable SQL"文章。



這篇文章可以在ADODB的官方網站,或是隨程式碼下載的docs目錄下找到。以下就是這一篇文章的讀後筆記:

有關SELECT

  • 限制SELECT的行數請用SelectLimit($sql, $fromrow, $totalrows) function
  • Fetch modes
    • ADODB的fetch_xxx function,return的array有三種情形(number, fieldname, both),但是根據不同的資料庫,有不同的default 值(為了效率的因素),所以最好在程式開始及設定,以確保程式在不同的資料庫運作正常。設定方式為$ADODB_FETCH_MODE= DODB_FETCH_XXX (where XXX= NUM, ASSOC,BOTH
  • Counting Records
    • 大型資料庫為了效率因素,不等所有資料query完成,取 得總數後及先傳回資料。所以,set $ADODB_COUNTERCS=false,需要查詢總數時在用PO_RecordCount($tablename, $where_condition) function查詢才是較好的作法。
  • Locking
    • 建議無論如何都使用,用法如下
    • $connection->BeginTrans( );
      $connection->RowLock($table, $where);
      # some operation
      if ($ok) $connection->CommitTrans( );
      else $connection->RollbackTrans( );
  • Outer Join
    • 有些資料庫不支援Outer Join,使用其他方法取代,或使用 $conn->leftOuter, rightOuter, ansiOuter

有關INSERT

  • 有些資料庫(如:oracle)不支援auto_incerment,所以利用GenID($sequence_name)取得較好。

有關Binding

  • Binding(prepare/execute)在新增多比資料的情況下,可以增加50%以上的效率。原因是SQLstatement事先已經被資料庫compile完成。
  •  
    $stmt = $db->Prepare('select * from customers where custid=? and state=?'); $rs = $db->Execute($stmt, array($id,'New York'));
    為了支援ORCALE 請將 第1個?改成 :a 第2個?改成 :b
    所以將整段改成 $stmt = $db->Prepare('select * from customers where custid=' . $db->Param('a') . ' and state=' . $db->Param('b') ); 才是最好的作法

此外,對於DateTime或是其他的DataType在不同資料庫也有不同的格式,所以ADODB也提供了許多的Function,例如:DBDate (), DBTimeStemp(), UnixDate()(可以處理MS ACCESS資料型態的問題)。 此外,對於Blob ADODB提供了UpdateBlob( ) and UpdateClob( ) 以處理binany與character兩種不同型態的資料。值得注意的是,Oracle對於Blob也有不同處理(empty_blob())。

Stored Procedures存在於MSSQL與ORACLE,ADODB提供了相關的function但是程式碼需要判斷後個別處理。 區域劃Localizatio的問題,ADODB建議用不同的檔案存放不同語言的SQL statement。其必要性如何,就看各自的需求吧!

最後在補充兩點:

1. qstr() function可以自動位欄位加上quote (single or double)

2. SELECT * FROM articles WHERE match (title,body) against ("劉") (for mysql 在中文環境可以取代 LIKE )

這樣最就萬無一失了嗎?不是的,資料庫設計也需要適當的配合,且別忘了Performance的問題。^_^