Php MySQLi事务成功,bind_param警告
我一直在玩Php MySQLi事务成功,bind_param警告,php,mysql,mysqli,Php,Mysql,Mysqli,我一直在玩mysqli事务,遇到了一个问题。如果我想让两个查询都失败,因为我弄乱了其中一个bind_-param()s,则不会调用rollback(),因为bind_-param只会抛出警告。我的印象是,只有内部的所有查询都成功,交易才能完成。在这种情况下,只有一个是成功的 try{ $mysqli->begin_transaction(); $stmt1 = $mysqli->prepare('INSERT INTO test (name) VALUES (?)'
mysqli
事务,遇到了一个问题。如果我想让两个查询都失败,因为我弄乱了其中一个bind_-param()
s,则不会调用rollback()
,因为bind_-param
只会抛出警告。我的印象是,只有内部的所有查询都成功,交易才能完成。在这种情况下,只有一个是成功的
try{
$mysqli->begin_transaction();
$stmt1 = $mysqli->prepare('INSERT INTO test (name) VALUES (?)');
$stmt1->bind_param('s',$name);
$stmt1->execute();
$stmt2 = $mysqli->prepare('INSERT INTO test2 (test) VALUES (?)');
$stmt2->bind_param('ss',$test);
$stmt2->execute();
$mysqli->commit();
}catch(Exception $e){
$mysqli->rollback();
error_log($e);
exit('We have caught an exception!');
}
警告:mysqli_stmt::bind_param():类型中的元素数
定义字符串与中的绑定变量数不匹配
我理解这是一个警告,我只希望如果这个查询失败,它将不允许事务保持提交状态
我的连接是基本的
$test = new mysqli('localhost:3306','root','','test');
要首先捕获异常,您需要一段代码,这段代码将抛出异常。默认情况下,MySQLi会自动忽略所有问题。它可能会警告您,但不会引发异常。如果希望MySQLi能够正常工作,则需要通过切换异常模式来启用MySQLi错误报告 使用mysqli的正确数据库连接包括3个步骤:
在生产环境中进行错误报告是完全安全的,只要您从不向最终用户显示它们。这意味着您必须在生产INI配置中设置为
0
。您能显示完整的警告/错误消息吗?警告不一定是错误,也不一定是事务作废异常。@richyen请查看我的编辑是否正确打开了mysqli异常模式?您的execute调用应该触发异常,而不是bind_参数。@Dharman请参见编辑2是!如果将其关闭,您预计会发生哪些异常情况?
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$mysqli = new mysqli('localhost', 'username', 'somePassword', 'dbName');
$mysqli->set_charset('utf8mb4');