1. 程式人生 > >PHP擴展PDO MySQL之PDOStatement::bindParam vs bindValue

PHP擴展PDO MySQL之PDOStatement::bindParam vs bindValue

官方文檔 適應 引用 input box 解決 span hive 對象


PHP擴展PDO MySQL之PDOStatement::bindParam vs bindValue技術

maybe yes 發表於2015-11-16 13:27 原文鏈接 : http://blog.lmlphp.com/archives/155/The_difference_of_PDOStatement_bindParam_and_bindValue_of_PHP_extension_PDO_MySQL 來自 : LMLPHP後院

前些日子將 LBlog 在線體驗站點 http://lblog.lmlphp.com/ 搬遷到了 VPS 上,其實已經過去了好幾個月了。新的 VPS 上 PHP 的版本比較高,所以運行的時候會出現提示 mysql 系列的函數過時的 Deprecated 錯誤。這個錯誤最簡單的辦法就是在報錯級別那裏屏蔽掉,但是這個不是我的風格,我更希望以更好的方式來解決。但是一上班根本沒有時間,寫個 MysqlPdo Enhance 的類,按照之前 LMLPHP 中 Mysql 驅動類的風格。為此,寫 PDO 操作類的時候還專門定義了接口來約束自己的行為,生怕出問題,測試之後證明,完全兼容之前的 Mysql 類,寫完花了這麽幾個月的時間,真的傷不起。

這次寫 PDO 驅動類的時候,沒有參照其他人的寫法,完全看官方文檔,結合自己的需要,盡量的簡單的實現。其實 PDO 已經是面向對象的風格了,其實並不需要什麽驅動類來太多的封裝,寫這個只是為了更好的兼容項目中的代碼。剛開始我看 bindValue 和 bindParam 的時候,文檔給我的感覺只是一個是變量,一個是確切的值。到後來才發現一個是引用,一個是普通傳參。在測試修改操作的時候,發現數據庫中最後一個字段和前一個字符串一樣,int 類型沒有收到影響,可能當時腦子太累的緣故,這個問題竟然搞了好久,第二天才弄清楚是因為在循環的時候使用了 bindParam 導致的。

MysqlPdoEnhance 驅動類已經上傳到 LMLPHP 和 LBlog 中,LBlog 已經在初始化實例的時候自動選擇對應的驅動類。這次改善使得 LBlog 系統更加優秀,對服務器環境的適應能力更強了。

MysqlPdoEnhance 類延續了 Mysql 類的簡單風格,只有一個重量級的 query 方法,自動判斷是返回資源還是影響的行數。同時也發現在使用 PDO 操作時,不能很好的做到這一點。因為執行 SELECT 的時候也有影響的行數,這點與一般的常識不一樣,一般懂數據庫的人都應該知道,SELECT 是不會影響到行的,但是 PDO 中的 rowCount 方法返回的值是選出的行數。所以,因為這個緣故,只能從 SQL 上面做一個簡單的判斷了,算是不太完美。

附 query 方法節選。

0123456789101112131415161718192021222324252627 public function
query($sql, $params = array()){ $stmt = $this->db->prepare($sql, array(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY => true)); if($params){ foreach ($params as $k => $v){ if(is_array($v)){ $value = $v[‘value‘]; $type = isset($v[‘type‘]) ? $v[‘type‘] : false; $length = isset($v[‘length‘]) ? $v[‘length‘] : false; if($type && $length){ $stmt->bindValue($k, $value, $type, $length); }elseif($type){ $stmt->bindValue($k, $value, $type); }else{ $stmt->bindValue($k, $value); } }else{ $stmt->bindValue($k, $v); } } } $stmt->execute(); if(preg_match(‘/^update|^insert/i‘, trim($sql))){ return $stmt->rowCount(); }else{ return $stmt->fetchAll(PDO::FETCH_ASSOC); }} 技術分享 閱(607)評(0)查看評論

PHP擴展PDO MySQL之PDOStatement::bindParam vs bindValue