使用PDO (PDO即PHP数据对象PHP Data Object) 连接数据库。
PDO提供了一个【数据访问】抽象层,这意味着不管使用哪种数据库, 都可以用相同的函数(方法)来查询和获取数据。
单例模板:
test.php
文件
<?php
// PDO 连接数据库,单例模板
class SingletonPDO {
private static $pdo = null;
public static function getPDO() {
if (self::$pdo == null) {
try {
self::$pdo = new PDO('mysql:host=localhost; dbname=logintext', 'root', '123456');
}catch(PDOException $err) {
echo "错误信息:".$err.getMessage();
}
}
return self::$pdo;
}
}
再使用时只需要创建一个新php
文件引入上面的test.php
文件
使用PDO
实现数据的增、删、改、查:
添加数据:
<?php
// 引入文件
require_once 'test.php';
// 创建对象
$pdo = SingletonPDO::getPDO();
// 辅助操作
$pdo->exec("set names utf8");
// 添加数据
$sql = "insert into userinfo values('libingbing', '8888')";
// 判断是否添加成功
if ($pdo->exec($sql)) {
echo "yes";
}else {
echo "no";
}
删除数据:
<?php
require_once 'test.php';
$pdo = SingletonPDO::getPDO();
$pdo->exec("set names utf8");
// 删除数据
$sql = "delete from userinfo where username='libingbing'";
if ($pdo->exec($sql)) {
echo "yes";
}else {
echo "no";
}
修改数据:
<?php
require_once 'test.php';
$pdo = SingletonPDO::getPDO();
$pdo->exec("set names utf8");
// 修改 libingbing 的密码为123456
$sql = "update userinfo set password='123456' where username='libingbing'";
if ($pdo->exec($sql)) {
echo "yes";
}else {
echo "no";
}
讨论PDO
查询数据前先看一个PDO的预处理prepare
:
预处理语句prepare
是pdo提供的一种db操作方式。其语言逻辑与正常的pdo访问相同。但区别在于prepare语句允许用户在【设置sql语句】与【执行sql语句】之间部分进行参数的注入与提取操作,而不是像正常的pdo访问一样直接将参数写死。
预处理中包含以下几种方法可供使用:
prepare()
方法:prepare()方法为预处理sql语句的方法,能够让pdo预先处理【半成品的】sql语句。并生成一个PDOStatementObject类型的结果execute()
方法:execute()方法是提供给PDOSO类型对象去执行的【成品】sql语句的方法。并生成一个PDOStatementObject类型的结果
使用以上两种方法时:
- 交由pdo去prepare预处理的【半成品】sql语句,使用?问号作为占位符,表示待传参的参数
- prepare预处理必须只能处理【半成品】sql语句,如果是完整则需要使用exec方法执行
- execute()方法允许一个数组作为参数,将参数带入到预处理的sql语句中,并且会将结果存放到PDOSO对象中。
- PDOSO对象在预处理的不同阶段有着不同的含义!!不可混淆,必须根据上下文判断。
bindValue()
方法:bindValue()方法是提供给pdo预处理之后得到的PDOSO对象使用的方法,用来给【半成品】的sql语句进行传值
语法:$pdoso->bindValue(index,value); index代表第几个参数。bindColumn()
方法:bindColumn()方法允许将执行结果的一列数据绑定到一个指定对象上,本方法需要在execute()方法执行结束后在执行。
语法:$pdoso->bindColumn(index,指定变量); index代表第几列,指定变量用来接收该列的所有值。
形象的概括就是:
- 正常
PDO
直接访问:
设置sql语句 -> 执行sql语句 - 预处理访问
设置sql语句 -> 预处理sql语句 -> 处理sql语句中参数 -> 执行sql语句
接下来使用预处理来实现增、删、改:
添加数据:
<?php
require_once 'test.php';
$pdo = SingletonPDO::getPDO();
$pdo->exec("set names utf8");
$sql = "insert into userinfo values(?, ?)";
// 此时的 $pdoso 是一个半成品
$pdoso = $pdo->prepare($sql);
$result = $pdoso->execute(['fanbingbing', '8888']);
if($result) {
echo "yes";
}else {
echo "no";
}
在为?
添加数据时,可以使用bindValue()
方法代替execute()
方法中的参数来绑定值:
<?php
require_once 'test.php';
$pdo = SingletonPDO::getPDO();
$pdo->exec("set names utf8");
$sql = "insert into userinfo values(?, ?)";
// 此时的 $pdoso 是一个半成品
$pdoso = $pdo->prepare($sql);
$pdoso->bindValue(1, 'xiaohong');
$pdoso->bindValue(2, '123456');
$result = $pdoso->execute();
if($result) {
echo "yes";
}else {
echo "no";
}
接下来完成查询数据的操作:
<?php
require_once 'test.php';
$pdo = SingletonPDO::getPDO();
$pdo->exec("set names utf8");
$sql = "select * from userinfo where 1";
$pdoso = $pdo->prepare($sql);
$pdoso->execute();
$pdoso->bindColumn(1, $username);
$pdoso->bindColumn(2, $password);
$info = [];
for($i = 0; $row = $pdoso->fetch(PDO::FETCH_COLUMN); $i++) {
$info[$i] = ["username"=>$username, "password"=>$password];
}
echo "<pre>";
print_r($info);
PDO事务处理transaction
:
有些时候我们每次的事务中不是简单的每次都只有一个事件,事件实际上就是预处理语句执行的execute语句。
注意:
-
整个事务操作必须放到
try...catch
中,这是因为我们并不能保证执行的事件一定成功。
而对于整个事务而言,任何一个事件的失败都会导致catch的触发。
而catch
触发就意味着必须将之前做出的所有的操作都必须还原
回滚操作:$pdo->rollBack()
。 -
操作语句必须在事务开启之后执行,在事务提交之前停止。
开启事务:$pdo->beginTransaction();
。
关闭事务:$pdo->commit();
。 -
中文处理方案(避免乱码)。
读取:$pdo ->query("set names utf8");
。
插入:$pdo ->exec('set names utf8');
。
一个事务中可以执行多个事件:
<?php
require_once 'test.php';
$pdo = SingletonPDO::getPDO();
$pdo->exec("set names utf8");
try {
// 开启事务
$pdo->beginTransaction();
$sql = "insert into userinfo values(?, ?)";
$pdoso = $pdo->prepare($sql);
$pdoso->execute(['xiaoming', '666']);
$sql = "delete from userinfo where username=?";
$pdoso = $pdo->prepare($sql);
$pdoso->execute(['xiaohong']);
// 结束事务
$pdo->commit();
}catch(PDOException $err) {
echo "事务处理失败";
}
回滚
<?php
require_once 'test.php';
$pdo = SingletonPDO::getPDO();
$pdo->query('set names utf8');
$pdo->exec('set names utf8');
try {
// 开启事务
$pdo->beginTransaction();
$sql = "update userinfo set password=? where username=?";
$pdoso = $pdo->prepare($sql);
$pdoso->execute(['11111111', 'liguoqing']);
$pdoso->execute(['000000']);
$pdo->commit();
}catch(PDOException $e) {
$pdo->rollBack();
echo $e->getMessage();
}