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

如何通过PHP将HTML表单变量传入MySQL数据库(同页实现)

同一页面实现HTML表单提交+PHP存入MySQL数据库

我看了你给出的代码片段,需求是在同一个页面搞定表单展示和MySQL数据入库对吧?那我帮你把代码补全、优化,还会解决原代码里的安全隐患——毕竟直接拼SQL语句很容易踩SQL注入的坑。

完整优化代码示例

<?php
// 引入数据库连接文件
require('conn.php');

// 初始化操作提示信息
$message = '';

// 判断是否有表单提交请求
if (isset($_POST['send'])) {
    // 获取并清洗表单数据
    $productName = trim($_POST["product_name"]);
    $stock = (int)$_POST["stock"]; // 强制转为整数,确保库存是数字类型
    $price = (float)$_POST["price"]; // 强制转为浮点数,适配价格格式

    // 前置数据验证,避免无效数据入库
    if (!empty($productName) && $stock >= 0 && $price >= 0) {
        // 使用预处理语句,彻底防范SQL注入
        $sql = "INSERT INTO product (Product_Name, Stock, Price) VALUES (?, ?, ?)";
        $stmt = mysqli_prepare($conn, $sql);
        
        // 绑定参数:s=字符串、i=整数、d=浮点数
        mysqli_stmt_bind_param($stmt, "sid", $productName, $stock, $price);
        
        // 执行插入操作
        if (mysqli_stmt_execute($stmt)) {
            $message = "<span style='color:green;'>数据插入成功!</span>";
            // 可选:清空表单,方便再次录入
            $_POST = [];
        } else {
            $message = "<span style='color:red;'>插入失败:" . mysqli_error($conn) . "</span>";
        }
        
        // 关闭预处理语句
        mysqli_stmt_close($stmt);
    } else {
        $message = "<span style='color:red;'>请填写正确信息:产品名称不能为空,库存和价格不能为负数!</span>";
    }
}

// 关闭数据库连接
mysqli_close($conn);
?>

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <title>产品信息录入</title>
</head>
<body>
    <h2>产品信息录入表单</h2>
    <!-- 展示操作结果提示 -->
    <?php if (!empty($message)) echo "<p>$message</p>"; ?>
    
    <!-- 表单提交到当前页面 -->
    <form method="post" action="<?php echo $_SERVER['PHP_SELF']; ?>">
        <div>
            <label for="product_name">产品名称:</label>
            <input type="text" id="product_name" name="product_name" 
                   value="<?php echo isset($_POST['product_name']) ? htmlspecialchars($_POST['product_name']) : ''; ?>" 
                   required>
        </div>
        <div>
            <label for="stock">库存数量:</label>
            <input type="number" id="stock" name="stock" min="0"
                   value="<?php echo isset($_POST['stock']) ? htmlspecialchars($_POST['stock']) : '0'; ?>" 
                   required>
        </div>
        <div>
            <label for="price">产品价格:</label>
            <input type="number" id="price" name="price" min="0" step="0.01"
                   value="<?php echo isset($_POST['price']) ? htmlspecialchars($_POST['price']) : '0.00'; ?>" 
                   required>
        </div>
        <div>
            <button type="submit" name="send">提交信息</button>
        </div>
    </form>
</body>
</html>

关键优化点说明

  • 安全防护:用MySQLi预处理语句替代直接拼接SQL,彻底避免SQL注入风险(原代码用htmlspecialchars只能防XSS,对SQL注入防护有限)。
  • 数据验证:入库前检查必填字段、强制转换数据类型,确保存入数据库的是有效数据。
  • 用户体验:提交后展示明确的成功/失败提示,验证失败时保留用户已输入内容(并用htmlspecialchars转义,防止XSS)。
  • 同一页面处理:表单action设为$_SERVER['PHP_SELF'],实现展示表单和处理提交在同一页面完成。

配套的数据库连接文件(conn.php)示例

确保你的conn.php正确配置数据库连接,避免中文乱码:

<?php
$servername = "localhost"; // 数据库地址
$username = "你的数据库用户名";
$password = "你的数据库密码";
$dbname = "你的数据库名";

// 创建连接
$conn = mysqli_connect($servername, $username, $password, $dbname);

// 检查连接是否成功
if (!$conn) {
    die("数据库连接失败: " . mysqli_connect_error());
}
// 设置字符集为utf8mb4,支持所有中文和特殊字符
mysqli_set_charset($conn, "utf8mb4");
?>

内容的提问来源于stack exchange,提问作者masral

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 10:35:04