【问题标题】:CakePHP wrong date in MySQLMySQL 中的 CakePHP 日期错误
【发布时间】:2015-12-14 15:35:58
【问题描述】:

我在 MySQL 中的 datetime 类型的表中有一个名为 issue_date 的字段,我将其更改为 date。

当我尝试将日期保存到数据库时,将其保存为
奇怪的年份(例如 2196 年),当实际日期为 2003 年时,我在保存之前输出了对象并显示实际日期(2003-06-30)

字段为issue_date

这是我要保存的函数:

public function populate(){
        $this->tangoModel=$this->loadModel('Tango');
        $tango=$this->tangoModel->getInvoices();
        $this->obrasModel=$this->loadModel('Obras');
        $obras=$this->obrasModel->getObras();
        foreach($tango as $invoice){
        $data[] = ([
        'issue_date' => date('Y-m-d', strtotime($invoice['issue_date'])),
            'type' => $invoice['type']
        ]
        );
        }
        print_r($data);
        $invoices = $this->Invoices->newEntities($data);
        foreach($invoices as $invoice){
        if ($this->Invoices->save($invoice)) {
                $this->Flash->success(__('The invoice has been saved.'));
        };
        }


    }

这是一个数据数组对象的输出:

[0] => Array
    (
        [issue_date] => 2003-06-30,
        [type] => CRE
    )

这是如何在 MySQL 中插入的输出

    [{"id":"1",
    "issue_date":"2196-11-06",
    "type":"CRE"
    }]

这是在 /Model/Table 的 InvoicesTable 文件中验证字段的方式:

public function validationDefault(Validator $validator)
    {
        $validator
            ->add('id', 'valid', ['rule' => 'numeric'])
            ->allowEmpty('id', 'create');

        $validator
            ->add('issue_date', 'valid', ['rule' => 'date'])
            ->allowEmpty('issue_date');
         $validator
            ->allowEmpty('type');

        return $validator;
    }
}

这是/Model/Entity中的实体文件Invoice.php

   /**
 * Invoice Entity.
 *
 * @property int $id
 * @property \Cake\I18n\Time $issue_date
 * @property string $type
 */
class Invoice extends Entity
{

    /**
     * Fields that can be mass assigned using newEntity() or patchEntity().
     *
     * Note that when '*' is set to true, this allows all unspecified fields to
     * be mass assigned. For security purposes, it is advised to set '*' to false
     * (or remove it), and explicitly make individual fields accessible as needed.
     *
     * @var array
     */
    protected $_accessible = [
        '*' => true,
        'id' => false,
    ];
}

谢谢

【问题讨论】:

  • 在将列类型从datetime 更改为date 之后,您是否清除了CakePHP 缓存?这是在更改数据库结构后遇到奇怪错误时首先要检查的事情。
  • 是的,我已经删除了 /tmp/cache 中的所有内容
  • 你的 mysql 输出是 '2196-11-06'。你说这个字段是日期时间?
  • 现在字段是日期,原来是,当我使用 CakePHP 烘焙表格时,它是日期时间
  • intl.default_locale 设置为什么?你用过DateTimeType::setLocaleFormat()Time::setToStringFormat()吗?这可能很有趣:stackoverflow.com/questions/33734683/…

标签: php mysql cakephp cakephp-3.0


【解决方案1】:

在控制器中添加它起作用了:

use Cake\Database\Type; 
Type::build('date')->setLocaleFormat('yyyy-MM-dd');

感谢 ndm

【讨论】:

  • 我建议不要在控制器中这样做(而是在引导程序中),除非它真的应该只应用于那个特定的控制器!
猜你喜欢
  • 2014-08-29
  • 2023-03-22
  • 1970-01-01
  • 1970-01-01
  • 2018-07-16
  • 2012-08-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多