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); } } ?>
额外说明
- 新增了登录校验:确保只有已登录用户才能提交表单,避免未授权操作
- 修正了所有字段名匹配问题:表单字段和处理代码的变量完全对应
- 调整了SQL逻辑:用
UPDATE结合user_id定位到当前用户,准确更新其信息 - 修正了参数绑定的类型和数量:
"ssi"对应字符串、字符串、整数,和绑定的三个参数完全匹配 - 优化了错误提示文案,更清晰准确
内容的提问来源于stack exchange,提问作者marcusk7
相关产品推荐
相关产品推荐

