博客列表 >PHP 21 文件上传(续)与分页操作(0731fri)

PHP 21 文件上传(续)与分页操作(0731fri)

老黑
老黑原创
2020年08月02日 20:21:23519浏览

主要内容:

  1. 文件上传的异常处理
  2. 将文件从临时目录移动到正式目录
  3. 批量上传文件
  4. 分页操作

1. 文件上传的异常处理

  1. <?php
  2. error_reporting(E_ALL);
  3. // $_FILES: 文件上传变量,超全局的变量数组, 保存着所有与文件上传的相关信息
  4. printf('<pre>%s</pre>', print_r($_FILES, true));
  5. // 自定义文件上传的异常处理类
  6. class UploadException extends Exception
  7. {
  8. public function __toString()
  9. {
  10. return <<< UPLOAD
  11. <table>
  12. <tr>
  13. <td>编号</td>
  14. <td>信息</td>
  15. <td>文件</td>
  16. <td>行号</td>
  17. </tr>
  18. <tr>
  19. <td>$this->code</td>
  20. <td>$this->message</td>
  21. <td>$this->file</td>
  22. <td>$this->line</td>
  23. </tr>
  24. </table>
  25. <style>
  26. table {border-collapse: collapse;border:1px solid black;text-align: center;}
  27. td {border:1px solid black;padding: 5px;}
  28. tr:first-of-type {background-color:#eee;}
  29. tr:last-of-type td {color: red;}
  30. </style>
  31. UPLOAD;
  32. }
  33. }
  34. try {
  35. // 对错误编码的判断
  36. $errorCode = $_FILES['my_pic']['error'] ?? null;
  37. // 使用系统常量进行判断
  38. if ($errorCode > UPLOAD_ERR_OK) { //也就是说大于0。
  39. switch ($errorCode) {
  40. case UPLOAD_ERR_INI_SIZE:
  41. throw new UploadException('上传的文件超过了 php.ini 中 upload_max_filesize 选项限制的值',1);
  42. break;
  43. case UPLOAD_ERR_FORM_SIZE:
  44. throw new UploadException('上传文件的大小超过了 HTML 表单中 MAX_FILE_SIZE 选项指定的值', 2);
  45. break;
  46. case UPLOAD_ERR_PARTIAL:
  47. throw new UploadException('文件只有部分被上传', 3);
  48. break;
  49. case UPLOAD_ERR_NO_FILE:
  50. throw new UploadException('没有文件被上传', 4);
  51. break;
  52. case UPLOAD_ERR_NO_TMP_DIR:
  53. throw new UploadException('找不到临时文件夹', 5);
  54. break;
  55. case UPLOAD_ERR_CANT_WRITE:
  56. throw new UploadException('文件写入失败', 6);
  57. break;
  58. default:
  59. // 测试时建议关掉default: 避免误报影响
  60. throw new UploadException('未知类型错误', 7);
  61. }
  62. }
  63. // 判断文件类型是否正确?
  64. $fileType = $_FILES['my_pic']['type'] ?? null;
  65. $type = strstr($fileType, '/', true); // "image"
  66. if (!is_null($fileType)) {
  67. if ($type !== 'image') throw new UploadException('文件类型错误', 8);
  68. }
  69. // 判断上传方式是否正确?
  70. // 临时文件名
  71. $tmplFileName = $_FILES['my_pic']['tmp_name'] ?? null;
  72. // 首先临时文件是存在的,并且必须是通过POST上传的
  73. if (!($tmplFileName && is_uploaded_file($tmplFileName))) throw new UploadException('上传类型错误', 9);
  74. } catch (UploadException $e) {
  75. echo $e;
  76. }
  77. ?>
  78. <!DOCTYPE html>
  79. <html lang="en">
  80. <head>
  81. <meta charset="UTF-8">
  82. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  83. <title>文件上传的异常处理</title>
  84. </head>
  85. <body>
  86. <form action="" method="POST" enctype="multipart/form-data">
  87. <fieldset>
  88. <legend>单文件上传</legend>
  89. <!-- 隐藏域设置上传文件大小,必须写到input:file之前 -->
  90. <input type="hidden" name="MAX_FILE_SIZE" value="38000">
  91. <input type="file" name="my_pic" id="">
  92. <button>上传</button>
  93. </fieldset>
  94. </form>
  95. </body>
  96. </html>

2. 将文件从临时目录移动到正式目录

  1. <?php
  2. error_reporting(E_ALL);
  3. // $_FILES: 文件上传变量,超全局的变量数组, 保存着所有与文件上传的相关信息
  4. printf('<pre>%s</pre>', print_r($_FILES, true));
  5. // 自定义文件上传的异常处理类
  6. class UploadException extends Exception
  7. {
  8. public function __toString()
  9. {
  10. return <<< UPLOAD
  11. <table>
  12. <tr>
  13. <td>编号</td>
  14. <td>信息</td>
  15. <td>文件</td>
  16. <td>行号</td>
  17. </tr>
  18. <tr>
  19. <td>$this->code</td>
  20. <td>$this->message</td>
  21. <td>$this->file</td>
  22. <td>$this->line</td>
  23. </tr>
  24. </table>
  25. <style>
  26. table {border-collapse: collapse;border:1px solid black;text-align: center;}
  27. td {border:1px solid black;padding: 5px;}
  28. tr:first-of-type {background-color:#eee;}
  29. tr:last-of-type td {color: red;}
  30. </style>
  31. UPLOAD;
  32. }
  33. }
  34. try {
  35. // 对错误编码的判断
  36. $errorCode = $_FILES['my_pic']['error'] ?? null;
  37. // 使用系统常量进行判断
  38. if ($errorCode > UPLOAD_ERR_OK) {
  39. switch ($errorCode) {
  40. case UPLOAD_ERR_INI_SIZE:
  41. throw new UploadException('上传的文件超过了 php.ini 中 upload_max_filesize 选项限制的值',1);
  42. break;
  43. case UPLOAD_ERR_FORM_SIZE:
  44. throw new UploadException('上传文件的大小超过了 HTML 表单中 MAX_FILE_SIZE 选项指定的值', 2);
  45. break;
  46. case UPLOAD_ERR_PARTIAL:
  47. throw new UploadException('文件只有部分被上传', 3);
  48. break;
  49. case UPLOAD_ERR_NO_FILE:
  50. throw new UploadException('没有文件被上传', 4);
  51. break;
  52. case UPLOAD_ERR_NO_TMP_DIR:
  53. throw new UploadException('找不到临时文件夹', 5);
  54. break;
  55. case UPLOAD_ERR_CANT_WRITE:
  56. throw new UploadException('文件写入失败', 6);
  57. break;
  58. default:
  59. // 测试时建议关掉default: 避免误报影响
  60. throw new UploadException('未知类型错误', 7);
  61. }
  62. }
  63. // 判断文件类型是否正确?
  64. $fileType = $_FILES['my_pic']['type'] ?? null;
  65. $type = strstr($fileType, '/', true); // "image"
  66. if (!is_null($fileType)) {
  67. if ($type !== 'image') throw new UploadException('文件类型错误', 8);
  68. }
  69. // 判断上传方式是否正确?
  70. // 临时文件名
  71. $tmplFileName = $_FILES['my_pic']['tmp_name'] ?? null;
  72. // 1. 首先临时文件是存在的,并且必须是通过POST上传的
  73. if ($tmplFileName && is_uploaded_file($tmplFileName)) {
  74. // 2. 将文件从临时目录移动到目标目录中: uploads/
  75. // move_uploaded_file(临时文件, 目标文件名)
  76. // 原始文件名
  77. $originalFileName = $_FILES['my_pic']['name'] ?? null;
  78. // echo strstr($originalFileName, '.'); //显示扩展名
  79. // 目标文件名,用时间加盐,然后加载一个随机数,再用md5生成加密字符串作为文件名。
  80. // 这样同一文件多次上传也不会覆盖,而是生成新的。
  81. $destFileName = 'uploads/' . md5(time(). mt_rand(1,1000)) .strstr($originalFileName, '.');
  82. if (move_uploaded_file($tmplFileName, $destFileName)) {
  83. echo '<p>'. $_FILES['my_pic']['name'].': 上传成功</p>';
  84. // 预览图片
  85. echo "<img src='{$destFileName}' width='200'>";
  86. }
  87. }
  88. } catch (UploadException $e) {
  89. echo $e;
  90. }
  91. ?>
  92. <!DOCTYPE html>
  93. <html lang="en">
  94. <head>
  95. <meta charset="UTF-8">
  96. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  97. <title>将文件从临时目录移动到正式目录中</title>
  98. </head>
  99. <body>
  100. <form action="" method="POST" enctype="multipart/form-data">
  101. <fieldset>
  102. <legend>单文件上传</legend>
  103. <!-- 隐藏域设置上传文件大小,必须写到input:file之前 -->
  104. <!-- <input type="hidden" name="MAX_FILE_SIZE" value="38000"> -->
  105. <input type="file" name="my_pic" id="">
  106. <button>上传</button>
  107. </fieldset>
  108. </form>
  109. </body>
  110. </html>

3. 批量上传文件

  1. <?php
  2. error_reporting(E_ALL);
  3. printf('<pre>%s</pre>', print_r($_FILES, true));
  4. // 异常处理, 错误处理,这里省略...
  5. foreach ($_FILES as $file) {
  6. // print_r($file);
  7. // 判断 $file['error'] 是否为0,如果为0表示上传成功
  8. if ($file['error'] === 0) {
  9. $destFileName = 'uploads/' . md5(time(). mt_rand(1,1000)) .strstr($file['name'], '.');
  10. if (move_uploaded_file($file['tmp_name'], $destFileName)) {
  11. echo '<p>'. $file['name'].': 上传成功</p>';
  12. // 预览图片
  13. echo "<img src='{$destFileName}' width='200'>";
  14. }
  15. }
  16. }
  17. ?>
  18. <!DOCTYPE html>
  19. <html lang="en">
  20. <head>
  21. <meta charset="UTF-8">
  22. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  23. <title>多文件上传</title>
  24. </head>
  25. <body>
  26. <form action="" method="POST" enctype="multipart/form-data">
  27. <fieldset>
  28. <legend>批量上传文件</legend>
  29. <!-- 隐藏域设置上传文件大小,必须写到input:file之前 -->
  30. <!-- <input type="hidden" name="MAX_FILE_SIZE" value="38000"> -->
  31. <input type="file" name="my_pic1" id="">
  32. <input type="file" name="my_pic2" id="">
  33. <input type="file" name="my_pic3" id="">
  34. <button>上传</button>
  35. </fieldset>
  36. </form>
  37. </body>
  38. </html>

4. 分页操作

4-1. 基本知识: 分页原理

4-1-1. 术语
  1. 记录索引: 记录在表中的位置,从 0 开始编号(与主键的值无关)
  2. 偏移量: 每页显示的索引距离起始索引 0 的相对位置
  3. 显示数量: 每页的显示记录的条数
  1. SELECT * FROM `users` 每页的数量 显示的偏移量
  2. -- 每页的数量: LIMIT n
  3. -- 显示的偏移量: 从哪个索引开始显示 OFFSET m
  4. # 从第1页开始显示5条
  5. SELECT * FROM `users` LIMIT 5 OFFSET 0;
  6. -- (1-1)*5 = 0
  7. # 第二页,从索引5开始显示
  8. SELECT * FROM `users` LIMIT 5 OFFSET 5;
  9. -- (2-1)*5 = 5
  10. # 第3页,从索引10开始,即偏移量为10, 偏移量从第一条记录的索引开始计数
  11. SELECT * FROM `users` LIMIT 5 OFFSET 10;
  12. -- (3-1)*5 = 10
  • 分页的时候,一定会提供当前的页数,还有就是每一页的显示的记录数量
  • 而偏移量是动态变量的变量,随页数不同而发生变化
4-1-2. 计算偏移量
  • 偏移量 = (页码 -1) * 每页的显示数量
  • offset = (page - 1) * num

4-2. 操作

  • 先建立一个connect.php文件
  1. <?php
  2. // 连接数据库
  3. // PDO连接对象
  4. $pdo = new PDO('mysql:host=localhost;dbname=phpedu', 'root', 'root');
  5. // 设置结果默认获取方式: 关联数组
  6. $pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);

  • 然后开始操作分页
  1. <?php
  2. // 连接数据库
  3. require 'connect.php';
  4. // 获取分页数据, 一定要知道的二个数据
  5. // 1. 每页显示的数量
  6. $num = 5;
  7. // 2. 当前页码,默认为1
  8. $page = $_GET['p'] ?? 1;
  9. // 3. 计算每一页的第一条记录的显示偏移量(每页展示量)
  10. $offset = ($page - 1) * $num;
  11. // 4. 获取分页数据
  12. // SElECT * FROM `table_name `LIMIT n OFFSET m;
  13. $sql = "SELECT * FROM `users` LIMIT {$num} OFFSET {$offset}";
  14. // 简写
  15. // $sql = "SELECT * FROM `users` LIMIT {$offset}, {$num}";
  16. $users = $pdo->query($sql)->fetchAll();
  17. // print_r($users);
  18. // 计算总页数

  • 分页展示的结果html
  1. <?php require 'demo4.php' ?>
  2. <!DOCTYPE html>
  3. <html lang="en">
  4. <head>
  5. <meta charset="UTF-8">
  6. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  7. <title>数据展示</title>
  8. <link rel="stylesheet" href="style.css">
  9. </head>
  10. <body>
  11. <table>
  12. <caption>用户信息表</caption>
  13. <thead>
  14. <tr>
  15. <td>id</td>
  16. <td>name</td>
  17. <td>email</td>
  18. <td>操作</td>
  19. </tr>
  20. </thead>
  21. <tbody>
  22. <?php foreach ($users as $user):?>
  23. <tr>
  24. <!-- 短标签来简化变量的显示 -->
  25. <td><?=$user['id']?></td>
  26. <td><?php echo $user['name'] ?></td>
  27. <td><?=$user['email']?></td>
  28. <td><button>编辑</button><button>删除</button></td>
  29. </tr>
  30. <?php endforeach ?>
  31. </tbody>
  32. </table>
  33. </body>
  34. </html>
  • css文件部分
  1. * {
  2. margin: 0;
  3. padding: 0;
  4. box-sizing: border-box;
  5. color: #555;
  6. }
  7. body {
  8. display: flex;
  9. flex-direction: column;
  10. align-items: center;
  11. }
  12. /*表格样式*/
  13. table {
  14. width: 80%;
  15. border: 1px solid;
  16. border-collapse: collapse;
  17. text-align: center;
  18. }
  19. table caption {
  20. font-size: 1.2rem;
  21. margin: 10px;
  22. }
  23. table td,
  24. table th {
  25. border: 1px solid;
  26. padding: 5px;
  27. }
  28. table tr:hover {
  29. background-color: #eee;
  30. }
  31. table thead tr:only-of-type {
  32. background-color: lightblue;
  33. }
  34. table button {
  35. width: 56px;
  36. height: 26px;
  37. }
  38. table button:last-of-type {
  39. color: red;
  40. }
  41. table button {
  42. cursor: pointer;
  43. margin: 0 3px;
  44. }
  45. /*分页条样式*/
  46. body > p {
  47. display: flex;
  48. }
  49. p > a {
  50. text-decoration: none;
  51. color: #555;
  52. border: 1px solid;
  53. padding: 5px 10px;
  54. margin: 10px 2px;
  55. }
  56. .active {
  57. background-color: red;
  58. color: white;
  59. border: 1px solid red;
  60. }

5. 作业实战

  • 单文件上传
  1. <?php
  2. /*
  3. 1. 实现单文件上传,要求自定义异常类来处理常见错误
  4. 2. 将demo3.php中的文件批量上传中缺失的异常处理, 文件类型处理等操作补齐
  5. 附加/选做: 封装一个文件上传类,可同时处理单文件与多文件上传
  6. */
  7. error_reporting(E_ALL);
  8. printf('<pre>%s</pre>',print_r($_FILES, true));
  9. class UploadEcpt extends Exception
  10. {
  11. public function __toString()
  12. //__toString应该是Exception中唯一可以进行访问的功能
  13. {
  14. return <<< UPLOAD
  15. <table>
  16. <tr>
  17. <td>编号</td>
  18. <td>信息</td>
  19. <td>文件</td>
  20. <td>line</td>
  21. </tr>
  22. <tr>
  23. <td>$this->code</td>
  24. <td>$this->message</td>
  25. <td>$this->file</td>
  26. <td>$this->line</td>
  27. </tr>
  28. <style>
  29. table {border-collapse:collapse;border:1px solid yellow;
  30. text-align:center;}
  31. td {border: 1px solid black; padding:5px;}
  32. tr: first-of-type {background-color:#eee;}
  33. tr: last-of-type td {color:red;}
  34. </style>
  35. </table>
  36. UPLOAD;
  37. }
  38. }
  39. $errorCode = $_FILES['my_file']['error']?? null;
  40. //下面这块的内容简化到$errorCode中。这个是学老周的方法
  41. $fileType = $_FILES['my_file']['type']?? null;
  42. $type = strstr($fileType, '/', true);
  43. $tmpFileName = $_FILES['my_file']['tmp_name']?? null;
  44. if (!is_null($fileType) && $type !== 'image') $errorCode = 8;
  45. if (!$tmpFileName && is_uploaded_file($tmpFileName)) $errorCode = 9;
  46. try {
  47. if ($errorCode > 0) {
  48. switch($errorCode){
  49. case 1: throw new UploadEcpt("文件超过php.ini限制值",1); break;
  50. case 2: throw new UploadEcpt("文件超过表单限定值",2); break;
  51. case 3: throw new UploadEcpt("文件只有部分被上传",3); break;
  52. case 4: throw new UploadEcpt("没有文件被上传",4); break;
  53. case 5: throw new UploadEcpt("",5); break;
  54. case 6: throw new UploadEcpt("找不到临时文件夹",6); break;
  55. case 7: throw new UploadEcpt("文件写入失败",7); break;
  56. case 8: throw new UploadEcpt("文件类型出错",8); break;
  57. case 9: throw new UploadEcpt("上传方式不是POST",9); break;
  58. default: throw new UploadEcpt("未知类型错误",77);
  59. }
  60. }
  61. } catch (UploadEcpt $e){
  62. echo $e;
  63. }
  64. ?>
  65. <html lang="en">
  66. <head>
  67. <meta charset="UTF-8">
  68. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  69. <title>文件上传</title>
  70. </head>
  71. <body>
  72. <form action="" method="POST" enctype="multipart/form-data">
  73. <fieldset>
  74. <legend>单文件上传</legend>
  75. <input type="hidden" name="max_file_siez" value="4000">
  76. <input type="file" name="my_file" id="">
  77. <button>上传</button>
  78. </fieldset>
  79. </form>
  80. </body>
  81. </html>
  • 多文件上传下的异常报错
  1. <?php
  2. error_reporting(E_ALL);
  3. printf('<pre>%s</pre>', print_r($_FILES, true));
  4. class UploadEcpt extends Exception
  5. {
  6. public function __toString()
  7. {
  8. return <<< UPLOAD
  9. <table>
  10. <tr>
  11. <td>编号</td>
  12. <td>信息</td>
  13. <td>文件</td>
  14. <td>line</td>
  15. </tr>
  16. <tr>
  17. <td>$this->code</td>
  18. <td>$this->message</td>
  19. <td>$this->file</td>
  20. <td>$this->line</td>
  21. </tr>
  22. <style>
  23. table {border-collapse:collapse;border:1px solid yellow;
  24. text-align:center;}
  25. td {border: 1px solid black; padding:5px;}
  26. tr: first-of-type {background-color:#eee;}
  27. tr: last-of-type td {color:red;}
  28. </style>
  29. </table>
  30. UPLOAD;
  31. }
  32. }
  33. try {
  34. foreach ($_FILES as $FILE) {
  35. $errorCode = $FILE['error']?? null;
  36. $fileType = $FILE['type']?? null;
  37. $type = strstr($fileType, '/', true);
  38. $tmpFileName = $FILE['tmp_name']?? null;
  39. if (!is_null($fileType) && $type !== 'image') $errorCode = 8;
  40. if (!($tmpFileName && is_uploaded_file($tmpFileName))) $errorCode = 9;
  41. switch($errorCode){
  42. case 1: throw new UploadEcpt("文件超过php.ini限制值",1); break;
  43. case 2: throw new UploadEcpt("文件超过表单限定值",2); break;
  44. case 3: throw new UploadEcpt("文件只有部分被上传",3); break;
  45. case 4: throw new UploadEcpt("没有文件被上传",4); break;
  46. case 5: throw new UploadEcpt("",5); break;
  47. case 6: throw new UploadEcpt("找不到临时文件夹",6); break;
  48. case 7: throw new UploadEcpt("文件写入失败",7); break;
  49. case 8: throw new UploadEcpt("文件类型出错",8); break;
  50. case 9: throw new UploadEcpt("上传方式不是POST",9); break;
  51. case 0:
  52. $destFileName = 'uploads/' . md5(time(). mt_rand(1,1000)) .strstr($FILE['name'], '.');
  53. if (move_uploaded_file($FILE['tmp_name'], $destFileName)) {
  54. echo '<p>'. $FILE['name'].': 上传成功</p>';
  55. echo "<img src='{$destFileName}' width='200'>";}
  56. break;
  57. default: throw new UploadEcpt("未知类型错误",77);
  58. }
  59. // 下面这段按照老周的方式赋值到了$errorCode中(line)。
  60. // $fileType = $FILE['type']?? null;
  61. // $type = strstr($fileType, '/', true);
  62. // if (!is_null($fileType)) {
  63. // if ($type !== 'image') throw new UploadEcpt('文件类型出错',8);
  64. // }
  65. // $tmpFileName = $FILE['tmp_name']?? null;
  66. // if (!($tmpFileName && is_uploaded_file($tmpFileName)))
  67. // throw new UploadEcpt('上传方式不是POST',9);
  68. }} catch (UploadEcpt $e){
  69. echo $e;
  70. }
  71. // 这段也放入到了上面的switch中。
  72. // foreach ($_FILES as $file) {
  73. // // print_r($file);
  74. // // 判断 $file['error'] 是否为0,如果为0表示上传成功
  75. // if ($file['error'] === 0) {
  76. // $destFileName = 'uploads/' . md5(time(). mt_rand(1,1000)) .strstr($file['name'], '.');
  77. // if (move_uploaded_file($file['tmp_name'], $destFileName)) {
  78. // echo '<p>'. $file['name'].': 上传成功</p>';
  79. // // 预览图片
  80. // echo "<img src='{$destFileName}' width='200'>";
  81. // }
  82. // }
  83. // }
  84. ?>
  85. <!DOCTYPE html>
  86. <html lang="en">
  87. <head>
  88. <meta charset="UTF-8">
  89. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  90. <title>多文件上传</title>
  91. </head>
  92. <body>
  93. <form action="" method="POST" enctype="multipart/form-data">
  94. <fieldset>
  95. <legend>批量上传文件</legend>
  96. <input type="hidden" name="MAX_FILE_SIZE" value="3800000">
  97. <input type="file" name="my_file1" id="">
  98. <input type="file" name="my_file2" id="">
  99. <input type="file" name="my_file3" id="">
  100. <button>上传</button>
  101. </fieldset>
  102. </form>
  103. </body>
  104. </html>
  • 分页显示的文件1
  1. <?php
  2. require 'myconnect.php';
  3. $numPerPage = 8;
  4. $pageNum = $_GET['p']?? 1;
  5. $offset = ($pageNum-1) * $numPerPage;
  6. $sql = "SELECT * FROM `shao` LIMIT {$offset}, {$numPerPage}";
  7. $items = $pdo->query($sql)->fetchAll();
  8. // print_r($items);
  • 文件2
  1. <?php require 'my1.php' ?>
  2. <!DOCTYPE html>
  3. <html lang="en">
  4. <head>
  5. <meta charset="UTF-8">
  6. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  7. <title>SHAO's Items</title>
  8. <link rel="stylesheet" href="style.css">
  9. </head>
  10. <body>
  11. <table>
  12. <caption>邵恒头条</caption>
  13. <thead>
  14. <tr>
  15. <td>id</td>
  16. <td>date</td>
  17. <td>title</td>
  18. <td>tags</td>
  19. <td>action</td>
  20. </tr>
  21. </thead>
  22. <tbody>
  23. <?php foreach ($items as $item):?>
  24. <tr>
  25. <!-- 短标签来简化变量的显示 -->
  26. <td><?=$item['id']?></td>
  27. <td><?=$item['date']?></td>
  28. <td><?=$item['title']?></td>
  29. <td><?=$item['label']?></td>
  30. <td><button>编辑</button><button>删除</button></td>
  31. </tr>
  32. <?php endforeach ?>
  33. </tbody>
  34. </table>
  35. </body>
  36. </html>

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