PHP教程学习11:PDO

学习教程来源于:
PHP中文网教程 PDO操作
PHP官网PHP手册(简体中文)链接

ADODB 是 Active Data Objects Data Base 的简称,它是一种 PHP 存取数据库的中间函式组件。
虽然 PHP 是建构 Web 系统强有力的工具,但是 PHP 存取数据库的功能,一直未能标准化,每一种数据库,都使用另一种不同且不兼容的应用程序接口(API)。为了填补这个缺憾,因此才有 ADODB 的出现。一旦存取数据库的接口予以标准化,就能隐藏各种数据库的差异,若欲转换至其它不同的数据库,将变得十分容易。–百度百科

PDO数据统一接口
PHP Data Object:PHP数据对象
为所有数据库类型提供统一访问接口
原生支持预处理,防止SQL注入
是PHP未来数据操作的发展趋势

SQL注入,就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。具体来说,它是利用现有应用程序,将(恶意的)SQL命令注入到后台数据库引擎执行的能力,它可以通过在Web表单中输入(恶意)SQL语句得到一个存在安全漏洞的网站上的数据库,而不是按照设计者意图去执行SQL语句。比如先前的很多影视网站泄露VIP会员密码大多就是通过WEB表单递交查询字符暴出的,这类表单特别容易受到SQL注入式攻击.–百度百科

操作步骤:
1.创建数据源与PDO对象,完成特定数据库的链接
2.调用PDO对象方法完成增删改查操作
3.对产生的错误或异常进行处理

数据库连接:
链接三要素:数据源、用户名、密码

<?php  
$dbType = 'mysql';	//设置数据库类型
$host = 'localhost';//设置主机名称
$dbName = 'edu';	//设置数据库名称
$userName = 'root';	//设置数据库用户名
$password = 'root';	//设置数据库用户名密码
$dsn = "{$dbType}:host={$host};dbName={$dbName}";//设置数据源
try{
	$pdo = new PDO($dsn,$userName,$password);//链接数据库创建PDO对象
} catch(PDOException $e){//捕获异常并处理
	die('操作失败'.$e->getMessage());
}
?>
添加数据

INSERT语句
PDO::exec()方法:返回受影响记录数
PDO::lastInsertId():获取新增主键id

<?php  
$sql = "INSERT student(字段列表) VALUES (新记录字段值列表)";
$num = $pdo->exec($sql);//使用exec方法执行查询,返回受影响的行数
$insertId = $pdo->lastInsertId();//获取新增主键id
if($num > 0){
	print '成功添加了'.$num.'条记录,新增主键id是:'.$insertId;
}
?>
更新操作

UPDATE语句
PDO::exec()方法:返回影响记录数

<?php  
$sql = "UPDATE student SET course='php',grade=99 WHERE id=8";
$num = $pdo->exec($sql);//使用exec方法执行查询,返回收影响的行数
if($num>0){
	echo '成功更新了'.$num.'条记录';
}
?>
删除操作

DELETE语句
PDO::exec()方法:返回影响记录数

<?php  
$sql = "DELETE FROM `student` WHERE `id`=4";
$num = $pdo->exec($sql);//使用exec方法执行查询,返回收影响的行数
if($num>0){
	echo '成功删除了'.$num.'条记录';
}

?>
查询操作

SELECT语句
结果集用PDO::query(SQL语句)来获取
查询结果放在PDOStatement对象
setFetchMode(PDO::FETCH_ASSOC):读取模式
PDOStatement::fetch()解析结果集
查询单条记录:$result->fetch()
获取所有记录:$result->fetchAll()
直接遍历结果集:foreach($result as $row){}
将结果映射到对象再遍历:类名与表名一致,属性与字段名一致,通过__get()魔术方法来实现查询

使用fetch()方法逐条遍历
<?php  
$sql = "SELECT id,name,course,grade FROM student WHERE grade > 80";
$result = $pdo->query($sql);
if($result && $result->rowCount()){
	echo '<h2 align="center">成绩大于80</h2>';
	echo '<table border="1" celllpadding="5" cellspacing="0" width="70%" align="center">';
	echo '<tr bgcolor="#87ceeb"><th>id</th><th>姓名</th><th>课程</th><th>成绩</th></tr>';
	$result->setFetchMode(PDO::FETCH_ASSOC);
	while($row = $result->fetch()){
		echo '<tr align="center">';
		echo '<td>'.$row['id'].'</td><td>'.$row['name'].'</td><td>'.$row['course'].'</td><td>'.$row['grade'].'</td>';
		echo '</tr>';
	}
	echo '</table>';
	echo '<h3 align="center">共有'.$result->rowCount().'条记录</h3>';
} else {
	echo '查询失败~~';
}
?>

