您的位置:首页 > 数据库

【笔记】PDO数据库抽象层学习笔记(不断更新中....)

2015-09-02 17:52 387 查看
<该文章版权归imooc的Mr.King老师所有>

在学习PDO数据库抽象层的视频的时候,整理Mr.King老师的视频笔记如下,算是一个学习记录,如果对此感兴趣的同学请移步至imooc网站上自行查看学习该系列视频=> http://www.imooc.com/learn/164
----------------------------------------------------我是笔记的分割线---------------------------------------------------------

什么是PDO?

PDO(PHP Data Object),数据库访问抽象层,统一各种数据库的访问接口。

为什么要使用PDO?

PHP支持市面上所有的数据库。PHP对数据库的支撑不好。应用程序之间难以维护。抽象度不够,访问接口不通一。让PHP对多种数据库比较艰难。重新编写跟数据库相关的函数。PDO出现了,可以让代码变得更简洁。无论使用哪一种数据库都可以。

PDO有什么优点?

编码一致性。

灵活性。

高性能。PDO使用C语言编写的。

面向对象特性。PDO利用PHP5面向对象的特性。

PDO安装与配置

1. 配置PHP配置文件,开启相应扩展

extension=php_pdo.so

2. 开启对相应数据库的扩展(以MySQL为例)

extension=php_pdo_mysql.so

3. 通过查看phpinfo可以看到PDO扩展的详细信息

PDO连接数据库

1. 通过参数的形式连接数据库

2. 通过URI形式连接数据库

3. 通过配置文件形式连接数据库

通过参数的形式连接数据库(推荐这种形式)

<span style="font-size:14px;"><?php      
    try{  
        $dsn='mysql:host=localhost;dbname=imooc';  
        $username='root';  
        $passwd='root';  
        $pdo=new PDO($dsn,$username,$passwd);  
    }catch(PDOException $e){  
        echo $e->getMessage();  
    }  </span>


通过URI形式连接数据库

<span style="font-size:14px;"><?php  
    try{  
      
        $dsn='uri:/var/www/html/dsn.txt'; //windows: $dsn='uri:file://G:\phpdev\apache\htdocs\pdo\dsn.txt';  
        $username='root';    
            $passwd='root';    
         $pdo=new PDO($dsn,$username,$passwd);    
        var_dump($pdo);  
    }catch(PDOException $e){  
        echo $e->getMessage();  
    }  
      
    ?>  </span>


dsn.txt

<span style="font-size:14px;">mysql:dbname=imooc;host=localhost </span>


通过配置文件的形式连接数据库

修改php.ini文件,在php.ini文件里任意一个位置加入以下这行:

<span style="font-size:14px;">pdo.dsn.imooc="mysql:host=localhost;dbname=imooc"</span>
修改完后重启apache

代码

<span style="font-size:14px;"><?php

try{
    $dsn='imooc';        //数据库名字
    $username='root';  
    $passwd='root';  
    $pdo=new PDO($dsn,$username,$passwd);  
    var_dump($pdo);
}catch(PDOException $e){
    echo $e->getMessage();
}
?>
<?php

try{
    $dsn='imooc';        //数据库名字
    $username='root';  
    $passwd='root';  
    $pdo=new PDO($dsn,$username,$passwd);  
    var_dump($pdo);
}catch(PDOException $e){
    echo $e->getMessage();
}
?>
</span>


PDO对象的方法

exec() 执行一条SQL语句,并返回其受影响的行数

query() 执行一条SQL语句,返回一个PDOStatement对象

prepare() 准备要执行的SQL语句,返回PDOStatement对象

quote() 返回一个添加引号的字符串,用于SQL语句中

lastInsertId() 返回最后插入行的ID

setAttribute() 设置数据库连接属性

getAttribute() 得到数据库连接的属性

errorCode() 获取跟数据库句柄上一次操作相关的SQLSTATE

errorInfo() 获取跟数据库句柄上一次操作的错误信息

创建表以及插入一条数据

