gpt4 book ai didi

php - 将多个 MySQL 语句合并为一个

转载 作者:太空宇宙 更新时间:2023-11-03 12:13:26 24 4
gpt4 key购买 nike

我连续快速地调用了这三个电话:

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 ,但两者似乎都比我认为必要的要复杂。

最佳答案

我将在假设您使用的是符合 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();
}

关于php - 将多个 MySQL 语句合并为一个,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23264184/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com