1

私はCakePHP1.3.7を使用していますが、非常に特殊な問題が発生しました。

私のアプリケーションで使用されているSanitizeコアクラスメソッドは、バージョン1.2のメソッドです。特定のデータを保存したいとき、それは私に警告を与えます:

警告:array_merge():引数#2は、113行目の/usr/share/php/cake/libs/sanitize.phpの配列ではありません

しかし、それは保存され、正しいエンコーディング/フォーマットで保存されます。

この警告の原因となるメソッドは次のとおりです(バージョン1.2、113行目にはありませんが、後で説明します)

    function html($string, $remove = false) {
    if ($remove) {
        $string = strip_tags($string);
    } else {
        $patterns = array("/\&/", "/%/", "/</", "/>/", '/"/', "/'/", "/\(/", "/\)/", "/\+/", "/-/");
        $replacements = array("&amp;", "&#37;", "&lt;", "&gt;", "&quot;", "&#39;", "&#40;", "&#41;", "&#43;", "&#45;");
        $string = preg_replace($patterns, $replacements, $string);
    }
    return $string;
}

そして、これがこのメソッドの呼び方です

$value = Sanitize::html($value,true);

ご覧のとおり、このメソッドではarray_merge()は呼び出されませんが、html()メソッドを1.3バージョンに置き換えると

    function html($string, $options = array()) {
    static $defaultCharset = false;
    if ($defaultCharset === false) {
        $defaultCharset = Configure::read('App.encoding');
        if ($defaultCharset === null) {
            $defaultCharset = 'UTF-8';
        }
    }
    $default = array(
        'remove' => false,
        'charset' => $defaultCharset,
        'quotes' => ENT_QUOTES
    );

    $options = array_merge($default, $options);

    if ($options['remove']) {
        $string = strip_tags($string);
    }

    return htmlentities($string, $options['quotes'], $options['charset']);
}

array_merge()は正確に113行目にあります。

このようにhtml()を呼び出すと

$value = Sanitize::html($value,array('remove' => true));

もう警告は出ません。しかし、私のデータはもはや正しいエンコーディング/フォーマットで保存されません。

これが私が保存する必要のあるテキストの例です(それはフランス語であり、UTF-8エンコーディングが必要です)

L'envoi d'une communication&àlafenêtre

私はこれを克服することはできません

$value = Sanitize::html($value,array('remove' => true, 'quotes' => ENT_HTML401));

PHP 5.3.6を使用しているため、定数ENT_HTML401を使用できません。

ENT_NOQUOTESのような別の定数を使用すると、引用符は(明らかに)無視されますが、フランス語のアクセントやその他の特殊文字は無視されます。これは、このように機能することを目的としていますが、引用符とまったく同じようにテキストを保存したい(または少なくとも読んでください)。 。

htmlentitiesを使用する必要はないと思いますが、警告が表示されないようにする唯一の方法は、コアメソッドを更新する方が安全だと思います。また、これらのファイルを更新する以外に実際に変更するべきではないと思いますか?

だから、簡単に、私はしたい:

  • 警告を取り除く
  • 適切な形式でデータを保存/読み取り

情報を忘れてしまったかもしれません、ありがとう

4

1 に答える 1

0

次のように、バージョン1.3に一致するようにSanitizeクラスのhtml()メソッドを更新することになりました。

    function html($string, $options = array()) {
    static $defaultCharset = false;
    if ($defaultCharset === false) {
        $defaultCharset = Configure::read('App.encoding');
        if ($defaultCharset === null) {
            $defaultCharset = 'UTF-8';
        }
    }
    $default = array(
        'remove' => false,
        'charset' => $defaultCharset,
        'quotes' => ENT_QUOTES
    );

    $options = array_merge($default, $options);

    if ($options['remove']) {
        $string = strip_tags($string);
    }

    return htmlentities($string, $options['quotes'], $options['charset']);
}

私はそれをこのように呼びます

$value = Sanitize::html($value, array('remove'=>true,'quotes'=>ENT_NOQUOTES));

そして、データベースから値を読み取るたびに、この方法でテキストフィールドをデコードするだけです。

$data['Model']['field'] = html_entity_decode($data['Model']['field'], ENT_NOQUOTES, "UTF-8");

編集:1.3バージョンの関数でデータがエンコードされた方法でデータがエンコードされたため、上記で説明したことを元に戻す必要がありました。そのため、データを読み取るときにアプリケーション全体でデータをデコードする必要がありました。

また、私はCakePHP 1.3.7を使用していません(ケーキコンソールと混同されました)。私は1.2.4を使用しているので、関数の更新は結局適切ではありませんでした。

バージョン1.2を維持しましたが、今回は2番目のパラメーターを次のように配列に変更しただけで、警告が表示されなくなったため、うまくいったようです。

    function html($string, $options = array()) {
    if ($options['remove']) {
        $string = strip_tags($string);
    } else {
        $patterns = array("/\&/", "/%/", "/</", "/>/", '/"/', "/'/", "/\(/", "/\)/", "/\+/", "/-/");
        $replacements = array("&amp;", "&#37;", "&lt;", "&gt;", "&quot;", "&#39;", "&#40;", "&#41;", "&#43;", "&#45;");
        $string = preg_replace($patterns, $replacements, $string);
    }
    return $string;
}
于 2012-07-06T15:51:38.370 に答える