PHP-SQL插入查询无法执行,请求代码排查指导
你的PHP代码问题分析与修复方案
嘿,我帮你排查了这段代码,核心问题是SQL语句的语法错误,另外还有几个可以优化的地方,咱们一个个说:
1. 直接导致运行失败的原因:SQL语句未闭合
你写的INSERT语句最后少了一个闭合的括号),数据库执行时会因为语法不完整报错。看这段:
$queryService = "INSERT INTO `companySpTable` (`companyId`,`serviceId`) VALUES ('".mysqli_real_escape_string($link,$companyId)."' ,'".mysqli_real_escape_string($link,$service)."'";
最后那个VALUES的括号只开了没关,应该补上),修正后是:
$queryService = "INSERT INTO `companySpTable` (`companyId`,`serviceId`) VALUES ('".mysqli_real_escape_string($link,$companyId)."' ,'".mysqli_real_escape_string($link,$service)."')";
2. 可以优化的几个点
- 避免循环内重复计算数组长度:把
count($companyService)提前赋值给变量,不然每次循环都会重新计算数组长度,影响性能:$serviceCount = count($companyService); for ($i = 0; $i < $serviceCount; $i++) { // ... 循环内容 } - 使用预处理语句更安全:虽然你用了
mysqli_real_escape_string,但预处理语句是防止SQL注入更可靠的方式,而且代码更清晰,举个例子:$stmt = mysqli_prepare($link, "INSERT INTO `companySpTable` (`companyId`,`serviceId`) VALUES (?, ?)"); mysqli_stmt_bind_param($stmt, "ii", $companyId, $service); // 假设companyId和serviceId都是整数,用"ii";如果是字符串用"ss" mysqli_stmt_execute($stmt); - 循环变量初始化更规范:原代码里
for ($i; $i<count($companyService); $i++)虽然能跑,但最好写成for ($i = 0; $i < $serviceCount; $i++),可读性更强。
完整修复后的示例代码
$i = 0; $companyService = $_POST['companyService']; // 数组变量 $serviceCount = count($companyService); // 假设$link和$companyId已经正确初始化 for ($i = 0; $i < $serviceCount; $i++) { $service = $companyService[$i]; echo $service; // 可正常输出正确值 echo $companyId; // 可正常输出正确值 // 修正后的SQL语句(或者用预处理语句更优) $queryService = "INSERT INTO `companySpTable` (`companyId`,`serviceId`) VALUES ('".mysqli_real_escape_string($link,$companyId)."' ,'".mysqli_real_escape_string($link,$service)."')"; if(!mysqli_query($link,$queryService)) { $error = "<p> 查询未执行</p>".$error; // 可以加上具体错误信息方便调试:echo mysqli_error($link); } }
另外,调试的时候可以在if(!mysqli_query(...))里加上echo mysqli_error($link);,这样能直接看到数据库返回的具体错误信息,更容易定位问题~
内容的提问来源于stack exchange,提问作者Moe K
相关产品推荐
相关产品推荐

