在上在篇教程中,請為大家介紹如何透過PHP 內建的Mysqli 擴充與MySQL 資料庫交互,今天我們來看看另一個PHP 內建的資料庫擴充功能- PDO,其全名為PHP Data Objects,即PHP 資料物件。
PDO 為PHP 存取資料庫定義了一個輕量級的一致接口,因此它提供的是一個資料存取抽象層,本身並不能實現任何資料庫交互功能,必須使用一個特定資料庫的PDO 驅動來存取資料庫服務,這些特定資料庫驅動包括MySQL、PostgreSQL、SQLite、SQL Server、Oracle 等,因此PDO 是一個更標準、更通用的資料庫擴展,而且完全是物件導向風格的,目前,在各個主流PHP 框架中,PDO 已經成為了建構資料庫互動的基礎元件,包括Laravel 框架,也是基於PDO 擴充功能提供資料庫存取功能。
我們先前推薦的PHP 本機整合開發環境都整合了對PDO 擴充功能的支援(以下是Laragon 預先安裝的PHP 擴充功能):
且可以看到,除了PDO
擴充功能外,還有一個與之匹配的具體資料庫擴充pdo_mysql
,有了這個具體擴展,才能存取MySQL 資料庫。另外,PDO 提供了統一的資料庫存取接口,所以實現了PDO 接口的具體資料庫擴展可以透過完全一樣的方法存取資料庫,這樣一來,如果應用需要切換資料庫,就不需要對資料庫操作碼進行重構,光憑這一點,就可以丟掉MySQLi 擴展,投入PDO 的懷抱了。
如果安裝過Laradock,可以啟動workspace
容器,然後查看其預先安裝的PHP 擴展,可以看到,它包含更多具體的PDO 資料庫驅動支援:
其中pdo_pgsql
表示PostgresSQL 資料庫驅動,pdo_sqlite
表示SQLite 資料庫驅動。
在我們的教學課程中,還是選擇以 MySQL 為例進行示範。
要透過PDO 擴充功能建立資料庫連接,直接實例化PDO 物件即可,我們寫一段簡單的範例程式碼如下(在php_learning/mysql
目錄下新建pdo.php
儲存程式碼):
<?php // 设置连接属性 $dsn = 'mysql:host=127.0.0.1;port=3306;dbname=test;charset=utf8mb4'; $user = 'root'; $pass = 'root'; try { // 建立连接 $pdo = new PDO($dsn, $user, $pass); // 执行 SQL 查询 $sql = $pdo->quote('SELECT * FROM `post` ORDER BY `id` DESC'); $res = $pdo->query($sql); // 打印查询结果 echo '<pre class="brush:php;toolbar:false">'; foreach ($res as $row) { print_r($row); } } catch (PDOException $exception) { // 如果数据库操作出现异常,则捕获并打印 printf("Error: %s\n", $exception->getMessage()); } finally { // 释放 PDO 连接实例 $pdo = null; }
在實例化PDO 物件建立資料庫連線時,至少需要傳入三個字串類型參數,第一個參數包含了資料庫主機訊息,例如資料庫驅動類型(這裡是mysql
)、IP位址(本機位址是127.0.0.1
)、連接埠號碼(可選,預設是3306
)、要連接的資料庫名稱(test
)、字元編碼資訊(utf8mb4
)等,第二個參數是使用者名,第三個參數是密碼。
接下來,我們就可以呼叫PDO 物件實例$pdo
上的query 方法執行指定SQL 語句與資料庫互動了(增刪改查),不過在此之前,我們先呼叫了quote 方法對查詢SQL 語句進行轉義,該函數的功能類似mysqli_escape_string
。
執行完 SQL 查詢後,會傳回一個查詢結果集,可以透過循環遍歷列印該結果。
此外,透過PDO 擴充功能進行資料庫連接和查詢操作如果發生錯誤,會拋出異常,為了增加程式的健全性,我們在透過try...catch...
語句捕獲PDOException
異常,並列印錯誤訊息,最後透過finally
語句釋放PDO 物件實例,因為該語句區塊不管是否拋出例外都會執行。
執行php -S localhost:9000
啟動內建HTTP 伺服器進行測試,在瀏覽器中存取http://localhost:9000/mysql/pdo.php
,即可看到正常的列印結果:
我們修改下上述程式碼中的連線訊息,例如將密碼值調整為test
,這個時候就會捕獲到PDO 異常,並列印錯誤訊息:
#註:錯誤訊息中的IP 位址是MySQL Docker 容器內部的IP 位址。可以忽略,這個報錯是密碼錯誤,而不是 IP 位址的問題。
#想了解更多相關文章,請關注php mysql欄位!
以上是透過PDO擴展與MySQL資料庫互動實現基本使用的詳細內容。更多資訊請關注PHP中文網其他相關文章!