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>";
}

 

  1. fetchAll()比較好用,一次取出所有陣列。直接用foreach ()搭配就可以了。
  2. fetch() 一次取單筆資料,取完後指標會指向下一筆資料。可搭配while()一筆一筆取取到結束。
  3. fetch() 與 fatchAll() 預設參數是 PDO::FETCH_BOTH (同時取得陣列key的編號與SQL欄位名稱,我習慣用這個)。另有 PDO::FETCH_ASSOC 為陣列形式、PDO::FETCH_OBJ 為物件形式。
  4. 其他參數可參考 PHP 官網
  • php – PDO – 有趣的 PDO::FETCH_CLASS 用法


Comments

  1. Fatal error: Uncaught Error: Call to a member function fetchAll() on boolean

    我不懂…為甚麼

    • 應該是 SQL 錯誤,直接去 DB 測試你的 SQL 看看。
      有可能是資料表不存在喔

  2. 我也是Call to a member function fetch()

    但是本機端成功..
    但機器上 (php 5.6 )
    就出現這段文字

發表迴響