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

相关专题

更多
php文件怎么打开
php文件怎么打开

打开php文件步骤:1、选择文本编辑器;2、在选择的文本编辑器中,创建一个新的文件,并将其保存为.php文件;3、在创建的PHP文件中,编写PHP代码;4、要在本地计算机上运行PHP文件,需要设置一个服务器环境;5、安装服务器环境后,需要将PHP文件放入服务器目录中;6、一旦将PHP文件放入服务器目录中,就可以通过浏览器来运行它。

2707

2023.09.01

php怎么取出数组的前几个元素
php怎么取出数组的前几个元素

取出php数组的前几个元素的方法有使用array_slice()函数、使用array_splice()函数、使用循环遍历、使用array_slice()函数和array_values()函数等。本专题为大家提供php数组相关的文章、下载、课程内容,供大家免费下载体验。

1668

2023.10.11

php反序列化失败怎么办
php反序列化失败怎么办

php反序列化失败的解决办法检查序列化数据。检查类定义、检查错误日志、更新PHP版本和应用安全措施等。本专题为大家提供php反序列化相关的文章、下载、课程内容,供大家免费下载体验。

1527

2023.10.11

php怎么连接mssql数据库
php怎么连接mssql数据库

连接方法:1、通过mssql_系列函数;2、通过sqlsrv_系列函数;3、通过odbc方式连接;4、通过PDO方式;5、通过COM方式连接。想了解php怎么连接mssql数据库的详细内容,可以访问下面的文章。

974

2023.10.23

php连接mssql数据库的方法
php连接mssql数据库的方法

php连接mssql数据库的方法有使用PHP的MSSQL扩展、使用PDO等。想了解更多php连接mssql数据库相关内容,可以阅读本专题下面的文章。

1444

2023.10.23

html怎么上传
html怎么上传

html通过使用HTML表单、JavaScript和PHP上传。更多关于html的问题详细请看本专题下面的文章。php中文网欢迎大家前来学习。

1235

2023.11.03

PHP出现乱码怎么解决
PHP出现乱码怎么解决

PHP出现乱码可以通过修改PHP文件头部的字符编码设置、检查PHP文件的编码格式、检查数据库连接设置和检查HTML页面的字符编码设置来解决。更多关于php乱码的问题详情请看本专题下面的文章。php中文网欢迎大家前来学习。

1529

2023.11.09

php文件怎么在手机上打开
php文件怎么在手机上打开

php文件在手机上打开需要在手机上搭建一个能够运行php的服务器环境,并将php文件上传到服务器上。再在手机上的浏览器中输入服务器的IP地址或域名,加上php文件的路径,即可打开php文件并查看其内容。更多关于php相关问题,详情请看本专题下面的文章。php中文网欢迎大家前来学习。

1307

2023.11.13

Python GraphQL API 开发实战
Python GraphQL API 开发实战

本专题系统讲解 Python 在 GraphQL API 开发中的实际应用,涵盖 GraphQL 基础概念、Schema 设计、Query 与 Mutation 实现、权限控制、分页与性能优化,以及与现有 REST 服务和数据库的整合方式。通过完整示例,帮助学习者掌握 使用 Python 构建高扩展性、前后端协作友好的 GraphQL 接口服务,适用于中大型应用与复杂数据查询场景。

1

2026.01.21

热门下载

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

精品课程

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

共48课时 | 1.8万人学习

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

共3课时 | 0.3万人学习

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

共1课时 | 804人学习

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

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