Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/245.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL触发器在PHP中不触发,但在命令行中触发_Php_Mysql_Zend Framework - Fatal编程技术网

MySQL触发器在PHP中不触发,但在命令行中触发

MySQL触发器在PHP中不触发,但在命令行中触发,php,mysql,zend-framework,Php,Mysql,Zend Framework,我正在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.

我正在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
我的脚本只在
余额
表中插入,并从
账户
表中选择以获取余额

问题:当PHP执行INSERT查询时,触发器没有被触发(或者不起作用)。但是,如果我从MySQL日志中复制查询并将其粘贴到MySQL的命令行客户机中,它确实可以工作,并得到所需的结果(正确更新
accounts
表)。想法


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

这个问题的解决方案再明显不过了。随着插入到
余额表
中,我的脚本正在更新
账户
表。现在,如果我使用的是框架中提供的
Zend\u Db\u Table\u Row
类,这就不是问题了。但我很久以前就定制了一个过滤器,将其应用于集合中的每一行,如下所示(简化为这个答案):

所以我把它改成:

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
保持不变

我还向用户添加了一些特定于列的语句,我的脚本使用这些语句来加倍敏感数据的安全屏障:p

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);
    }
}