博客列表 >PDO常用操作与trait、interface、抽象类的详解

PDO常用操作与trait、interface、抽象类的详解

Tlilam的PHP之路
Tlilam的PHP之路原创
2020年09月07日 19:00:47876浏览

PDO常用方法

连接数据库

直接写PDO连接数据库,后续的操作都引入这个connect.php文件
config.php 数据库基本连接参数

  1. <?php
  2. return [
  3. // 数据库类型
  4. 'type' =>$type ?? 'mysql',
  5. // 主机地址
  6. 'host' => $host ?? 'localhost',
  7. // 默认数据库
  8. 'dbname' =>$dbname ?? 'phpedu',
  9. // 账号
  10. 'username' =>$username ?? 'root',
  11. // 密码
  12. 'password' =>$password ?? 'root',
  13. // 默认字符集
  14. 'charset' =>$charset ?? 'utf8',
  15. // 默认端口
  16. 'port' =>$port ?? '3306'
  17. ];

connect.php 数据库连接文件

  1. <?php
  2. $config = require 'config.php';
  3. // var_dump($config);
  4. extract($config);
  5. $dsn = "{$type}:host={$host};dbname={$dbname}";
  6. // echo $dsn;
  7. $pdo = new PDO($dsn,$username,$password);
  8. // var_dump($pdo);
  9. // 设置默认返回数据是关联数组格式
  10. $pdo->setAttribute
  11. (PDO::ATTR_DEFAULT_FETCH_MODE,PDO::FETCH_ASSOC);

