【问题标题】:Unexpected Notice in CodeIgniter form validationCodeIgniter 表单验证中的意外通知
【发布时间】:2019-09-16 10:39:25
【问题描述】:

这是我的简化视图

<?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: NoticeArray 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; 
}
?>

这是来自前端的图像

【问题讨论】:

  • $key 或 $val 是一个数组:在第 972 行之前试试这个 if(is_array($val)) { $val = implode(", ", $val); }
  • @ChrisHemmens $val 是数组,但我很惊讶如果我通过填写所有必填字段来提交表单没有错误,正如我在问题中提到的那样。
  • 而且我无法编辑第 972 行,因为这是 CI 自己的助手

标签: php codeigniter codeigniter-form-validation


【解决方案1】:

撤回“第一个”答案

我的原始答案(如下)是错误的。事实证明,我声称无效的语法(例如 'name' =&gt; '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() 期间,因为作为“助手”,它需要精确的数组名称。如果你使用下面的代码没有错误,生活很美好。

$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'=&gt;'value'=&gt; 的值使用双引号?我喜欢这种语法而不是使用点(。)来连接字符串。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' =&gt; 'u_email[0][email]', 应该是'name' =&gt; 'u_email[]'

'name' =&gt; 'u_email[1][email]' 应该是'name' =&gt; 'u_email[]'

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

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

【讨论】:

  • 感谢您的宝贵时间。但在我的场景中,我无法更改数组输入。请查看我更新的问题。
  • 查看我修改后的答案。享受吧!
【解决方案2】:

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]');

【讨论】:

  • 感谢您的回复。但我没有使用名称字段作为数组输入。
  • 数组输入是电子邮件字段,正如我在问题中提到的那样,我的控制器中不需要它
  • 所以请你再看一下这个意外通知
  • 抱歉,'name' =&gt; 'u_email[0][email]' 是一个数组输入。这是无效的,因为数组输入是一维数组。
  • 我相信@DFriend 所说的仍然适用。对于每个电子邮件输入 .etc,您的格式应为 email[]somestr[index][name] 的任何变体均无效。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-09-16
  • 2012-06-16
  • 1970-01-01
  • 1970-01-01
  • 2017-02-06
  • 2016-09-05
相关资源
最近更新 更多