PDD 浅析

创建配置文件并导入

PDO 三要素 :DSN 数据源 username password
DSN 数据源需要包括:数据库类型,数据库地址,数据表名称

// 设置DSN数据源
$dsn = sprintf("%s:host=%s;dbname=%s",$type,$host,$dbname);

一个数据库配置文件的生成:数据库类型数据库地址数据库表名数据库端口数据库编码数据库用户名数据库密码

// 基础配置文件
// 创建一个命名空间
namespace pdo_io;

// 声明配置项
return [
    // 如果用户自定义就使用用户自定义的,如果没有就使用我们提前配置好的
    'type'=>$type ?? 'mysql',  //数据库类型
    'host'=>$host ?? 'localhost', //数据库地址
    'dbname'=>$dbname ?? 'user', //数据库表名
    'port'=>$port ?? '3306', //数据库端口
    'charset'=>$charset ?? 'utf8', //数据库编码
    'username'=>$username ?? 'root', //数据库用户名
    'password'=>$password ?? '12346' //数据库密码
];

??的作用:

  • 链接数据库
// 创建一个命名空间
namespace pdo_io;
// 因为引入的配置数据是一个大数组,所以使用一个数组接收
$config = require __DIR__ . '/../config/database.php';
use PDO;

// PDO数据链接三要素:DSN数据源   username   password
$type = $config['type'];
$host = $config['host'];
$dbname  = $config['dbname'];
$username  = $config['username'];
$password  = $config['password'];

// 设置DSN数据源
$dsn = sprintf("%s:host=%s;dbname=%s",$type,$host,$dbname);

// PHP中try{}catch{}的作用是用来处理异常。可以为我们收集并显示出错误信息。
try{
    $pdo = new PDO($dsn,$username,$password);
}catch(\Exception $e){
    die('Connection error: '. $e->getMessage());
}

说明一下为什么不适用use PDO就报错,以及它的作用:

  • 数据库的操作语句
    增删查改:

    需要包括的参数:
    要执行的操作:
    增删查改SELECT / DELETE / INSERT / UPDATE
    要操作的字段: * :操作全部数据库数据 字段 :操作指定字段的数据库数据
    从那张表之中操作:FROM / SET[设置]
    在哪个字段找到的数据上操作:WHERE

    $sql = "SELECT * FROM user WHERE id=1";

WHERE不能忽略,不然会将符合条件的数据都全部删除/更新/查询到

操作 sql 语句后得到一个对象,这个对象可以使用一些方法进行预处理

  • sql 的预处理

    得到一个 PDO 对象之后,我们可以使用方法,对对象使用方法可以通过 -> 来操作

得到一个 PDO 对象:

更新操作:

//连接
require 'connect.php';
//操作 sql语句
$sql = "UPDATE user SET age = 55 WHERE id = 3";
// 使用方法:
$res = $pdo->exec($sql);
var_dump($res);

返回值 更新成功返回 1,更新失败返回 0

更新成功

查询操作:

//连接
require 'connect.php';

// 将数据以关联数据的方式接收过来
extract($_POST);
// 对密码进行加密
$password = md5($password);

// 执行sql语句
// 查询
$sql = "SELECT * FROM user WHERE uname = '{$username}' AND pwd = '{$password}'";

// 使用query方法返回结果集
$stmt = $pdo->query($sql);
echo '受影响的行数' . $stmt->rowCount();


但是这里出现了一个问题,这里如果使用 sql 语句' or 1=1 #从前端注入的话,就能够查询成功

所以此时就需要对数据库执行语句进行 PDO 对象进行预处理
下面通过一个为字符串添加引号的预处理方法来举例子:

//连接
require 'connect.php';

// 将数据以关联数据的方式接收过来
extract($_POST);
// 对密码进行加密
$password = md5($password);

// 执行sql语句
$username = $pdo->quote($username);   //对用户名查询做一个预处理
// 查询
$sql = "SELECT * FROM user WHERE uname = {$username} AND pwd = '{$password}'";

// 使用query方法返回结果集
$stmt = $pdo->query($sql);
echo '受影响的行数' . $stmt->rowCount();

  • ? 参数占位符
    使用问好占位符代替我们需要查询的条件
    $sql = "SELECT * FROM user WHERE uname = ? AND pwd = ?";
    同时我们还需要使用过到(PDOstatement)对象之中的方法:PDOstatement 对象是对 pdo 对象使用 pdo 方法之后得到的一个 PDOstatement 对象。

    PDO 对象只能使用 PDO 方法,而 PDOstatement 对象也只能使用 PDOstatement 对象之中的方法

使用了占位符之后我们还需要使用到 PDOstatement 对象之中的方法对每个占位符进行绑定
方法:bindParam()

// 链接数据库
require 'connect.php';
// 数组接收
extract($_POST);
// 密码散列处理
$password = md5($password);

// 操作sql语句
$sql = "SELECT * FROM user WHERE uname = ? AND pwd = ?";
// 执行sql语句,并返回一个PDOstatement对象

 //prepare() — 准备要执行的语句,并返回语句对象 object(PDOStatement)
$stmt = $pdo->prepare($sql);

// 对?占位符进行绑定
// 语法:bindParam(第几个占位符,绑定的值)
$stmt->bindParam(1,$username);
$stmt->bindParam(2,$password);

//PDOStatement::execute — 执行一条预处理语句
$stmt->execute();
// 返回受影响的行数【在数据库中】
echo $stmt->rowCount();

POD 预处理执行 CURD 操作

更新操作:
除了使用bindParam()来绑定占位符,我们还可以通过execute()来直接将值绑定到占位符上

require 'connect.php';
// 更新指定字段  通过``来将字段绑定,可以避免用户输入的值和字段值相同的问题。
// 多个字段之间使用,隔开
$sql = 'UPDATE `user` SET `uname` = ?,`pwd`=?,`age`=? WHERE `id`=?;';
// prepare() — 准备要执行的语句,并返回语句对象 object(PDOStatement)
$stmt = $pdo->prepare($sql);
// 将值绑定
// 通过execute可以直接将值一一对应绑定到占位符上,但是execute是只能接收数组
$stmt->execute(['LLL',md5(888999),99,1]);
echo '更新成功' . $stmt->rowCount() . '条记录';


PDO 程序的关闭

  1. 如果每次查询后,不关闭的话,那么当 php 程序执行完后,php 占用的内存、CPU 资源会释放,mysql 自然会断开
  2. $pdo = null;
最后修改:2020 年 11 月 29 日 01 : 51 PM
如果觉得我的文章对你有用,请随意赞赏