0

0

PHP 动态表格选择与数据持久化教程

心靈之曲

心靈之曲

发布时间:2025-09-18 13:13:13

|

792人浏览过

|

来源于php中文网

原创

PHP 动态表格选择与数据持久化教程

本教程详细阐述了如何在 PHP 应用中实现动态数据库表格的选择、显示与数据提交。核心内容包括通过会话管理($_SESSION)持久化用户选择的表格状态,确保在表单提交后表格依然保持显示,并指导如何安全地将数据插入到动态选定的表格中,避免状态丢失和 SQL 注入等常见问题

1. 理解问题核心:状态丢失与数据提交失败

在开发动态 web 应用时,用户选择和数据提交是常见交互。本案例中,用户期望通过下拉菜单选择一个数据库表进行显示,并在该表对应的表单中提交数据。然而,实际操作中出现了两个主要问题:

  1. 表格选择状态丢失: 当用户在数据提交表单中点击“提交”后,之前选择的表格不再显示,下拉菜单也恢复到默认状态。
  2. 数据提交失败: 提交的数据未能成功添加到选定的数据库表中。

这两个问题根源在于 PHP 会话管理的不当以及表单处理逻辑的缺陷。

1.1 body.php 中的会话管理缺陷

原始的 body.php 代码片段如下:

// ...
session_start();
include 'get.php'; 
$_SESSION["dbselect"] = filter_input(INPUT_POST, 'dbselect', FILTER_SANITIZE_STRING);                               
if ($_SESSION["dbselect"] == "messages") {
    dbMessages("*");
    include 'Forms/contact_form.php';
}
if ($_SESSION["dbselect"] == "messages2") {
    dbMessages2("*");
}
// ...

问题在于 $_SESSION["dbselect"] = filter_input(INPUT_POST, 'dbselect', FILTER_SANITIZE_STRING); 这一行。它在每次页面加载时都会无条件执行。当用户提交 数据输入表单 时,$_POST['dbselect'] 将不存在,导致 filter_input 返回 NULL 或空字符串,从而覆盖了之前存储在 $_SESSION["dbselect"] 中的正确表格选择。结果就是,页面刷新后 $_SESSION["dbselect"] 失去其值,表格不再显示。

此外,FILTER_SANITIZE_STRING 过滤器在 PHP 8.1.0 版本中已被弃用,不应再使用。

立即学习PHP免费学习笔记(深入)”;

1.2 contact_form.php 的表单行为与硬编码

原始的 contact_form.php 代码片段如下:

// ...
// ... $query = "insert into messages(ID, name, email, phone, message) values (NULL, '$txtName', '$txtEmail', '$txtPhone', '$txtMessage')"; // ...

这里存在两个问题:

  1. 表单 action 属性: action="index.php?send=1" 意味着数据提交表单会将数据发送到 index.php,而不是当前处理 body.php 的页面。这使得 body.php 无法直接处理数据提交,也无法在提交后保持表格显示状态。理想情况下,表单应该提交回当前页面,以便 body.php 能够重新渲染并保持状态。
  2. 硬编码表名: 插入数据的 SQL 查询 insert into messages(...) 硬编码了 messages 表。这意味着即使 body.php 成功选择了 messages2 表,contact_form.php 仍然会尝试向 messages 表插入数据。它需要能够动态地根据用户选择的表进行插入。
  3. SQL 注入风险: 直接将 $_POST 数据拼接到 SQL 查询字符串中,存在严重的安全漏洞,容易遭受 SQL 注入攻击。

2. 解决方案:优化会话管理与动态表操作

为了解决上述问题,我们需要对 body.php 和 contact_form.php 进行关键性修改。

2.1 确保会话状态持久化 (body.php 改进)

核心思想是只有当用户明确通过下拉菜单提交了表格选择时,才更新 $_SESSION["dbselect"]。

iWebShop开源商城系统
iWebShop开源商城系统

iWebShop是一款基于PHP语言及MYSQL数据库开发的B2B2C多用户开源免费的商城系统,系统支持自营和多商家入驻、集成微信商城、手机商城、移动端APP商城、三级分销、视频电商直播、微信小程序等于一体,它可以承载大数据量且性能优良,还可以跨平台,界面美观功能丰富是电商建站首选源码。iWebShop开源商城系统 v5.14 更新日志:新增商品编辑页面规格图片上传优化商品详情页面规格图片与主图切

下载





