MySQLi编写语句错误报告

我试图让我的头在MySQli周围,我很困惑的错误报告。 我正在使用MySQLi'prepare'语句的返回值来检测执行SQL时的错误,如下所示:

$stmt_test = $mysqliDatabaseConnection->stmt_init(); if($stmt_test->prepare("INSERT INTO testtable VALUES (23,44,56)")) { $stmt_test->execute(); $stmt_test->close(); } else echo("Statement failed: ". $stmt_test->error . "<br>"); 

但是,准备语句的返回值只是检测SQL语句的准备中是否存在错误,并且没有检测到执行错误? 如果是这样,我应该改变我的执行线标记错误,就像这样:

 if($stmt_test->execute()) $errorflag=true; 

然后为了安全起见,我也应该在声明执行后做以下事情:

 if($stmt_test->errno) {$errorflag=true;} 

…或者我可以开始,并且MySQLi prepare语句的返回值捕获与它定义的查询的完整执行相关的所有错误。

谢谢C

在过去两天之前,我曾经写过两遍(所以对我来说,即使问题开始有点不同,也是重复的)。

mysqli的每种方法都可能失败。 你应该testing每个返回值。 如果失败了,考虑继续处理一个不符合预期状态的对象是否合理。 (可能不是处于“安全”状态,但我认为这不是问题。)

由于每个连接/语句只存储上次操作的错误消息,因此如果在出错后继续执行,则可能会丢失有关导致错误的信息。 您可能希望使用这些信息让脚本决定是否再次尝试(只是暂时的问题),更改某些内容或完全释放(并报告错误)。 这使得debugging更容易。

 $stmt = $mysqli->prepare("INSERT INTO testtable VALUES (?,?,?)"); // prepare() can fail because of syntax errors, missing privileges, .... if ( false===$stmt ) { // and since all the following operations need a valid/ready statement object // it doesn't make sense to go on // you might want to use a more sophisticated mechanism than die() // but's it's only an example die('prepare() failed: ' . htmlspecialchars($mysqli->error)); } $rc = $stmt->bind_param('iii', $x, $y, $z); // bind_param() can fail because the number of parameter doesn't match the placeholders in the statement // or there's a type conflict(?), or .... if ( false===$rc ) { // again execute() is useless if you can't bind the parameters. Bail out somehow. die('bind_param() failed: ' . htmlspecialchars($stmt->error)); } $rc = $stmt->execute(); // execute() can fail for various reasons. And may it be as stupid as someone tripping over the network cable // 2006 "server gone away" is always an option if ( false===$rc ) { die('execute() failed: ' . htmlspecialchars($stmt->error)); } $stmt->close(); 

编辑:六年后的几个笔记….
mysqli扩展完全能够报告通过exception导致(mysqli)错误代码不为0的操作,请参阅mysqli_driver :: $ report_mode 。
死()是真的,真的很粗糙,我不会使用它甚至像这样的例子了。
所以,请只拿走由于多种原因每个 (mysql)操作都可能失败的事实; 即使同样的事情发生了好几千遍之前….

完整性

你需要检查$mysqli$statement 。 如果它们是错误的,则需要分别输出$mysqli->error$statement->error

效率

对于可能会终止的简单脚本,我使用简单的单行程序来触发PHP错误消息。 对于更复杂的应用程序,应该激活错误警告系统,例如通过抛出exception。

用法示例1:简单脚本

 # This is in a simple command line script $mysqli = new mysqli('localhost', 'buzUser', 'buzPassword'); $q = "UPDATE foo SET bar=1"; ($statement = $mysqli->prepare($q)) or trigger_error($mysqli->error, E_USER_ERROR); $statement->execute() or trigger_error($statement->error, E_USER_ERROR); 

用法示例2:应用程序

 # This is part of an application class FuzDatabaseException extends Exception { } class Foo { public $mysqli; public function __construct(mysqli $mysqli) { $this->mysqli = $mysqli; } public function updateBar() { $q = "UPDATE foo SET bar=1"; $statement = $this->mysqli->prepare($q); if (!$statement) { throw new FuzDatabaseException($mysqli->error); } if (!$statement->execute()) { throw new FuzDatabaseException($statement->error); } } } $foo = new Foo(new mysqli('localhost','buzUser','buzPassword')); try { $foo->updateBar(); } catch (FuzDatabaseException $e) $msg = $e->getMessage(); // Now send warning emails, write log } 

不知道这是否回答你的问题。 对不起,对不起

为了从mysql数据库中获取关于你的查询的错误,你需要使用你的连接对象作为焦点。

所以:

 echo $mysqliDatabaseConnection->error 

会回应从您的查询从MySQL发送的错误。

希望有所帮助