欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-03-24 21:20:34
...

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;

    运行结果图:
    PDO常用操作与trait、interface、抽象类的详解

  • 插入记录精简版

    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;

    运行结果图:
    PDO常用操作与trait、interface、抽象类的详解

  • 删除记录

    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;

    运行结果图:
    PDO常用操作与trait、interface、抽象类的详解

  • 查询记录: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;

    运行结果图:
    PDO常用操作与trait、interface、抽象类的详解

  • 查询记录: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;

    运行结果图:
    PDO常用操作与trait、interface、抽象类的详解

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

    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;

    运行结果图:
    PDO常用操作与trait、interface、抽象类的详解

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

    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;

    运行结果图:
    PDO常用操作与trait、interface、抽象类的详解

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关键字让类实现接口的详细方法,且类可以一次性实现多个接口,用逗号分开各个接口