2012-08-27 3 views
2

PHP + Zend Framework에서 매우 간단한 회계 프로그램을 구현하고 있습니다. 나는이 트리거가 설정 한 :PHP에서 가정 할 때 MySQL 트리거가 실행되지 않지만 명령 줄에서는 실행되지 않습니다.

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.

관련 문제