在cakephp中使用enctype作为multipart / form-data时,不会显示已发布的值

时间:2016-04-22 11:33:06

标签: php forms cakephp

我在cakephp工作。我创建了一个包含文件上传和textbox nad textarea的表单。

在这里,我的html代码如下所示:

<form action="" id="frmReg" method="post" enctype= "multipart/form-data">
   <div style="position:relative; margin-bottom:30px;" class="fildtpart4">
      <label><?php __d('statictext', 'Question', false); ?>:</label>
      <span>
          <textarea class="validate[required]" name="question1['question']" cols="" rows=""></textarea>
          <div style="color: red; position:absolute ; bottom:-25px ;" id="charNum"></div>
     </span>  
     <div class="clear"></div>
     <div class="fildtpart3">
        <label><?php __d('statictext', 'Currect Answer', false); ?></label>
        <span>
           <input name="question1['currect_ans']" type="text" class="validate[required]" id="" value="">
           <input type="file" class="validate[required]" onchange="showMyImage1(this)" name="question1['sponsor_image']" id="" />
           <input type="file" class="validate[required]" onchange="showMyImage2(this)" name="question1['question_image2']" id="" />
        </span>
        <input type="submit" value="submit" name="submit">
        <div class="clear10"></div>  
     </div>
   </div>
<form>

当我提交此表单时,它将仅显示图像而不是所有数据。

在我的控制器中,我写道:

 function add_polls()
 { 
    print_r($this->params['form']);exit;
 }

然后它输出如下:

array(
    [question1]=>array(
                    [name] => Array
                              (
                                 ['sponsor_image'] => contact.jpg
                                 ['question_image2'] => contact.jpg
                              )
                    [type] => Array
                              (
                                 ['sponsor_image'] => image/jpeg
                                 ['question_image2'] => image/jpeg
                              )
                    [tmp_name] => Array
                                   (
                                     ['sponsor_image'] => /tmp/phpUK7Vcj
                                     ['question_image2'] => /tmp/php3SCWGZ
                                   )
                    [error] => Array
                               (
                                 ['sponsor_image'] => 0
                                 ['question_image2'] => 0
                               )
                    [size] => Array
                              (
                                ['sponsor_image'] => 2305
                                ['question_image2'] => 2305
                              )
                      )
         )

此处,未打印问题1 ['currect_ans'] 问题1 ['问题'] 。当我从表单中删除enctype时,它将显示所有值。那么我该如何解决这个问题呢?

注意: CakePHP vesrion是1.3.13。

3 个答案:

答案 0 :(得分:0)

这是PHP如何处理文件,而不遵循CakePHP约定,导致CakePHP“覆盖”您的其他表单数据。

你应该使用表单助手,这样你就可以首先避免这个问题,除非你当然要弄乱字段名称并再次使用这些冲突。

添加question1中的所有内容(包括文件)会导致文件在question1 $_FILES下分组,正如您的问题所示,即

Array(
    [question1] => Array(
        [name] => Array(
            ['sponsor_image'] => contact.jpg
            ['question_image2'] => contact.jpg
        )
        // ...
    )
)

$_POST中的其余表单数据使用相同的键,即

Array(
    [question1] => Array(
        ['question'] => 'foo',
        ['currect_ans'] => 'bar'
    )
)

你应该闻到即将到来的冲突。

CakePHP将首先用$params['form']填充$_POST,然后迭代$_FILES并使用密钥在$params['form']中设置文件数据,这将导致之前设置的表单数据,即文本输入,要被覆盖,因为它们都使用密钥question1

tl; dr遵循命名约定,或使用表单助手

遵循CakePHP约定并使用data键(以及可选的模型名称,不需要存在)来对输入进行分组,这样所有数据都将被单独正确处理并通过{ {1}}

Controller::$data

无需使用嵌套键的引号btw。

更好的是,如前所述,使用表单助手,它会自动创建正确的字段名。

另见

答案 1 :(得分:-1)

所以我转载了你的问题,我正在报告以下内容。

在我的cakephp 3.x上,通过提交“常规”HTTP帖子,您的表单效果很好。 (我在您的表单中添加了<input type="submit">

[
    'question1' => [
        'question' => 'da',
        'currect_ans' => 'da',
        'sponsor_image' => [
            'name' => 'Mobile version.png',
            'type' => 'image/png',
            'tmp_name' => '/tmp/php3A021O',
            'error' => (int) 0,
            'size' => (int) 149447
        ],
        'question_image2' => [
            'name' => 'Mobile version.png',
            'type' => 'image/png',
            'tmp_name' => '/tmp/phpi6VWxl',
            'error' => (int) 0,
            'size' => (int) 149447
        ]
    ]
]

那么你如何提交数据呢?是通过ajax吗?你使用的是什么版本的cakephp?尝试回答这些问题,以便我可以为您提供进一步的帮助。

答案 2 :(得分:-2)

您是否尝试使用

获取数据
$postedData = $this->request->data;