Blogger Information
Blog 15
fans 0
comment 0
visits 11170
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
PDO常用操作、trait 、interface、抽象类与interface的区别与联系
乐作人生
Original
717 people have browsed it
  1. 熟悉PDO所有常用方法,并实例演示
  • 数据库配置
    1. // 连接参数
    2. return [
    3. // 类型
    4. 'type' => $type ?? 'mysql',
    5. // 默认主机名
    6. 'host' => $username ?? 'localhost',
    7. // 默认编码集
    8. 'charset' => $charset ?? 'utf8',
    9. // 默认端口号
    10. 'port' => $porst ?? '3306',
    11. // 默认用户名
    12. 'username' => $usernam ?? 'root',
    13. // 默认用户的密码
    14. 'password' => $password ?? 'root',
    15. // 默认数据库
    16. 'dbname' => $dbname ?? 'phpedu',
    17. ];
  • 连接数据库
    1. // 1. 导入配置参数
    2. //__DIR__获取当前目录的路径
    3. $config = require __DIR__ . '\\0829-1config.php';
    4. // print_r($config);
    5. extract($config);
    6. // new PDO(数据源, 用户名, 密码);
    7. // $dsn = '数据库类型:host=主机名;dbname=默认数据库;charset=默认编码集;port=默认端口';
    8. // $dsn = 'mysql:host=localhost;dbname=phpedu;charset=utf8;port=3306';
    9. try {
    10. //要执行的代码,$dsn代表数据源
    11. $dsn = sprintf('%s:host=%s;dbname=%s',$type,$host,$dbname);
    12. $pdo =new PDO($dsn, $username, $password);
    13. // var_dump($pdo);
    14. } catch (PDOException $e) {
    15. die($e->getMessage());
    16. }
  • 新增数据

    1. // 1、连接数据库
    2. $config = require __DIR__ . '\\0829-2.php';
    3. //2、操作
    4. // ?占位符;:name命名占位符
    5. $sql = 'INSERT `user` SET `name`=?, `email`=?, `password`=?;';//将?分别替换成:name,:email,:password;占位符前面的:可以不加
    6. // sql语句对象(预处理对象)
    7. $stmt = $pdo->prepare($sql);
    8. // var_dump($stmt);
    9. // 将占位符与变量名绑定
    10. //1)bindParam()参数绑定
    11. // bindParam(): 参数与指定的变量名进行绑定,也叫引用传参
    12. //常量:PDO::PARAM_STR表示 SQL 中的 CHAR、VARCHAR 或其他字符串类型
    13. $stmt->bindParam(1, $name, PDO::PARAM_STR, 30);//$stmt->bindParam(':name', $name, PDO::PARAM_STR, 30);
    14. $stmt->bindParam(2, $email,PDO::PARAM_STR, 100);//$stmt->bindParam(':email', $email, PDO::PARAM_STR, 100);
    15. $stmt->bindParam(3, $password, PDO::PARAM_STR, 40);//$stmt->bindParam(':password', $password, PDO::PARAM_STR, 40);
    16. //变量名与值进行绑定
    17. $name = '张龙';
    18. $email = 'zhanglong@qq.com';
    19. $password = sha1('156793');
    20. //执行
    21. $stmt->execute();
    22. //简易方法:可以省略参数绑定的步骤,直接在execute()传参时进行绑定,但此时参数必须放在一个数组中
    23. // 如:?匿名占位符可写成$stmt->execute(['张龙2','zhanglong2@qq.com',sha1('1562793')]);
    24. // 如:使用命名占位符, 则需传一个关联数组,键名就是占位符,可写成$res=$stmt->execute(['name'=>'张龙2', 'email'=>'zhanglong2@qq.com','password'=> sha1('1562793')]);
    25. //2)bindValue()值绑定
    26. // $name='张士';
    27. // $email='zhangshi@qq.com';
    28. // $password=sha1('589802');
    29. // $stmt->bindValue(1,$name,PDO::PARAM_STR);
    30. // $stmt->bindValue(2,$email,PDO::PARAM_STR);
    31. // $stmt->bindValue(3,$password,PDO::PARAM_STR);
    32. // $stmt->execute();
    33. //rowCount():返回操作成功后受影响的记录数量,这里是指新增的记录数量
    34. echo '成功新增'.$stmt->rowCount().'条记录';
    35. // 3、关闭
    36. // $pdo = null;
    37. unset($pdo);


    1. // 1、连接数据库
    2. $config = require __DIR__ . '\\0829-2.php';
    3. //2、操作
    4. // ?占位符;:name命名占位符
    5. $sql = 'INSERT `user` SET `name`=:name, `email`=:email, `password`=:password;';
    6. // sql语句对象(预处理对象)
    7. $stmt = $pdo->prepare($sql);
    8. $res=$stmt->execute(['name'=>'张龙2', 'email'=>'zhanglong2@qq.com','password'=> sha1('1562793')]);
    9. echo '成功新增'.$stmt->rowCount().'条记录';
    10. // 3、关闭
    11. // $pdo = null;
    12. unset($pdo);

  • 更新数据
    1. // 1、连接数据库
    2. $config = require __DIR__ . '\\0829-2.php';
    3. //2、操作
    4. // 更新数据时一定要有条件
    5. $sql = 'UPDATE `user` SET `name`=?, `email`=?, `password`=? WHERE `id` = ?;';
    6. // sql语句对象(预处理对象)
    7. $stmt = $pdo->prepare($sql);
    8. $res=$stmt->execute(['赵虎', 'zhaohu@qq.com',sha1('580293'),9]);
    9. //rowCount():返回操作成功后受影响的记录数量,这里是指新增的记录数量
    10. echo $stmt->rowCount() === 1 ? '成功更新了 ' . $stmt->rowCount() . ' 条记录' : '没有记录被更新';
    11. // 3、关闭
    12. unset($pdo);
  • 删除数据
    1. // 1、连接数据库
    2. $config = require __DIR__ . '\\0829-2.php';
    3. //2、操作
    4. // 更新数据时一定要有条件
    5. $sql = 'DELETE FROM `user` WHERE `id` = ?;';
    6. // sql语句对象(预处理对象)
    7. $stmt = $pdo->prepare($sql);
    8. $res=$stmt->execute([8]);
    9. //rowCount():返回操作成功后受影响的记录数量,这里是指新增的记录数量
    10. echo $stmt->rowCount() === 1 ? '成功删除了 ' . $stmt->rowCount() . ' 条记录' : '没有记录被删除';
    11. // 3、关闭
    12. unset($pdo);
  • 查询数据
    • fetch()+while()
      1. // pdo查询数据:fetch()+while()逐条遍历
      2. // 1、连接数据库
      3. $config = require __DIR__ . '\\0829-2.php';
      4. //2、操作
      5. // 更新数据时一定要有条件
      6. $sql = 'SELECT `id`,`name`,`email` FROM `user` WHERE `id` > ?;';
      7. // sql语句对象(预处理对象)
      8. $stmt = $pdo->prepare($sql);
      9. //给查询结果增加一个条件:符合时逐条遍历显示结果,否则打印错误信息
      10. if($stmt->execute([5])){
      11. // 逐条遍历,fetch()返回一维数组,将数据表的记录指针自动下移
      12. // $a = $stmt->fetch();
      13. // printf('<pre>%s</pre>',print_r($a,true));
      14. //数据查询完之后再进行遍历,则不会显示数据,可用while循环遍历操作
      15. while($a=$stmt->fetch()){
      16. printf('<pre>%s</pre>',print_r($a,true));
      17. }
      18. }else{
      19. // 返回一个错误信息的数组
      20. printf('<pre>%s</pre>',print_r($stmt->errorInfo(),true));
      21. // 调试方法:打印出执行的SQL预处理语句,进行检查
      22. $stmt->debugDumpParams();
      23. }
      24. // 3、关闭
      25. unset($pdo);
    • fetchALl() + foreach()
      1. // pdo查询数据:fetchALl() + foreach()
      2. // 1、连接数据库
      3. $config = require __DIR__ . '\\0829-2.php';
      4. //2、操作
      5. // 更新数据时一定要有条件
      6. $sql = 'SELECT `id`,`name`,`email` FROM `user` WHERE `id` < ?;';
      7. // sql语句对象(预处理对象)
      8. $stmt = $pdo->prepare($sql);
      9. //给查询结果增加一个条件:符合时显示结果,否则打印错误信息
      10. if($stmt->execute([5])){
      11. // 一次性获取所有满足条件的数据信息
      12. $a = $stmt->fetchAll();
      13. //数据查询完以二维数组显示,可用foreach操作
      14. foreach($a as $value){
      15. vprintf('<li>id = %d, name = %s, email = %s</li>', $value);
      16. }
      17. }else{
      18. // 返回一个错误信息的数组
      19. printf('<pre>%s</pre>',print_r($stmt->errorInfo(),true));
      20. // 调试方法:打印出执行的SQL预处理语句,进行检查
      21. $stmt->debugDumpParams();
      22. }
      23. // 3、关闭
      24. unset($pdo);
    • 将每个字段绑定到变量上
      1. // pdo查询数据:将每个字段绑定到变量上
      2. // 1、连接数据库
      3. $config = require __DIR__ . '\\0829-2.php';
      4. //2、操作
      5. // 查询数据时一定要有条件
      6. $sql = 'SELECT `id`,`name`,`email` FROM `user` WHERE `id` < ?;';
      7. // sql语句对象(预处理对象)
      8. $stmt = $pdo->prepare($sql);
      9. $stmt->execute([5]);
      10. // 将三个字段与三个变量进行绑定,通过列名进行绑定
      11. $stmt->bindColumn('id', $id);
      12. $stmt->bindColumn('name', $name);
      13. $stmt->bindColumn('email', $email);
      14. while ($user = $stmt->fetch()) {
      15. printf('<pre>%s</pre>',print_r($user,true));
      16. }
      17. // 3、关闭
      18. unset($pdo);
    • 查询符合条件的记录数量
      1. //查询符合条件的记录数量
      2. // 1、连接数据库
      3. $config = require __DIR__ . '\\0829-2.php';
      4. //2、操作
      5. //获取满足条件的记录数量不能用$stmt->rowCount(),要用COUNT(*)
      6. // COUNT(*):字段名,并不直观,所以给个别名
      7. $sql = 'SELECT COUNT(*) AS `count` FROM `user` WHERE `id` < ?;';
      8. // 预处理语句
      9. $stmt = $pdo->prepare($sql);
      10. $stmt->execute([5]);
      11. //将别名count绑定到变量
      12. $stmt->bindColumn('count', $count);
      13. $stmt->fetch(PDO::FETCH_BOUND);
      14. echo '满足条件记录数量是: ', $count, ' 条记录';
      15. // 3. 关闭
      16. $pdo = null;
  1. trait 常用场景
  • 代码复用
    1. //1、实现代码复用,图片单继承限制
    2. trait Demo{
    3. public function getUser(){
    4. return '姓名:'.$this->name.',年龄:'.$this->age.'岁';
    5. }
    6. }
    7. trait Demos{
    8. public function getUsers(){
    9. //get_class_vars() 函数返回由类的默认属性组成的数组;参数为类名
    10. //self可以访问本类中的静态属性和静态方法,可以访问父类中的静态属性和静态方法。用self时可以不用实例化
    11. //__CLASS__:当前类的名称;等价于self::class
    12. return sprintf('<pre>%s</pre>', print_r(get_class_vars(self::class), true));
    13. }
    14. }
    15. class Demo1{
    16. //插入多个trait,用,隔开
    17. use Demo,Demos;//相当于把Demo和Demos的方法都复制到了本类中
    18. protected $name='张三';
    19. protected $age='30';
    20. }
    21. class Demo2{
    22. use Demo;
    23. protected $name='李四';
    24. protected $age='40';
    25. }
    26. echo (new Demo1)->getUser().'<br>';
    27. echo (new Demo1)->getUsers().'<br>';
    28. echo (new Demo2)->getUser().'<hr>';
  • trait支持继承
    1. //2、trait支持继承
    2. trait Demo{
    3. public $name='李四';
    4. public function getUser()
    5. {
    6. //__METHOD__:返回该方法被定义时的名字(区分大小写)
    7. return 'trait method name : ' . __METHOD__;
    8. }
    9. }
    10. class Demo1{
    11. use Demo;
    12. }
    13. class Demo2 extends Demo1{
    14. }
    15. echo (new Demo2)->getUser().'<br>';
    16. echo (new Demo2)->name.'<hr>';
    17. //静态属性及方法
    18. trait Demos{
    19. public static $name='张三';
    20. public static function get()
    21. {
    22. //__METHOD__:返回该方法被定义时的名字(区分大小写)
    23. return 'trait method name : ' . __METHOD__;
    24. }
    25. }
    26. //可以使用抽象类(abstract)使用strait
    27. abstract class Demo3{
    28. use Demos;
    29. }
    30. // 给用户提供的工作类/实现,应该尽可能的简单,可以将一些实现细节进行隐藏
    31. class Demo4 extends Demo3{
    32. }
    33. //静态属性的调用方法为"类名::属性名"
    34. echo Demo4::get().'<br>';
    35. echo Demo4::$name;
  • trait扩展
    1. //3、trait扩展
    2. trait Demo{
    3. public function getUser(){
    4. return '姓名:'.$this->name.',年龄:'.$this->age.'岁';
    5. }
    6. }
    7. trait Demos{
    8. public function getUsers(){
    9. //get_class_vars() 函数返回由类的默认属性组成的数组;参数为类名
    10. return sprintf('<pre>%s</pre>', print_r(get_class_vars(self::class), true));
    11. }
    12. }
    13. //同时引入多个trait,用,隔开;trait支持功能整合,trait中允许再引入trait
    14. trait tDemo{
    15. use Demo,Demos;
    16. }
    17. class Demo1{
    18. use tDemo;//tDemo中已经整合了Demo和Demos,此时只需要引入一个tDemo即可
    19. protected $name='张三';
    20. protected $age='30';
    21. }
    22. echo (new Demo1)->getUser().'<br>';
    23. echo (new Demo1)->getUsers();
  • trait成员的命名冲突
    1. //4、trait成员的命名冲突
    2. trait Demo{
    3. public function getUser(){
    4. return '姓名:'.$this->name.',年龄:'.$this->age.'岁';
    5. }
    6. }
    7. trait Demos{
    8. public function getUser(){
    9. //get_class_vars() 函数返回由类的默认属性组成的数组;参数为类名
    10. return sprintf('<pre>%s</pre>', print_r(get_class_vars(self::class), true));
    11. }
    12. }
    13. trait tDemo1{
    14. protected $profession='司机';
    15. public function getUser(){
    16. // return __METHOD__;
    17. return '姓名:'.$this->name.',年龄:'.$this->age.'岁,职业:'.$this->profession;
    18. }
    19. }
    20. //同时引入多个trait,用,隔开;trait支持功能整合,trait中允许再引入trait
    21. trait tDemo{
    22. use Demo,Demos,tDemo1{//Demo和Demos中的方法名冲突,先替代,然后起别名
    23. //替代:用Demo::getUser将Demos::getUser替换掉,也就是只有Demo中的方法起作用
    24. Demo::getUser insteadOf Demos;
    25. Demos::getUser insteadOf tDemo1;//用Demos::getUser将tDemo1::getUser替换掉
    26. //别名:给Demos::getUser起别名
    27. Demos::getUser as getUsers;
    28. tDemo1::getUser as td;//给tDemo1::getUser起别名
    29. }
    30. }
    31. class Demo1{
    32. use tDemo;//tDemo中已经整合了Demo和Demos,此时只需要引入一个tDemo即可
    33. protected $name='张三';
    34. protected $age='30';
    35. }
    36. echo (new Demo1)->getUser().'<br>';
    37. echo (new Demo1)->getUsers().'<br>';
    38. echo (new Demo1)->td();
    39. //2个以上的trait成员命名冲突时如何做???
  • trait与interface组合
    1. //5、trait与interface组合
    2. //创建接口,在创建前先判断当前接口是否存在
    3. //interface_exists() 函数检查接口是否已被定义
    4. if (!interface_exists('iDemo')){
    5. interface iDemo {
    6. // 创建一个静态抽象方法
    7. //接口的方法必须是public(默认是public),且接口中只能定义方法名(含参数),不能有函数体
    8. public static function index();
    9. public static function user();
    10. }
    11. }
    12. //用trait实现接口中的方法
    13. trait tDemo{
    14. // 将抽象类的实现代码写到trait中
    15. public static function index(){
    16. return __METHOD__;
    17. }
    18. public static function user(){
    19. return 'Hello Word!';
    20. }
    21. }
    22. //要实现一个接口,需使用 implements 操作符,类中必须实现接口中定义的所有方法
    23. abstract class work implements iDemo{
    24. use tDemo;
    25. }
    26. class works extends work{}
    27. echo works::index().'<br>';
    28. echo works::user();
  1. interface常用场景

    1. //interface:接口;接口完全的分离了:设计(接口)与实现(实现类)
    2. //1、单接口的实现
    3. interface A{
    4. //接口中只能定义方法名(含参数),不能有函数体;接口的方法必须是public(默认public)
    5. public function write();
    6. //接口中不能有属性,但可以定义常量
    7. const NAME='胡八一';
    8. //接口不能进行实例化,但可以有构造方法
    9. // public function __construct();
    10. }
    11. //要实现一个接口,使用 implements 操作符,类中必须实现接口中定义的所有方法
    12. class userA implements A{
    13. protected $age=33;
    14. public function write(){
    15. return '姓名:'.A::NAME.',年龄:'.$this->age.'岁';
    16. }
    17. }
    18. echo (new userA)->write().'<hr>';
    19. //2、接口继承、实现多个接口
    20. interface B extends A{
    21. //B接口继承A接口
    22. const NATION='CHINA';
    23. }
    24. interface C extends A,B{
    25. //C接口继承A和B接口
    26. public static function work();
    27. //多个接口进行整合,形成一个统一的接口,再用一个类实现
    28. }
    29. //一个类可以同时实现多个接口,实现多个接口时,接口中的方法不能有重名
    30. //实现类
    31. class userB implements C{
    32. public function write(){
    33. return '姓名:'.A::NAME.',国籍:'.B::NATION;
    34. }
    35. public static function work(){
    36. return __METHOD__;
    37. }
    38. }
    39. echo (new userB)->write().'<br>';
    40. echo (new userB)->work().'<hr>';
    41. // php是典型的单继承式语言
    42. // 接口之间允许继承,并用支持多继承
    43. // 可以有二种实现方案:
    44. // 1)将多个接口进行整合,形成一个统一的接口,然后用一个实现类来实现它
    45. // 2)一个实现类同时实现多个接口,实现类的功能组合,是一种横向功能扩展

  2. 抽象类与interface的区别与联系

    1. //abstract抽象类: 部分的分离了: 设计(抽象类)与实现(工作类)
    2. abstract class user{
    3. protected $name='张三';
    4. //抽象类中的方法可以有抽象方法,也可以有非抽象方法
    5. public function work(){
    6. return __METHOD__;
    7. }//抽象方法:只其调用方式(参数),没有具体的实现过程,即没有函数体
    8. abstract function write();
    9. }
    10. // 抽象类禁止实例化
    11. // 抽象类必须使用它的子类才可以访问/工作
    12. class user1 extends user{
    13. public function write(){
    14. return $this->name;
    15. }
    16. }
    17. echo (new user1)->work().'<br>';
    18. echo (new user1)->write();

  • 抽象类中至少有一个抽象方法,且前面必须加abstract
  • 接口成员的属性只能是常量;接口中的方法都是抽象方法,无函数体,且都必须是public
  • 接口类和抽象类本身均不能实例化,必须通过类进行继承;且继承后必须全部实现所有抽象方法
  1. 抽奖案例
  • 简单抽奖

    1. //设置抽奖接口
    2. interface drawId{
    3. public static function getDrawId($min,$max);
    4. }
    5. //公共方法:实现抽象接口方法
    6. trait tDrawId{
    7. public static function getDrawId($min,$max){
    8. //mt_rand()生成随机整数
    9. return mt_rand($min,$max);
    10. }
    11. }
    12. //实现工作类
    13. class Draw implements drawId{
    14. use tDrawId;
    15. public static function award($prizes,$id){
    16. return $prizes[$id];
    17. }
    18. }
    19. $prizes=['电脑','手机','平板','相机','音箱','耳机','U盘'];
    20. $id=Draw::getDrawId(0,6);
    21. $prize=Draw::award($prizes,$id);//随机输出$prizes中的值
    22. echo '你的奖品是:'.$prize;

  • 双色球

    1. <?php
    2. //抽奖案例:双色球
    3. //设置抽奖接口
    4. interface drawId{
    5. public static function getDrawId($min,$max);
    6. }
    7. //公共方法:实现抽象接口方法
    8. trait tDrawId{
    9. public static function getDrawId($min,$max){
    10. //mt_rand()生成随机整数
    11. return mt_rand($min,$max);
    12. }
    13. }
    14. // 抽象类: 彩票(lottery)
    15. abstract class Lottery implements drawId{
    16. //引入trait
    17. use tDrawId;
    18. //生成中奖需要的编号,$num表示需要的数量
    19. protected static function createBalls($min,$max,$num){
    20. //1、按照开奖规则生成指定步长和数量的编号
    21. //range() 函数创建一个包含指定范围的元素的数组
    22. $allBalls=range($min,$max,1);//1为规定元素之间的步进制。默认是 1
    23. //2、蓝色球,生成$num=1个
    24. //array_rand(array,number):array必需,规定数组;number可选,规定返回多少随机键名
    25. //如果选出的元素不止一个,则返回包含随机键名的数组,否则返回该元素的键名
    26. if($num===1) return $allBalls[array_rand($allBalls)];//array_rand($allBalls)返回的是元素的键名,需要根据键名获取对应的值
    27. //3、红色球:随机6个球的编号
    28. $redBallsKeys=array_rand($allBalls,6);//返回6个随机元素的键名数组
    29. //根据键名获取对应的值
    30. $redBalls=[];
    31. foreach($redBallsKeys as $key){
    32. $redBalls[]=$allBalls[$key];
    33. }
    34. return $redBalls;
    35. }
    36. //抽象方法:生成一个中奖号:6个红色球+1个蓝色球
    37. abstract protected static function doubleBall($redRule,$blueRule);
    38. //抽象方法:生成一组试机号
    39. abstract protected static function doubleBalls($redRule,$blueRule,$range);
    40. }
    41. // 工作类: 抽奖(DrawLottery);用抽象类的子类去实现、访问
    42. class DrawLottery extends Lottery{
    43. //生成一个中奖号:6个红色球+1个蓝色球
    44. public static function doubleBall($redRule,$blueRule){
    45. //红色球规则:[1,33,6],1-33之间取随机6个数
    46. $redBalls=self::createBalls(...$redRule);
    47. sort($redBalls);//sort() 函数对数值数组进行升序排序
    48. //蓝色球规则:[1,16,1],1-16之间取随机1个数
    49. $blueBall=self::createBalls(...$blueRule);
    50. //红色+蓝色组成一个完整的中奖号
    51. //array_push() 向数组尾部插入一个或多个元素
    52. array_push($redBalls,$blueBall);//在$redBalls数组尾部添加一个值$blueBall
    53. //最终7个号码在$redBalls中
    54. return $redBalls;
    55. }
    56. //生成一组试机号
    57. public static function doubleBalls($redRule,$blueRule,$range){
    58. // 随机生成试机号的数量
    59. $count = self::getDrawId(...$range);
    60. $randBalls = [];
    61. for ($i = 0; $i < $count; $i++) {
    62. $randBalls[] = self::doubleBall($redRule, $blueRule);
    63. }
    64. // 返回最终生成一组开奖号
    65. return $randBalls;
    66. }
    67. }
    68. $draw = DrawLottery::doubleBall([1,33,6], [1,16,1]);
    69. // print_r($draw);
    70. $randBalls = DrawLottery::doubleBalls([1,33,6], [1,16,1],[1,6]);
    71. // print_r($randBalls);
    72. ?>
    73. <!DOCTYPE html>
    74. <html lang="en">
    75. <head>
    76. <meta charset="UTF-8">
    77. <meta name="viewport" content="width=device-width, initial-scale=1.0">
    78. <title>双色球开奖啦</title>
    79. <style>
    80. .container{
    81. display:grid;
    82. grid-template-columns:repeat(7,40px);
    83. gap:15px;
    84. margin-bottom:15px;
    85. }
    86. .container >span{
    87. width:30px;
    88. height:30px;
    89. border-radius:50%;
    90. color:#fff;
    91. font-weight:700;
    92. text-align:center;
    93. line-height:30px;
    94. }
    95. .container >span:nth-of-type(-n+6){
    96. background-color:red;
    97. }
    98. .container >span:last-of-type{
    99. background-color:blue;
    100. }
    101. </style>
    102. </head>
    103. <body>
    104. <h2>模拟双色球开奖</h2>
    105. <h3>今日开奖号码: <small><?php echo date('Y年m月d日 H:i:s', time()); ?></small></h3>
    106. <div class="container">
    107. <?php foreach ($draw as $item) :?>
    108. <span><?php echo $item ?></span>
    109. <?php endforeach ?>
    110. </div>
    111. <h3>今日试机号: </h3>
    112. <?php foreach ($randBalls as $draws) :?>
    113. <div class="container">
    114. <?php foreach ($draw as $item) :?>
    115. <span><?php echo $item ?></span>
    116. <?php endforeach ?>
    117. </div>
    118. <?php endforeach ?>
    119. </body>
    120. </html>

Correcting teacher:天蓬老师天蓬老师

Correction status:qualified

Teacher's comments:完成的不错, 如果不看源码, 能否自己写出来呢, 试试看
Statement of this Website
The copyright of this blog article belongs to the blogger. Please specify the address when reprinting! If there is any infringement or violation of the law, please contact admin@php.cn Report processing!
All comments Speak rationally on civilized internet, please comply with News Comment Service Agreement
0 comments
Author's latest blog post