我快速连续发出这三个电话:
UPDATE job
SET jstatus = '9'
WHERE snum = :u AND jstatus = '7' AND jdate < :d
DELETE FROM job
WHERE snum = :u AND jstatus < '7' AND jdate < :d
DELETE FROM jdate
WHERE snum = :u AND jdate < :d
每个参数都是相同的。目前,每一项工作如下:
$STH = $DBH->prepare("
UPDATE job
SET jstatus = '9'
WHERE snum = :u AND jstatus = '7' AND jdate < :d");
$STH->bindParam(':u', $json['u']);
$STH->bindParam(':d', $date);
try{$STH->execute();}catch(PDOException $e){echo $e->getMessage();}
当然必须有办法将它们结合起来?我看过$mysqli->multi_query和SO question,但两者看起来都比我想象的要复杂得多。
答案 0 :(得分:2)
我假设您使用符合ACID标准的引擎(或我们的凡人,支持交易的引擎),我会提供答案。
您要做的是避免代码复杂性 - 在这种情况下,它运行3个查询捆绑到1中。维护大量查询非常困难,您应该不惜一切代价避免这种情况。
您想要的是尽可能快地执行查询并尽可能清楚地阅读和理解。
此外,您需要确定查询所有已执行的内容,或者如果其中任何一项失败都会失败 - 这是一项交易。您不希望删除失败但成功更新,这将破坏您的数据完整性。
这就是你应该使用交易的原因。这样做的巨大好处是,您可以以普通人的方式查询数据库(一次一个查询),确保一切正常或没有发生任何事情,加上它几乎与将所有内容捆绑成一个一样快巨大的,丑陋的无法维护的查询。
以下是代码:
$dsn = 'mysql:dbname=testdb;host=127.0.0.1';
$user = 'dbuser';
$password = 'dbpass';
$pdo = new PDO($dsn, $user, $password);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
try
{
$pdo->beginTransaction();
/**
* Repeat for as many queries you wish to execute, I used only 1 for the example
*/
$stmt = $pdo->prepare("
UPDATE job
SET jstatus = '9'
WHERE snum = :u AND jstatus = '7' AND jdate < :d");
$stmt->bindParam(':u', $json['u']);
$stmt->bindParam(':d', $date);
$stmt->execute();
$pdo->commit();
}
catch(PDOException $e) {
$pdo->rollBack();
echo 'Error: ' . $e->getMessage();
}
答案 1 :(得分:1)
答案 2 :(得分:0)
可能是您可以尝试MySQL存储过程
http://www.php.net/manual/en/mysqli.quickstart.stored-procedures.php