私は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("&", "%", "<", ">", """, "'", "(", ")", "+", "-");
$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を使用する必要はないと思いますが、警告が表示されないようにする唯一の方法は、コアメソッドを更新する方が安全だと思います。また、これらのファイルを更新する以外に実際に変更するべきではないと思いますか?
だから、簡単に、私はしたい:
- 警告を取り除く
- 適切な形式でデータを保存/読み取り
情報を忘れてしまったかもしれません、ありがとう