3

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

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 的实例处理。

4

1 回答 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。

于 2012-08-27T23:49:46.703 回答