CodeIgniter表单验证中的意外通知

时间:2019-09-16 10:39:25

标签: php codeigniter codeigniter-form-validation

这是我的简化视图

Task

这是我的示例控制器

<?php
echo form_open('form/submit');

echo form_label('User Name:*', 'u_name');
$data= array('name' => 'u_name','placeholder' => 'Your Name');
echo form_input($data);

echo form_label('User emails:', 'u_email');
$data= array('type' => 'email','name' => 'u_email[0][email]', 'placeholder' => 'Email');
echo form_input($data);

$data= array('type' => 'email','name' => 'u_email[1][email]', 'placeholder' => 'Email');
echo form_input($data);

$data = array('type' => 'submit','value'=> 'Submit','class'=> 'submit');
echo form_submit($data); 

echo form_close();

与预期的差异:

当我提交我的表单而不填写姓名字段并且服务器端表单验证失败后,我期望的是姓名字段的表单验证错误。但它会生成$this->form_validation->set_rules('u_name', 'Name', 'trim|required|max_length[20]'); if ($this->form_validation->run() == FALSE) { $this->load->view('myview', $data); }

Severity: Notice
  

遇到PHP错误

     

严重性:通知

     

消息:数组到字符串的转换

     

文件名:helpers / form_helper.php

     

行号:972

我的调试结果:

排除故障后,我发现我的Array to string conversion字段正在引起此错误通知。但是,当我通过填写所有必填字段提交时,效果很好,input as array字段不会生成任何input as array

form_helper.php

Notice

请对此进行深入研究,并为我提出一些解决方案。

编辑:

从我正在工作的实际场景中看下面的代码,以便更好地理解

function _parse_form_attributes($attributes, $default)
{
    if (is_array($attributes))
    {
        foreach ($default as $key => $val)
        {
            if (isset($attributes[$key]))
            {
                $default[$key] = $attributes[$key];
                unset($attributes[$key]);
            }
        }

        if (count($attributes) > 0)
        {
            $default = array_merge($default, $attributes);
        }
    }

    $att = '';

    foreach ($default as $key => $val)
    {
        if ($key === 'value')
        {
            $val = html_escape($val);
        }
        elseif ($key === 'name' && ! strlen($default['name']))
        {
            continue;
        }

        $att .= $key.'="'.$val.'" '; //Line Number: 972
    }

    return $att;
}

这是前端的图像 and here is image from front-end

2 个答案:

答案 0 :(得分:2)

撤消“第一个”答案

我的原始答案(如下)是错误的。事实证明,我声称无效的语法(例如'name' => 'u_email[0][email]')完全可以。我以前从未见过这种语法,或者已经忘记了它。 (因此,我今天学到了(或重新学习了一些)这是我喜欢在SO上闲逛的原因之一。)

新的(正确的)答案

首先,使用原始示例代码不会重现该问题。至少我做不到。问题的编辑代码和DOM屏幕快照通过更好地了解目标是什么以及问题可能在何处而提供了更好,更真实的信息。

在OP中,您没有使用“数组作为字段名”,无论如何都不会使用u_name。但是在编辑后的问题中,您是! additional_alert绝对是一个数组。

因此,事实证明@Alex大多是指出问题所在。尚不清楚的是,使用数组作为字段名称适用于全部“ helper”函数。

解决方法是使用EXACT数组名称。

“实际情况”代码使用此语法,从而产生数组到字符串转换错误。

$data = array(
    'placeholder' => 'Name',
    'name' => 'additional_alert['.$key.'][name]',
    'value' => set_value('additional_alert', $additional_alert['name']),
    'class' => '');
echo form_input($data);

花了一些时间才意识到错误发生在set_value()期间,因为作为“帮助者”,它需要EXACT数组名称。如果使用以下代码,则不会有错误,生活会很美好。

$data = array(
    'placeholder' => 'Name', 
    'name' => 'additional_alert['.$key.'][name]',
    'value' => set_value('additional_alert['.$key.'][name]', $additional_alert['name']),
    'class' => '');
echo form_input($data);

很明显,(不是吗?)您必须对email做同样的事情。

$data = array('placeholder' => 'Email',
    'name' => "additional_alert[$key][email]",
    'value' => set_value("additional_alert[$key][email]", $additional_alert['email']),
    'class' => '');
echo form_input($data);

(注意'name'=>'value'=>的值使用双引号吗?我喜欢这种语法,而不是使用点(。)来连接字符串。IMO,它更易于阅读。不,您不需要在$key周围加上单引号。)

建议:

您使用了构造

foreach($additional_alert as $key=>$additional_alert):

这当然是可行的,但在set_value('additional_alert', $additional_alert['name'])行中让我暂时有些困惑。

为避免这种混乱,我建议您使用表格

foreach($plural_values as $key => $singular_value) 

在您的代码中,然后使用复数$additional_alerts,即

foreach($additional_alerts as $key => $additional_alert):`

-原始(错误)答案-

我认为错误在于'name' => 'u_email[0][email]', 应该是'name' => 'u_email[]'

并且'name' => 'u_email[1][email]'应该是'name' => 'u_email[]'

当您的视图尝试加载错误的语法时,会使form_input('$data')感到窒息。 当您在控制器中引用该字段时,则可以使用索引,例如

$emails = $this->input->post('u_email');
$email_1 = $emails[0];
$email_2 = $emails[2];

答案 1 :(得分:1)

https://codeigniter.com/user_guide/libraries/form_validation.html#using-arrays-as-field-names

因此:

$this->form_validation->set_rules('u_name[]', 'Name', 'trim|required|max_length[20]');