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 程序的关闭
- 如果每次查询后,不关闭的话,那么当 php 程序执行完后,php 占用的内存、CPU 资源会释放,mysql 自然会断开
$pdo = null;