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 のインスタンスによって処理されます。

4

1 に答える 1

0

この問題の解決策はこれ以上ないほど明白です。テーブルへの挿入に加えてbalance、私のスクリプトはテーブルを更新していましたaccountsZend_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そのまま残ります。

また、スクリプトがそのような機密データのセキュリティバリアを2倍にするために使用している列固有のREVOKEステートメントをユーザーに追加しました:P.

于 2012-08-27T23:49:46.703 に答える