PDO基础知识

使用PDO之前首先开启PHP的PDO扩展,方法见百度。

 

PDO连接数据库的方式有三种

1.通过参数的形式连接数据库 (推荐) 

//通过参数形式连接数据库
try{
    $dsn      = 'mysql:host=localhost;dbname=test';
    $username = 'root';
    $passwd   = '';
        $options  = array(PDO::ATTR_PERSISTENT=>TRUE);   //设置属性[可选参数]
    $pdo = new PDO($dsn, $username, $passwd, $options);
    var_dump($pdo);
}catch(PDOException $e){
    echo $e->getMessage();
}
View Code

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

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

首先在配置文件php.ini添加一行 pdo.dsn.test="mysql:localhost;dbname=test"   //test是自定义的数据源名称

$dsn  = 'test';  //配置文件中数据源名称
$username = 'root';
$passwd   = '';
$pdo = new PDO($dsn, $username, $passwd);

 

PDO常用操作

exec()   执行一条sql语句,并返回受影响的行数(只对写数据操作有效,如增删改)

$sql =<<<EOF
  insert into user2 values(1);
EOF;
$result = $pdo->exec($sql);

lastInsertId()   得到最后的自增的ID号

errorCode()      返回上一次操作的错误码 

errorInfo()       返回上一次操作的错误信息

query()           执行查询SQL语句,返回关联+索引的二维数组,但是该方法也可以执行写数据库的SQL,只是不能返回受影响的行数。

prepare()        预处理

execute()        执行一条预处理命令

fetch()            从结果集里获取一行数据

fetchAll()        获取结果集里面的所有数据

   $sql =<<<EOF
  select * from user;
EOF;
    $pre = $pdo->prepare($sql);
    $info = $pre->execute();

    while($row = $pre->fetch(PDO::FETCH_BOTH)){
        var_dump($row);
        echo "<br/>";
    }
    $result = $pre->fetchAll(PDO::FETCH_ASSOC);
View Code

getAttribute()  获取属性

setAttribute()  设置属性

rowCount()     返回查询的行数或者受影响的行数

nextRowset()   将指针移动到下一个结果集 

 

防止SQL注入攻击

quote方法在字符串前面自动加上单引号并转义特殊符号

$pass = "' or 1 = 1 #";
$pass = $pdo->quote($pass);

//return   '\' or 1 = 1 #'

 

预处理语句中的占位符使用

第一种占位符是 :的形式

$sql = " SELECT * FROM user WHERE id = :id AND name = :name ";
$pre = $pdo->prepare($sql);
$pre->execute(array(':id'=>2 , ':name'=>'b'));
$rsult = $pre->rowCount();  //返回查询的行数

第二种占位符是?的形式

$sql = " SELECT * FROM user WHERE id = ? AND name = ? ";
$pre = $pdo->prepare($sql);
$pre->execute(array(2 , 'b'));
$rsult = $pre->rowCount();  //返回查询的行数

 

bindParam()方法绑定参数

:变量占位符方式
$sql = " INSERT INTO user(id, name) VALUES (:id, :name)"; $pre = $pdo->prepare($sql); $pre->bindParam(':id', $id, PDO::PARAM_STR); //绑定参数 $pre->bindParam(':name', $name, PDO::PARAM_STR); //绑定参数 $id = 8; $name = 'cj'; $pre->execute();
?占位符方式
$sql = " INSERT INTO user(id, name) VALUES (?, ?)";
$pre = $pdo->prepare($sql);
$pre->bindParam(1, $id, PDO::PARAM_STR);    //绑定参数
$pre->bindParam(2, $name, PDO::PARAM_STR);  //绑定参数
$id = 9;
$name = 'cj';
$pre->execute();

 

 bindValue() 绑定参数【跟bindParam大同小异】

 

设置PDO三种错误处理模式

$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_SILENT); //默认模式,静默模式  
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING);  //警告模式
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); //异常模式,推荐使用

 

PDO事务处理

事务是把很多SQL语句放在一起执行,如果某条出错,可以回滚到最初始的状态,这样可以保证流程的完整。

//关闭自动提交
setAttribute(PDO::ATTR_AUTOCOMMIT, 0);

rollBack();  //失败就回滚

commit();  //提交

inTransaction();   //检查是否在事务中

//关闭自动提交
$pdo->setAttribute(PDO::ATTR_AUTOCOMMIT, 0);
//开启事务
    $pdo->beginTransaction();
    $sql1 = 'INSERT INTO user VALUES (13, "transaction")';
    $action1 = $pdo->exec($sql1);
    if($action1 == 0){
        echo '插入10失败';
        $pdo->rollBack();  //失败就回滚
    }
    $sql2 = 'INSERT INTO user VALUES (10, "transaction")';
    $action2 = $pdo->exec($sql2);
    if($action2 == 0){
        echo '插入11失败';
        $pdo->rollBack(); //失败就回滚
    }
    //检查是否在事务中
    $position = $pdo->inTransaction();
    $pdo->commit();  //提交
View Code

 

 

 

 

 

 

posted @ 2016-02-16 11:29  钱规则  阅读(187)  评论(0编辑  收藏  举报