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

PHP认证后无法写入MySQL数据库问题求助

问题分析与修复方案

核心错误点

  • 日期校验字段不匹配:表单中日期输入框的name是startdate,但处理代码里判断的是$_POST["date"],且错误提示文案混乱(写成了"Name is required")
  • 参数绑定完全错误:
    • 绑定的变量是$_POST["name"],但表单里根本没有name这个字段,应该用$_POST["nickname"]
    • bind_param的类型标识写了"sss"(对应3个字符串参数),但只传了1个变量,参数数量不匹配,直接导致执行失败
  • SQL操作逻辑错误:你是要更新已登录用户的信息,不是新增用户,所以应该用UPDATE语句而非INSERT,否则会在表中新增一条无关联的空记录(或错误记录),而非修改当前登录用户的nickname和startdate
  • 遗漏日期字段写入:原SQL只处理了nickname,没把startdate写入数据库

修正后的user-input.php代码

<?php
session_start();

// 先校验用户是否已登录
if (!isset($_SESSION["user_id"])) {
    die("请先登录");
}

// 校验表单字段
if (empty($_POST["nickname"])) {
    die("昵称是必填项");
}

if (empty($_POST["startdate"])) {
   die("起始日期是必填项");
}

$mysqli = require __DIR__ . "/database.php";
// 使用UPDATE语句更新当前登录用户的信息,而非INSERT
$sql = "UPDATE user 
        SET nickname = ?, startdate = ? 
        WHERE id = ?";

$stmt = $mysqli->stmt_init();

if (!$stmt->prepare($sql)) {
    die("SQL错误: " . $mysqli->error);
}

// 绑定参数:两个字符串(nickname、startdate)+ 一个整数(user_id),类型标识为"ssi"
$stmt->bind_param("ssi", $_POST["nickname"], $_POST["startdate"], $_SESSION["user_id"]);

if ($stmt->execute()) {
    echo "提交成功";
    // 可选:重定向回首页
    // header("Location: index.php");
    // exit;
} else {
    if ($mysqli->errno === 1062) {
        die("昵称重复");
    } else {
        die($mysqli->error . " " . $mysqli->errno);
    }
}
?>

额外说明

  1. 新增了登录校验:确保只有已登录用户才能提交表单,避免未授权操作
  2. 修正了所有字段名匹配问题:表单字段和处理代码的变量完全对应
  3. 调整了SQL逻辑:用UPDATE结合user_id定位到当前用户,准确更新其信息
  4. 修正了参数绑定的类型和数量:"ssi"对应字符串、字符串、整数,和绑定的三个参数完全匹配
  5. 优化了错误提示文案,更清晰准确

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 14:23:26