###### 使用fetchAll()获取整个结果集
<?php  
$sql = "SELECT id,name,course,grade FROM student WHERE grade > 60";
$result = $pdo->query($sql);
if($result && $result->rowCount()){
	echo '<h2 align="center">成绩大于80</h2>';
	echo '<table border="1" celllpadding="5" cellspacing="0" width="70%" align="center">';
	echo '<tr bgcolor="#87ceeb"><th>id</th><th>姓名</th><th>课程</th><th>成绩</th></tr>';
	$result->setFetchMode(PDO::FETCH_ASSOC);
	$rows = $result->fetchAll();	//一次性的将结果集转为二维数组
	foreach($rows as $row){
		echo '<tr align="center">';
		echo '<td>'.$row['id'].'</td><td>'.$row['name'].'</td><td>'.$row['course'].'</td><td>'.$row['grade'].'</td>';
		echo '</tr>';
	}
	echo '</table>';
	echo '<h3 align="center">共有'.$result->rowCount().'条记录</h3>';
} else {
	echo '更新失败~~';
}
?>

###### 使用模型映射处理结果集
<?php  
require 'pdoConfig.php';
class Student
{
	private $id;	
	private $name;
	private $email;
	private $course;
	private $grade;	
	private $create_time;
	private $update_time;

	public function __get($propertyName){
		return $this->$propertyName;
	}

}
try{
	$pdo = new PDO($dsn, $userName, $password);
	$sql = "SELECT id,name,course,grade FROM student WHERE grade > 0";
	$result = $pdo->query($sql);
	if($result && $result->rowCount()){
		echo '<h2 align="center">成绩大于0</h2>';
		echo '<table border="1" celllpadding="5" cellspacing="0" width="70%" align="center">';
		echo '<tr bgcolor="#87ceeb"><th>id</th><th>姓名</th><th>课程</th><th>成绩</th></tr>';
		$result->setFetchMode(PDO::FETCH_CLASS,'Student');
		$rows = $result->fetchAll();	//一次性的将结果集转为二维数组
		foreach($rows as $row){
			echo '<tr align="center">';
			echo '<td>'.$row->id.'</td><td>'.$row->name.'</td><td>'.$row->course.'</td><td>'.$row->grade.'</td>';
			echo '</tr>';
		}
		echo '</table>';
		echo '<h3 align="center">共有'.$result->rowCount().'条记录</h3>';
		// print_r($row); 
	} else {
		echo '更新失败~~';
	}
}catch(PDOException $e) {
	die('操作失败'.$e->getMessage());
}

?>
直接操作结果集,跳过解析
<?php 
require 'pdoConfig.php';
try{
	$pdo = new PDO($dsn, $userName, $password);
	$sql = "SELECT id,name,course,grade FROM student WHERE grade > 60";
	$result = $pdo->query($sql);
	if($result && $result->rowCount()){
		echo '<h2 align="center">成绩大于80</h2>';
		echo '<table border="1" celllpadding="5" cellspacing="0" width="70%" align="center">';
		echo '<tr bgcolor="#87ceeb"><th>id</th><th>姓名</th><th>课程</th><th>成绩</th></tr>';
		$result->setFetchMode(PDO::FETCH_ASSOC);
		//跳过解析,直接使用
		foreach($result as $row){
			echo '<tr align="center">';
			echo '<td>'.$row['id'].'</td><td>'.$row['name'].'</td><td>'.$row['course'].'</td><td>'.$row['grade'].'</td>';
			echo '</tr>';
		}
		echo '</table>';
		echo '<h3 align="center">共有'.$result->rowCount().'条记录</h3>';
	} else {
		echo '更新失败~~';
	}
}catch(PDOException $e) {
	die('操作失败'.$e->getMessage());
}
?>
预处理

将动态数据与静态SQL语句进行分离
SQL语句中用占位符":字段名",或者"?"
PDO::prepare()准备预处理语句
execute([真实替换数据])执行预处理语句

<?php 
require 'pdoConfig.php';
try{
	$pdo = new PDO($dsn, $userName, $password);
	$updateTime = time();
	$sql = "UPDATE student  SET grade=:grade,course=:course,update_time=:update_time WHERE id=9";
	$stmt = $pdo->prepare($sql);
	$num = $stmt->execute([':course'=>'php',':grade'=>80,':update_time'=>$updateTime]);
		if ($num > 0 ) {
		echo '更新了'.$num.'条记录';
	} else {
		echo '更新失败~~';
	}

}catch(PDOException $e) {
	die('操作失败'.$e->getMessage());
}
?>
总结

PDO数据库抽象层
PDO的安全性是最高的,也是最安全的方式
几乎所有的主流框架只支持PDO操作

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值