登录  /  注册
博主信息
博文 28
粉丝 0
评论 0
访问量 28587
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
PDO浅析
G
原创
1180人浏览过

PDD 浅析

创建配置文件并导入

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

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

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

  1. // 基础配置文件
  2. // 创建一个命名空间
  3. namespace pdo_io;
  4. // 声明配置项
  5. return [
  6. // 如果用户自定义就使用用户自定义的,如果没有就使用我们提前配置好的
  7. 'type'=>$type ?? 'mysql', //数据库类型
  8. 'host'=>$host ?? 'localhost', //数据库地址
  9. 'dbname'=>$dbname ?? 'user', //数据库表名
  10. 'port'=>$port ?? '3306', //数据库端口
  11. 'charset'=>$charset ?? 'utf8', //数据库编码
  12. 'username'=>$username ?? 'root', //数据库用户名
  13. 'password'=>$password ?? '12346' //数据库密码
  14. ];

??的作用:

  • 链接数据库
  1. // 创建一个命名空间
  2. namespace pdo_io;
  3. // 因为引入的配置数据是一个大数组,所以使用一个数组接收
  4. $config = require __DIR__ . '/../config/database.php';
  5. use PDO;
  6. // PDO数据链接三要素:DSN数据源 username password
  7. $type = $config['type'];
  8. $host = $config['host'];
  9. $dbname = $config['dbname'];
  10. $username = $config['username'];
  11. $password = $config['password'];
  12. // 设置DSN数据源
  13. $dsn = sprintf("%s:host=%s;dbname=%s",$type,$host,$dbname);
  14. // PHP中try{}catch{}的作用是用来处理异常。可以为我们收集并显示出错误信息。
  15. try{
  16. $pdo = new PDO($dsn,$username,$password);
  17. }catch(\Exception $e){
  18. die('Connection error: '. $e->getMessage());
  19. }

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

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

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

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

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

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

  • sql 的预处理

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

得到一个 PDO 对象:

更新操作:

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

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

更新成功

查询操作:

  1. //连接
  2. require 'connect.php';
  3. // 将数据以关联数据的方式接收过来
  4. extract($_POST);
  5. // 对密码进行加密
  6. $password = md5($password);
  7. // 执行sql语句
  8. // 查询
  9. $sql = "SELECT * FROM user WHERE uname = '{$username}' AND pwd = '{$password}'";
  10. // 使用query方法返回结果集
  11. $stmt = $pdo->query($sql);
  12. echo '受影响的行数' . $stmt->rowCount();


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

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

  1. //连接
  2. require 'connect.php';
  3. // 将数据以关联数据的方式接收过来
  4. extract($_POST);
  5. // 对密码进行加密
  6. $password = md5($password);
  7. // 执行sql语句
  8. $username = $pdo->quote($username); //对用户名查询做一个预处理
  9. // 查询
  10. $sql = "SELECT * FROM user WHERE uname = {$username} AND pwd = '{$password}'";
  11. // 使用query方法返回结果集
  12. $stmt = $pdo->query($sql);
  13. echo '受影响的行数' . $stmt->rowCount();

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

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

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

  1. // 链接数据库
  2. require 'connect.php';
  3. // 数组接收
  4. extract($_POST);
  5. // 密码散列处理
  6. $password = md5($password);
  7. // 操作sql语句
  8. $sql = "SELECT * FROM user WHERE uname = ? AND pwd = ?";
  9. // 执行sql语句,并返回一个PDOstatement对象
  10. //prepare() — 准备要执行的语句,并返回语句对象 object(PDOStatement)
  11. $stmt = $pdo->prepare($sql);
  12. // 对?占位符进行绑定
  13. // 语法:bindParam(第几个占位符,绑定的值)
  14. $stmt->bindParam(1,$username);
  15. $stmt->bindParam(2,$password);
  16. //PDOStatement::execute — 执行一条预处理语句
  17. $stmt->execute();
  18. // 返回受影响的行数【在数据库中】
  19. echo $stmt->rowCount();

POD 预处理执行 CURD 操作

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

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


PDO 程序的关闭

  1. 如果每次查询后,不关闭的话,那么当 php 程序执行完后,php 占用的内存、CPU 资源会释放,mysql 自然会断开
  2. $pdo = null;
批改老师:灭绝师太灭绝师太

批改状态:合格

老师批语:
本博文版权归博主所有,转载请注明地址!如有侵权、违法,请联系admin@php.cn举报处理!
全部评论 文明上网理性发言,请遵守新闻评论服务协议
1条评论
灭绝师太 2020-11-30 10:20:13
use pdo, 是因为创建了命名空间, 不创建的话, PDO类默认在全局空间使用, 你创建了自己的小房间, 就要把PDO类引进你的小房间使用, 否则就不要创建命名空间~
1楼
作者最新博文
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2024 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号

  • 登录PHP中文网,和优秀的人一起学习!
    全站2000+教程免费学