PHP数据库操作故障:创建表后无法插入数据(变量未获取)
问题分析与解决方案
你遇到的核心问题是PHP的无状态特性导致$save变量在第二次请求时丢失,同时代码缺少错误检测和存在SQL注入风险,下面一步步帮你解决:
1. 为什么无法获取变量?
PHP是无状态的,当你提交第一个表单创建数据表后,$save变量只在那次HTTP请求中有效。当你提交第二个表单时,这是一个全新的请求,之前的$save已经被销毁了,所以插入SQL里的表名是空的,自然无法插入数据。
2. 修复步骤
步骤1:使用Session保存表名
我们可以用PHP Session来存储创建好的表名,这样在后续请求中能获取到它。记得要在脚本最开头调用session_start()。
步骤2:添加错误检测
每次执行SQL语句后,都要检查是否执行成功,并用mysqli_error($con)输出错误信息,方便排查问题。
步骤3:避免SQL注入风险
直接将用户输入拼接到SQL语句中会导致严重的安全问题,必须使用预处理语句来处理数据库操作。
修改后的完整代码
<?php session_start(); // 开启Session $con = mysqli_connect('localhost', 'root', 'adminadmin', 'votes'); // 检查数据库连接是否成功 if (!$con) { die("数据库连接失败: " . mysqli_connect_error()); } // 创建数据表的逻辑 if (isset($_POST['save'])) { $cate = $_POST['cate']; // 过滤表名,只允许字母、数字和下划线,避免恶意输入 $safeTableName = preg_replace("/[^a-zA-Z0-9_]/", "", $cate); if (empty($safeTableName)) { die("表名格式不合法,仅支持字母、数字和下划线"); } $tl = "CREATE TABLE $safeTableName (id INT NOT NULL PRIMARY KEY auto_increment, name varchar(60) NOT NULL, category varchar(60) NOT NULL)"; if (mysqli_query($con, $tl)) { $_SESSION['current_table'] = $safeTableName; // 把合法表名存到Session echo "数据表创建成功"; } else { echo "创建表失败: " . mysqli_error($con); } } // 插入数据的逻辑 if (isset($_POST['submit'])) { // 先检查Session里是否存在有效的表名 if (!isset($_SESSION['current_table']) || empty($_SESSION['current_table'])) { die("请先创建数据表"); } $currentTable = $_SESSION['current_table']; $name = $_POST['name']; $cate = $_POST['categ']; // 使用预处理语句插入数据,彻底避免SQL注入 $sql = "INSERT INTO $currentTable (name, category) VALUES (?, ?)"; $stmt = mysqli_prepare($con, $sql); mysqli_stmt_bind_param($stmt, "ss", $name, $cate); // "ss"表示两个字符串类型的参数 if (mysqli_stmt_execute($stmt)) { echo "数据插入成功"; } else { echo "插入数据失败: " . mysqli_error($con); } mysqli_stmt_close($stmt); } mysqli_close($con); ?> <form method="POST" action="try.php"> <label>Enter category</label> <input type="text" name="cate" required> <button type="submit" name="save">save</button> </form> <form method="POST" action="try.php"> <label>Enter name</label> <input type="text" name="name" required> <label>Enter category</label> <input type="text" name="categ" required> <button type="submit" name="submit">save</button> </form>
额外说明
- 给表名做了过滤处理,防止恶意输入破坏数据库结构;
- 给表单字段添加了
required属性,确保用户必须填写必要内容; - 所有数据库操作都添加了错误提示,方便你快速定位问题;
- 插入数据使用预处理语句,彻底规避了SQL注入的安全风险。
内容的提问来源于stack exchange,提问作者Tope Kenny
相关产品推荐
相关产品推荐

