PDO::query
The PDOStatement class
突然發現老人家的寄掛網站主機有 error_log,下載來看,裡面有警告,內容如下:
Parameter must be an array or an object that implements Countable in .... xxx.php on line 10
對照我的程式,我是這樣寫的:
... ... $sql = "SELECT * FROM table1"; $rs = $pdo->query($sql); if(count($rs)>0) { // 查詢有記錄 ... ... }
這樣的寫法為什麼會有警告?於是上 PHP 官網看了 PDO::query() 的用法
PDO::query() executes an SQL statement in a single function call, returning the result set (if any) returned by the statement as a PDOStatement object. For a query that you need to issue multiple times, you will realize better performance if you prepare a PDOStatement object using PDO::prepare() and issue the statement with multiple calls to PDOStatement::execute(). (如果有段查詢語句需要執行多次,使用 PDO::prepare() 會有更佳的效能)
似乎 官方較建議 要有 PDO::prepare(),雖然我的查詢只執行一次
於是嘗試下面的寫法:
... ... $sql = "SELECT * FROM table1"; $pdoStat = $pdo->prepare($sql); $pdoStat->execute(); $rs = $pdoStat->fetchAll(); if(count($rs)>0) { // 查詢有記錄 ... ... }這樣 error_log 就不會出現警告了
順便一提,千萬不要用 PDOStatement::rowCount() 去取得查詢結果的記錄筆數,官方並不保證這樣的寫法可適用所有的資料庫!!!!!!
雖然從字面很容易誤以為這是查詢結果的記錄筆數
老人家的朋友就曾經用這方法去取得查詢筆數,結果造成災難!
PHP 官方文件寫道:
這個函式的功能是用來取得執行 INSERT, UPDATE, DELETE 後,受影響的記錄數,
就像是我們在資料庫管理工具(如:Toad、SQLServer Enterprise Manager...) 下了 INSERT, UPDATE, DELETE 後,會顯示受影響的記錄數。