当使用PHP时,MySQL触发器未被触发,但从命令行中触发。

3

我正在使用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的一个实例处理。
1个回答

0
这个问题的解决方案再明显不过了。除了插入到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。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接