PDO-資料庫連線----PDOStatement--操作資料,sql預定義等
阿新 • • 發佈:2021-01-21
<?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(); //也是有三種方法 }