Contact Form - PHP/MySQL Demo Code





    

修改说明:

  • session_start(); 必须在任何 HTML 输出之前调用。
  • if (isset($_POST["dbselect"])) { ... } 确保 $_SESSION["dbselect"] 仅在表格选择表单提交时才被更新。
  • $selected_table = $_SESSION["dbselect"] ?? ''; 使用空合并运算符为 $selected_table 提供默认值,避免未定义索引错误。
  • dbselect 的值直接来自预定义的

2.2 实现动态数据插入 (contact_form.php 改进)

为了让 contact_form.php 能够动态地向选定的表插入数据,并确保数据提交后状态不丢失,我们需要进行以下调整:

  1. 获取动态表名: 从 $_SESSION["dbselect"] 中读取目标表名。
  2. 修正表单 action: 将表单提交目标指向 body.php 自身,以便 body.php 能够处理数据并重新渲染页面。
  3. 使用预处理语句: 这是防止 SQL 注入的关键措施。
  4. 数据清理和验证: 对用户输入进行适当的清理和验证。
此表单仅适用于 'messages' 表。

"; return; // 停止执行,不显示表单 } if (isset($_POST["Submit"])) { // 检查所有必填字段是否都已提交且不为空 if (!empty($_POST["txtName"]) && !empty($_POST["txtPhone"]) && !empty($_POST["txtEmail"]) && !empty($_POST["txtMessage"])) { // 使用 mysqli_real_escape_string (不推荐,但比直接拼接好,最佳是预处理) // 更好的方法是使用预处理语句,如下所示 $txtName = htmlspecialchars($_POST['txtName']); $txtEmail = htmlspecialchars($_POST['txtEmail']); $txtPhone = htmlspecialchars($_POST['txtPhone']); $txtMessage = htmlspecialchars($_POST['txtMessage']); // 准备 SQL 插入语句 - 使用预处理语句防止 SQL 注入 $stmt = mysqli_prepare($conn, "INSERT INTO " . $targetTable . "(name, email, phone, message) VALUES (?, ?, ?, ?)"); if ($stmt) { // 绑定参数 mysqli_stmt_bind_param($stmt, "ssss", $txtName, $txtEmail, $txtPhone, $txtMessage); // 执行语句 if (mysqli_stmt_execute($stmt)) { echo "

数据已成功添加到 " . htmlspecialchars($targetTable) . " 表。

"; } else { echo "

数据添加失败: " . mysqli_error($conn) . "

"; } // 关闭语句 mysqli_stmt_close($stmt); } else { echo "

SQL 预处理失败: " . mysqli_error($conn) . "

"; } } else { echo "

请填写所有必填字段。

"; } // 清除 POST 数据,防止刷新重复提交 // unset($_POST); // 不推荐直接 unset $_POST,因为可能影响其他逻辑 // 更好的做法是重定向到当前页面,但这里我们只是刷新显示 // 刷新页面以显示更新后的数据,并确保表格选择状态保持 echo ""; exit; // 确保在重定向后停止执行 } // 如果是 GET 请求或提交失败,显示表单 echo '
Contact Form

'; // 数据库连接在处理完请求后关闭 mysqli_close($conn); ?>

修改说明:

  • $targetTable = $_SESSION["dbselect"] ?? ''; 从会话中安全地获取目标表名。
  • 添加了 $targetTable !== 'messages' 的检查,以符合原问题中“contact_form.php 文件仅用于第一个表,messages”的说明。
  • 表单 action 已更改为 action="' . htmlspecialchars($_SERVER['PHP_SELF']) . '",确保表单提交回当前页面 (body.php)。
  • 关键: 使用 mysqli_prepare() 和 mysqli_stmt_bind_param() 实现预处理语句,有效防止 SQL 注入。
  • 对用户输入数据使用 htmlspecialchars() 进行 HTML 转义,防止 XSS 攻击。
  • 在成功提交后,使用 echo ""; exit; 进行页面刷新并重定向,确保 $_POST 数据被清除,防止用户刷新页面导致重复提交,同时让 body.php 重新渲染以显示更新后的表格数据。
  • 在表单字段中添加 value 属性,以便在提交失败时保留用户输入。

2.3 get.php 和 db.php

get.php 负责从数据库获取并显示数据,db.php 负责数据库连接。这两个文件在原始代码中似乎工作正常,但为了完整性,这里提供一个简化的 db.php 示例和 get.php 的关键部分。

