5

私は CodeIgniter を使用しており、編集フォームでデータベースからデータを取得しています。このデータには、アポストロフィ、アンパサンドなどが含まれることがあります。

CI でこれを解析せずに HTML バージョンに変更して、エンド ユーザーが編集できるようにするにはどうすればよいでしょうか。

これは編集フォームの画像です。このテキスト フィールドには、データベースから取り込まれたデータが入力テキスト フィールドに取り込まれています。下の 2 番目の画像でわかるように、データには特別な文字は含まれていません。

ここに画像の説明を入力

これは、テーブルでデータがどのように表示されるかのスクリーンショットです。右端の列からのみ取得していることに注意してください。4列目ではありません: ここに画像の説明を入力

ご覧のとおり、データは html に変換されて保存されていませんが、CI はまだデータを変換しています。

上記のテキスト フィールドのスニペットを次に示します。

<?php    
/**
 * Form Field attribute settings
 * @author Mike DeVita
 */
$companyname = array(
    'name'  => 'companyname',
    'placeholder' => 'Enter Your Companies Name',
    'id'    => 'companyname',
    'value' => set_value('', $points['pointFields']['companyname']->uf_fieldvalue),
    'maxlength' => 80,
    'size'  => 30
);
            <div class="_100">
                <p><?php echo form_label('Company Name', $companyname['id']); ?><?php echo form_input($companyname); ?></p>
                <?php echo form_error($companyname['id']); ?>
            </div>

データベースへの挿入のスニペットを次に示します。

function addUserFieldHtml($compiledHtml){
    foreach ($compiledHtml as $cHK => $cHV){
        $data = array (
            'pointid' => $cHV['pointId'],
            'timestamp' => time(),
            'html' => $cHV['html'],
            'fieldid' => $cHV['fieldId'],
            'fieldvalue' => $cHV['fieldValue']
        );
        $this->db->insert('userfields', $data);

    }
}#end addUserFieldHtml() function

ありがとう

4

6 に答える 6

3

問題はここにあります:

$companyname = array(
    'value' => set_value('', $points['pointFields']['companyname']->uf_fieldvalue),
);

set_value()一部の文字をエンティティに変換し、生の HTML でのみ使用する必要があります。次のように、フォーム ヘルパー関数には渡されません。

<input name="email" value="<?php echo set_value('email'); ?>">

form_prep()これは、次のような入力文字列をエスケープする関数を呼び出します。

<input name="username" value="<?php echo form_prep($row->username); ?>">

したがって、設定をvalue次のように変更するだけです。

$companyname = array(
    'value' => $points['pointFields']['companyname']->uf_fieldvalue,
);

...そして、入力を表示するためform_input()の他のフォームヘルパー関数valueと一緒に使用すると、は適切にエスケープされます。例えば:

echo form_input('myinput', '</div>"someJunkInput"<?php'); // Good to go
于 2012-04-15T05:45:49.603 に答える
1

私はこのように使用します:

$tavall = html_entity_decode($task->description, ENT_QUOTES, 'UTF-8');

次に、フォーム入力(私の場合はテキストエリア)で:

form_textarea(array(
    'name'          => 'task_description',
    'id'            => 'task_description',
    'value'         => set_value('task_description', $tavall), // 
    'rows'          => 10,
    'cols'          => 40,
))

テキスト入力についても同じことが機能します。

于 2013-03-20T11:16:45.350 に答える
0

set_value() を使用すると、CodeIgniter は htmlspecialchars() を介して $_POST 配列を自動的に渡します。form_helper.php の set_value() 関数を見ると、目的の値が目的のフィールドで htmlspecialchars() を実行する form_prep() を介して渡されることがわかります。

これを回避するには、form_prep() の実行をスキップする 3 番目のオプション パラメータを追加して、form_helper を拡張する必要があります。次のコードを MY_form_helper.php にコピーし、それを application/helpers/ にコピーします。

<?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed');

/**
 * Form Value
 *
 * Grabs a value from the POST array for the specified field so you can
 * re-populate an input field or textarea.  If Form Validation
 * is active it retrieves the info from the validation class
 * NEW: Added a third parameter prep to skip htmlspecialchars escaping
 *
 * @access  public
 * @param   string
 * @return  mixed
 */
if ( ! function_exists('set_value'))
{
    function set_value($field = '', $default = '', $prep = true)
    {
        if (FALSE === ($OBJ =& _get_validation_object()))
        {
            if ( ! isset($_POST[$field]))
            {
                return $default;
            }

            return $prep ? form_prep($_POST[$field], $field) : $_POST[$field];
        }

        return $prep ? form_prep($OBJ->set_value($field, $default), $field) : $OBJ->set_value($field, $default);
    }
}


/* End of file MY_form_helper.php */
/* Location: ./application/helpers/MY_form_helper.php */
于 2012-10-18T23:17:09.390 に答える