PDO 翻譯過來叫作數據訪問抽象層php
它是一個數據訪問的層面,其實是一個類,也就是說全部操做數據庫的代碼,都是經過這個層面完成的前端
該圖好理解大概就是這樣一種模式mysql
如今考慮的是能不能使用同一個類,上層代碼不用動,使用一個類去操做數據庫,我能夠根據這個類裏邊給的一些參數,它來自動切換驅動sql
因此PDO主要就是用來訪問其它數據庫數據庫
它的主要功能:數組
1.操做其它數據庫函數
2.事務功能fetch
3.防止SQL注入攻擊spa
首先先造PDO對象翻譯
$dsn = "mysql:dbname=mydb;host=localhost"; 這是一個數據源
mysql 表明了驅動的名稱
冒號後邊寫鏈接的參數
寫的是數據庫名稱叫dbname=名稱叫mydb
host 表明了數據庫地址
$dsn = "mysql:dbname=mydb;host=localhost"; $pdo = new PDO($dsn,"root","123");
這樣PDO對象就造好了
接着寫SQL語句和執行
$sql = "select * from nation"; $attr = $pdo->query($sql); $arr = $attr->fetch(PDO::FETCH_ASSOC);//參數不須要加單引號雙引號 var_dump($arr);
這返回的對象是PDOStatement對象
ASSOC 表明 關聯數組
NUM 表明 索引的
BOTH 表明二者都有
OBJ 返回對象
若是sql語句不是查詢語句,而是增刪改
//添加語句 $sql = "insert into nation values('n076','數據')"; //$a = $pdo->query($sql); //執行查詢 //$a = $pdo->exec($sql); //執行其它語句
exec 是指一個單獨的函數調用中執行一條SQL語句,返回受此語句影響的行數
不會從一條SELECT語句中返回結果
這些就是PDO訪問數據庫的基本寫法
若是把dsn換掉就能夠訪問別的數據庫了
接下來了解一下事務功能
事務:可以控制語句同時成功同時失敗,失敗時能夠回滾
$dsn = "mysql:dbname=mydb;host=localhost"; $pdo = new PDO($dsn,"root","123"); $sql1 = "insert into nation values('n079','是刪')"; $sql2 = "insert into nation values('n077','可愛')"; $pdo->exec($sql1); $pdo->exec($sql2);
n079是在數據裏沒有的,能夠進
n077是在數據裏存在的,是失敗的,主鍵重複
執行的時候,若是單純的執行,我沒有加事務的話,應該是一條成功一條失敗
如今咱們要加事務讓着兩條要麼一塊兒成功,要麼一塊兒失敗,而且把錯誤的找出來,進行回滾
$dsn = "mysql:dbname=mydb;host=localhost"; $pdo = new PDO($dsn,"root","123"); //設置異常模式 若是出現錯誤,會拋出一個異常,一拋異常,catch抓住 $pdo->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION); //加事務 try{ //開啓事務 $pdo -> beginTransaction(); //調它開啓事務 $sql1 = "insert into nation values('n078','是刪')"; $sql2 = "insert into nation values('n077','數據')"; $pdo->exec($sql1); $pdo->exec($sql2); //提交 走到提交的時候可以把事務結束掉 $pdo->commit(); } catch(Exception $e) $e就是異常對象 { $e->getMessage(); //獲取異常信息 //回滾 $pdo->rollBack(); } ?>
1.設置異常模式
$pdo->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
若是出現錯誤,會拋出一個異常,拋出異常後,catch抓住
2.加事務 try : 試着執行
try{
先開啓事務
$pdo -> beginTransaction(); 調它開啓
提交
$pdo->commit(); 走到提交的時候可以把事務結束掉
}
catch : 抓住try裏面出現的問題,抓住後執行下面的內容
catch(Exception $e) pdo異常參數 Exception:異常 $e就是異常對象
{
$e->getMessage(); 獲取異常信息
回滾
$pdo->rollBack();
}
還有一個是final
是配合着try用的,要麼加catch,要麼加final,也有可能一塊兒
final 是 不管以上try代碼是否執行成功,是否有錯誤,都會最終過來執行它
最後在來看一下 SQL注入攻擊
它的表現方式
用戶在輸入內容的時候,它能夠本身拼接一個字符串,來改變咱們查詢的結果
怎麼防範?有幾種方式
1. 過濾用戶的輸入 經過前端用JS也行,用PHP也行
2. 寫代碼的規範
3. 使用PDO裏自帶的功能叫預處理語句,來防止SQL注入攻擊
<?php $dsn = "mysql:dbname=mydb;host=localhost"; $pdo = new PDO($dsn,"root","123"); $code ="n001"; //SQL語句裏面須要加佔位符 ? $sql = "select * from nation where code='{?}'"; //怎樣把注入攻擊規避掉 //pdo 提供了一種方式叫 prepare-> 準備的意思 //準備執行,返回PDOStatement對象 $st = $pdo->prepare($sql); //調用綁定參數的方法來綁定參數 $st->bindParam(1,$code); //1.括號裏第一個要寫佔位符在sql語句裏面的位置是幾 //2.要寫參數 這兩個是必需要寫的 //執行方法 $st->execute(); $attr = $st->fetchAll(); var_dump($attr); ?>