css

2013年11月5日 星期二

PHP’s PDO

PDO (PHP Data Object) 提供了一個 Abstraction Layer 來操作資料庫


連接DB

  1. define('DB_NAME','mydb');
  2. define('DB_USER','username');
  3. define('DB_PASSWD','userpwd');
  4. define('DB_HOST','localhost');
  5. define('DB_TYPE','mysql');
  6. try{
  7.    $dbh = new PDO(DB_TYPE.':host='.DB_HOST.';dbname='.DB_NAME, DB_USER, DB_PASSWD,
  8.                    array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"));
  9.    $dbh->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION); //錯誤訊息提醒
  10.    }
  11. catch (PDOException $e){
  12.      echo 'Error!: ' . $e->getMessage() . '<br />';
  13.      }


  • PDO 是 Abstraction Layer 所以就算更換儲存媒介,需要花的功夫比起來是最少的;將DB_TYPE改掉,即可移到不同DB使用。
  • PDO 可以透過 PDO::setAttribute 來決定連線時的設定,像是 Persistent Connection, 回傳錯誤的方式(Exception, E_WARNING, NULL)。甚至是回傳欄位名稱的大小寫…等等 
      PDO Drivers
      Connections and Connection management
      PDO::setAttribute
      PDOException 



查詢

    ex1:

  1. $sql = 'select ArticleDate,ChineseTitle,SubChineseTitle from Article where 
           ArticleDate=:seldate';
  2. $sth = $dbh->prepare($sql);
  3. $sth ->execute(array(':seldate' => $seldate));


    ex2:
     
  1. $sth = $dbh->prepare('insert into Article(ArticleDate,Type,EngTitle,ChineseTitle)values (:date,:type,:et,:ct)');
  2. $sth->bindParam(':date',$seldate);
  3. $sth->bindParam(':type',$_POST["type"], PDO::PARAM_STR,15);
  4. $sth->bindParam(':et',$_POST["EngTitle"], PDO::PARAM_STR,30);
  5. $sth->bindParam(':ct',$_POST["ChineseTitle"], PDO::PARAM_STR,30);
  6. $sth->execute() 
  • PDO 支援 Bind Column 的功能,除了基本的 Prepare, Execute 以外,也可以 Bind 單一欄位,並且指定欄位型態。
     Prepared statements and stored procedures
     Predefined Constants   PDO::PARAM
     PDOStatement


取資料

     ex1:
  1. $obj = $sth->fetch(PDO::FETCH_ASSOC);
  2. echo $obj["ArticleDate"];
  3. echo $obj["ChineseTitle"];
  4. echo $obj["SubChineseTitle"];
   
     ex2:
    
  1. $obj = $sth->fetch(PDO::FETCH_OBJ);
  2. echo $obj->ChineseTitle
  3. echo $obj->SubChineseTitle
      
      PDOStatement::fetch
      PDOStatement::fetchAll


參考資料
PDO vs. MySQLi: Which Should You Use?
淺談 PHP-MySQL, PHP-MySQLi, PDO 的差異
PHP MYSQL PDO
[解決] Undefined class constant 'MYSQL_ATTR_INIT_COMMAND'
PDO 基本用法
Comparison of PHP Database Abstraction Classes