简体   繁体   English

CakePHP无法正确保存条目

[英]CakePHP not saving entries properly

I'm trying to copy multiple rows from one table to another but it's only saving the last entry that I select. 我试图将多个行从一个表复制到另一个表,但这仅保存了我选择的最后一个条目。 When I print the array of data everything displays. 当我打印数据数组时,一切都会显示。 The table that I'm copying to does not have auto_increment set and that was my guess as to why, so now I'm puzzled. 我要复制到的表没有设置auto_increment,这是我对原因的猜测,所以现在我很困惑。

foreach($this->request->data['Order']['archive_value'] as $orderid){
    $data = $this->Order->query("select * from orders where orderid = '$orderid'");
    $newdata = array(
        'ArchivedOrder' => array(
                'orderid' => $data[0]['orders']['orderid'],
                'id' => $data[0]['orders']['id'],
                'order_status' => $data[0]['orders']['order_status'],
                'email' => $data[0]['orders']['email'],
                'total' => $data[0]['orders']['total'],
                'fullName' => $data[0]['orders']['fullName'],
                'address' => $data[0]['orders']['address'],
                'city' => $data[0]['orders']['city'],
                'state' => $data[0]['orders']['state'],
                'zip' => $data[0]['orders']['zip'],
                'created' => $data[0]['orders']['created'],
                'modified' => $data[0]['orders']['modified']  
        ));
        print_r($newdata); //this shows every entry that I look up, but it's not saving them properly
        $this->loadModel('ArchivedOrder');
        $this->ArchivedOrder->save($newdata);
        ///$this->Order->query("delete from orders where orderid = '$orderid'");
}

When I dump the table structure from PHPMyAdmin this is what shows 当我从PHPMyAdmin转储表结构时,显示的是

CREATE TABLE `archived_orders` (
  `orderid` int(10) default NULL,
  `id` int(10) default NULL,
  `order_status` varchar(20) default NULL,
  `email` varchar(50) default NULL,
  `total` varchar(50) default NULL,
  `fullName` varchar(60) default NULL,
  `address` varchar(50) default NULL,
  `city` varchar(50) default NULL,
  `state` varchar(50) default NULL,
  `zip` varchar(15) default NULL,
  `created` datetime default NULL,
  `modified` datetime default NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

Per the CakePHP book here : 按照CakePHP的书在这里

When calling save in a loop, don't forget to call create(). 循环调用save时,请不要忘记调用create()。

Also probably not a good idea to do the loadModel within the foreach loop. 在foreach循环中执行loadModel可能也不是一个好主意。

// load the model

// foreach loop

    // build the data
    $this->ArchivedOrder->create();
    $this->ArchivedOrder->save($newdata);

    //...

There are multiple issues with that code 该代码存在多个问题

  • Don't use query()... SQL injection ahead, your code is insecure and you lose the database abstraction. 不要使用query()...前面的SQL注入,您的代码不安全,并且丢失了数据库抽象。 Use find(). 使用find()。
  • Not an issue but... print_r - there is debug() by CakePHP, it's a lot better than a plain print_r 不是问题,但是... print_r-CakePHP有debug(),它比普通的print_r好很多
  • Don't use save(), use saveAll(), read that page . 不要使用save(),请使用saveAll(),请阅读该页面 No need to save the data in a loop 无需循环保存数据
  • 90% of that code should go into the model not in a controller 该代码的90%应该进入模型而不是放在控制器中

Granted your under the OrdersController 在OrdersController下授予您

$newdata = array();
foreach($this->request->data['Order']['archive_value'] as $orderid){
    $data = $this->Order->find('all',array('conditions'=>array('orderid'=>$orderid)));
    if(count($data) > 0){
    $newdata[] = array(
        'ArchivedOrder' => array(
                'orderid' => $data[0]['Order']['orderid'],
                'id' => $data[0]['Order']['id'],
                'order_status' => $data[0]['Order']['order_status'],
                'email' => $data[0]['Order']['email'],
                'total' => $data[0]['Order']['total'],
                'fullName' => $data[0]['Order']['fullName'],
                'address' => $data[0]['Order']['address'],
                'city' => $data[0]['Order']['city'],
                'state' => $data[0]['Order']['state'],
                'zip' => $data[0]['Order']['zip'],
                'created' => $data[0]['Order']['created'],
                'modified' => $data[0]['Order']['modified']  
        ));
     }


}
if(count($newdata) > 0){
      $this->loadModel('ArchivedOrder');
      print_r($newdata); //this shows every entry that I look up, but it's not saving them properly
      foreach($newdata as $order):
         $this->ArchivedOrder->id = $order['ArchivedOrder']['id'];
          if($this->ArchivedOrder->exists()){
               echo 'Entered Already';
          }else{
               $this->ArchivedOrder->create();
               if($this->ArchivedOrder->save($order)){

               }else{echo 'error'; return false;}
          }
      endforeach;
}
unset($newdata);

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM