1

这是我的简化视图

<?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一个Array to string conversion

遇到 PHP 错误

严重性:通知

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

文件名:helpers/form_helper.php

行号:972

我的调试发现:

排除故障后,我发现我的input as array字段导致了此错误通知。但是,当我通过填写所有必填字段提交时,它工作正常并且input as array字段不会生成任何Notice.

form_helper.php

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;
}

请深入研究一下,并为此建议我一些解决方案。

编辑:

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

<?php
if(empty($additional_alert[0]))
{
   echo '<td id ="empty">No additional alert data found.</td>';
}
else
{
foreach($additional_alert as $key=>$additional_alert):
 ?><div>
<?php
$data   = array('placeholder'=>'Name', 'name'=>'additional_alert['.$key.'][name]', 'value'=>set_value('additional_alert', $additional_alert['name']), 'class'=>'');
   echo form_input($data);
$data   = array('placeholder'=>'Email', 'name'=>'additional_alert['.$key.'][email]', 'value'=>set_value('additional_alert',$additional_alert['email']), 'class'=>''); 
   echo form_input($data);
   echo '<button type="button" name="remove" id="" class="btn btn-danger btn_removes"><i class="fa fa-trash-o"></i></button>';
?><br>
</div>
<?php
endforeach; 
}
?>

这是来自前端的图像 这是来自前端的图像

4

2 回答 2

2

撤回“第一个”答案

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

新的(正确的)答案

首先,使用原始示例代码不会重现问题。至少我不能让它这样做。问题的编辑代码和 DOM 屏幕截图通过更好地理解目标是什么以及问题可能出在哪里,提供了更好、更真实的信息。

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

所以事实证明@Alex 主要指出了这个问题。不清楚的是,使用数组作为字段名称适用于所有“帮助”函数。

解决方法是使用 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'=>$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];
于 2019-09-16T22:02:11.107 回答
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]');
于 2019-09-16T12:09:36.277 回答