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