2012-08-27 18 views
2

我正在PHP + Zend Framework上實現一個非常簡單的會計程序。我有這樣的觸發設置:MySQL觸發器不應該從PHP發起時觸發,但從命令行執行

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實例處理。

回答

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。