【问题标题】:CakePHP: Submitting a multiple checkbox input into the databaseCakePHP:将多个复选框输入提交到数据库中
【发布时间】:2013-01-05 00:42:15
【问题描述】:

我在 Cakephp 表单中有一个复选框,它可以有多个值。在视图中:

<?php // Multiple checkbox form
        echo $this->Form->input('report_types', array(
        'type'=>'select',
        'label'=>'Report Type(s)',
        'multiple'=>'checkbox',
        'options'=>array(
            'option 1'=>'option 1',
            'option 2'=>'option 2',
            'option 3'=>'option 3',
        ),
)); ?>

当我将它加载到数据库中时,它会返回“未找到列:1054 Unknown column 'Array' in 'field list'”错误,因为它试图在应该是字符串的位置添加一个数组。

我尝试将数组形式的$this-&gt;request-&gt;data 中的 any 转换为字符串,但这会干扰我之前在表单中的日期选择(它们存储为数组以及)。

我还尝试在模型中的beforeValidate() 方法中仅将多个复选框字段的值转换为字符串,但它需要太多重复并且当我需要“解包”数据时会变得混乱:

<?php class Request extends AppModel {
    ...
    function beforeValidate() {
        if(!empty($this->request->data['Request']['attachment_types'])) {
            $this->data['Request']['attachment_types'] = implode(',', $this->data['Request']['attachment_types']);
        }
        if(!empty($this->request->data['Request']['report_types'])) {
            $this->data['Request']['report_types'] = implode(',', $this->data['Request']['attachment_types']);
        }
        // Am I going to have to keep adding if-statements here? 
        }?>

此外,!empty() 方法不起作用,因为该字段永远不会为空(由于 CakePHP 进行复选框输入时自动创建的隐藏字段)。

有没有人知道如何将多个复选框输入提交到数据库中?这似乎是一个非常温和的要求……CakePHP 在这方面有什么“自动”技能吗?

【问题讨论】:

  • 'report_types' 列的数据类型是什么?一个集合,还是一个被滥用为集合的 varchar?在那种情况下,我认为这是唯一的方法(我遇到了同样的问题)
  • 嗨,JvO!谢谢您的答复。我已将数据类型更改为一个集合(由复选框选项的值定义)并将数组传递给数据库——尽管仍然得到相同的错误。我缺少一些额外的步骤吗?我需要以某种方式序列化数据吗?
  • 是的,必须自己序列化。重新阅读我的评论后,我意识到这不是很清楚。将其更改为一组将无济于事(无论如何,对 Cake 没有帮助);我的意思是说我也必须使用 implode/explode 函数。另请注意,集合不是标准 SQL,而是 MySQL 扩展。
  • 感谢您的帮助,JvO!现在我可以正式开始我的周末了。我已经对数据进行了序列化,稍后会发布答案。

标签: php cakephp


【解决方案1】:

为了解决这个问题,我将数组中的数据类型更改为在我的数据库中定义为('option 1','option 2','option 3) 的选项集。如果您的数据库中没有“设置”数据类型,没关系。然后,我修改了我的beforeValidate() 函数来序列化数据。

<?php class Request extends AppModel {
...
function beforeValidate() {
    if($this->request->data['Request']['attachment_types']!=0) {
        $this->data['Request']['attachment_types'] = implode(',', $this->data['Request']['attachment_types']);
    }
    if($this->request->data['Request']['report_types']!=0) {
        $this->data['Request']['report_types'] = implode(',', $this->data['Request']['report_types']);
    }
    // Yes, I will just have to keep adding if-statements :(
    }?>

请注意,在上面的示例中,我有两个带有复选框的字段(“report_types”和“attachment_types”),这解释了为什么我有两个 if 语句。

感谢 JvO 的帮助!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-06-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-03
    • 1970-01-01
    相关资源
    最近更新 更多