PHP – 使用PDO連資料庫遇到的query()、fatch()、fetchAll的問題
每使用一次 fetchAll() 或 fetch() 之前,一定要先 query() 。
有時候我們需要在同一頁輸出兩次資料,可以這麼寫,那麼兩次都能顯示資料。
<?php try { // 連接資訊 $pdo = new PDO("mysql:host=localhost;dbname=ci_jsn", 'root', ''); $pdo->query("set names utf8"); $sql = "select * from member limit 2"; // 運行 SQL $query = $pdo->query($sql); $datalist = $query->fetchAll(); //第一次輸出 foreach ($datalist as $datainfo) { echo $datainfo['id'] . "<br>"; } //第二次輸出 foreach ($datalist as $datainfo) { echo $datainfo['id'] . "<br>"; } } catch(Exception $e) { // 發生錯誤會顯示 echo $e->getMessage(); }
如果這麼寫,那麼第二次會無法取得資料。
// 運行 SQL $query = $pdo->query($sql); //第一次輸出 foreach ($query->fetchAll() as $datainfo) { echo $datainfo['id'] . "<br>"; } //第二次輸出 foreach ($query->fetchAll() as $datainfo) { echo $datainfo['id'] . "<br>"; }
- fetchAll()比較好用,一次取出所有陣列。直接用foreach ()搭配就可以了。
- fetch() 一次取單筆資料,取完後指標會指向下一筆資料。可搭配while()一筆一筆取取到結束。
- fetch() 與 fatchAll() 預設參數是 PDO::FETCH_BOTH (同時取得陣列key的編號與SQL欄位名稱,我習慣用這個)。另有 PDO::FETCH_ASSOC 為陣列形式、PDO::FETCH_OBJ 為物件形式。
- 其他參數可參考 PHP 官網
- php – PDO – 有趣的 PDO::FETCH_CLASS 用法
張景翔
2017-05-10 - 20:28
Fatal error: Uncaught Error: Call to a member function fetchAll() on boolean
我不懂…為甚麼
JSN
2017-05-11 - 10:57
應該是 SQL 錯誤,直接去 DB 測試你的 SQL 看看。
有可能是資料表不存在喔
renguin
2018-01-03 - 13:16
我也是Call to a member function fetch()
但是本機端成功..
但機器上 (php 5.6 )
就出現這段文字