PDO ( PHP Data Object ) PHP資料物件查詢技術

PDO 有三個類:

  1. PDO ( PDO即是PHP資料物件技術的總稱,也是一個類名 )
  2. PDOStatement
  3. PDOException

PDO類:

用來和資料庫伺服器建立一個連線。

通常使用 query、prepare 方法來產生一個 PDOStatement 物件。

PDOStatement物件:

用來表示一個預先處理陳述式,或是一個資料庫查詢結果,可以包含結果集。

PDOStatement物件不能使用構造方式建立,需由 PDO->query() 或 PDO->prepare() 產生一個 PDOStatement 物件。

PDOException類:

PDOException是Exception的子類。

使用預先處理陳述式和參數化查詢:

呼叫 PDO 物件的 prepare() 方法即可,成功回傳 PDOStatement 物件,失敗回傳 False 。

你可以使用以下 3 種方式:

$sql = "SELECT * FROM setup WHERE setup_name = ?";
$result = $dbh->prepare($sql);
$result->bindValue(1,"webname");

或是

$sql = "SELECT * FROM setup WHERE setup_name = :value1";
$result = $dbh->prepare($sql);
$value1 = "footer";
$result->bindParam(":value1",$value1,PDO::PARAM_STR);

注意!使用bindParam(),一定要代入變數,不能直接用字串方式填入。

或是,使用 execute() 方法指定參數

$sql = "SELECT * FROM setup WHERE setup_name = ?";
$result = $dbh->prepare($sql);
$result->execute(array("webname"));
$row = $result->fetch();
$setup['webname'] = $row['setup_value'];

$value1 = 'setup';
$sql = 'SELECT * FROM '.$value1.' WHERE setup_name = :value2';
$result = $dbh->prepare($sql);
$result->execute(array(":value2" => "footer"));
$row = $result->fetch();
$setup['footer'] = $row['setup_value'];

另外要注意資料庫查詢語法中,table name 不能參數化!

Why? 因為使用預先陳述式,要明確指定資料表名稱給 PDO 才能預先處理。

如果要動態指定資料表,應該使用以下方式:

$value1 = 'setup';
$sql = 'SELECT * FROM '.$value1.' WHERE setup_name = :value2';
$result = $dbh->prepare($sql);
$value2 = "footer";
$result->bindParam(":value2",$value2,PDO::PARAM_STR);

特別注意,字串組合 table name 時,左右兩邊 Sql 字串都有留空格,與 $value1 結合才不會連在一起。

使用 prepare 方法的好處:

  1. 預先處理陳述式可以預先編譯並保存在記憶體中,執行時不必進行預編譯就可以執行預先處理過的 SQL 陳述式。重新解析但是不重新編譯,在記憶體中重新使用預編譯過的陳述式。
  2. 參數替代符交給預先處理陳述式進行預先處理,有效避免 SQL 注入攻擊。
資料存取方法:
PDOStatement 類有四個方法可以用來從結果集中存取資料,分別是
  1. fetch(),取出一列資料
  2. fetchAll(),取出所有,放到一個二維陣列
  3. fetchColumn(),取出一列資料,欄位用數字索引
  4. fetchObject(),取出一列資料,欄位是物件屬性,物件屬性的名稱是資料表欄位名稱