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

予想からの偏差:

名前フィールドに入力せずにフォームを送信し、サーバー側のフォーム検証が false になった後、名前フィールドのフォーム検証エラーを予期していました。しかし、それ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; 
}
?>

これがフロントエンドの画像です これがフロントエンドの画像です

4

2 に答える 2

2

「最初の」回答の撤回

私の元の答え(以下)は間違っています。私が無効だと主張した構文 (例: 'name' => 'u_email[0][email]') は、実際には完全に問題ないことがわかりました。その構文を見たことがないか、忘れていました。(だから、私は今日何かを学んだ(または再学んだ)ので、SOでぶらぶらするのが好きな理由の1つです。)

新しい(正しい)答え

まず、元のサンプル コードを使用しても問題は再現されません。少なくとも、そうさせることはできません。質問の編集コードと DOM スクリーンショットは、目標が何であり、問​​題がどこにあるのかを正確に理解できるようにすることで、より正確で正確な情報を提供します。

OPでは、「フィールド名としての配列」を使用していません-u_nameとにかくそうではありません。しかし、編集された質問では、あなたはそうです! additional_alert間違いなく配列です。

そのため、@Alex はほとんど問題を特定したことがわかりました。明確ではなかったのは、配列をフィールド名として使用すると、すべての「ヘルパー」関数に適用されるということです。

修正は、正確な配列名を使用することです。

「実際のシナリオ」コードは、配列から文字列への変換エラーを生成するこの構文を使用します。

$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'=>( andの値に二重引用符を使用していることに注意してください'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];
于 2019-09-16T22:02:11.107 に答える