1. 程式人生 > 實用技巧 >PDO-資料庫連線----PDOStatement--操作資料,sql預定義等

PDO-資料庫連線----PDOStatement--操作資料,sql預定義等

<?php 

    //dsn 資料資源名稱,裡面內容沒有先後順序,但是資料庫型別必須是小寫mysql:的
    //如果是本地host 可以省略,埠也可以省略,資料庫名字和字符集也可以省略
    $dsn="mysql:host=localhost;dbname=my_db;port=3306;charset=utf8";

    //PDO代表php與資料庫連線
    $pdo = new PDO($dsn,"root","root");

    /**
     * PDO 操作增刪改操作
     * @return 成功返回受影響的行數,失敗返回false
     * 如果返回0也表示成功,只是沒有受影響的行數
     
*/ //增,受影響1條 // echo $pdo->exec("insert into my_user values (null,'王小虎',123456,'超級管理員')"); //刪除,受影響3條 // echo $pdo->exec("delete from my_user where u_name='王小虎'"); //修改,受影響6條 // echo $pdo->exec("update my_user set u_name='張小龍' where u_id >=15 and u_id<=20"); //例子 ,錯誤資訊及錯誤程式碼
$info=$pdo->exec("delete from my_user where u_id=10"); if($info===false){ echo "錯誤程式碼".$pdo->errorCode()."<br>"; echo "錯誤資訊". $pdo->errorInfo()[2]."<br>"; }elseif($info===0){ echo "沒有要刪除的資料"; }else{ echo "資料刪除成功"; echo "刪除了".$info
; } ?>

PDO事務

  多個SQL語句同時執行?如果有錯就回滾,沒有錯誤就同時提交

  

<?php


    if(!empty($_GET)){
    $out=$_GET['bank_out'];
    $in=$_GET['bank_in'];
    $mony=$_GET['mony'];
    $dsn="mysql:host=localhost;dbname=my_db;port=3306;charset=utf8";
    $pdo = new PDO($dsn,"root","root");
    $pdo->beginTransaction();
        $bank_out=$pdo->exec("update my_bank set mony=mony-$mony where carNo=$out");
        $bank_in=$pdo->exec("update my_bank set mony=mony+$mony where carNo=$in");

    if($bank_out && $bank_in){
        $pdo->commit();
        echo "轉賬成功,轉賬金額:".$mony;

    }else{
        $pdo->rollBack();
        echo "轉賬失敗";
        echo "錯誤資訊".$pdo->errorInfo()[2];
    }
}



?>

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <form action="" method="get">
        轉出賬號:<input type="text" name="bank_out" id=""><br>
        轉入賬號:<input type="text" name="bank_in" id=""><br>
        金額:<input type="text" name="mony" id=""> <br>
        <input type="submit" value="轉賬">
    </form>
</body>
</html>

PDOStatement物件

<?php

    $dsn="mysql:dbname=my_db;port=3306;carset=utf8";
    $pdo = new PDO($dsn,"root","root");

    //查詢操作會返回一個PDOStatement物件結果集
    $stmt=$pdo->query("select * from my_user");
    //var_dump($stmt);  //object(PDOStatement)#2 (1) { ["queryString"]=> string(21) "select * from my_user" }

    /**
     * 作用:獲取二維陣列結果集
     * @param static int 預設不寫為PDO::FETCH_BOTH 索引陣列和關聯陣列
     * PDO::FETCH_ASSOC 關聯陣列
     * PDO::FETCH_NUM 索引陣列
     * @return 預設返回索引陣列和關聯陣列
     */
    // $arr=$stmt->fetchAll(PDO::FETCH_NUM); 
    // print_r($arr);

    /**
     * 作用:返回一維陣列
     * 可以使用迴圈來輸出,每次只取出一條記錄,並且指標下移 next();
     */
    // $arr=$stmt->fetch();
    // print_r($arr);

    /**
     * 作用:獲取記錄數
     * @return int 記錄總數
     */
    
    echo $stmt->rowCount();   //25

    //foreach迴圈物件,只能是輸出物件中的成員屬性,但是我們迴圈的時候,輸出了陣列資料,說明PDOStatement類實現了迭代器
    // foreach( $stmt as $row){
    //     print_r($row);   
    // }

PDO prepare 預處理,準備要執行的SQL語句並返回一個 PDOStatement 物件,多次執行一種sql語句,多次編譯,使用prepare效率更高

1.PDOStatement->bindparam 與bindcvalue

<?php
     $dsn="mysql:host=localhost;dbname=my_db;port=3306;charset=utf8";
     $pdo = new PDO($dsn,"root","root");
     //預處理語句,引數佔位符使用? 代替,返回一個PDOStatement物件
     $stmt=$pdo->prepare("insert into my_bank values (?,?,?)");
     //定義陣列
     $arr=[
         [3,10003,500],
         [4,10004,800]
     ];

    //  //執行預處理
    //  foreach ($arr as $value) {
    //      //方法一:繫結引數
    //      $stmt->bindParam(1,$value[0]);    //佔位符從1開始
    //      $stmt->bindParam(2,$value[1]);
    //      $stmt->bindParam(3,$value[2]);
    //      $stmt->execute();   //執行預處理   執行成功
    //  }

    // foreach ($arr as $value) {
    //     //方法二 繫結值
    //     // $stmt->bindValue(1,$value[0]);    //佔位符從1開始
    //     // $stmt->bindValue(2,$value[1]);
    //     // $stmt->bindValue(3,$value[2]);
    //     // $stmt->execute();   //成功  bindparam和bindValue 效果一樣的?但是
    //     // pindParam的引數必須是變數,而bindValue可以是變數也可以是值
    //     $stmt->bindValue(1,3);   
    //     $stmt->bindValue(2,10003);
    //     $stmt->bindValue(3,4000);
    //     $stmt->execute();   
    //     //pindParam的引數必須是變數,而bindValue可以是變數也可以是值
    // }

    foreach($arr as $value){
        //方法三:如果預處理引數和陣列的值是一致的可以直接寫
        $stmt->execute($value);

    }

值的佔位符 使用:p1冒號佔位

<?php
     $dsn="mysql:host=localhost;dbname=my_db;port=3306;charset=utf8";
     $pdo = new PDO($dsn,"root","root");
     //預處理語句,引數佔位符使用? 代替,返回一個PDOStatement物件
     $stmt=$pdo->prepare("insert into my_bank values (:p1,:p2,:p3)");
     //定義陣列
     $arr=[
         ['p1'=>3,'p2'=>10003,'p3'=>500],
         ['p1'=>4,'p2'=>10004,'p3'=>800]
     ];
     
     foreach ($arr as $value) {
        $stmt->bindParam('p1',$value['p1']);
        $stmt->bindParam('p2',$value['p2']);
        $stmt->bindParam('p3',$value['p3']);
        $stmt->execute();   //也是有三種方法
     }