Mysqli INSERT语句执行失败求助:PHP表单插入数据库无响应
问题诊断与修复方案
让我帮你拆解下为什么INSERT操作始终失败——你的代码里有几个明确的SQL语法错误,再加上缺少必要的错误检测机制,导致你看不到具体问题。另外还有个严重的安全风险必须修正,具体如下:
1. 字段名的引号用错了
SQL里字段名不能用单引号(')包裹,单引号是给字符串值用的。如果你的字段名不是SQL关键字,其实可以不用引号;要是必须区分的话,得用反引号(`)。你现在的写法会让数据库把字段名当成字符串常量,自然找不到对应的字段。
错误写法:
INSERT INTO commandes ('name', 'id_sport', ...)
正确写法:
INSERT INTO commandes (`name`, `id_sport`, ...)
2. 时间拼接的语法错误
你写的'$firsthour':00完全不符合SQL语法,数据库会把它拆成两个独立的部分,直接报错。应该把小时和分钟拼成一个完整的字符串,比如'$firsthour:00'。
3. 没做错误检测,等于闭着眼调试
你既没检查数据库连接是否成功,也没管mysqli_query的执行结果,就算报错了你也看不到。一定要加上错误判断,不然出问题根本找不到方向。
4. 直接拼POST参数=送人头式SQL注入
把用户输入的内容直接拼进SQL语句里,是非常危险的操作,随便就能被黑客攻破数据库。必须用预处理语句来处理参数,这是行业标准做法。
修正后的完整代码
<?php // 获取POST参数 $sport = $_POST['sport']; $level = $_POST['level']; $date = $_POST['date']; $firsthour = $_POST['first']; $lasthour = $_POST['last']; // 先做个简单的非空校验(可选但推荐) if(empty($sport) || empty($level) || empty($date) || empty($firsthour) || empty($lasthour)){ die("所有必填字段都不能为空哦"); } echo "sport: " . $sport . " Level " . $level . " Date ". $date . " first hour " . $firsthour. " last hour " . $lasthour . "<br>"; // 连接数据库并检查是否成功 $connexion = mysqli_connect("localhost", "root", "", "database"); if (!$connexion) { die("数据库连接炸了: " . mysqli_connect_error()); } // 用预处理语句写SQL,参数用?占位 $reqadd = "INSERT INTO commandes (`name`, `id_sport`, `id_niveau`, `date`, `heure_début`, `heure_fin`) VALUES (?, ?, ?, ?, ?, ?)"; // 初始化预处理语句 $stmt = mysqli_prepare($connexion, $reqadd); if(!$stmt){ die("预处理语句创建失败: " . mysqli_error($connexion)); } // 绑定参数:第一个参数是类型标识,s=字符串,i=整数,根据你表的字段类型调整 // 假设id_sport和id_niveau是整数,就把对应的s改成i $name = 'Amendera Lochan'; $firsthour_time = $firsthour . ':00'; $lasthour_time = $lasthour . ':00'; mysqli_stmt_bind_param($stmt, "sssiss", $name, $sport, $level, $date, $firsthour_time, $lasthour_time); // 执行并判断结果 if(mysqli_stmt_execute($stmt)){ echo "数据插入成功啦!"; } else { echo "插入失败,错误信息: " . mysqli_stmt_error($stmt); } // 收尾:关闭语句和连接 mysqli_stmt_close($stmt); mysqli_close($connexion); ?>
额外提醒
- 开发阶段可以开启PHP错误提示,方便调试:
error_reporting(E_ALL); ini_set('display_errors', 1); - 确认下你数据库表的字段类型和插入值是否匹配,比如
id_sport如果是整数类型,那$sport得是整数,不能传字符串。 - 永远不要直接把用户输入拼进SQL里,预处理语句是必须的!
内容的提问来源于stack exchange,提问作者Aliënor
相关产品推荐
相关产品推荐

