(2)Mysqli 只支持MySQL數據庫,PDO支持大部分數據庫
(3)以後做的項目都是使用PDO作爲數據庫抽象層來實現的
mysqli------是mysql數據庫的加強:
(預處理機制)
(錯誤處理機制)
(採用了面向對象的編程模式)
一、PHP如何操作數據庫
與具體數據庫的擴展:php想操作那個數據庫,需要開啓這個數據庫的擴展,提供操作這個數據庫的函數
二、什麼是PDO
PDO是一個mysql官方封裝的,基於面向對象編程思想的,使用c語言開發的數據庫抽象層
三、PDO數據庫抽象的概念:
PDO抽象類
它是封裝的一個類,就是一個控制數據庫的新的操作方法
將具體的操作數據庫的代碼封裝到數據庫抽象層,如果出項數據庫轉移,只需在php代碼裏高速數據庫抽象層,你去使用哪一個數據庫就可以了
通過代碼引出PDO
<?php
//寫一個函數,根據傳遞的參數來操作不同的數據庫
function mysql_db($type){
if($type=='mysql'){
mysql_connect();
mysql_select_db();
}elseif ($type=='mssql'){
mssql_connect();
mssql_query();
}elseif ($type=='oracle'){
// 具體操作某個數據庫的函數
}
}
mysql_db('mysql');
function mysql_q($type,$sql){
if($type=='mysql'){
mysql_query($sql);
}
}
?>
一、 如何使用PDO
和當前使用mysql非常像
要想使用mysql需要開啓mysql擴展,
需想使用PDO,需要開啓PDO擴展
獲得PDO對象,調用方法
(1)要開啓pdo驅動
Extension = php_pdo.dll
Extension = php_pdo_sqlite.dll
Extension = php_pdo_mysql.dll
開啓這個擴展(驅動),就可以使用這個擴展給我們提供類了
(2)使用這個類,實例化這個類,調用屬性和方法
<?php
//使用PDO操作數據庫
//第一個參數:連接數據庫的類型:主機名;數據庫名
$dsc = 'mysql:host=localhost;dbname=mysql_text';
$user = 'root';
$pass = '123';
$pdo = new PDO($dsc,$user,$pass);//實例化一個類的時候,會自動的先調用__construct()構造函數
//var_dump($pdo);
//執行sql語句獲得
$sql = 'select*fromgoods';
$result = $pdo->query($sql);//query方法返回的是PDOStatement對象
//如果想獲得具體的數據,需要調用對象的方法:fetchAll();參數是類常量,表示返回什麼樣的數據
$rows = $result->fetchAll(PDO::FETCH_BOTH);
//var_dump($rows);
//更新數據庫的操作
$sql = 'update goods set goods_name="lalala" wheregoods_id=3';
//執行增刪改的語句,exec()方法,執行查詢的語句 query()
//exec()返回受影響的函數 query()返回PDOStatement對象
$nums = $pdo->exec($sql);
var_dump($nums);
?>
二、 PDO預編譯機制
先將sql語句的數據部分和費數據部分分離開————》將不帶數據的部分預編譯一下prepare()————》在編譯結果上綁定數據bandparam()————》執行編譯結果execute()
預編譯的好處:1、減少了編譯的字符數,編譯的速度提高
2、如果再次執行同樣的sql語句,直接綁定數據,減少編譯sql語句時間
寫代碼實現PDO的預編譯(與處理機制)
<?php
//預編譯:PDO::prepare($sql); 返回PDOStatement對象
//綁定數據PDOStamentt->bindParam(); 給預編譯的結果綁定數據
//執行編譯結果 PDOStament->execute();
//使用PDO操作數據庫
//第一個參數:連接數據庫的類型:主機名;數據庫名
$dsn = 'mysql:host=localhost;dbname=mysql_text';
$user = 'root';
$pass = '123';
$pdo = new PDO($dsn,$user,$pass);
//var_dump($pdo);
//預編譯:prepare();參數是不帶數據的sql語句
//先將sql語句中的數據部分用佔位符代替 :佔位符名稱
$sql = 'insert intogoods values(null,:name,:price,:number)';
$smt = $pdo->prepare($sql); //返回一個PDOStament 對象
//綁定數據 PDOStament對象的bindParam()來綁定參數:佔位符,實際數據
$goods_name= 'surface';
$goods_price= '3500';
$goods_num= '41';
$smt->bindParam(':name',$goods_name);
$smt->bindParam(':price',$goods_price);
$smt->bindParam(':number',$goods_num);
$smt->execute();
?>
三、 PDO的錯誤處理機制:
(1)靜默模式
默認情況下與mysql處理方式一致,不現實錯誤信息(靜默模式)但是我們可以通過固定的方法獲得錯誤信息
(2)警告模式
//更改屬性設置錯誤處理模式
$pdo ->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_WARNING);
(3)異常模式,當發生錯誤時,拋出一個異常
$pdo ->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
$sql = 'select*fromgood';
try {
//嘗試可能會處錯誤的代碼
$pdo ->query($sql);
}catch (PDOException $e){
//現在捕獲異常後,自己看着辦,是讓他顯示出來呢,還是輸出到日誌文件裏呢?
//通常是將錯誤信息輸出到日誌文件裏
var_dump($e->getMessage());
file_put_contents('D://mysql.log',$e->getMessage());
}