检查mysql_ *中是否有多个查询成功

时间:2012-09-27 14:45:01

标签: php mysql

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

有一种简单的方法吗?

PS:一个是update,另一个是insert

编辑目前我有两个问题:

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

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

4 个答案:

答案 0 :(得分:2)

  

有一种简单的方法吗?

Transactions正是您要找的。

  

我正在使用普通插入和更新,没有PDO。

没有“普通插入/更新”之类的东西。如果您正在谈论使用古老的mysql_*函数,请停止使用它们。它们已不再维护,社区已开始deprecation process。请参阅red box?相反,您应该了解prepared statements并使用PDOMySQLi。如果您无法决定,this article将有助于选择。如果您想学习,here is a good PDO tutorial

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

<强>更新

如果你担心旧系统(虽然PDO是5.1.0+而mysqli是5+),你可以做些什么,但它是 hack ,容易出错事情可能搞砸了。您可以存储查询的最后一个插入ID,如果更新查询失败,您可以手动删除插入的行,但是如上所述,这在并发系统上非常容易出错。

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

答案 1 :(得分: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。

答案 2 :(得分:0)

echo($resultQuery1 && $resultQuery2) ? 'No error' : 'Error';

答案 3 :(得分:0)

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

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

START TRANSACTION

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

  

对于SELECT,SHOW,DESCRIBE,EXPLAIN和其他语句返回   resultset,mysql_query()在成功时返回资源,或者返回FALSE   错误。

     

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

     

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

     

使用mysql_num_rows()来查找为a返回的行数   SELECT语句或mysql_affected_rows()来查找多少行   受到DELETE,INSERT,REPLACE或UPDATE语句的影响。

如果您没有成功,您可以回复您的更改:

ROLLBACK

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