db.php 示例:

get.php 关键部分:

没有数据可显示。

"; return; } $output = ""; $header_printed = false; while ($row = mysqli_fetch_assoc($result)) { if (!$header_printed) { $output .= ''; foreach ($row as $col => $val) { $output .= "'; } $output .= ''; $header_printed = true; } $output .= ''; foreach ($row as $col => $val) { $output .= ''; } $output .= ''; } $output .= '
" . htmlspecialchars($col) . '
' . htmlspecialchars($val) . '
'; echo $output; mysqli_free_result($result); // 释放结果集 } function dbMessages($selector) { include 'db.php'; // 确保每次函数调用都能获取到 $conn $query = "SELECT $selector FROM messages"; $res = mysqli_query($conn, $query); if ($res) { display_data($res); } else { echo "

查询 'messages' 表失败: " . mysqli_error($conn) . "

"; } // mysqli_close($conn); // 不在此处关闭,因为可能其他函数还需要 $conn } function dbMessages2($selector) { include 'db.php

相关文章

PHP速学教程(入门到精通)
PHP速学教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
数据分析工具有哪些
数据分析工具有哪些

数据分析工具有Excel、SQL、Python、R、Tableau、Power BI、SAS、SPSS和MATLAB等。详细介绍:1、Excel,具有强大的计算和数据处理功能;2、SQL,可以进行数据查询、过滤、排序、聚合等操作;3、Python,拥有丰富的数据分析库;4、R,拥有丰富的统计分析库和图形库;5、Tableau,提供了直观易用的用户界面等等。

707

2023.10.12

SQL中distinct的用法
SQL中distinct的用法

SQL中distinct的语法是“SELECT DISTINCT column1, column2,...,FROM table_name;”。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

327

2023.10.27

SQL中months_between使用方法
SQL中months_between使用方法

在SQL中,MONTHS_BETWEEN 是一个常见的函数,用于计算两个日期之间的月份差。想了解更多SQL的相关内容,可以阅读本专题下面的文章。

350

2024.02.23

SQL出现5120错误解决方法
SQL出现5120错误解决方法

SQL Server错误5120是由于没有足够的权限来访问或操作指定的数据库或文件引起的。想了解更多sql错误的相关内容,可以阅读本专题下面的文章。

1221

2024.03.06

sql procedure语法错误解决方法
sql procedure语法错误解决方法

sql procedure语法错误解决办法:1、仔细检查错误消息;2、检查语法规则;3、检查括号和引号;4、检查变量和参数;5、检查关键字和函数;6、逐步调试;7、参考文档和示例。想了解更多语法错误的相关内容,可以阅读本专题下面的文章。

360

2024.03.06

oracle数据库运行sql方法
oracle数据库运行sql方法

运行sql步骤包括:打开sql plus工具并连接到数据库。在提示符下输入sql语句。按enter键运行该语句。查看结果,错误消息或退出sql plus。想了解更多oracle数据库的相关内容,可以阅读本专题下面的文章。

819

2024.04.07

sql中where的含义
sql中where的含义

sql中where子句用于从表中过滤数据,它基于指定条件选择特定的行。想了解更多where的相关内容,可以阅读本专题下面的文章。

581

2024.04.29

sql中删除表的语句是什么
sql中删除表的语句是什么

sql中用于删除表的语句是drop table。语法为drop table table_name;该语句将永久删除指定表的表和数据。想了解更多sql的相关内容,可以阅读本专题下面的文章。

423

2024.04.29

Python 自然语言处理(NLP)基础与实战
Python 自然语言处理(NLP)基础与实战

本专题系统讲解 Python 在自然语言处理(NLP)领域的基础方法与实战应用,涵盖文本预处理(分词、去停用词)、词性标注、命名实体识别、关键词提取、情感分析,以及常用 NLP 库(NLTK、spaCy)的核心用法。通过真实文本案例,帮助学习者掌握 使用 Python 进行文本分析与语言数据处理的完整流程,适用于内容分析、舆情监测与智能文本应用场景。

10

2026.01.27

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
MySQL 教程
MySQL 教程

共48课时 | 1.9万人学习

MySQL 初学入门(mosh老师)
MySQL 初学入门(mosh老师)

共3课时 | 0.3万人学习

简单聊聊mysql8与网络通信
简单聊聊mysql8与网络通信

共1课时 | 812人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

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