面向物件,PDO基礎知識,PDO預處理,SQL事務處理
阿新 • • 發佈:2019-01-31
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();獲取錯誤資訊;
<?php
//使用pdo連線資料庫
//1,例項化物件
$pdo=new PDO('mysql:host=localhost;dbname=test1;charset=utf8;port=3306'
//傳送SQL語句,查詢用query,執行(增刪改)用exec()
$res=$pdo->query('select *from test2');
$res=$pdo->exec("update test2 set name='張三1' where id=44");
//3,處理結果;
//3,1 query有結果集的情況
//3,1,1,foreach
foreach($res as $k=>$v){
var_dump($k);
var_dump($v);
}
//3,1,2,fetch 只返回一條結果集
$res->
var_dump($res);
//3,1,3,fetchAll返回所有的結果集
$rows=$res->fetchAll();
var_dump($rows);
//返回查詢結果總數
//3,2 exec沒有結果集直接返回受影響的行數
echo $res;
?>
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()
程式碼部分
<?php
//pdo預處理
//1,例項化物件
$pdo=new PDO('mysql:host=localhost;dbname=test1;charset=utf8;prot=3306','root','admin');
//2,傳送sql指令
//1,?形式;
$sql="select *from test2 where name=? and passwd=?";
//2,: 起別名
//$sql="select * from test2 where name=:name and passwd=:passwd";
$stmt=$pdo->prepare($sql);
//3,繫結引數
//1,bindValue
$stmt->bindValue(1,'張三');
$stmt->bindValue(2,'admin');
//2,bindParam,次方法中第二個引數不能為固定值
$stmt->bindParam(1,$name);
$stmt->bindParam(2,$passwd);
//3,array()陣列形式
$arr=array('張三','admin');//?
$arr=array(':name'=>'張三',':passwd'=>'admin');//:起別名
//4,傳送執行
$stmt->execute($arr);//陣列形式時在這裡必須傳入陣列
$res=$stmt->fetchAll(PDO::FETCH_NUM);
var_dump($res);
?>
MySQL事務處理
將多條sql語句(增刪改)作為一個操作單元,要麼都成功,要麼都失敗;
ps:操作表必須是innoDB
事務處理的步驟:
$pdo->beginTransaction():開啟事務
$pdo->commit():提交一次事務
$pdo->rollback():回滾一次事務
程式碼部分
<?php
//mysql事務處理
//例項化物件
$pdo=new PDO('mysql:host=localhost;dbname=test1;charset=utf8;port=3306','root','admin');
//開啟事務
$pdo->begintransaction();
try{
//sql操作
$num=$pdo->exec("update test2 set name='張三1111' where id=8");
if($num <1){
thrownewPDOException('第一個失敗了',10086);//丟擲錯誤
}
//sql操作
$num1=$pdo->exec("update test2 set name='李四2222' where id=9");
if($num1 <1){
thrownewPDOException('第二個失敗了',10010);//丟擲錯誤
}
if($num>=1&& $num1 >=1){
$pdo->commit();//成功的話提交事務
echo "兩個都成功了";
}
}catch(PDOException $e){
$pdo->rollback();// 如果失敗回滾
echo $e->getMessage();
echo $e->getCode();
}
?>
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)