php - MySQLi 事务成功,但带有 bind_param 警告

标签 php mysql mysqli

我一直在使用 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 个步骤:

  1. 启用 mysqli 错误报告。
  2. 创建 mysqli 类的实例
  3. 设置正确的连接字符集
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/

相关文章:

php - 跳过整行,如果使用 PHP foreach 的 MySQL 表中的单元格为 Null

php - MySQL PHP 从数据库表中获取倒数时间

mysql - 我不断收到错误消息 "missing Keyword"

mysql - 有限制地检索评论和回复

php - mysqli select 查询不能正常工作

PHP安全系统

php - 在循环中创建多维数组

php - 建议 : 8 million send request

android - 如何在没有php的情况下从android访问mySQL数据库

php - 工作两年后突然出现 MYSQL "Malformed packet"on LOAD DATA LOCAL INFILE