gpt4 book ai didi

php - MySQL 触发器在从 PHP 假定时不触发但从命令行触发

转载 作者:搜寻专家 更新时间:2023-10-31 22:11:51 26 4
gpt4 key购买 nike

我正在 PHP + Zend Framework 上实现一个非常简单的会计程序。我设置了这个触发器:

CREATE TRIGGER consolidate_balance BEFORE INSERT ON balance FOR EACH ROW 
BEGIN
IF (NEW.amount IS NOT NULL) THEN
UPDATE accounts SET accounts.balance = accounts.balance + NEW.amount WHERE accounts.id = NEW.account_id;
END IF;
END

我的脚本只对 balance 表进行插入,并从 accounts 表中进行选择以获取余额。

问题:当 PHP 执行 INSERT 查询时,触发器未被触发(或不起作用)。但是,如果我从 MySQL 日志中复制查询并将其粘贴到 MySQL 的命令行客户端中,它确实有效并且我得到了想要的结果(accounts 表已正确更新)。想法?

以防万一,所有查询都由 Zend_Db_Table_Row 的实例处理。

最佳答案

这个问题的解决方案再明显不过了。随着对 balance 表的插入,我的脚本正在更新 accounts 表。现在,如果我使用框架中提供的 Zend_Db_Table_Row 类,这将不是问题。但我很久以前就对其进行了定制,以便对集合中的每一行应用一个过滤器,就像这样(针对这个答案的问题进行了简化):

class Mauro_Db_Table_Row extends Zend_Db_Table_Row {
// Pre-update logic
function _update() {
$data = $this->toArray();
$data = $filters->filter($data);
$this->setFromArray($data);
}
}

所以我改成了这样:

class Mauro_Db_Table_Row extends Zend_Db_Table_Row {
// Pre-update logic
function _update() {
$diffData = array_intersect_key($this->_data, $this->_modifiedFields);
$data = $filters->filter($diffData);
$this->setFromArray($data);
}
}

现在只有修改过的字段被过滤 $account->balance 保持不变。

我还添加了一些专栏 REVOKE向用户声明我的脚本正在使用这些敏感数据加倍安全屏障:P。

关于php - MySQL 触发器在从 PHP 假定时不触发但从命令行触发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12150245/

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