<?php
1.什么是PDO( PHP Database Object) //数据库抽象层
项目换数据库的时候,所有相关数据库的代码 和 函数库都需要修改。而使用pdo则会非常省事!!
PDO扩展为PHP访问数据库定义了一个轻量级的、一致性的接口,它提供了一个数据访问抽象层,这样,无论使用什么数据库,都可以通过一致的函数执行查询和获取数据
2.PDO数据库抽象层 原理
3.PDO对象初始化
PDO::__construct ( string $dsn [, string $username [, string $password [, array $driver_options ]]] )
创建一个表示连接到请求数据库的数据库连接 PDO 实例。
// 使用mysqli 实例化对象的时候用 $mysqli = new mysqli("localhost", "root", "user", "boolshop");
说那个PDO
<?php
//当然也可以把这些信息放到文件中
$dsn = 'mysql:dbname=test; host=127.0.0.1';
$user = 'root';
$password = '123456';
try{
//第一种方法 直接使用
$pdo = new PDO($dsn, $user, $password);
//第二种方法 引入外部配置文件
//可以把 mysql:dbname=test; host=127.0.0.1 写进下面的配置文件中,然后引入进来
// $pdo = new PDO("uri:mysqlPdo.ini", $user, $password);
//第三种方法 在php的配置文件中写进mysql:dbname=test; host=127.0.0.1 不过我感觉这样做有点冒险啊
// [PDO]
// pdo.dsn.mysqlpdo = "mysql:dbname=test; host=127.0.0.1"
// 然后$pdo = new PDO('mysqlpdo', $user, $password);
}catch(PDOException $e){
die("连接失败".$e->getMessage());
}
var_dump($pdo);
4.pdo对象应用
1.query($sql) //用于执行查询sql语句,返回PDOStatement对象
2.exec($sql) //用于执行增删改查操作,返回影响行数
3.setAttribute(); //设置一个数据库连接对象属性
4.fetchAll(); //解析数据
1.首先连接数据库
.....
2.然后查询数据库 query 返回的是预处理对象
$sql = "select * from a";
$stmt = $pdo->query($sql);
//括号内加上 PDO::FETCH_ASSOC 表示返回的是关联数组,而不是索引数组了
$list = $stmt->fetchAll(PDO::FETCH_ASSOC);
3.解析数据
foreach ($list as $key => $val) {
echo $val['id']."====".$val['num']."<br />";
}
4.释放资源
$stmt = null;
$pdo = null;
有一个快捷的方式 解析全部数据
$sql = "select id, num from a ";
foreach ($pod->query($sql) as $val) {
echo $val['id']."=====".$val['num']."<br />";
}
一步就可以解决了,这里用到了php的底层原理
5.插入语句
//插入
$sql = "insert into a values('m', 888)";
//删除
$sql = "delete from a where id='m'";
//修改
$sql = "update a set num='999' where id='b'";
//exec() 返回受影响的行数
$res = $pdo->exec($sql);
if ($res) {
echo "OK";
}
<===================================================================================================>
<===================================================================================================>
PDO安全处理 和 异常处理
异常处理、预处理、事务处理
1.异常处理
PDO::ATTR_ERRMODE
1.PDO::ATTR_ERRMODE 不报错 0
2.PDO::ERRMODE_WARNING 以警告的方式报错 1
3.PDO::ERRMODE_EXCEPTION 以异常的方式报错 2
setAttribute()
getAttribute()
1.连接数据库
try{
$pdo = new PDO("mysql:host=locahost; dbname=tese", "root", "123456");
}catch(PDOException $e){
die("连接失败".$e->getMessage());
}
2.报错
$sql = "insert int a values('z', 021)";
$res = $pdo->exec($sql);
if ($res) {
echo "OK";
}else{
echo $pdo->errorCode();
print_r($pdo->errorInfo());
}
3.设置报警级别
$pdo->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_WARNING);
$pdo->setAttribute(PDO::ATTR_ERRMODE,0); //或者是 1 2
//这种方法比较常用
try{
$res = $pdo->exec($sql);
}catch(PDOException $e){
echo $e->getMessage();
}
<===================================================================================================>
2.预处理
先准备好语句,你只要传参数就OK了。防止sql注入
预处理解释把想要执行的sql语句编译成一种模板,然后使用绑定参数取处理。
好处是,sql语句只解析一次,可以对参数绑定一次或者多次执行,提高了性能,节约宽带传输。
另外还可以防止sql注入,安全!
1.prepare() 用于执行查询sql语句,返回PDOStatement对象
2.bindValue() 将值绑定到对应的一个参数,返回bool
3.bindParam() 将参数绑定到响应的查询占位符上,返回bool
4.bindColumn() 用来匹配列名和一个指定的变量名
5.execute() 执行一个准备好的预处理语句,返回bool
6.rowCount() 返回使用增删改查操作语句后受影响的行数
/**
步骤
1.连接数据库
2.写prepare()语句
$sql = 'select * from goods where goodsid=?';
$st = $pdo->perpare($sql);
3.绑定参数
$st->bindValue(1,5);
4.执行
$st->execute();
或者直接跳过绑定
$st = $pdo->perpare('select name, color from goods where id=? and price>?');
$st->extecute(array(20, 1000));
$result = $st->fetchAll();
**/
1.连接数据库(使用try{}catch(){})
try{
$pdo = new PDO("mysql:host=127.0.0.1; dbname=test", "root", "123456");
}catch(PODException $e){
die("连接失败".$e->getMessage());
}
2.写预处理的SQL语句 (这里只是增删改)
增
//第一种预处理方式 使用 ?
$sql = "insert into a(id, num) values(?, ?)";
$stmt = $pdo->prepare($sql);
//第二种预处理方式 使用 别名
$sql = "insert into a(id, num) values(:id, :num)"; //其中 id num 可以随便起名的
/**
2.5 sql语句的查询
$sql = "select id,num from a";
$stmt = $pod->prepare($sql);
//执行
$stmt->execute();
foreach ($stmt as $val) {
echo $v['id']."======".$v['num']."<br />";
}
*/
如果是使用预处理查询的话
$sql = "select id,num from a";
$stmt = $pod->prepare($sql);
//执行
$stmt->execute();
$stmt->bindColumn(1,$id);
$stmt->bindColumn(2,$num); //这里的绑定可以随意绑定 使用? 或者 别名 都可以
while ($row=$stmt->fetch(POD::FETCH_COLUMN)) {
echo "{$id}:{$num}<br />";
}
3.对?进行绑定
//第一种绑定 bindValue() 处理方式是 ?
$stmt->bindValue(1, "x");
$stmt->bindValue(2, 639);
/*
处理方式是 别名
$stmt->bindValue("id", "x");
$stmt->bindValue("num", 639);
*/
//第二种绑定 bindParam()
$stmt->bindParam(1, $id);
$stmt->bindParam(2, $num);
$id = "y";
$num = 25;
/*
处理方式是 别名
$stmt->bindValue("id", $id);
$stmt->bindValue("num", $num);
*/
//第三种绑定方式 bindColumn
$arr = array('n', 899);
//执行的时候
$stmt->execute($arr);
/*
处理方式是 别名
$arr = array('id'=>'n', 'num'=>899);
*/
4.执行
$stmt->execute();
echo $stmt->rowCount();
<===================================================================================================>
3.PDO事务处理 (付款方面使用,一方面增加,一方面少。事务提交 事务回滚)
数据表需要 InnoDB 类型
操作方法
1.beginTransaction() //开启一个事务,做一个回滚点
2.commit() //提交事务
3.rollBack() //事务回滚操作
1.连接数据库
try{
$pdo = new PDO("mysql:host=127.0.0.1;dbname=test", "root", "123456");
$pdo->setAttribute(PDO::STTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
}catch(PDOException $e){
die("数据库连接失败".$e->getMessage());
}
2.执行数据操作
try{
//开启事务
$pdo->beginTransaction();
$sql = "insert into a(id, num) values(?,?)";
$stmt = $pdo->prepare($sql);
//传入参数
$stmt->execute(array('i', 555));
$stmt->execute(array('h', 111));
//提交事务
$pdo->commit();
}catch(PDOException $e){
die("执行操作失败".$e->getMessage());
//回滚事务
$pdo->rollBack();
}
如果不同try{}catch(){} 来操作的话,利用 if 判断
//开启事务
$pdo->beginTransaction();
$sql = "insert into a('id', 'num') values(?, ?)";
//预处理准备
$stmt = $pso->prepare($sql);
//预处理赋值
$arr = array(
array('u', 15),
array('v', 58),
array('w', 98)
);
//立一个标志.判断时候执行成功
$flag = true;
//执行预处理(使用foreach循环)
foreach ($arr as $v) {
$stmt->execute($v);
//判断是否出错.通过报错码
if ($stmt->errorCode()>0) {
//回滚事务
$pdo->rollBack();
$flag = false;
break;
}
}
if ($flag) {
//提交事务
$pdo->commit();
}
PDO基本概念
最新推荐文章于 2021-04-04 12:38:52 发布