2014-10-30 3 views
0

CodeIgniter 응용 프로그램에서 특정 UPDATE 작업을 시도 할 때 매우 이상한 데이터베이스 오류가 발생합니다.활성 레코드의 추가 결합 WHERE 절 : 어디서 오는가?

$this->db->update('eval_events', 
        array('eval_event_totalscore'=>$result['average_score'], 
         'eval_event_average_totalscore=>$result['average_score']), 
        array('eval_event_id'=>$eval_event_id)); 

그리고보고 된 오류는 다음과 같습니다 :

활성 기록 호출은

Error Number: 1054 

Unknown column 'id' in 'where clause' 

UPDATE `eval_events` SET `eval_event_totalscore` = '40.0000', `eval_event_average_totalscore` 
= '40.0000' WHERE `id` = '581' AND `id` = '581' AND `id` = '581' AND `id` = '581' AND `id` = 
'581' AND `id` = '581' AND `id` = '581' AND `id` = '581' AND `id` = '581' AND `id` = '581' AND 
`id` = '581' AND `id` = '581' AND `id` = '581' AND `id` = '581' AND `id` = '581' AND `id` = '581' 
AND `eval_event_id` = '565' 

응? 도대체 'id'가 나오는 여분의 결합체는 모두 어디에 있습니까?

분명히 나는 ​​그들을 지나치 지 않고 CI_active_record.php의 독서에서 나에게 단서를 제공하지 못했습니다. 관련 될 수있는 정보의

추가로 3 개 조각 :이 오류는 지금까지 내가 말할 수있는, 내 개발 컴퓨터에 무슨 일이 일어나고

  1. . 프로덕션 시스템에서 쿼리가 정상적으로 처리 된 것 같습니다.
  2. 이 전화를 update()에게 보내면 다음에 전화가 오는 경우 정확히 똑같은 방식으로 손상됩니다.
  3. 값 '581'은 이러한 업데이트가 포함 된 작업의 전체 컨텍스트에서 중요하지만 다른 테이블의 키입니다 (어쨌든 `pid`이 아닌` id`).

그것은 활성 기록 코드와 같은을 느낀다는 그`id` = '581'캐쉬하고, 뭔가가 밖으로이 시점에서 내 UPDATE 문에 그 캐시의 내용을 기침을 일으키는 원인이된다.

내가 정말 좋은 있어야하는 액티브 어떤 기록의 start_cache()/ stop_cache()/ flush_cache() 방법을 이해하지 못하고 있음을 인정한다

- grep -r 어디 start_cache()에 더 전화가 없다는 것을 나에게 알려주기 때문에,하지만 그건 문제가 안된다 응용 프로그램의 코드베이스에서.

그냥 웃어 보려고했는데 update() 호출 바로 전에 $this->db->flush_cache()에 전화를 걸었지만 아무것도 변경하지 않았습니다.

나는 이것을 알아 내려고 다음으로 어디를보아야할지 모른다.

아이디어가 있으십니까? 누군가?

답변

0

오케이 : echo, var_export()debug_print_backtrace()을 구출합니다.

실패한 update() 전화를 걸기 전에 총 16 번 호출되는 기능이 있습니다. 그리고 16은 잘못된 UPDATE 문에 여분의`id` = '581'결합의 수입니다.

$this->db->where('id',$pid); // <=== WTF??? 
$sql = "SELECT id FROM project_score WHERE pid=$pid AND uid=$uid AND scoretype=1"; 
$result = $this->db->query($sql)->row_array(); 

이 사진에 어떤 문제가 있습니까 :

그리고 그 이전의 기능에

(나는 BTW,이 쓰레기 어떤 를 작성하지 않은) 다음 코드?

음, 떨어져 모든에서 액티브 레코드 을 사용하는 반신 반의하는 선택에서, * 활성 기록 query() 방법은 where() 이전 호출에 의해 멀리 squirreled 된 것 아무것도 사용하지 않습니다.

결과적으로, 16 개의 가짜 조건 대기열이 계속 나타나며 처음에는 모호한 update() (또는 select() 등) 호출을 기다리고 있습니다.

프로덕션 시스템에서이 문제가 발생하지 않는 이유는 무엇입니까?

글쎄, 내 개발 시스템에서, 일시적으로 내 로컬 PHP에서 일부 누락 된 구성으로 인해 실패하고 있었던 그 밖의 (내가별로 신경 쓰지 않았던)을 주석 처리했습니다. 바로 그때를 재건.

내가 메모 한 내용에는 16 가지 조건 대기열이있는 것을 알 수있는 액티브 레코드가 포함되어 있었지만 분명히 그 특정 호출에 대해 양성을 보였습니다.

쳇!

* 어쨌든이 "액티브 레코드"는 누구의 아이디어였습니까?

개체에 대기열을내는 where()과 같은 기능을 갖는 것이 좋습니다. 더 나은 디자인은 각각의 SQL 문을 다른 객체로 만들지 않았을 것입니다. 그래서 하나를 생성하는 동안 만들어진 실수는 완전히 다른 부분에서 다른 객체를 손상시킬 수 없습니까?