2019-07-27

【PHP】PDO::query()

參考資料 ----
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 後,受影響的記錄數,
就像是我們在資料庫管理工具(如:ToadSQLServer Enterprise Manager...) 下了 INSERT, UPDATE, DELETE 後,會顯示受影響的記錄數。