PDO-fetchAll()-取得所有結果列,以陣列或物件方式回傳


在使用 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`";
$sth = $conn->prepare($sql);
$sth->execute();
$rows = $sth->fetchAll(PDO::FETCH_ASSOC);

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

返回結果:
sn : 1
name : 王小明
mail : aaa@gmail.com
home : 台南縣新化區中正路1號
message : 第 1 筆資料
sn : 2
name : 陳小華
mail : chen@gmail.com
home : 台中市北屯區中華路100號
message : 第 2 筆資料
sn : 3
name : 王小白
mail : wang@gmail.com
home : 台北市信義區信義路一段1號
message : 第 3 筆資料

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

$sql = "SELECT * FROM `users`";
$sth = $conn->prepare($sql);
$sth->execute();
$rows = $sth->fetchAll(PDO::FETCH_NUM);

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

返回結果:
0 : 1
1 : 王小明
2 : aaa@gmail.com
3 : 台南縣新化區中正路1號
4 : 第 1 筆資料
0 : 2
1 : 陳小華
2 : chen@gmail.com
3 : 台中市北屯區中華路100號
4 : 第 2 筆資料
0 : 3
1 : 王小白
2 : wang@gmail.com
3 : 台北市信義區信義路一段1號
4 : 第 3 筆資料

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

$sql = "SELECT * FROM `users`";
$sth = $conn->prepare($sql);
$sth->execute();
$rows = $sth->fetchAll(PDO::FETCH_BOTH);

foreach($rows as $row)
{
    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 筆資料
sn : 2
0 : 2
name : 陳小華
1 : 陳小華
mail : chen@gmail.com
2 : chen@gmail.com
home : 台中市北屯區中華路100號
3 : 台中市北屯區中華路100號
message : 第 2 筆資料
4 : 第 2 筆資料
sn : 3
0 : 3
name : 王小白
1 : 王小白
mail : wang@gmail.com
2 : wang@gmail.com
home : 台北市信義區信義路一段1號
3 : 台北市信義區信義路一段1號
message : 第 3 筆資料
4 : 第 3 筆資料

PDO::FETCH_CLASS 返回一個物件,以欄位名稱設定屬性,並把設值給該屬性
注意:要先撰寫該類別,空的也可以,但一定要有類別

class Member
{
    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`";
$sth = $conn->prepare($sql);
$sth->execute();
$rows = $sth->fetchAll(PDO::FETCH_CLASS,"Member");

foreach($rows as $row)
{
    $row->showMember();
}

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

sn:2
name:陳小華
mail:chen@gmail.com
home:台中市北屯區中華路100號
message:第 2 筆資料

sn:3
name:王小白
mail:wang@gmail.com
home:台北市信義區信義路一段1號
message:第 3 筆資料