PDO學習

PDO(PHP Data Object)粮坞,數(shù)據(jù)庫訪問抽象層蝗岖,統(tǒng)一各種數(shù)據(jù)庫的訪問接口晦雨。

image.png

一架曹、PDO連接數(shù)據(jù)庫

1、通過參數(shù)形式連接數(shù)據(jù)庫

    try{
        $dsn = 'mysql:host=localhost;dbname=article';
        $username = 'root';
        $password = '';
        $pdo = new PDO($dsn,$username,$password);
        var_dump($pdo);
    }catch (PDOException $e){
        echo $e->getMessage();
    }

2闹瞧、通過uri的形式連接數(shù)據(jù)庫

    try{
        $dsn = 'uri:file://D:\wamp64\www\dsn.txt';
        $username = 'root';
        $password = '';
        $pdo = new PDO($dsn,$username,$password);
        var_dump($pdo);
    }catch (PDOException $e){
        echo $e->getMessage();
    }

dsn.txt

mysql:dbname=article;host=localhost

3绑雄、通過配置文件連接數(shù)據(jù)庫

    try{
        $dsn = 'imooc';
        $username = 'root';
        $password = '';
        $pdo = new PDO($dsn,$username,$password);
        var_dump($pdo);
    }catch (PDOException $e){
        echo $e->getMessage();
    }

php.ini

pdo.dsn.imooc="mysql:host=localhost;dbname=article"

二、pdo方法

1奥邮、exec() 可以實現(xiàn)一次插入多條語句
    try{
        $dsn = 'mysql:host=localhost;dbname=article';
        $username = 'root';
        $password = '';
        $pdo = new PDO($dsn,$username,$password);
        // exec();執(zhí)行一條sql語句并返回其受影響的記錄的條數(shù),如果沒有受影響的記錄万牺,返回0
        // exec對于select沒有作用
        $sql = <<< EOF
            create table if not exists pdo_user(
              id int unsigned auto_increment key,
              username varchar(20) not null unique,
              password char(32) not null,
              email varchar(30) not null 
            );
EOF;
        $res = $pdo->exec($sql);
        var_dump($res);    // int 0
        $sql = "insert into pdo_user(username,password,email) values ('king','king','imooc@qq.com')";
        $res = $pdo->exec($sql);
        var_dump($res);    // int 1
    }catch (PDOException $e){
        echo $e->getMessage();
    }
2、lastInsertiId() 獲得最后插入的Id號
3洽腺、errorCode() 返回上一次操作的SQLSTATE
4脚粟、errorInfo() 返回上一次操作的 錯誤信息

返回的錯誤信息的數(shù)組,數(shù)組中包含3個單元
0=>SQLSTATE,1=>CODE,2=>INFO

5蘸朋、query() 返回一個PDOStatement對象
    <?php
/**
 * Created by PhpStorm.
 * User: zhengjiayuan
 * Date: 2018/7/14
 * Time: 16:44
 */
    header("content-type:text/html;charset=utf-8");
    try{
        $pdo = new PDO('mysql:host=localhost;dbname=article','root','');
        $sql = "select * from pdo_user where id = 1";
        $stmt = $pdo->query($sql); // 執(zhí)行失敗返回 false
        foreach ($stmt as $row){
            print_r($row);
        }
    }catch (PDOException $e){

    }
5核无、prepare() + execute()
header("content-type:text/html;charset=utf-8");
try{
    $pdo = new PDO('mysql:host=localhost;dbname=article','root','');
    $sql = "select * from pdo_user where id = 1";
    $stmt = $pdo->prepare($sql); // 執(zhí)行失敗返回 false 成功 PDOStatement對象
    $res = $stmt->execute();// 成功返回 true 失敗返回 false
    if($res){
        $row = $stmt->fetch(); // 索引加關聯(lián)
        print_r($row);
    }
}catch (PDOException $e){
    $e->getMessage();
}
6、getAttribute() ==== setAttribute()
$pdo->getAttribute(PDO:ATTR_AUTOCOMMIT);   // 自動提交

常用屬性
AUTOCOMMIT 自動提交
ERRMODE 錯誤處理模式
CASE 字段名稱是否大小寫
PERSISTENT 是否持久連接
TIMEOUT 超時設置
ORACLE_NULLS 返回空字符串返回sql的null
SERVER_INFO 錯誤信息
SERVER_VERSION 服務端版本
CLIENT_VAERSION 客戶端版本
CONNECTION_STATUS 連接信息

7藕坯、quote() 返回待引號的字符串团南,過濾字符串中的特殊字符,防止sql注入
// ' or 1=1 #
$username = $pdo->quote($username);
// ' \' or 1=1 #'
$sql="select * from user where username = ${username} and password = '${password}'";
8噪沙、PDOStatement對象的方法:rouCount() : 對于select操作返回的結果集中記錄的條數(shù),對于Insert吐根、Update正歼、Delete返回受影響的記錄的條數(shù)
9、預處理

用命名方式做占位符

$sql = "select * from user where username=:username and password=:password";
$stmt=$pdo->prepare($sql);
$stmt->execute(array(":username"=>$username,":password"=>$password));

用?做占位符

$sql = "select * from user where username = ? and password= ? ";
$stmt=$pdo->prepare($sql);
$stmt->execute(array($username,$password));
10拷橘、bindParam()綁定參數(shù)形式

用命名方式做占位符

