Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php MySQLi事务成功,bind_param警告_Php_Mysql_Mysqli - Fatal编程技术网

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个步骤:

  • 启用mysqli错误报告
  • 创建mysqli类的实例
  • 设置正确的连接字符集

  • 在生产环境中进行错误报告是完全安全的,只要您从不向最终用户显示它们。这意味着您必须在生产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');