1

Zend の挿入クエリと更新クエリに問題があります (Select は問題ありません)。

テーブルの定義:

class Application_Model_DbTable_Kpr1Data extends Zend_Db_Table_Abstract
{
    protected $_name = 'kpr_kpr1_data';
}

ここに私のデータマッパー(モデル)があります

class Application_Model_Kpr1DataMapper
{
    protected $_dbTable;

    public function setdbTable($dbTable) {
        if(is_string($dbTable)){
            $dbTable = new $dbTable();
        }
        if(!$dbTable instanceof Zend_Db_Table_Abstract ){
            throw new Exception ('Invalid table data gateway provided.');
        }
        $this->_dbTable = $dbTable;

        return $this;
    }

    public function getdbTable() {
        if (null === $this->_dbTable){
            $this->setdbTable('Application_Model_DbTable_Kpr1Data');
        }
        return $this->_dbTable;
    }

    public function save(Application_Model_Kpr1Data $kpr1data){
        $data = array('id' => (int) $kpr1data->getId(),
                'kpr1_plaza_id'   => (int) $kpr1data->getPlaza(),
                'kpr1_data' =>  new Zend_db_Expr("STR_TO_DATE('".$kpr1data->getDate()."', '%Y-%m-%d')"),
                'kpr1_money_delivered' => (float) $kpr1data->getDelivered(),
                'kpr1_money_transactions' => (float) $kpr1data->getTransactions(),
                'kpr1_created' => new Zend_Db_Expr('CURDATE()')
                );
        $id = (int) $kpr1data->getId();
        $table = $this->getdbTable();
        if (is_null($id) && $id != 0) {
            unset($data['id']);
            $table->insert($data);
        } else {
            $table->update($data, array('id => ?', $id));
        }
    }

最後の 1 つは、データを挿入して更新する保存機能です。

そして、この保存は保存アクションから呼び出されます:

public function saveAction()
{
    $plazaid = (int) $this->getRequest()->getParam('plaza');
    $date = (string) $this->getRequest()->getParam('date');
    $delivered = (string) $this->getRequest()->getParam('delivered');
    $transactions = (string) $this->getRequest()->getParam('transactions');
    $kpr1data = new Application_Model_Kpr1Data();
    if ($plazaid && $date) {
        $kpr1datamapper = new Application_Model_Kpr1DataMapper();
        if($kpr1datamapper->findDatePlaza($date, $plazaid, $kpr1data)){
            $kpr1data->setDelivered($delivered)
                    ->setTransactions($transactions);
            $kpr1datamapper->save($kpr1data);
            $this->_helper->layout->disableLayout();
            $this->view->result = json_encode(array("success"=>"true"));
        } else {
            $kpr1data->setDate($date);
            $kpr1data->setDelivered($delivered);
            $kpr1data->setTransactions($transactions);
            $kpr1data->setPlaza($plazaid);
            $kpr1datamapper->save($kpr1data);
            $this->_helper->layout->disableLayout();
            $this->view->result = json_encode(array("success"=>"true"));
        }
        $this->_helper->layout->disableLayout();
        $this->view->result = json_encode(array(
                                //"success"=>"false", 
                                "errorMsg"=>"Saving error"
                              ));            
    } else {
        $this->_helper->layout->disableLayout();
        $this->view->result = json_encode(array(
                                //"success"=>"false", 
                                "errorMsg"=>"Saving error"
                              ));
    }
    return true;
}

保存アクションは JS 経由で呼び出されますが、Web ブラウザーから直接呼び出しても失敗します。

動作: アプリケーションが実行中で、デバッガーが更新/挿入行に実行されると:

    if (is_null($id) && $id != 0) {
        unset($data['id']);
        $table->insert($data);
    } else {
        $table->update($data, array('id => ?', $id));
    }

ErrorController にリダイレクトしています。

1. firePHP はこのステートメントを表示していません 2. MySQL データベースはこのステートメントをログに記録しません (general_log 機能でチェックしました)。

立ち往生しています。お願い助けて。

編集

$data=
array(6) (
  [id] => (int) 0
  [kpr1_plaza_id] => (int) 116
  [kpr1_data] => Zend_Db_Expr object {
    _expression => (string) STR_TO_DATE('2013-03-01', '%Y-%m-%d')
  }
  [kpr1_money_delivered] => (float) 120
  [kpr1_money_transactions] => (float) 122
  [kpr1_created] => Zend_Db_Expr object...

$kpr1データ=

Application_Model_Kpr1Data object {
  _plaza => (string) 116
  _date => (string) 2013-03-01
  _delivered => (string) 120.00
  _transactions => (string) 122.00
  _created => null
  _id => null
  _plazaname => null
}

これは挿入する必要があります。そして次の更新:

Application_Model_Kpr1Data object {
  _plaza => (string) 117
  _date => (string) 2013-03-01
  _delivered => (string) 120.00
  _transactions => (string) 122.00
  _created => (string) 2013-03-06 12:42:13
  _id => (string) 79
  _plazaname => (string) SPO Kraj...
4

1 に答える 1

0

saveAction() $this->view->result関数は(最初に)設定した後は何も返さないため、if/elseステートメントの後に上書きされます$this->view->result。さらに、最初の設定はSaving error不要のようです。

これを試して:

public function saveAction()
{
    $plazaid = (int) $this->getRequest()->getParam('plaza');
    $date = (string) $this->getRequest()->getParam('date');
    $delivered = (string) $this->getRequest()->getParam('delivered');
    $transactions = (string) $this->getRequest()->getParam('transactions');
    $kpr1data = new Application_Model_Kpr1Data();
    if ($plazaid && $date) {
        $kpr1datamapper = new Application_Model_Kpr1DataMapper();
        if($kpr1datamapper->findDatePlaza($date, $plazaid, $kpr1data)){
            $kpr1data->setDelivered($delivered)
                    ->setTransactions($transactions);
            $kpr1datamapper->save($kpr1data);
            $this->_helper->layout->disableLayout();
            $this->view->result = json_encode(array("success"=>"true"));
        } else {
            $kpr1data->setDate($date);
            $kpr1data->setDelivered($delivered);
            $kpr1data->setTransactions($transactions);
            $kpr1data->setPlaza($plazaid);
            $kpr1datamapper->save($kpr1data);
            $this->_helper->layout->disableLayout();
            $this->view->result = json_encode(array("success"=>"true"));
        }
    } else {
        $this->_helper->layout->disableLayout();
        $this->view->result = json_encode(array(
                                //"success"=>"false", 
                                "errorMsg"=>"Saving error"
                              ));
    }
    return true;
}

編集:

保存アクションとしてこれを試してください。

public function save(Application_Model_Kpr1Data $kpr1data){
    $table = $this->getdbTable();

    if ($id == $kpr1data->getId()) {
        $data = array('id' => (int) $id,
            'kpr1_plaza_id'   => (int) $kpr1data->getPlaza(),
            'kpr1_data' =>  new Zend_Db_Expr("STR_TO_DATE('".$kpr1data->getDate()."', '%Y-%m-%d')"),
            'kpr1_money_delivered' => (float) $kpr1data->getDelivered(),
            'kpr1_money_transactions' => (float) $kpr1data->getTransactions(),
            'kpr1_created' => new Zend_Db_Expr('CURDATE()')
            );
        $table->update($data, array('id => ?', $id));
    } else {
    [...]
        $table->insert($data);
    }
}
于 2013-03-07T10:07:23.210 に答える