【发布时间】:2021-05-26 03:31:01
【问题描述】:
我有以下 PHP 代码:
$inserted = false ;
printf("Record must be inserted. Old DB ID is %d.\n", $old_db_id) ;
$insertSQL = "INSERT INTO GoogleAuth ("
. "script"
. ", client_id"
. ", client_secret"
. ", refresh_token"
. ", auth_token"
. ", refresh_token_date"
. ", auth_token_date"
. ", client_info_date"
. ", last_used_date"
. ")"
. " VALUES(?, ?, ?, ?, ?, ?, ?, ?, NULL) "
;
printf("Preparing statement....\n") ;
$stmt = $mySQL->prepare($insertSQL) ;
if ($stmt) {
printf("Binding parameters...\n") ;
if ($stmt->bind_param("sssssiiii"
, $page_file
, $clientId
, $clientSecret
, $refreshToken
, $authToken
, $authTokenDate
, $refreshTokenDate
, $clientInfoDate
, $now
)) {
print("Bind returned true\n") ;
if ($stmt->execute()) {
$inserted = true ;
}
}
else {
printf("Bind failed. %s\n", $stmt->error) ;
}
}
if ($inserted) {
printf("row inserted.\n") ;
}
else {
printf("Insert failed! %s\n", $mySQL->error) ;
trigger_error("Insert failed. Dang it!", E_USER_ERROR) ;
}
当我执行这段代码时,会打印以下内容:
Record must be inserted. Old DB ID is 0.
Preparing statement....
Binding parameters...
Bind failed.
Insert failed!
注意 $stmt->error 值和 $mySQL->error 值都是空的!
您能否帮助我了解如何可靠地获取与此类故障相关的错误消息(和/或错误代码)? (我最终发现我用 9 个变量代替了 8 个替换标记……这不是重点。重点是要弄清楚如何从 mysql 中获取实际错误。)
谢谢!
编辑
顺便说一句,我看过像this 这样的文章,其中谈到有趣的变量名重用。这不适用于这里。 $stmt 未在此应用程序的其他任何地方使用。
EDIT2
有人建议这是this problem 的副本。但是,不同之处在于,这里的目标是获取失败消息,以便对其进行分析以进行正确处理。 (根据具体情况,一些错误可能是可以管理的。)无论如何,这样的过程可以让程序优雅地关闭,而不是抛出失败错误所带来的粗鲁和直接的结果。当我阅读the other problem 时,目标是确保错误进入日志,并且程序被中止。
【问题讨论】:
-
这能回答你的问题吗? Turning query errors to Exceptions in MySQLi
-
这不是 MySQL 错误。这是一个 PHP 错误。您是否启用了 PHP 错误报告?
-
语义,@Dharman - 取决于你的观点。这是要求 MySQL 做某事的结果。正如我在其他地方所避免的那样,优雅地处理错误对于一个好的程序来说是必不可少的。例如,如果某些 INSERT 由于重复键而失败,则可以调整并继续。另一种方法是转储整个过程,让受害者自己弄清楚如何重新启动。