插入记录

  • 插入记录完整版

    1. <?php
    2. // 1.引入连接文件
    3. require __DIR__.DIRECTORY_SEPARATOR.'connect.php';
    4. // 2.操作
    5. /*
    6. // 2.1.1 匿名预处理SQL语句
    7. $sql = 'INSERT INTO `users` SET `name`=?, `email`=?, `password`=?;';
    8. $stmt = $pdo->prepare($sql);
    9. // 方法一:匿名占位符
    10. // 2.1.2变量绑定占位符
    11. $stmt->bindParam(1, $name, PDO::PARAM_STR, 30);
    12. $stmt->bindParam(2, $email, PDO::PARAM_STR, 100);
    13. $stmt->bindParam(3, $password, PDO::PARAM_STR, 40);
    14. // 2.1.3变量赋值 执行
    15. $name = '小李';
    16. $email = 'xl@php.cn';
    17. $password = sha1('222');
    18. // 执行
    19. $stmt->execute();
    20. */
    21. // 方法二:匿名占位符省略版 ,直接执行,传入索引数组,数据按照占位符顺序
    22. // $stmt->execute(['小马', 'xm@php.cn', sha1('111')]);
    23. // 2.2.1 命名占位符
    24. $sql = 'INSERT INTO `users` SET `name` =:name, `email` = :email, `password` =:password;';
    25. $stmt = $pdo->prepare($sql);
    26. /*
    27. // 方法三:命名占位符
    28. // 2.2.2 命名与变量名绑定
    29. $stmt -> bindParam(':name',$name,PDO::PARAM_STR,30);
    30. $stmt -> bindParam(':email',$email,PDO::PARAM_STR,100);
    31. // :name 前面的冒号可以省略
    32. $stmt -> bindParam('password', $password, PDO::PARAM_STR,40);
    33. // 2.2.3 变量名赋值
    34. $name = '小虎';
    35. $email = 'xh@php.cn';
    36. $password = sha1('xiaohu');
    37. $stmt->execute();
    38. */
    39. // 方法四:命名占位符省略版
    40. $stmt->execute(['name'=>'小方','email'=>'xf@php.cn','password'=>sha1('xiaofang')]);
    41. // 2.4输出影响结果
    42. echo '成功新增了 ' . $stmt->rowCount() . ' 条记录,新增的主键id = '. $pdo->lastInsertId();
    43. // 3.关闭
    44. $pdo = null;

    运行结果图:

  • 插入记录精简版

    1. <?php
    2. require 'connect.php';
    3. // 标准版
    4. /*
    5. $sql = 'INSERT INTO `users` SET `name`=?, `email`=?, `password`=?;';
    6. $stmt = $pdo->prepare($sql);
    7. $stmt->bindParam(1, $name, PDO::PARAM_STR, 30);
    8. $stmt->bindParam(2, $email, PDO::PARAM_STR, 100);
    9. $stmt->bindParam(3, $password, PDO::PARAM_STR, 40);
    10. $name = '小骆';
    11. $email = 'xl@php.cn';
    12. $password = sha1('xiaoluo');
    13. $stmt->execute();
    14. echo '成功新增:'.$stmt->rowCount().'条记录,新增的主键ID是:'.$pdo->lastInsertId();
    15. */
    16. // 最简化版
    17. $sql = 'INSERT INTO `users` SET `name`=:name, `email`=:email, `password`=:password;';
    18. $stmt = $pdo->prepare($sql);
    19. $stmt->execute(['name'=>'小琪','email'=>'xq@php.cn','password'=>sha1('xiaoqi')]);
    20. echo '成功新增:'.$stmt->rowCount().'条记录,新增的主键ID是:'.$pdo->lastInsertId();
    21. // 关闭连接
    22. $pdo = null;
  • 更新记录

    1. <?php
    2. // 1.连接
    3. require __DIR__.DIRECTORY_SEPARATOR.'connect.php';
    4. // 2.操作
    5. $sql = 'UPDATE `users` SET `name`=:name, `email`=:email, `password`=:password WHERE `id`=:id;';
    6. $stmt = $pdo->prepare($sql);
    7. $stmt->execute(['name'=>'tlilam','email'=>'tlilam@php.cn','password'=>sha1('tlilam'),'id'=>'12']);
    8. echo $stmt->rowCount() == true ? '成功更新:'.$stmt->rowCount().'条记录' : '没有记录被更新';
    9. // 3.关闭
    10. $pdo = null;

    运行结果图:

  • 删除记录

    1. <?php
    2. // 1.连接
    3. require __DIR__.DIRECTORY_SEPARATOR.'connect.php';
    4. // 2.操作
    5. $sql = 'DELETE FROM `users` WHERE `id`=?;';
    6. $stmt = $pdo->prepare($sql);
    7. $stmt->execute(['12']);
    8. echo $stmt->rowCount() == true ? '成功删除:'.$stmt->rowCount().'条记录' : '没有记录被删除';
    9. // 3.关闭
    10. $pdo = null;

    运行结果图:

  • 查询记录:fetch()+while()

    1. <?php
    2. // PDO 查询操作 fetch() + while()
    3. // 1.连接
    4. require __DIR__.DIRECTORY_SEPARATOR.'connect.php';
    5. // 2.操作
    6. $sql = 'SELECT `id`, `name`, `email` FROM `users` WHERE `id` > ?;';
    7. $stmt = $pdo->prepare($sql);
    8. if($stmt->execute( ['6'] )) {
    9. // 查询成功返回
    10. /*
    11. // 测试一条条查询出来
    12. $user = $stmt->fetch();
    13. printf('<pre>%s</pre>',print_r($user,true));
    14. $user = $stmt->fetch();
    15. printf('<pre>%s</pre>',print_r($user,true));
    16. // 数据查询完之后返回的是false
    17. $user = $stmt->fetch();
    18. var_dump($user);
    19. */
    20. // 这样我们就可以使用while循环,没有数据的时候就停止
    21. while($user = $stmt->fetch()){
    22. printf('<pre>%s</pre>',print_r($user,true));
    23. }
    24. }else{
    25. // 失败检查方法1,打印出错误信息
    26. printf('<pre>%s</pre>',print_r($stmt->errorInfo(), true));
    27. // 失败检查方法2,打印出执行的SQL语句,进行检查
    28. $stmt->debugDumpParams();
    29. }
    30. // 3.关闭
    31. $pdo = null;

    运行结果图:

  • 查询记录:fetchALl() + foreach()

    1. <?php
    2. // PDO 查询操作 fetchAll() + foreach()
    3. // 1. 连接
    4. require __DIR__.DIRECTORY_SEPARATOR.'connect.php';
    5. // 2.操作
    6. $sql = 'SELECT `id`,`name`,`email` FROM `users` WHERE `id` > ?;';
    7. $stmt = $pdo->prepare($sql);
    8. if($stmt->execute(['6'])){
    9. // 返回关联和索引数组合并后的结果
    10. $users = $stmt->fetchAll();
    11. // 填入参数只返回关联数组,可以在connect.php 进行声明默认取关联数组数据
    12. // $users = $stmt->fetchAll(PDO::FETCH_ASSOC);
    13. // print_r($users);
    14. foreach($users as $user){
    15. echo 'id:'.$user['id'].',name:'.$user['name'].',email:'.$user['email'].'<br/>';
    16. }
    17. }else{
    18. $stmt->debugDumpParams();
    19. }
    20. // 3.关闭
    21. $pdo = null;

    运行结果图:

  • 查询记录:将每条记录的字段值绑定到变量

    1. <?php
    2. // PDO 查询操作,将一条记录的每个字段值绑定到变量
    3. // 1.连接
    4. require __DIR__.DIRECTORY_SEPARATOR.'connect.php';
    5. // 2.操作
    6. $sql = 'SELECT `id`,`name`,`email` FROM `users` WHERE `id` > ?;';
    7. $stmt = $pdo->prepare($sql);
    8. $stmt->execute(['6']);
    9. // 2.1绑定
    10. $stmt->bindColumn('id',$id);
    11. $stmt->bindColumn('name',$name);
    12. $stmt->bindColumn('email',$email);
    13. // PDO::FETCH_BOUND 可选
    14. while($user = $stmt->fetch(PDO::FETCH_BOUND) ){
    15. echo "<li>ID :{$id},name:{$name},email:{$email}</li>";
    16. }
    17. // 3.关闭
    18. $pdo = null;

    运行结果图:

  • 查询符合条件的记录数量

    1. <?php
    2. // 1.连接
    3. require __DIR__.DIRECTORY_SEPARATOR.'connect.php';
    4. // 获取满足条件的记录 不能使用$stmt->rowCount();这不一定准确
    5. // 获取满足条件的记录数量
    6. $sql = 'SELECT COUNT(*) AS `count` FROM `users` WHERE `id` > ?;';
    7. // 预处理SQL语句
    8. $stmt = $pdo->prepare($sql);
    9. // 执行
    10. $stmt->execute( ['6'] );
    11. // 绑定到变量
    12. $stmt->bindColumn('count',$count);
    13. // 取出记录
    14. $stmt->fetch(PDO::FETCH_BOUND);
    15. echo '满足条件记录数量是: ', $count, ' 条记录';
    16. // 3.关闭
    17. $pdo = null;

    运行结果图:

