Php 按类似条件更新不同的表和列

Php 按类似条件更新不同的表和列,php,mysql,pdo,Php,Mysql,Pdo,我必须运行一个过程,在几个表中用新值更新旧值。所有这些表都是不同的,并且具有不同的列名,而且它们甚至不能包含匹配的$old_value(在这种情况下,不应更新列),因此我唯一能想到的是运行事务,如下所示: $new_value = 'something'; $DBH->prepare("SELECT old_value FROM table_0 WHERE id = :id"); $DBH->execute(':id' => $some_value); $result = $

我必须运行一个过程,在几个表中用新值更新旧值。所有这些表都是不同的,并且具有不同的列名,而且它们甚至不能包含匹配的
$old_value
(在这种情况下,不应更新列),因此我唯一能想到的是运行事务,如下所示:

$new_value = 'something';

$DBH->prepare("SELECT old_value FROM table_0 WHERE id = :id");
$DBH->execute(':id' => $some_value);
$result = $DBH->fetch(PDO::FETCH_ASSOC);

if( $new_value != $result[0]['old_value'] )
{
    $DBH->beginTransaction();

    $DBH->exec("UPDATE table_1 SET column_1 = $new_value WHERE column_1 = $old_value");
    $DBH->exec("UPDATE table_2 SET column_2 = $new_value WHERE column_2 = $old_value");
    $DBH->exec("UPDATE table_2 SET column_3 = $new_value WHERE column_3 = $old_value");

    $DBH->rollBack();
}

有没有更好的解决办法?在不影响整个结果集的情况下运行“选择更新”的可能方法?

您有三种不同的更新条件,所以基本上需要三种不同的更新。将它们封装在事务中是可靠实现这一点的最佳方法。

最后,您需要这样做

$DBH->commit();

只有在出现错误时才执行
$DBH->rollback()
。回滚将撤消自事务开始以来所做的所有操作。

您在
选择中使用占位符,这很好,但在
更新
查询中使用字符串插值,这非常危险。是的,但
$old\u value
无法作为用户输入;此数据仅来自
session\u id()
;所以我认为在这种情况下,事先准备好的声明是不必要的。是例外和借口让人们陷入了严重的麻烦。尽可能使用占位符。像这样的东西是任何SQL安全审计的自动失败。对不起,我忘了在问题
代码块
中包括最后一行,但这不是重点。谢谢!我想是的,但还是决定问。问也无妨。有时不清楚是否真的有更好的方法。