你自己写,“它没有显示任何错误”。通过如此广泛的分析,您需要牢记一些事情(并将其列入您的清单)。
首先,PHP 并不总是显示错误。它是否显示错误取决于您使用的错误配置。由于您没有在问题中显示,很难说这是否是一个问题,但是,如果您遇到意外的事情(就像您一样),您应该首先检查报告错误的方式和位置。
解释整个PHP 错误配置对于这里的答案来说太过分了,这是一个很好的资源(在已经详细记录所有内容的手册旁边),我们在 Stackoverflow 网站上有这个:
然后你需要澄清 Mysqli 是否有错误以及在哪里出错。让我们回顾一下事情可能会出错的每个步骤。
联系:
$mysqli = new mysqli($host, $user, $pass, 'finance');
使用错误的凭据实例化 Mysqli 确实会在 PHP 中产生错误。然而,mysqli
对象无论如何都会被实例化。这意味着该变量$mysqli
将始终是一个类型的对象mysqli
——无论连接是否成功。
由于 PHP 中的每个对象总是 松散true
的,因此检查如下
if (!$mysqli) {
不足以告诉您是否存在连接问题 - 所以当您这样做时,您在这里做错了。$mysqli
总是真实的,所以永远不要输入 if 子句主体。相反,您需要通过查找mysqli 连接错误来检查与服务器的连接是否已经建立。您可以通过检查它的错误号来做到这一点。如果没有,则为(整数零),如果有错误,则为非零整数(真实)(因为它比错误号:0
if ($mysqli->connect_errno) {
该属性也记录在 PHP 手册中,请参阅mysqli::$connect_errno
。我无法详细解释不同的错误编号,但您可以在此处的 Mysqli 文档中找到它们:C.3。服务器错误代码和消息。
作为对此的另一种选择 - 它也可以检查以前的连接是否仍然处于活动状态 - 是运行测试查询:
if (NULL === $mysqli->query("SELECT 1;")) {
如果您无法连接到数据库服务器,SELECT 1;
则会返回一个简单的查询。NULL
这是针对连接到服务器时可能出现的许多问题:您可能使用了错误的用户名或密码((HY000/1045)“访问被拒绝”),错误的服务器((HY000/2002)“连接失败” ) 甚至使用错误的数据库 ((HY000/1049) “未知数据库”)。
运行这样的测试查询很容易,并且可以快速告诉您连接是否顺利。如果您成功连接,则返回mysqli_result
不符合条件的类型对象=== NULL
,因此更新 if 子句很好地涵盖了所有这些失败和成功场景。
它还向您展示了另一个重要原则:大多数方法返回一些内容,您可以检查以发现是否有问题。
执行插入查询:
下一个检查错误的地方是执行INSERT ...
SQL 查询:
// execute query
$mysqli->query($query);
正如您的这段代码所示,您根本没有在此处进行任何错误检查。再次,这是错误的。相反,由于您的期望不匹配,您需要在此处验证插入是否有效。再次,该方法返回一个值,在INSERT ...
SQL 查询的情况下,无论查询是否有效,这是一个布尔值:
// execute query
$result = $mysqli->query($query);
if (!$result) {
throw new Exception(
sprintf(
'query "%s" failed: (%s/%d): %s', $query,
$mysqli->sqlstate, $mysqli->errno, $mysqli->error
)
);
}
如本例所示,再次添加了对返回值的正确检查,如果出现问题,则通过读取$mysqli
连接对象的适当属性(此处mysqli::$sqlstate
和)mysqli::$errno
给出错误消息mysqli::$error
。
因此,在得出“没有给出错误”的结论之前,最好仔细检查一下出了什么问题。首先检查是否必须自动给出错误(以及在哪里,例如筛选或写入日志文件?)。或者,如果您甚至不需要检查错误情况,因为失败始终是一种选择,并且即使您使用 PHP 扩展或 PHP 语言,并非所有“不起作用”的东西都可以被视为故障。