我一直在使用 mysqli
事务并遇到了一个问题。当我因为弄乱了 bind_param()
之一而打算让两个查询失败时,将不会调用 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!');
}
Warning: mysqli_stmt::bind_param(): Number of elements in type definition string doesn't match number of bind variables in...
我知道这是一个警告,我只是希望如果此查询失败,它将不允许事务保持提交状态。
我的连接是基本的
$test = new mysqli('localhost:3306','root','','test');
最佳答案
要首先捕获异常,您需要一段代码来抛出异常。默认情况下,MySQLi 会默默地忽略您的所有问题。它可能会警告您,但不会抛出异常。如果您希望 MySQLi 正常工作,您需要通过切换异常模式来启用 MySQLi 错误报告。
使用 mysqli 的正确数据库连接包括 3 个步骤:
- 启用 mysqli 错误报告。
- 创建 mysqli 类的实例
- 设置正确的连接字符集
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$mysqli = new mysqli('localhost', 'username', 'somePassword', 'dbName');
$mysqli->set_charset('utf8mb4');
只要您不向最终用户显示错误报告,在生产环境中报告错误是完全安全的。这意味着您必须设置 display_errors
到您的高效 INI 配置中的 0
。
关于php - MySQLi 事务成功,但带有 bind_param 警告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59398982/