2010-08-09 7 views
11

저장하려고하면 "부모가 누락 된 행을 새로 고칠 수 없습니다"라는 오류 메시지가 나타납니다. 여기 내 코드는 내가 saveRow() 메서드를 호출 할 때, 나는 $ _POST 값 ($ 형상 ->에 getValues ​​()) 내 다른 모듈에서 함께상위로 행을 새로 고칠 수 없습니다. Zend Framework

내가이 클래스를 재사용 한 전달

abstract class Webapp_Model_Resource_Db_Table_Abstract 
extends Zend_Db_Table_Abstract 
{ 
    /** 
    * Save a row to the database 
    * 
    * 
    * @param array    $info The data to insert/update 
    * @param Zend_DB_Table_Row $row Optional The row to use 
    * @return mixed The primary key 
    */ 

    public function saveRow($info, $row = null) 
    {   
     if (null === $row) { 
      $row = $this->createRow(); 
     } 
     $columns = $this->info('cols'); 
     foreach ($columns as $column) { 
      if (array_key_exists($column, $info)) { 
       $row->$column = $info[$column]; 
      } 
     } 

     return $row->save(); 
    } 
} 

입니다 같은 응용 프로그램이지만 지금은이 오류가 발생하고 왜 확실하지 않습니다. 내 테이블은 꽤 똑바로 :

CREATE TABLE `news` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `headline` varchar(100) DEFAULT NULL, 
    `snippet` varchar(500) DEFAULT NULL, 
    `full_text` text, 
    `author` varchar(100) DEFAULT NULL, 
    `publish_from` date DEFAULT NULL COMMENT 'Publish date', 
    `publish_to` date DEFAULT NULL COMMENT 'Take it down or mark as draft after this date', 
    `datecreated` timestamp NULL DEFAULT NULL COMMENT 'First created on', 
    `revised` timestamp NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'Timestamp for the last time it was revised', 
    `draft` tinyint(1) DEFAULT '0' COMMENT 'Should not be published', 
    `departments_id` int(11) DEFAULT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=InnoDB AUTO_INCREMENT=214 DEFAULT CHARSET=utf8 COMMENT='Stores news articles'; 

누구나 내가 뭘 잘못하고 있는지 알아?

:::::::::::::: ADDTION :::::::::::::

public function saveNews($post,$defaults = array()) 
    { 

     //get the form 
     $form = $this->getForm('article' . ucfirst($validator)); 
     //validate 
     if(!$form->isValid($post)) { 
      return false; 
     } 


     //get fitered values 
     $data = $form->getValues(); 
     //apply defaults 
     foreach($defaults as $col => $value) { 
      $data[$col] = $value; 
     } 

     //get the article if it exists 
     $article = array_key_exists('id', $data) ? 
        $this->getNewsById($data['id']) : null; 


     return $this->saveRow($data, $article); 
} 
+1

왜'Zend_Db_Table_Row_Abstract :: save()'을 사용하지 않습니까? 여기 : http://framework.zend.com/apidoc/core/Zend_Db/Table/Zend_Db_Table_Row_Abstract.html#save – chelmertz

+0

@chelmertz thats 내가 사용하고있는 것. 내 수업이 Zend_Db_Table_Abstract를 어떻게 확장하는지보십시오. 데이터가 데이터베이스에 성공적으로 삽입되었지만 Zend_Db_Table_Row_Abstract :: save() 코드는 _refresh()를 내부적으로 호출하므로 오류가 발생합니다. – browndash

+0

왜 저장 대신 saveRow()를 사용하는지 이해하지 못합니다.(). 괜찮아요, 오류가 지속되지만, 먼저 이것을 제거해야합니까? 또한 저장시 departments_id를 설정 했습니까? 아마 그 오류는 그 관계에 있습니다. 컨트롤러 코드도 게시하십시오. –

답변

10

기본 키에 대해 빈 값을 전달하면 Zend는 삽입 된 자동 증가 값 대신이 값을 반환하는 것처럼 보입니다. 자동으로 새 행이 올바르게 생성 되더라도 - 증가 값, 삽입 된 값은 반환되지 않습니다.

아마도이 문제는 관련이 있습니다. 그렇다면 저장하기 전에 id 필드를 설정 해제하십시오.

+0

고마워, 그 속임수를 – browndash

+0

나는 이것이 원인인지 확인할 수 있습니다. Zend를 프로젝트의 일부로 약간 비표준 방식으로 사용했습니다. 나는 null 'id'컬럼을 가진 $ 배열을 전달하는 것을 끝내었다. 쓰기도하지만 설명 된대로 오류가 반환됩니다. Zend가 불평하지 않기 위해서는 실제로 $ array [ 'id']를 unset()해야합니다. – elb98rm

-1

당신이 기능을 게시 할 수 없습니다 :

$this->getNewsById($id) 

문제가 있습니다 ...

+0

array_key_exists ('id', $ data)가 false를 반환하고 getNewsById가 실행되지 않도록 새 행을 만들 때 id가 없다고 생각합니다. 따라서 $ article = null 값이 saveRow()로 전달되므로이 값을 확인했습니다. 그래서 어디서나 실행되지 않기 때문에 getNewsById 코드는 무의미하다고 생각합니다. – browndash

+0

데이터베이스에서 찾을 수없는 행을 업데이트하면 "부모가 행을 새로 고칠 수 없습니다."라는 문제가 발생합니다. 삽입 또는 기본 키에 오류가 발생했습니다. 설정이 올바르지 않음). – Chris

0

$ 정보 배열을 확인하십시오. 아마도 기본 키에 대한 값이 비어있을 것입니다. 그래서 array_key_exists ($ column, $ info)는 true를 반환하고 행에 빈 기본 키를 할당합니다. 그리고이 키가있는 행이 존재하지 않으므로 오류가 발생합니다.

if (array_key_exists($column, $info) and $column != 'YOUR_PRIMARY_KEY_NAME') 
{ 
     $row->$column = $info[$column]; 
} 
0

문제는 AUTO_INCREMENT 누락했다.

관련 문제