trait的常用场景:组合性、代码复用、抽象方法

  1. <?php
  2. // trait1:代码复用
  3. trait tDemo1{
  4. public function getName(){
  5. return $this->name;
  6. }
  7. }
  8. // trait2:抽象方法
  9. trait tDemo2{
  10. abstract function getEmail();
  11. }
  12. // trat3:引入多个trait
  13. trait tDemo{
  14. use tDemo1, tDemo2;
  15. }
  16. // 引入组合后的trait: tDemo
  17. class test1{
  18. use tDemo;
  19. public $name = 'test1';
  20. public $email = 'test1@qq.com';
  21. public function getEmail(){
  22. return $this->name;
  23. }
  24. }
  25. class test2{
  26. use tDemo;
  27. public $name = 'test2';
  28. public $email = 'test2@qq.com';
  29. public function getEmail(){
  30. return $this->name;
  31. }
  32. }
  33. // 引入trait调用公用方法
  34. echo (new test1)->name;
  35. echo (new test2)->name;
  36. // 引入有抽象方法,需实现trait的抽象方法
  37. echo (new test1)->email;
  38. echo (new test2)->email;

trait使用总结

  • 代码最常用的是代码复用,公用的方法放在trait里面需要使用就use引入trait
  • trait也支持抽象方法,引入的类需要实现抽象方法
  • trait支持父类被继承的时也被继承下去,优先级是宿主子类>宿主类>trait
  • trait支持多引用,trait可以引入多个trait,类也可以引入多个trait
  • trait命名冲突可以用AS别名或者insteadof顶替解决

