PDO概念 分析 練習

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);
                   
?>
相關文章
相關標籤/搜索