我正在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。
答案 0 :(得分:2)
有一种简单的方法吗?
Transactions正是您要找的。 p>
我正在使用普通插入和更新,没有PDO。
没有“普通插入/更新”之类的东西。如果您正在谈论使用古老的mysql_*
函数,请停止使用它们。它们已不再维护,社区已开始deprecation process。请参阅red box?相反,您应该了解prepared statements并使用PDO或MySQLi。如果您无法决定,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
最后,在不了解您的应用程序的情况下,我无法确定,但您可能能够设计数据集和应用程序,这样您就不会在第一时间处于更快的状态。事务和锁定表都很慢,所以除非必要,否则我会避免使用它们。