【问题标题】:how to insert into two tables using php with transaction?如何使用带有事务的php插入两个表?
【发布时间】:2014-10-05 11:24:18
【问题描述】:

我知道用单个查询插入多个表是不可能的,

现在我正在尝试使用START TRANSACTION 使用 php 插入 2 个表,但它不起作用。

我的 sql 查询是这样的

mysqli_query($con,"START TRANSACTION
    INSERT INTO users VALUES ('', '$getuser', '$getpass', '$getemail', '$fname', '$lname', '$domain', '$address1', '$address2', '$city', '$country', '$region', '$zip', '$phone', '$getplan', '$duration', '$getprice', '', '0', '0', '$code', '$date', '$time','0', '', '')
    INSERT INTO domains (username) VALUES ('$getuser') COMMIT");

那么问题出在哪里??

非常感谢。

【问题讨论】:

  • 我可能错了,但您的插入语句对我来说似乎是错误的。不应该是 INSERT INTO table_name (column1,column2,column3,...) VALUES (value1,value2,value3,...);?
  • 你看到了什么??不像你说的那样?
  • 请阅读本文,了解如何使用正确的语法插入 dev.mysql.com/doc/refman/5.6/en/insert.html

标签: php mysql sql mysqli


【解决方案1】:

这是因为mysqli_query 每次只能处理一个命令。像这样拆分它们:

mysqli_query($con, "SET AUTOCOMMIT=0");
mysqli_query($con,"START TRANSACTION");
$insert1 = mysqli_query($con,"INSERT INTO users VALUES ('', '$getuser', '$getpass', '$getemail', '$fname', '$lname', '$domain', '$address1', '$address2', '$city', '$country', '$region', '$zip', '$phone', '$getplan', '$duration', '$getprice', '', '0', '0', '$code', '$date', '$time','0', '', '')");
$insert2 = mysqli_query($con,"INSERT INTO domains (username) VALUES ('$getuser')");

if($insert1 && $insert2) {
    mysqli_query($con,"COMMIT");
} else {
    mysqli_query($con,"ROLLBACK");
}
mysqli_query($con, "SET AUTOCOMMIT=1");

更新:如果你使用的是面向对象的mysqli,你可以这样做:

$mysqli->begin_transaction();
$insert1 = $mysqli->query("INSERT INTO users VALUES ('', '$getuser', '$getpass', '$getemail', '$fname', '$lname', '$domain', '$address1', '$address2', '$city', '$country', '$region', '$zip', '$phone', '$getplan', '$duration', '$getprice', '', '0', '0', '$code', '$date', '$time','0', '', '')");
$insert2 = $mysqli->query("INSERT INTO domains (username) VALUES ('$getuser')");

if($insert1 && $insert2) {
    $mysqli->commit();
} else {
    $mysqli->rollback();
}

提示:如果您使用旧的 PHP 版本为 5.5.0,则不能使用$mysqli->begin_transaction();,而必须在开头使用$mysqli->autocommit(false);,在结尾使用$mysqli->autocommit(true);

【讨论】:

  • 这是mysql_query("SET AUTOCOMMIT=0"); 还是mysqli_query("SET AUTOCOMMIT=0"); ???
  • 但所有这些都是单独的查询,而不是单个查询。它应该在 1 次查询中进行交易。该怎么做?
  • 是的,但是因为AUTOCOMMIT 关闭并且START TRANSACTION 他们将在一个事务中处理。
  • 好的,如果可行,我会接受你的回答。如果您认为我的问题有帮助,您可以投票支持我的问题以帮助我提高评分。谢谢
【解决方案2】:

代替

if($insert1 && $insert2)

将其命名为“插入”,然后:

if ($insert->affected_rows > 0)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-28
    • 1970-01-01
    • 2023-03-16
    • 2016-08-15
    • 1970-01-01
    相关资源
    最近更新 更多