1. 程式人生 > >面向物件,PDO基礎知識,PDO預處理,SQL事務處理

面向物件,PDO基礎知識,PDO預處理,SQL事務處理

PDO:資料庫抽象層

PDO特點:跨資料庫,支援預處理,支援事務

PDO的基本使用

1,例項化物件
例項化物件( new PDO() )  
$pdo=new PDO(引數1,引數2,引數3);
    引數:
        1,資料庫型別:主機名,資料庫名,字符集,埠號(資料庫型別必須小寫)
        2,使用者名稱
        3,密碼
$pdo=new PDO('mysql:host=localhost;dbname=test2;charset=utf8;port=3306','root','admin');
2,傳送sql語句
查詢用(query),執行(增刪改)用exec
    如:$pdo->query('select * from test2')
    query:返回結果集物件;
    exec:返回受影響的行數;
3,處理查詢結果
foreach:遍歷結果集物件,如:foreach($res as $v =>$k){}
fetch:提取一條資料,如:$rows=$res->fetch();
fetchAll:提取所有資料;$rows=$res->fetchAll();
函式
$pdo->lastInsertId();獲取最後插入的id
$pdo->errorInfo();獲取錯誤資訊;
    1. <?php
    1. //使用pdo連線資料庫
    2. //1,例項化物件
    3. $pdo=new PDO('mysql:host=localhost;dbname=test1;charset=utf8;port=3306'
      ,'root','admin')ordie('資料庫連線失敗');
    1. //傳送SQL語句,查詢用query,執行(增刪改)用exec()
    2. $res=$pdo->query('select *from test2');
    3. $res=$pdo->exec("update test2 set name='張三1' where id=44");
    1. //3,處理結果;
    2. //3,1 query有結果集的情況
    3. //3,1,1,foreach
    4. foreach($res as $k=>$v){
    5. var_dump($k);
    6. var_dump($v);
    7. }
    8. //3,1,2,fetch 只返回一條結果集
    9. $res->
      fetch();
    10. var_dump($res);
    11. //3,1,3,fetchAll返回所有的結果集
    12. $rows=$res->fetchAll();
    13. var_dump($rows);
    14. //返回查詢結果總數
    15. //3,2 exec沒有結果集直接返回受影響的行數
    16. echo $res;
    1. ?>

PDO預處理

1,例項化物件;$pdo=new PDO()
2,傳送預處理指令;兩種方法:1:?; 2:起別名:name
    $sql='select * from test2 where name=? and passwd=? ';
    $stmt=$pdo->prepare($sql);
3,繫結引數 bindValue;三種方法:1,bindValue; 2,bindParam; 3,陣列
    $stmt->bindValue(1,$name);
    $stmt->bindValue(2,$passwd);
4,執行傳送
    $stmt->execute();
5,處理返回結果
    $res=$stmt->fetch()
程式碼部分
    1. <?php
    1. //pdo預處理
    2. //1,例項化物件
    3. $pdo=new PDO('mysql:host=localhost;dbname=test1;charset=utf8;prot=3306','root','admin');
    4. //2,傳送sql指令
    5. //1,?形式;
    6. $sql="select *from test2 where name=? and passwd=?";
    7. //2,: 起別名
    8. //$sql="select * from test2 where name=:name and passwd=:passwd";
    9. $stmt=$pdo->prepare($sql);
    1. //3,繫結引數
    2. //1,bindValue
    3. $stmt->bindValue(1,'張三');
    4. $stmt->bindValue(2,'admin');
    5. //2,bindParam,次方法中第二個引數不能為固定值
    6. $stmt->bindParam(1,$name);
    7. $stmt->bindParam(2,$passwd);
    8. //3,array()陣列形式
    9. $arr=array('張三','admin');//?
    10. $arr=array(':name'=>'張三',':passwd'=>'admin');//:起別名
    1. //4,傳送執行
    2. $stmt->execute($arr);//陣列形式時在這裡必須傳入陣列
    3. $res=$stmt->fetchAll(PDO::FETCH_NUM);
    4. var_dump($res);
    1. ?>

MySQL事務處理

將多條sql語句(增刪改)作為一個操作單元,要麼都成功,要麼都失敗;
    ps:操作表必須是innoDB
事務處理的步驟:
    $pdo->beginTransaction():開啟事務
    $pdo->commit():提交一次事務
    $pdo->rollback():回滾一次事務
程式碼部分
    1. <?php
    2. //mysql事務處理
    3. //例項化物件
    4. $pdo=new PDO('mysql:host=localhost;dbname=test1;charset=utf8;port=3306','root','admin');
    5. //開啟事務
    6. $pdo->begintransaction();
    1. try{
    2. //sql操作
    3. $num=$pdo->exec("update test2 set name='張三1111' where id=8");
    1. if($num <1){
    2. thrownewPDOException('第一個失敗了',10086);//丟擲錯誤
    3. }
    1. //sql操作
    2. $num1=$pdo->exec("update test2 set name='李四2222' where id=9");
    3. if($num1 <1){
    4. thrownewPDOException('第二個失敗了',10010);//丟擲錯誤
    5. }
    6. if($num>=1&& $num1 >=1){
    7. $pdo->commit();//成功的話提交事務
    8. echo "兩個都成功了";
    9. }
    1. }catch(PDOException $e){
    2. $pdo->rollback();// 如果失敗回滾
    3. echo $e->getMessage();
    4. echo $e->getCode();
    5. }
    1. ?>

setAttribute

設定結果集提取的型別:$pdo->setAttribute();
$pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MEDO,PDO::FETCH_NUM);

PDO::FETCH_ASSOC:關聯陣列
PDO::FETCH_NUM:索引陣列

設定結果集鍵名的大小寫:
$pdo->setAttribute(PDO::ATTR_CASE,PDO::CASE:UPPER)
(PDO::ATTR_CASE,PDO::CASE:LOWER)

設定錯誤處理模式:
$pdo->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION)
(PDO::ATTR_ERRMODE,PDO::ERRMODE_WARNING)

獲得模式:$pdo->getAttribute(PDO::ERRMODE)