1

我在 php 中执行两个不同的 mysql 查询,
但我还需要检查它们是否都成功。如果其中一个失败,我需要抛出一个错误召回所做的更改。

有没有一种简单的方法可以做到这一点?

PS:一个是 andupdate另一个是insert.

编辑目前我有两个查询:

INSERT INTO table1 ( warning ) VALUES ( 0 ) WHERE con_id = 1
UPDATE table2 SET no_alerts = 1 WHERE con_id = 1

我正在使用基本mysql_的插入和更新,没有 PDO。

4

4 回答 4

2

有没有一种简单的方法可以做到这一点?

交易是您正在寻找的。

我使用的是普通的插入和更新,没有 PDO。

没有“普通插入/更新”之类的东西。如果您正在谈论使用古老的mysql_*功能,请停止使用它们。它们不再被维护并且社区已经开始了弃用过程。看到红框了吗?相反,您应该了解准备好的语句并使用PDOMySQLi。如果你不能决定,这篇文章将有助于选择。如果你想学习,这里有一个很好的 PDO 教程

如果您使用的是 PDO / mysqli,您可以在事务中进行查询。这样,您可以轻松地回滚更改而不是提交更改。

更新

如果您担心旧系统(尽管 PDO 是 5.1.0+ 而 mysqli 是 5+),您可以做一些事情,但它是一种hack,容易出错并且事情可能会变得一团糟。您可以存储查询的最后一个插入 ID,如果更新查询失败,您可以手动删除插入的行,但是如上所述,这在并发系统上很容易出错。

查询失败的原因可能是什么?也许有更好的做事方式?

于 2012-09-27T14:49:26.030 回答
0

我猜你正在寻找这样的东西

$result1 = mysql_query('INSERT INTO table1 ( warning ) VALUES ( 0 ) WHERE con_id = 1');
$result2 = mysql_query('UPDATE table2 SET no_alerts = 1 WHERE con_id = 1');

if(!$result1 || !$result2) {
  echo 'error';
}

您应该使用 PDO ... mysql_query 已弃用。

于 2012-09-27T14:48:04.457 回答
0
echo($resultQuery1 && $resultQuery2) ? 'No error' : 'Error';
于 2012-09-27T14:54:08.427 回答
0

我认为有两种方式。首先,如果有可能无法插入或更新,我会先检查表的条件,看看是否有可能。如果您需要原子操作,您可以在此过程中锁定表,以确保另一个进程在您检查表和进行更新之间不会更改表。如果您需要高水平的并发性,这可能会减慢速度。

或者,如果您使用事务引擎(InnoDB 支持事务,MyISAM 不支持),您可以启动事务,然后监控更新和插入的返回值。

START TRANSACTION

..然后检查您的操作结果。从 php 文档:

对于 SELECT、SHOW、DESCRIBE、EXPLAIN 和其他返回结果集的语句,mysql_query() 成功时返回资源,错误时返回 FALSE。

对于其他类型的 SQL 语句,INSERT、UPDATE、DELETE、DROP 等,mysql_query() 在成功时返回 TRUE,在错误时返回 FALSE。

返回的结果资源应该传递给 mysql_fetch_array() 和其他处理结果表的函数,以访问返回的数据。

使用 mysql_num_rows() 找出 SELECT 语句返回了多少行,或使用 mysql_affected_rows() 找出有多少行受到 DELETE、INSERT、REPLACE 或 UPDATE 语句的影响。

如果您不成功,您可以回滚您的更改:

ROLLBACK

最后,在不了解您的应用程序的情况下,我无法确定,但您可能能够设计数据集和应用程序,这样您一开始就不会陷入这种情况,这样会更快。事务和锁定表都很慢,所以除非有必要,否则我会避免使用它们。

于 2012-09-27T14:54:50.687 回答