实体CRUD操作 - 编辑(更新)问题

时间:2012-01-20 08:45:05

标签: php mysql zend-framework crud

我正在尝试学习有关Zend Framework的一些内容,并且我对“编辑”数据库条目这样简单的操作感到困惑。

我有MySQL数据库中的联系人列表,我的意图是用一行中的信息填写表单,编辑它并将其保存回db(更新语句)。我尝试了几乎在我脑海中浮现的东西,检查了谷歌并预订了ZF,但是一直存在一些问题。此时,当我想要进行更新时,zf和mysql将创建新的数据库条目,其中填入了新的id和编辑的信息,但这显然不是我想要做的事情,因为而不是DB中的一个更新条目我已经得到了两个旧的和新的一个,有更新的信息。

以下是我的代码的重要部分...请看一下,我无法弄清楚我在这里缺少什么。

indexcontroller的一部分:

public function createcontactAction()
{
    $createContactForm = $this->_helper->_formLoader('addContact');
    $this->view->addContactForm = $createContactForm;
}

public function editcontactAction()
{
    $id = $this->getRequest()->getParam('id');

    $contactModel = new Application_Model_Contacts();
    $contactRow = $contactModel->find($id)->current();

    $addContactForm = $this->_helper->formLoader('addContact');

    if ($this->getRequest()->isPost() && $this->getRequest()->getPost('send', false) !== false) {
        if ($addContactForm->isValid($this->getRequest()->getPost())) {

            $contactRow->setFromArray($addContactForm->getValues());

            $contactRow->save();

            $this->_redirect('/index/editcontact/id/' . $contactRow->id);
        }
    } else {
        $addContactForm->populate($contactRow->toArray());
    }

    $this->view->addContactForm = $addContactForm;
}

public function savecontactAction()
{
    $form = $this->_helper->formLoader('addContact');

    if ($this->getRequest()->isPost() && $this->getRequest()->getPost('send', false) !== false) {
        if ($form->isValid($this->getRequest()->getPost())) {
            $contactModel = new Application_Model_Contacts();
            $contactRow = $contactModel->createRow($form->getValues());
            $contactRow->save();

            $this->_redirect('/index/editcontact/id/' . $contactRow->id);
        }
    }
    $this->view->form = $form;
}

表格 - 重要的部分:

类Application_Form_AddContact扩展了Zend_Form {

public function init()
{


    $this->setAction('/index/savecontact');
    $this->setMethod(Zend_Form::METHOD_POST);
    $this->setAttrib('id', 'index_savecontact');

    $contactFirstName = new Zend_Form_Element_Text('first_name', array('size'=>32, 'maxlength'=>64, 'label'=>'Křestní', 'required'=>false));
    $contactLastName = new Zend_Form_Element_Text('last_name', array('size'=>32, 'maxlength'=>64, 'label'=>'Přímění', 'required'=>true));

.
.
.

    $contactNotes = new Zend_Form_Element_Textarea('notes', array('cols'=>32, 'rows'=>1, 'label'=>'Poznámky', 'required'=>false));

    $contactSend = new Zend_Form_Element_Submit('send', array('label'=>'Odeslat'));

    $this->addElements(array ($contactFirstName, $contactLastName, $contactStreet, $contactHouseNumber, $contactCity, $contactZipCode, $contactCountry,
            $contactPhoneNumber, $contactMobileNumber, $contactEmail, $contactWebPage, $contactCrn, $contactVat, $contactNotes, $contactSend));

非常感谢!

(如果您需要更多的东西来帮我解决这个问题)

编辑:

heres联系模式:

class Application_Model_Contacts extends Zend_Db_Table_Abstract
{
    protected $_name    = 'contacts';
    protected $_primary = 'id';

}

3 个答案:

答案 0 :(得分:0)

您尝试在不提供要更新的行的ID的情况下获取更新。用于查询的数据是$form->getValues(),但表单似乎不包含联系人的ID。将ID作为隐藏字段(ID为值)添加到表单中,或者使用$contactRow->id = $id单独设置,并且应该更新而不是插入。

答案 1 :(得分:0)

关于Zend_Db_TableZend_Db_Table_Row(我假设这是你的模型使用的),我有点生疏,但我的赌注是你错过了主键(PK) )在你的$contactRow - 我猜你可能不会通过表单提供它,因为我看到你通过GET得到它。所以,只需在id中将$id设置为$contactRow,就可以了。

答案 2 :(得分:0)

editcontactAction()之前,$contactRow->save();之前,添加:$contactRow->id = $id
如果您的行没有指定ID,则save()无法更新。