<span style="font-size:14px;"><?php
try{
    $pdo=new PDO('mysql:host=localhost;dbname=imooc','root','root');
    //exec() 执行一条SQL语句,并返回其受影响的行数, 如果没有受影响的记录,他返回0
    //exec()对于select没有作用
    $sql=<<<EOF
    CREATE TABLE IF NOT EXISTS 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);
    
    $sql='INSERT user(username,password,email) VALUES("king","'.md5('king').'","imooc@qq.com")';
    $res=$pdo->exec();
    echo $res;    

}catch(PDOException $e){  
    echo $e->getMessage();  
}  

?></span>


插入多条数据:

<span style="font-size:14px;"><?php
try{
    $pdo=new PDO('mysql:host=localhost;dbname=imooc','root','root');
    //exec() 执行一条SQL语句,并返回其受影响的行数, 如果没有受影响的记录,他返回0
    //exec()对于select没有作用
    $sql=<<<EOF
    INSERT user(username,password,email) VALUES("king1","king1","imooc1@qq.com"),
("king2","king2","imooc2@qq.com"),
("king3","king3","imooc3@qq.com")
    EOF;
    $res=$pdo->exec($sql);
    var_dump($res);                      //output: 3 意味3条记录插入成功
    
}catch(PDOException $e){  
    echo $e->getMessage();  
}  

?></span>


返回最后插入一行的ID号:

<span style="font-size:14px;"><?php
try{
    $pdo=new PDO('mysql:host=localhost;dbname=imooc','root','root');
    //exec() 执行一条SQL语句,并返回其受影响的行数, 如果没有受影响的记录,他返回0
    //exec()对于select没有作用
    $sql=‘INSERT user(username,password,email) VALUES("king1","king1","imooc1@qq.com")’;
    $res=$pdo->exec($sql);
    echo 'affected row count:'.$res;
    //$pdo->lastInsertId(); 得到新插入记录的ID号
    echo 'last inserted id:'.$pdo->lastInsertId();
}catch(PDOException $e){  
    echo $e->getMessage();  
}  

?></span>


更新和删除:

<span style="font-size:14px;"><?php
try{
    $pdo=new PDO('mysql:host=localhost;dbname=imooc','root','root');
    $sql=‘UPDATE user set username = "imooc" where id = 1’;
    $res=$pdo->exec($sql);
    
}catch(PDOException $e){  
    echo $e->getMessage();  
}  

?></span>


<span style="font-size:14px;"><?php
try{
    $pdo=new PDO('mysql:host=localhost;dbname=imooc','root','root');
    $sql=‘DELETE user where id = 3’;
    $res=$pdo->exec($sql);
    echo 'affected row count:'.$res;
    //$pdo->lastInsertId(); 得到新插入记录的ID号
    echo 'last inserted id:'.$pdo->lastInsertId();
    
}catch(PDOException $e){  
    echo $e->getMessage();  
}  

?></span>


查询:

<span style="font-size:14px;"><?php
try{
    $pdo=new PDO('mysql:host=localhost;dbname=imooc','root','root');
    $sql=‘select * from user where id=2’;
    
    //$pdo->query($sql),执行SQL语句,返回PDOStatement对象
    $stmt=$pdo->query($sql);
    //var_dump($stmt);
    //loop print this statement
    foreach($stmt as $row){
        print_r($row);
    }

}catch(PDOException $e){  
    echo $e->getMessage();  
}  

?></span>


PDOStatement对象的方法

execute() 执行一条预处理语句

rowCount() 返回上一个SQL语句影响的行数

fetch() 从结果集中获取一行

fetchAll() 返回一个包含结果集中所有行的数组

setFetchModel() 为语句设置默认的获取模式

fetchColumn() 从结果集中的下一行返回单独的一列

fetchObject() 获取下一行并作为一个对象返回

bindParam() 绑定一个参数到指定的变量名

bindValue() 把一个值绑定到一个参数

设置数据库连接属性

