将心比心,方得人心~

PDO准备语句及事务

周洲 2017-04-06 20:51:14

一.准备语句

优点:

1:在服务器上缓存查询的语句和执行过程,节省不必要的开销,2:变量被自动转义,防止sql注入等攻击

<?php

//try {
//    $_drive_opt = array(
//        PDO::MYSQL_ATTR_INIT_COMMAND=>'SET NAMES UTF8'
//    );
//    $_pdo = new PDO('mysql:host=localhost;dbname=thinkphp','root','',$_drive_opt);
//    $_pdo->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_WARNING);
//} catch (PDOException  $e) {
//    exit('数据库链接错误:'.$e->getMessage());
//}

//使用prepare()和execute()方法增删改查
//新增
//$_sql = "INSERT INTO think_user (user,email) VALUES ('悟空','wukong@163.com')";
//$_stmt = $_pdo->prepare($_sql);
//$_stmt->execute();

//简写:
//$_sql = "INSERT INTO think_user (user,email) VALUES ('悟空','wukong@163.com')";
//$_pdo->prepare($_sql)->execute();




//获取当前新增数据的id
//echo '新增数据ID:'.$_pdo->lastInsertId();



//修改
//$_sql = "UPDATE think_user SET user='八戒' WHERE id=1";
//$_pdo->prepare($_sql)->execute();

//获取影响的行数
//$_sql = "UPDATE think_user SET user='悟空' WHERE id=1";
//$_stmt = $_pdo->prepare($_sql);
//$_stmt->execute();
//
//echo '影响了:'.$_stmt->rowCount();


//通过影响的行数判断数据库操作是否执行成功
//$_sql = "UPDATE think_user SET user='唐僧' WHERE id=1";
//$_stmt = $_pdo->prepare($_sql);
//$_stmt->execute();
//
//if ($_stmt->rowCount()) {
//    echo '修改成功!';
//} else {
//    echo '修改失败!';
//}


//获取数据,使用$_stmt->fetchAll()遍历结果集
//$_sql = "SELECT user,email FROM think_user";
//$_stmt = $_pdo->prepare($_sql);
//$_stmt->execute();
//print_r($_stmt->fetchAll());
//print_r($_stmt->fetch());


//设置显示方式
//方式1:
//$_sql = "SELECT user,email FROM think_user";
//$_stmt = $_pdo->prepare($_sql);
//$_stmt->execute();
//print_r($_stmt->fetch(PDO::FETCH_ASSOC));

//方式2:
//$_sql = "SELECT user,email FROM think_user";
//$_stmt = $_pdo->prepare($_sql);
//$_stmt->execute();
//$_stmt->setFetchMode(PDO::FETCH_ASSOC);
//print_r($_stmt->fetch());

//方式3:
//$_sql = "SELECT user,email FROM think_user";
//$_stmt = $_pdo->prepare($_sql);
//$_stmt->execute();
//print_r($_stmt->fetchObject());


//循环
//$_sql = "SELECT user,email FROM think_user";
//$_stmt = $_pdo->prepare($_sql);
//$_stmt->execute();
//while (!!$_row = $_stmt->fetchObject()) {
//    //print_r($_row);
//    echo $_row->user;
//    echo '<br />';
//}


//多条语句的操作
//索引方式,问号与数组必须一一对应,顺序不能
//$_sql = "INSERT INTO think_user (user,email) VALUES (?,?)";
//$_stmt = $_pdo->prepare($_sql);
//$_stmt->execute(array('沙僧','shaseng@163.com'));
//$_stmt->execute(array('白龙马','longma@163.com'));

//关联方式变,不用一一对应
//$_sql = "INSERT INTO think_user (user,email) VALUES (:user,:email)";
//$_stmt = $_pdo->prepare($_sql);
//$_stmt->execute(array(':email'=>'wukong@163.com',':user'=>'悟空'));
//$_stmt->execute(array(':user'=>'唐僧',':email'=>'tangseng@163.com'));

//问号结合绑定参数方式 必须先赋值到变量
//$_sql = "INSERT INTO think_user (user,email) VALUES (?,?)";
//$_stmt = $_pdo->prepare($_sql);
//$user = '悟空';
//$email = 'wukong@163.com';
//$_stmt->bindParam(1,$user);
//$_stmt->bindParam(2,$email);
//$_stmt->execute();
//$user = '悟空';
//$email = 'wukong@163.com';
//$_stmt->bindParam(1,$user);
//$_stmt->bindParam(2,$email);
//$_stmt->execute();


//冒号结合绑定参数方式 必须先赋值到变量
//$_sql = "INSERT INTO think_user (user,email) VALUES (:user,:email)";
//$_stmt = $_pdo->prepare($_sql);
//$user = '悟空';
//$email = 'wukong@163.com';
//$_stmt->bindParam(':user',$user);
//$_stmt->bindParam(':email',$email);
//$_stmt->execute();
//$user = '悟空';
//$email = 'wukong@163.com';
//$_stmt->bindParam(':user',$user);
//$_stmt->bindParam(':email',$email);
//$_stmt->execute();

二.事务处理

1.所谓事务,就是一组SQL关联的操作,如果其中一条sql有误没有执行,其他的sql语句都会撤销执行

2.mysql数据库类型为InnoDB方可启用事务处理

3.有3个PD方法可以完成事务处理:beginTransaction()、commit()、rollback()

4.数据库连接需要用异常模式PDO::ERRMODE_EXCEPTION

<?php
try {
    $_drive_opt = array(
        PDO::MYSQL_ATTR_INIT_COMMAND=>'SET NAMES UTF8'
    );
    $_pdo = new PDO('mysql:host=localhost;dbname=thinkphp','root','',$_drive_opt);
    $_pdo->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
} catch (PDOException  $e) {
    exit('数据库链接错误:'.$e->getMessage());
}

try{
    //开启事务处理
    $_pdo->beginTransaction();

    $_sql = "UPDATE think_user SET count=count-50 WHERE id=15";
    $_pdo->prepare($_sql)->execute();

    $_sql = "UPDATE think_user SET count=count+50 WHERE id=16";
    $_pdo->prepare($_sql)->execute();

    //成功之后提交
    $_pdo->commit();

} catch(PDOException $e) {
    echo $e->getMessage();
    //回滚,撤销刚才所有的SQL操作
    $_pdo->rollBack();
}


打赏

『微信打赏』

Tag标签php 

上一篇: 错误与异常处理

下一篇: php数据库连接-PDO

我是有底线的