PDO主要是用來對資料庫進行訪問的。PDO擴充套件為PHP訪問資料庫定義了一個輕量級的一致介面,不同資料庫在訪問時,採用相同方法名稱,解決了連線資料庫不統一問題。PDO擴充套件自身並不能實現任何資料庫功能,必須使用一個具體資料庫的PDO驅動來訪問資料庫服務。
pdo特點: 效能:比傳統和原生訪問資料庫方式的效率高。
執行時擴充套件:pdo是模組化的。能在專案執行時載入資料庫的驅動。
pdo的安裝問題:
找到擴充套件配置位置,新增extension=php_pdo_mysql.dll。 如果程式碼存在,則把前面的分號註釋去掉即可。extension=php_pdo.dll同理
重啟apache
pdo的分類:
PDO類 : 主要使用者資料庫連線,傳送sql語句
PDOStatement類 : 主要用來解釋結果集,實現預處理,事物處理
PDOException類 : 主要用於捕獲PDO異常
建立PDO物件:
變數名 = new PDO('資料庫源','使用者名稱','密碼');
例如:$db = new PDO('mysql:host=localhost;port=3306;charset=utf8;dbname=stu','root','root');
exec()方法執行一條 SQL 語句,並返回受影響的行數,建議用於增刪改的SQL執行操作
query()方法執行一條SQL語句,並返回結果集,建議用於查詢的SQL執行操作
對應query()方法,可以通過setFetchMode(PDO::FETCH_ASSOC) 設定獲取結果集的返回型別
setFetchMode方法的一個PDO引數可以有三個值:
PDO::FETCH_ASSOC 只返回關聯陣列。
PDO::FETCH_NUM 只返回數字下標陣列。
PDO::FETCH_BOTH 預設的,關聯陣列+數字下標的陣列。
fetch()方法從結果集中獲取下一行 ,一次只能返回一行資料,獲取不到資料返回false,通過引數可以設定結果集的返回型別
引數一共有以下幾個:
-
PDO::FETCH_ASSOC:返回一個索引為結果集列名的陣列
-
PDO::FETCH_BOTH(預設):返回一個索引為結果集列名和以0開始的列號的陣列
-
PDO::FETCH_BOUND:返回
TRUE
,並分配結果集中的列值給 PDOStatement::bindColumn() 方法繫結的 PHP 變數。 -
PDO::FETCH_CLASS:返回一個請求類的新例項,對映結果集中的列名到類中對應的屬性名。
-
PDO::FETCH_INTO:更新一個被請求類已存在的例項,對映結果集中的列到類中命名的屬性
-
PDO::FETCH_LAZY:結合使用 PDO::FETCH_BOTH 和 PDO::FETCH_OBJ,建立供用來訪問的物件變數名
-
PDO::FETCH_NUM:返回一個索引為以0開始的結果集列號的陣列
-
PDO::FETCH_OBJ:返回一個屬性名對應結果集列名的匿名物件
fetchAll()方法返回一個包含結果集中所有行的陣列 ,通過引數可以設定結果集的返回型別。想要獲取結果集中單獨一列的唯一值,需要將 PDO::FETCH_COLUMN
和 PDO::FETCH_UNIQUE
按位或。想要返回一個根據指定列把值分組後的關聯陣列,需要將 PDO::FETCH_COLUMN
和 PDO::FETCH_GROUP
按位或。
通過引數可以設定結果集的返回型別:
-
PDO::FETCH_COLUMN
:返回指定以0開始索引的列。 -
PDO::FETCH_CLASS
:返回指定類的例項,對映每行的列到類中對應的屬性名。 -
PDO::FETCH_FUNC
:將每行的列作為引數傳遞給指定的函式,並返回撥用函式後的結果。
rowCount()方法 返回受上一個 SQL 語句影響的行數
prepare()方法生成一個PDOStatement物件,查詢不會立即執行,而是預處理
例如: $stmt = $db->prepare("select * from test");
execute()方法執行一條預處理語句
PDO的預處理:
預處理功能就是在SQL語句結構與形式相同的情況下,只有引數不同所採用的一種資料處理機制,其極大的減少了頻寬的浪費。
引數繫結:
bindParam => 繫結一個引數到指定的變數名。繫結一個PHP變數到用作預處理的SQL語句中的對應命名佔位符或問號佔位符。這個方法只能繫結變數。
bindValue => 把一個值繫結到一個引數 。繫結一個值到用作預處理的 SQL 語句中的對應命名佔位符或問號佔位符。
特別注意:引數識別符號。對於使用命名佔位符的預處理語句,應是類似 :name 形式的引數名。對於使用問號佔位符(?)的預處理語句,應是以1開始索引的引數位置。
PDO中的事務處理功能:
① 開啟事務
PDO::beginTransaction
② 提交事務
PDO::commit
③ 回滾事務
PDO::rollBack
PDO異常處理:
異常處理用於在指定的錯誤(異常)情況發生時改變指令碼的正常流程。這種情況稱為異常。
PDO異常捕獲:
try{
$db = new PDO(“mysql:host=localhost;dbname=test”,”root”,”root”);
}catch(PDOException $e){ //捕獲得錯誤。
echo $e->getMessage(); //錯誤資訊
}
PDO屬性的獲取與設定:
setAttribute => 設定資料庫控制程式碼屬性。
getAttribute => 獲取資料庫連線的屬性值
一些可用的通用屬性:
-
PDO::ATTR_CASE:強制列名為指定的大小寫。
-
PDO::CASE_LOWER:強制列名小寫。
-
PDO::CASE_NATURAL:保留資料庫驅動返回的列名。
-
PDO::CASE_UPPER:強制列名大寫。
-
-
PDO::ATTR_ERRMODE:錯誤報告。
-
PDO::ERRMODE_SILENT: 僅設定錯誤程式碼。
-
PDO::ERRMODE_WARNING: 引發 E_WARNING 錯誤
-
PDO::ERRMODE_EXCEPTION: 丟擲 exceptions 異常。
-
-
PDO::ATTR_ORACLE_NULLS (在所有驅動中都可用,不僅限於Oracle): 轉換 NULL 和空字串。
-
PDO::NULL_NATURAL: 不轉換。
-
PDO::NULL_EMPTY_STRING: 將空字串轉換成
NULL
。 -
PDO::NULL_TO_STRING: 將 NULL 轉換成空字串。
-
-
PDO::ATTR_STRINGIFY_FETCHES: 提取的時候將數值轉換為字串。
-
PDO::ATTR_STATEMENT_CLASS: 設定從PDOStatement派生的使用者提供的語句類。 不能用於持久的PDO例項。
-
PDO::ATTR_TIMEOUT: 指定超時的秒數。並非所有驅動都支援此選項,這意味著驅動和驅動之間可能會有差異。比如,SQLite等待的時間達到此值後就放棄獲取可寫鎖,但其他驅動可能會將此值解釋為一個連線或讀取超時的間隔。 需要 int 型別。
-
PDO::ATTR_AUTOCOMMIT (在OCI,Firebird 以及 MySQL中可用): 是否自動提交每個單獨的語句。
-
PDO::ATTR_EMULATE_PREPARES 啟用或禁用預處理語句的模擬。 有些驅動不支援或有限度地支援本地預處理。使用此設定強制PDO總是模擬預處理語句(如果為
TRUE
),或試著使用本地預處理語句(如果為FALSE
)。如果驅動不能成功預處理當前查詢,它將總是回到模擬預處理語句上。 需要 bool 型別。 -
PDO::MYSQL_ATTR_USE_BUFFERED_QUERY (在MySQL中可用): 使用緩衝查詢。
-
PDO::ATTR_DEFAULT_FETCH_MODE: 設定預設的提取模式。