PDO-fetch()-取得一列結果列,以陣列或物件方式回傳


在使用 PDO 查詢時,我們可以指定接收的格式,是要以陣列(數字索引、欄位名稱索引),或是以物件方式回傳給我們。

不論是 fetch() 還是 fetchAll() 都有許多參數可以使用,都可以指定返回陣列或是物件,但 fetch() 若要返回物件,需要先設定 setFetchMode 參數。
經常使用參數如下:
PDO::FETCH_ASSOC 返回以欄位名稱作為索引鍵(key)的陣列(array)
PDO::FETCH_NUM 返回以數字作為索引鍵(key)的陣列(array),由0開始編號
PDO::FETCH_BOTH 返回 FETCH_ASSOC 和 FETCH_NUM 的結果,兩個都會列出
PDO::FETCH_CLASS 返回一個物件,以欄位名稱設定屬性,並把設值給該屬性

資料表格式及資料如下

mysql> select * from users;
+----+-----------+----------------+---------------------------------------+-----------------+
| sn | name      | mail           | home                                  | message         |
+----+-----------+----------------+---------------------------------------+-----------------+
|  1 | 王小明 | aaa@gmail.com  | 台南縣新化區中正路1號       | 第 1 筆資料 |
|  2 | 陳小華 | chen@gmail.com | 台中市北屯區中華路100號     | 第 2 筆資料 |
|  3 | 王小白 | wang@gmail.com | 台北市信義區信義路一段1號   | 第 3 筆資料 |
+----+-----------+----------------+---------------------------------------+-----------------+
3 rows in set (0.00 sec)

使用 PDO 連線

$dbhost = '127.0.0.1';
$dbuser = 'ben';
$dbpasswd = '1234';
$dbname = 'phpmysql';
$dsn = "mysql:host=".$dbhost.";dbname=".$dbname;

try
{
    //注意,使用PDO方式連結,需要指定一個資料庫,否則將拋出異常
    $conn = new PDO($dsn,$dbuser,$dbpasswd);
    $conn->exec("SET CHARACTER SET utf8");
    $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    echo "Connected Successfully";
}
catch(PDOException $e)
{
    echo "Connection failed: ".$e->getMessage();
}

PDO::FETCH_ASSOC 返回以欄位名稱作為索引鍵(key)的陣列(array)

$sql = "SELECT * FROM `users` WHERE sn = 1";
$sth = $conn->prepare($sql);
$sth->execute();
$row = $sth->fetch(PDO::FETCH_ASSOC);

foreach($row as $key => $value)
{
    echo $key." : ".$value."<br />";
}

返回結果:
sn : 1
name : 王小明
mail : aaa@gmail.com
home : 台南縣新化區中正路1號
message : 第 1 筆資料

PDO::FETCH_NUM 返回以數字作為索引鍵(key)的陣列(array),由0開始編號

$sql = "SELECT * FROM `users` WHERE sn = 1";
$sth = $conn->prepare($sql);
$sth->execute();
$row = $sth->fetch(PDO::FETCH_NUM);

foreach($row as $key => $value)
{
    echo $key." : ".$value."<br />";
}

返回結果:
0 : 1
1 : 王小明
2 : aaa@gmail.com
3 : 台南縣新化區中正路1號
4 : 第 1 筆資料

PDO::FETCH_BOTH 返回 FETCH_ASSOC 和 FETCH_NUM 的結果,兩個都會列出

$sql = "SELECT * FROM `users` WHERE sn = 1";
$sth = $conn->prepare($sql);
$sth->execute();
$row = $sth->fetch(PDO::FETCH_BOTH);

foreach($row as $key => $value)
{
    echo $key." : ".$value."<br />";
}

返回結果:
sn : 1
0 : 1
name : 王小明
1 : 王小明
mail : aaa@gmail.com
2 : aaa@gmail.com
home : 台南縣新化區中正路1號
3 : 台南縣新化區中正路1號
message : 第 1 筆資料
4 : 第 1 筆資料

PDO::FETCH_CLASS 返回一個物件,以欄位名稱設定屬性,並把設值給該屬性

注意:

  1. 一定要先設定 setFetchMode
  2. 一定要先撰寫該類別,空的也可以,但一定要有類別
class Member
{
    private $hi = 'Hi.';
    
    public function __construct()
    {
        echo $this->hi."<br />";
    }
    
    public function showMember()
    {
        echo "<br />";
        echo "sn:".$this->sn."<br />";
        echo "name:".$this->name."<br />";
        echo "mail:".$this->mail."<br />";
        echo "home:".$this->home."<br />";
        echo "message:".$this->message."<br />";
    }
}

$sql = "SELECT * FROM `users` WHERE sn = 1";
$sth = $conn->prepare($sql);
$sth->execute();
$sth->setFetchMode(PDO::FETCH_CLASS, 'Member');
$row = $sth->fetch(PDO::FETCH_CLASS);

$row->showMember();

返回結果:
Hi. (建構式有執行)

sn:1
name:王小明
mail:aaa@gmail.com
home:台南縣新化區中正路1號
message:第 1 筆資料

或者是用 fetchObject(“ClassName") 下列方式也可以達到相同效果,只返回一筆資料的話,建議使用這個方法

$sql = "SELECT * FROM `users` WHERE sn = 1";
$sth = $conn->prepare($sql);
$sth->execute();
$row = $sth->fetchObject("Member");

$row->showMember();