批改状态:合格
老师批语:
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 语句后得到一个对象,这个对象可以使用一些方法进行预处理
得到一个 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 = ?";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();

更新操作:
除了使用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 = null;
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号