<span style="font-size:14px;"><?php
try{
    $pdo=new PDO('mysql:host=localhost;dbname=imooc','root','root');
    echo '自动提交'.$pdo->getAttribute(PDO::ATTR_AUTOCOMMIT);
    echo '<br/>';
    echo ‘PDO默认的错误处理模式:’.$pdo->getAttribute(PDO::ATTR_ERRMODE);
    $pdo->setAttribute(PDO::ATTR_AUTOCOMMIT,0);
    echo '自动提交'.$pdo->getAttribute(PDO::ATTR_AUTOCOMMIT);
}catch(PDOException $e){  
    echo $e->getMessage();  
}  
?></span>


bindParam() 绑定一个参数到指定的变量名

<span style="font-size:14px;"><?php
try{
    $pdo=new PDO('mysql:host=localhost;dbname=imooc','root','root');
    $sql = "insert user(username, password, email) VALUES (:username, :password, :email)";
    $stmt = $pdo->prepare($sql);
    $stmt->bindParam(":username",$username, PDO::PARAM_STR);
    $stmt->bindParam(":password",$password, PDO::PARAM_STR);
    $stmt->bindParam(":email",$email);

    $username="imooc";
    $password="imooc";
    $email="imooc@imooc.com";
    $stmt->execute();

    echo $stmt->rowCount(); //返回受影响的行数
}catch(PDOException $e){  
    echo $e->getMessage();  
}  
?></span>


<span style="font-size:14px;"><?php
try{
    $pdo=new PDO('mysql:host=localhost;dbname=imooc','root','root');
    $sql = "insert user(username, password, email) VALUES (?,?,?)";
    $stmt = $pdo->prepare($sql);
    $stmt->bindParam(1,$username);
    $stmt->bindParam(2,$password);
    $stmt->bindParam(3,$email);

    $username="imooc";
    $password="imooc";
    $email="imooc@imooc.com";
    $stmt->execute();

    echo $stmt->rowCount(); //return affected row

}catch(PDOException $e){  
    echo $e->getMessage();  
}  
?></span>


<span style="font-size:14px;"><?php
try{
    $pdo=new PDO('mysql:host=localhost;dbname=imooc','root','root');
    //$sql = "delete from user where username = :username and password = :password";
    $sql = "delete from user where id <: id ";
    $stmt = $pdo->prepare($sql);
    $stmt->bindParam(":id",$id, PDO::PARAM_INT);
    $id=10;
    $stmt->execute();

    echo $stmt->rowCount(); //return affected rows count

}catch(PDOException $e){  
    echo $e->getMessage();  
}  
?></span>


bindValue() 把一个值绑定到一个参数

写法一:

<span style="font-size:14px;"><?php

try{

    $pdo=new PDO('mysql:host=localhost;dbname=imooc','root','root');
    $sql = 'insert user(username, password, email) VALUES(?,?,?) ';
    $stmt=$pdo->prepare($sql);
    $username='imooc';
    $password='imooc';
    $email='imooc@imooc.com';
    $stmt->bindValue(1,$username);
    $stmt->bindValue(2,$password);
    $stmt->bindValue(3,$email);
    $stmt->execute();
    echo $stmt->rowCount();
    
}catch(PDOException $e){

    echo $e->getMessage();
}

?></span>


写法二:

<span style="font-size:14px;"><?php

try{

    $pdo=new PDO('mysql:host=localhost;dbname=imooc','root','root');
    $sql = 'insert user(username, password, email) VALUES(:username,:password,:email) ';
    $stmt=$pdo->prepare($sql);
    $username='imooc';
    $password='imooc';
    $email='imooc@imooc.com';
    $stmt->bindValue(':username',$username);
    $stmt->bindValue(':password',$password);
    $stmt->bindValue(':email',$email);
    $stmt->execute();
    echo $stmt->rowCount();
    
}catch(PDOException $e){

    echo $e->getMessage();
}

?></span>


PDOStatement对象的方法

PDO函数 说明

bindColumn() 绑定一列到一个PHP变量

getColumnMeta() 返回结果集中一列的元数据

columnCount() 返回结果集中的列数

setAttribute() 设置一个语句属性

getAttribute() 检索一个语句属性

