PHP MySQL InnoDB使用事务多次插入不同的表失败

PHP MySQL InnoDB使用事务多次插入不同的表失败,php,mysql,transactions,innodb,multiple-insert,Php,Mysql,Transactions,Innodb,Multiple Insert,我一直在研究事务,据我所知,我的multipleinsert语句应该可以工作 我正在使用InnoDB引擎。下面的两个insert语句都可以工作并将数据正确地输入到相应的表中,但前提是我在事务中一次有一个insert语句,而不是同时有两个insert语句 有人能告诉我需要做什么不同吗 插入受影响的行时失败:-1 代码: mysqli_查询不支持一次调用中的多个查询。您需要使用或将查询拆分为两个单独的mysqli\u查询调用。因为您使用的是事务,所以将调用分成两个调用会更好,因为在mysqli\u

我一直在研究事务,据我所知,我的multipleinsert语句应该可以工作

我正在使用InnoDB引擎。下面的两个insert语句都可以工作并将数据正确地输入到相应的表中,但前提是我在事务中一次有一个insert语句,而不是同时有两个insert语句

有人能告诉我需要做什么不同吗

插入受影响的行时失败:-1

代码:


mysqli_查询不支持一次调用中的多个查询。您需要使用或将查询拆分为两个单独的mysqli\u查询调用。因为您使用的是事务,所以将调用分成两个调用会更好,因为在mysqli\u multi\u query中很难获得第二个和后续查询的错误信息。

那么我还需要使用事务吗?或者mysqli_multi_query就足够了吗?不。只需一次调用一条语句即可。@Mike一点也不,使用事务的目的是允许您在任何事务失败时回滚其效果。如果启动事务,则所有后续语句都将是该事务的一部分,直到您提交或回滚为止。你不必在一次电话中发送声明。事实上,如果您需要在一个事务中运行的SQL语句超过一个数据包所能容纳的数量,那么您可能无法这样做。一个事务中的语句数量没有上限,但一个数据包的大小有上限。PHP的创建者说,不要使用它。如果你允许的话,你只是给了黑客一个更容易进入你系统的方法。
$con->begin_transaction();

$con->autocommit(FALSE);


$query = "

INSERT INTO `Order` (`PO`,`SellingManagerSalesRecordNumber`,`OrderID`,
  `AmountPaid`,`CreatedTime`,`Subtotal`,`Total`,`BuyerUserID`,
  `IsMultiLegShipping`,`Status_id`,`SellerUserID_id`)
   VALUES
   ('AF11514','11514','111809902234-1906167668001','55.98',
  '2019-01-07 17:42:46','55.98','55.98','hyccas3','false',
   (SELECT `id` FROM `Status` WHERE `Status` = 'Completed'),
   (SELECT `id` FROM `SellerUserID` WHERE `SellerUserID` = 'afiperformance'))
   ON DUPLICATE KEY UPDATE PO = VALUES(PO),
   SellingManagerSalesRecordNumber = VALUES(SellingManagerSalesRecordNumber),
   OrderID = VALUES(OrderID),
   AmountPaid = VALUES(AmountPaid),
   CreatedTime = VALUES(CreatedTime), Subtotal = VALUES(Subtotal),
   Total = VALUES(Total),
   BuyerUserID = VALUES(BuyerUserID),
   IsMultiLegShipping = VALUES(IsMultiLegShipping);

INSERT INTO `CheckoutStatus` (`PO`,`LastModifiedTime`, 
         `PaymentMethod_id`,`Status_id`)
   VALUES ('AF11514','2019-01-07 17:47:55',
  (SELECT `id` FROM `PaymentMethod` WHERE `PaymentMethod` = 'PayPal'),
   (SELECT `id` FROM `Status` WHERE `Status` = 'Complete'))
   ON DUPLICATE KEY UPDATE PO = VALUES(PO),
   LastModifiedTime = VALUES(LastModifiedTime);";

echo $query;

$con->query($query);
printf("<br><br>\n\nAffected rows (INSERT): %d ", $con->affected_rows) . "\n\n<br><br>";

if ($con->affected_rows == -1) {
    echo "<br><br>\n\n Failed " . "\n\n<br><br>";
    $con->rollback();
    $commit = '';
} else {
    $commit = $con->commit();
    echo " success " . "\n\n<br><br>";
}

/* commit transaction */
if ($commit == '') {
    print("Transaction commit failed\n");
} else {
    print("Transaction commit success\n");
}

$con->close();