一.准备语句
优点:
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(); }