提问人:Columbo 提问时间:3/31/2010 最后编辑:MPelletierColumbo 更新时间:9/22/2022 访问量:148062
MySQLi 预准备语句错误报告 [duplicate]
MySQLi prepared statements error reporting [duplicate]
问:
我正试图了解 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>");
但是,prepare 语句的返回值是否只检测 SQL 语句的准备中是否存在错误,而不检测执行错误?如果是这样,我应该更改我的执行行以标记错误,如下所示:
if($stmt_test->execute()) $errorflag=true;
然后,为了安全起见,我还应该在语句执行后执行以下操作:
if($stmt_test->errno) {$errorflag=true;}
...或者我是否可以开始,并且MySQLi prepare'语句上的返回值捕获与它定义的查询的完整执行相关的所有错误?
谢谢 C
答:
不确定这是否回答了您的问题。对不起,如果不是
要从 mysql 数据库获取有关查询的错误报告,您需要使用连接对象作为焦点。
所以:
echo $mysqliDatabaseConnection->error
将回显从MySQL发送的有关您的查询的错误。
希望能有所帮助
评论
mysqli 的每个方法都可能失败。幸运的是,现在mysqli可以向你报告每一个问题,你所需要的只是问。只需将这一行添加到连接代码中,
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
在那之后,每个错误都会显露出来。无需测试任何返回值,只需立即编写语句即可:
$stmt = $mysqli->prepare("INSERT INTO testtable VALUES (?,?,?)");
$stmt->bind_param('iii', $x, $y, $z);
$stmt->execute();
当错误发生在任何步骤时,它将抛出一个通常的PHP异常,可以像任何其他PHP错误一样处理或报告。只要确保你配置了正确的PHP错误报告,即在开发服务器上,错误显示在屏幕上,而在生产服务器上,错误永远不会显示,而是记录下来。
评论
bind_param()
完整性
您需要同时检查 和 .如果它们为 false,则需要分别输出 或。$mysqli
$statement
$mysqli->error
$statement->error
效率
对于可能终止的简单脚本,我使用简单的单行代码来触发消息的 PHP 错误。对于更复杂的应用程序,应改为激活错误警告系统,例如通过抛出异常。
使用示例 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
}
评论