$sql = "select * from user where username=:username and password =:password";
$stmt=$pdo->prepare($sql);
$stmt->bindParam(":username",$username,PDO::PARAM_STR):
$stmt->bindParam(":password",$password,PDO::PARAM_STR):
$stmt->execute();

用?做占位符

$sql = "select * from user where username = ? and password= ?;";
$stmt=$pdo->prepare($sql);
$stmt->bindParam(1,$username):
$stmt->bindParam(2,$password):
$stmt->execute();
11局义、bindValue()

用?做占位符

$sql = "select * from user where username = ? and password= ?;";
$stmt=$pdo->prepare($sql);
$stmt->bindValue(1,$username):
$stmt->bindValue(2,$password):
$stmt->execute();

用命名方式做占位符

$sql = "select * from user where username=:username and password =:password";
$stmt=$pdo->prepare($sql);
$stmt->bindValue(":username",$username):
$stmt->bindValue(":password",$password):
$stmt->execute();
12、bindColumn()
$sql = "select username,password from user ;";
$stmt=$pdo->prepare($sql);
$stmt->execute();
$stmt->bindColumn(1,$username):
$stmt->bindColumn(2,$password):
while($stmt->fetch(PDO::FETCH_BOUND)){
    echo '用戶名:'.$username;
    echo '密碼:'.$password;
}
13膜楷、columnCount() 返回結果集中的列數(shù)
$sql = "select username,password from user ;";
$stmt=$pdo->prepare($sql);
$stmt->execute();
echo '結果集中的列數(shù):'.$pdo->columnCount();
14旭咽、錯誤處理模式

PDO::ERRMODE_SLIENT :默認模式,靜默模式
PDO::ERRMODE_WARNING : 警告模式
PDO::ERRMODE_EXCEPTION:異常模式

15赌厅、事務
image.png
try{
    $options=array(PDO::ATTR_AUTOCOMMIT,0)穷绵; // 關閉自動提交
$pdo = new PDO('mysql:host=localhost;dbname=article','root','',$options);
// 開啟事務
$pdo->beginTransaction();
$sql = "update userAccount set money=money-2000 where username = 'imooc' ;";
$res1 = $pdo->exec($sql);
if($res1 == 0 ){
    throw new PDOException('imooc 轉賬失敗');
}
$res2 = $pdo->exec("update userAccount set money = money + 2000 where username = 'king'");
if($res2 == 0) {
    throw new PDOExcetpion('king 接收失敗');
}
$pdo->commit();
}catch(PDOException $e){
    // 失敗回滾
    $pdo->rollback();
    $e->getMessage();
}
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市特愿,隨后出現(xiàn)的幾起案子仲墨,更是在濱河造成了極大的恐慌,老刑警劉巖揍障,帶你破解...
    沈念sama閱讀 207,248評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件目养,死亡現(xiàn)場離奇詭異,居然都是意外死亡毒嫡,警方通過查閱死者的電腦和手機癌蚁,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,681評論 2 381
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來兜畸,“玉大人努释,你說我怎么就攤上這事∫б。” “怎么了伐蒂?”我有些...
    開封第一講書人閱讀 153,443評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長肛鹏。 經常有香客問我逸邦,道長,這世上最難降的妖魔是什么在扰? 我笑而不...
    開封第一講書人閱讀 55,475評論 1 279
  • 正文 為了忘掉前任缕减,我火速辦了婚禮,結果婚禮上健田,老公的妹妹穿的比我還像新娘烛卧。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 64,458評論 5 374
  • 文/花漫 我一把揭開白布总放。 她就那樣靜靜地躺著呈宇,像睡著了一般。 火紅的嫁衣襯著肌膚如雪局雄。 梳的紋絲不亂的頭發(fā)上甥啄,一...
    開封第一講書人閱讀 49,185評論 1 284
  • 那天,我揣著相機與錄音炬搭,去河邊找鬼蜈漓。 笑死,一個胖子當著我的面吹牛宫盔,可吹牛的內容都是我干的融虽。 我是一名探鬼主播,決...
    沈念sama閱讀 38,451評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼灼芭,長吁一口氣:“原來是場噩夢啊……” “哼有额!你這毒婦竟也來了?” 一聲冷哼從身側響起彼绷,我...
    開封第一講書人閱讀 37,112評論 0 261
  • 序言:老撾萬榮一對情侶失蹤巍佑,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后寄悯,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體萤衰,經...
    沈念sama閱讀 43,609評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,083評論 2 325
  • 正文 我和宋清朗相戀三年猜旬,在試婚紗的時候發(fā)現(xiàn)自己被綠了脆栋。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,163評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡洒擦,死狀恐怖筹吐,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情秘遏,我是刑警寧澤,帶...
    沈念sama閱讀 33,803評論 4 323
  • 正文 年R本政府宣布嘉竟,位于F島的核電站邦危,受9級特大地震影響,放射性物質發(fā)生泄漏舍扰。R本人自食惡果不足惜倦蚪,卻給世界環(huán)境...
    茶點故事閱讀 39,357評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望边苹。 院中可真熱鬧陵且,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,357評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至沪悲,卻和暖如春获洲,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背殿如。 一陣腳步聲響...
    開封第一講書人閱讀 31,590評論 1 261
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人牲距。 一個月前我還...
    沈念sama閱讀 45,636評論 2 355
  • 正文 我出身青樓峭火,卻偏偏與公主長得像,于是被迫代替她去往敵國和親烤送。 傳聞我的和親對象是個殘疾皇子寒随,可洞房花燭夜當晚...
    茶點故事閱讀 42,925評論 2 344

推薦閱讀更多精彩內容