interface的常用场景:规范开发

  1. 接口: 完全的分离了: 设计(接口)与实现(实现类) 多继承性质
  1. <?php
  2. interface buy{
  3. // 进货总价
  4. function buyPrice($value,$num);
  5. }
  6. interface sell{
  7. // 接口中没有属性,有常量
  8. const SHUILV = 0.06;
  9. // 卖货总价
  10. function sellPrice($value,$num);
  11. }
  12. //工作类实现接口buy,sell
  13. class work implements buy,sell{
  14. public function buyPrice($value,$num){
  15. return $value * $num;
  16. }
  17. public function sellPrice($value,$num){
  18. // return ($value + $value * 0.06) * $num;
  19. return ($value + $value * sell::SHUILV ) * $num;
  20. }
  21. }
  22. $work = new work();
  23. echo '进货总价:' .$work->buyPrice(3500,10).'-----';
  24. echo '卖货总价:' .$work->sellPrice(4000,10);

interface使用总结

  • 接口主要是在规范开发的使用,不同的接口组合规范出新类的实现
  • 接口中方法没有方法体
  • 一个类可以同时实现多个接口,用逗号隔开
  • 实现类使用implements实现接口
  • 接口中只有常量和“抽象”方法

抽象类的使用

  1. 抽象类: 部分的分离了: 设计(抽象类)与实现(工作类) 单继承性质
  1. <?php
  2. // 定义抽象类
  3. abstract class aDemo{
  4. // 定义常量
  5. const TEST = '123';
  6. // 定义属性
  7. protected $password = 'pwd';
  8. // 定义普通方法 得到加料后的密码加密
  9. protected function getPassword($value){
  10. return sha1($value.$this->$password);
  11. }
  12. // 定义抽象静态方法
  13. abstract static function getName($name);
  14. }
  15. class work extends aDemo{
  16. // 类实现抽象静态方法,进行不同的样式输出
  17. static function getName($name){
  18. return '姓名:<strong>'.$name.'</strong> ';
  19. }
  20. public function test(){
  21. return aDemo::TEST;
  22. }
  23. }
  24. echo work::getName('user');
  25. echo (new work)->test();

抽象类与接口的相同点:

1、“抽象”方法都是用于声明某一种事物,规范名称、参数,形成模块,未有详细的实现细节。

2、都是通过类来实现相关的细节工作

3、语法上,抽象方法的抽象类与接口一样,不能有方法体,即{}符号

4、都可以用继承,接口可以继承接口形成新的接口,抽象类可以继承抽象类从而形成新的抽象类


抽象类与接口的不同点:

1、抽象类可以有常量、属性、普通方法、抽象方法,但接口不能有属性、普通方法、可以有常量

2、抽象类内未必有抽象方法,但接口内一定会有“抽象”方法

3、语法上有不同,下面是具体使用上的不同

4、抽象类用abstract关键字在类前声明,且有class声明为类,接口是用interface来声明,但不能用class来声明,因为接口不是类。

5、抽象类的抽象方法一定要用abstract来声明,而接口则不需要,接口里面的方法默认就是一种“抽象”的方法

6、抽象类是用extends关键字让子类继承抽象父类后,在子类实现详细的抽象方法。

7、接口则是用implements关键字让类实现接口的详细方法,且类可以一次性实现多个接口,用逗号分开各个接口

声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议