php中使用PDO连接数据库

使用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类型的结果

使用以上两种方法时:

  1. 交由pdo去prepare预处理的【半成品】sql语句,使用?问号作为占位符,表示待传参的参数
  2. prepare预处理必须只能处理【半成品】sql语句,如果是完整则需要使用exec方法执行
  3. execute()方法允许一个数组作为参数,将参数带入到预处理的sql语句中,并且会将结果存放到PDOSO对象中。
  4. 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语句。

注意:

  1. 整个事务操作必须放到try...catch中,这是因为我们并不能保证执行的事件一定成功。
    而对于整个事务而言,任何一个事件的失败都会导致catch的触发。
    catch触发就意味着必须将之前做出的所有的操作都必须还原
    回滚操作:$pdo->rollBack()

  2. 操作语句必须在事务开启之后执行,在事务提交之前停止。
    开启事务:$pdo->beginTransaction();
    关闭事务:$pdo->commit();

  3. 中文处理方案(避免乱码)。
    读取:$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();
}
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值