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

PHP输入表单无法向SQL数据库提交数据的问题排查请求

表单提交MySQL数据库失败的修复方案

我帮你梳理下代码里的核心问题,一步步修复就能解决提交失败的问题:

1. SQL语句的致命问题:语法错误+注入风险

你的插入语句直接把用户输入拼进SQL,不仅会因为字符串没加引号导致语法错误,还存在严重的SQL注入漏洞:

// 原错误代码
$query = "INSERT INTO users (name, email) VALUES ($firstname, $email)";

修复:用预处理语句(Prepared Statements),这是行业标准的安全做法,同时解决语法问题:

// 准备预处理模板
$query = "INSERT INTO users (name, email) VALUES (?, ?)";
// 创建预处理语句对象
$stmt = mysqli_prepare($conn, $query);
// 绑定参数:"ss"表示两个参数都是字符串类型
mysqli_stmt_bind_param($stmt, "ss", $firstname, $email);
// 执行语句
mysqli_stmt_execute($stmt);

// 检查执行结果
if(mysqli_stmt_affected_rows($stmt) > 0){
    echo "数据提交成功!";
} else {
    echo "提交失败:" . mysqli_stmt_error($stmt);
}
// 关闭语句释放资源
mysqli_stmt_close($stmt);

2. 插入逻辑的位置错误

你把数据库插入代码放在了HTML页面底部,不管表单验证是否通过都会执行,这完全不符合逻辑。应该把插入逻辑移到表单验证通过的分支里:

// 原错误结构
if(array_filter($errors)){
    echo ' errors in the form';
} else {
    echo ' form is valid';
}
// 这里单独的插入逻辑,验证失败也会执行

// 修复后结构
if(array_filter($errors)){
    echo '表单存在错误,请修正后重试';
} else {
    // 验证通过才执行插入操作
    $query = "INSERT INTO users (name, email) VALUES (?, ?)";
    $stmt = mysqli_prepare($conn, $query);
    // ... 后续预处理语句代码 ...
}

3. HTML表单的语法混乱

你混用了<tr>、<td>表格标签但没包裹在<table>里,还有多余的</div>标签,会导致页面结构异常,甚至影响表单提交:

// 原错误代码
<tr>
<label>First Name:</label>
<td><input type="text" name="firstname" placeholder="First Name"></td></br>
<?php echo $errors['firstname']; ?></div>
</tr>

修复:用简洁的div排版,优化输入框体验:

<div class="form-group">
    <label>First Name:</label>
    <input type="text" name="firstname" placeholder="First Name" value="<?php echo htmlspecialchars($firstname); ?>">
    <?php echo $errors['firstname']; ?>
</div>
<div class="form-group">
    <label>Email:</label>
    <!-- 邮箱输入框用type="email",浏览器会做基础格式验证 -->
    <input type="email" name="email" placeholder="Email" value="<?php echo htmlspecialchars($email); ?>">
    <?php echo $errors['email']; ?>
</div>
<div class="center">
    <input type="submit" name="submit" value="Submit">
</div>

另外给输入框加上value属性,验证失败后能保留用户输入的内容,提升体验。

4. 数据库连接的小优化

你的db_connect.php连接逻辑没问题,但可以加上字符集设置,避免中文乱码:

// 连接成功后添加这行代码
mysqli_set_charset($conn, "utf8mb4");

完整修复后的代码

add.php

<?php include_once 'includes/db_connect.php'; 
$firstname = $email = ''; 
$errors = array('firstname'=>'','email'=>''); 

if(isset($_POST['submit'])){ 
    // 检查姓名
    if(empty($_POST['firstname'])){ 
        $errors['firstname'] = '请输入姓名!<br />'; 
    } else { 
        $firstname = htmlspecialchars($_POST['firstname']); 
        if(!preg_match('/^[a-zA-Z]+$/', $firstname)){ 
            $errors['firstname'] = '姓名只能包含字母!<br />'; 
        } 
    } 

    // 检查邮箱
    if(empty($_POST['email'])){ 
        $errors['email'] = '请输入邮箱!<br />'; 
    } else { 
        $email = htmlspecialchars($_POST['email']); 
        if(!filter_var($email, FILTER_VALIDATE_EMAIL)){ 
            $errors['email'] = '无效的邮箱格式!<br />'; 
        } 
    } 

    if(array_filter($errors)){
        echo '表单存在错误,请修正后重试';
    } else {
        // 验证通过,执行插入
        $query = "INSERT INTO users (name, email) VALUES (?, ?)";
        $stmt = mysqli_prepare($conn, $query);
        if($stmt){
            mysqli_stmt_bind_param($stmt, "ss", $firstname, $email);
            if(mysqli_stmt_execute($stmt)){
                echo "数据提交成功!";
            } else {
                echo "提交失败:" . mysqli_stmt_error($stmt);
            }
            mysqli_stmt_close($stmt);
        } else {
            echo "预处理语句创建失败:" . mysqli_error($conn);
        }
    } 
} 
?>
<!DOCTYPE html>
<html>
<head>
    <title>SCIENCE FAIR</title>
    <link rel="stylesheet" href="style.css">
</head>
<body>
<section class="container grey-text">
    <form class="white" action="add.php" method="POST">
        <div class="form-group">
            <label>First Name:</label>
            <input type="text" name="firstname" placeholder="First Name" value="<?php echo $firstname; ?>">
            <?php echo $errors['firstname']; ?>
        </div>
        <div class="form-group">
            <label>Email:</label>
            <input type="email" name="email" placeholder="Email" value="<?php echo $email; ?>">
            <?php echo $errors['email']; ?>
        </div>
        <div class="center">
            <input type="submit" name="submit" value="Submit">
        </div>
    </form>
</section>
</body>
</html>

db_connect.php

<?php 
$dbServername = "localhost"; 
$dbUsername = "scifair"; 
$dbPassword = "password"; 
$dbName = "scifair"; 

// 连接到数据库
$conn = mysqli_connect($dbServername, $dbUsername, $dbPassword, $dbName); 

// 检查连接
if(!$conn){ 
    die('连接错误: ' . mysqli_connect_error()); 
}

// 设置字符集,避免乱码
mysqli_set_charset($conn, "utf8mb4");
?>

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 15:37:33