PDO基本概念

<?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();
		}
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值