以下是我在网页上提交新表单的代码。我整天都在研究这个问题,而且声明在bind_param上失败了。
$query = " INSERT INTO table
(
AbandonedComments,
DetectorComments,
FireExComments,
PestComments,
SanitationComments
)
VALUES
(
?,
?,
?,
?,
?;
)";
$stmt = $mysqli->prepare($query);
$stmt->bind_param("sssss",
$_POST['GeneralComment'],
$_POST['SmokeDetectorComment'],
$_POST['fireExComments'],
$_POST['PestComments'],
$_POST['SanitationComments']
);
$stmt->execute();
$stmt->close();
我已将该部分包装在try / catch,if / else中,并已测试以查看值是否正在通过。
我知道execute()可以被错误检查,因为它返回一个布尔值,但是我没有在bind_param上找到任何东西。
编辑:我在发布此消息后立即与我的老板交谈,他指出了错误,并解释说没有错误检查'bind_param'但是'prepare'和'execute'都会返回boolean并且你可以检查那里。答案 0 :(得分:4)
VALUES
(
?,
?,
?,
?,
?; <<< trailing semi-colon
注意那里的分号?
它没有抛出错误的原因是因为在PHP和其他语言中,被认为是一个有效的字符,是一个&#34;语句的结尾&#34;并位于所有占位符的末尾(请参阅编辑)。
参考:
与在C或Perl中一样,PHP要求在每个语句结尾处以分号结束指令。 PHP代码块的结束标记自动表示分号;你不需要一个分号来终止PHP块的最后一行。块的结束标记将包括紧接着的新行(如果存在)。
您声明查询(绑定)失败;它要么失败又有理由而你没有检查真正的错误,否则就会无声地失败。
您也无法检查绑定上的错误,检查查询中的错误以及错误报告,如果这也是与PHP相关的问题。
编辑:
但是,您的查询读取的内容如下:
VALUES
(
?,
?,
?,
?; <<< trailing semi-colon
?
)";
...然后那将是一个完全不同的球赛,因为最后一个占位符永远不会被使用,并且声明在第四个占位符处停止。
您可以而且应该使用条件语句,将您当前的$stmt->execute();
语句修改为!
并使用&#34; not&#34;运算符,转换为&#34;如果查询未执行&#34; :
if(!$stmt->execute()) {
echo "Error: " . mysqli_error($mysqli);
}else{
echo "Success";
}
答案 1 :(得分:2)
我认为你错误地插入了分号
VALUES
(
?,
?,
?,
?,
?**;**
)"
答案 2 :(得分:2)
当您拨打prepare()
而不是bind_param()
时,语法检查已完成。
$stmt = $mysqli->prepare($query) or die($mysqli->error);
但是,bind_param()
应报告错误,因为$stmt
为FALSE
。它应该抱怨在非对象上调用方法。
答案 3 :(得分:2)
正如@Barmar所示,如果您不启用例外,那么您必须检查每个mysqli调用以获取false
的响应。 IIRC,每个mysqli函数都会在出错时返回false。
您应该只配置mysqli来为prepare()错误引发异常。这不是默认设置,因此您必须启用它。但是如何从文档中做到这一点并不明显。
http://php.net/manual/en/mysqli-driver.report-mode.php显示了一个示例。
mysqli_report(MYSQLI_REPORT_STRICT);
$link = mysqli_connect(...);
执行此操作后,您的prepare()应该引发异常,因为SQL语法错误,其他人指出的您的values子句中的额外分号。
我总是很惊讶很少有人使用mysqli启用异常。我猜他们只是没有注意到文档中关于mysqli_report()的部分。它真的很埋没。
使用PDO的开发人员似乎更常见的是启用异常。默认情况下也不启用此功能,但在文档中更容易找到:http://php.net/manual/en/pdo.error-handling.php