就個人而言,我更喜歡使用所有PDO的包裝功能,簡化了所需的代碼大增。
例如,運行勢必查詢(當然,我所有的查詢),我這樣做:
$iterable_resultset = query("INSERT INTO accounts (username, email, password) VALUES (:username, :email, :password)", array(':username'=>'bob', ':email'=>'[email protected]', ':password'=>'bobpassword'));
注意,不僅是sql只是一個字符串,但它實際上是一個可重複使用的字符串,如您可以簡單地將sql作爲字符串傳遞,並更改要傳入的變量數組(如果要在後面執行類似的插入操作)(不適用於此情況,但適用於其他sql用例)。
,我用它來創建此包裝函數的代碼如下:
/**
* Run bound queries on the database.
*
* Use: query('select all from players limit :count', array('count'=>10));
* Or: query('select all from players limit :count', array('count'=>array(10, PDO::PARAM_INT)));
*
* Note that it returns foreachable resultset object unless an array is specifically requested.
**/
function query($sql, $bindings=array(), $return_resultset=true) {
DatabaseConnection::getInstance(); // Gets a singleton database connection
$statement = DatabaseConnection::$pdo->prepare($sql); // Get your pdo instance, in this case I use a static singleton instance. You may want to do something simpler.
foreach ($bindings as $binding => $value) {
if (is_array($value)) {
$first = reset($value);
$last = end($value);
// Cast the bindings when something to cast to was sent in.
$statement->bindParam($binding, $first, $last);
} else {
$statement->bindValue($binding, $value);
}
}
$statement->execute();
if ($return_resultset) {
return $statement; // Returns a foreachable resultset
} else {
// Otherwise returns all the data an associative array.
return $statement->fetchAll(PDO::FETCH_ASSOC);
}
}
// Wrapper to explicitly & simply get a multi-dimensional array.
function query_array($sql_query, $bindings=array()) {
return query($sql_query, $bindings, false); // Set return_resultset to false to return the array.
}
正如評論指出的是,你要使用自己的方法建立一個數據庫連接,並得到一個初始化pdo,但通常它允許你的綁定sql被減少到只有一行。
for assoc_array支持?你不是指指定的佔位符嗎? – 2011-04-16 03:10:37
只是好奇,你會用這種方式嗎?沒有幫手功能等? – 2011-04-16 03:22:28
我今天才剛剛開始使用PDO,如果您願意解釋,我不知道輔助函數是什麼? – Basic 2011-04-16 03:42:12