errorCode() 获取跟上一次语句句柄操作相关的SQLSTATE

errorInfo() 获取跟上一次语句句柄操作相关的扩展错误信息

debugDumpParam() 打印一条SQL预处理命令

nextRowset() 在一个多行集语句句柄中推进到下一个行集

bindColumn() 绑定一列到一个PHP变量

<span style="font-size:14px;"><?php

header('content-type:text/html;charset=utf-8');

try{

    $pdo=new PDO('mysql:host=localhost;dbname=imooc','root','root');
    $sql = 'select username, password, email from user';
    $stmt=$pdo->prepare($sql);
    $stmt->execute();
    echo "how many columns in result? ".$stmt->columnCount(); //under development
    echo '<hr/>';
    print_r($stmt->getColumnMeta(0)); //under development
    $stmt->bindColumn(1,$username);
    $stmt->bindColumn(2,$password);
    $stmt->bindColumn(3,$email);
    while($stmt->fetch(PDO::FETCH_BOUND)){
        echo 'username: ' . $username . 'password: ' . $password .'email: '. $email.'<hr/>';
    }    
    
}catch(PDOException $e){

    echo $e->getMessage();
}

?></span>


<span style="font-size:14px;"><?php

header('content-type:text/html;charset=utf-8');

try{

    $pdo=new PDO('mysql:host=localhost;dbname=imooc','root','root');
    $sql = 'select username, password, email from user';
    $stmt=$pdo->query($sql);
    $stmt->fetchColumn(0),'<br/>'; //第一行的第一列
    $stmt->fetchColumn(1),'<br/>'; //第二行的第二列(当执行完一次指针下移,无法继续取得第一行的第二列,此时在fetchColumn中,第二行为第一行)
    $stmt->fetchColumn(2),'<br/>'; //第三行的第三列(同上,指针下移,第三行为第一行)

}catch(PDOException $e){

    echo $e->getMessage();
}

?></span>


debugDumpParam() 打印一条SQL预处理命令

写法一:

<span style="font-size:14px;"><?php

try{

    $pdo=new PDO('mysql:host=localhost;dbname=imooc','root','root');
    $sql='INSERT user(username,password,email) VALUES(?,?,?);';
    $stmt->$pdo->prepare($sql);
    $stmt->bindParam(1,$username,PDO::PARAM_STR);
    $stmt->bindParam(2,$password,PDO::PARAM_STR);
    $stmt->bindParam(3,$email,PDO::PARAM_STR);
    $username='testParam';
    $password='testParam';
    $email='testParam@imooc.com';
    $stmt->execute();
    $stmt->debugDumpParams();

}catch(PDOException $e){

    echo $e->getMessage();
}

?>
</span>


写法二:

<span style="font-size:14px;"><?php

try{

    $pdo=new PDO('mysql:host=localhost;dbname=imooc','root','root');
    $sql='select * 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);
    $username='testParam';
    $password='testParam';
    $stmt->execute();
    $stmt->debugDumpParams();

}catch(PDOException $e){

    echo $e->getMessage();
}

?>

</span>


PDO错误处理模式

<span style="font-size:14px;"><?php

/*
PDO::ERRMODE_SLIENT:默认模式
PDO::ERRMODE_WARNING:警告模式
PDO::ERRMODE_EXCEPTION:异常模式
*/

try{

    $pdo=new PDO('mysql:host=localhost;dbname=imooc','root','root');
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING);
    $sql = 'select * from noneTable'; //没有这个表格
    $pdo->query($sql);
    echo $pdo->errorCode(); //sqlstate error code
    echo '<br/>';
    print_r($pdo->errorInfo()); //错误信息以数组的形式打印出来
    

}catch(PDOException $e){

    echo $e->getMessage();
}

?></span>


PDO对象的方法

方法 描述

beginTransaction() 启动一个事务

commit() 提交一个事务

rollBack() 回滚一个事务

inTransaction() 检测是否在一个事务内

事务:把很多事情当作一件事情做,要么都成功,要么都失败

ACIP:

原子型

一致性

完整性

持久性
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: