You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 06:59:02