学习教程来源于:
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操作