PHP擴展PDO MySQL之PDOStatement::bindParam vs bindValue
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 functionPHP擴展PDO MySQL之PDOStatement::bindParam vs bindValue