我正在使用CakePHP 1.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(),但是如果我用1.3版本替换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']);
}
array_merge()完全属于第113行。
如果我现在以这种方式调用html()
$value = Sanitize::html($value,array('remove' => true));
我不再收到警告了。但是,我的数据不再以正确的编码/格式保存。
以下是我需要保存的文本示例(它是法语,需要UTF-8编码)
L'envoi d'une communication&amp; àlafenêtre
我无法克服这一点
$value = Sanitize::html($value,array('remove' => true, 'quotes' => ENT_HTML401));
因为我使用的是PHP 5.3.6所以我不能使用常量ENT_HTML401
如果我使用另一个常量,如ENT_NOQUOTES,它会忽略引号(显然)但不会忽略法语口音和其他特殊字符,这些字符意图以这种方式工作,但我想保存文本,就像我引用的那样(或者至少读它)。
我猜我不需要使用htmlentities,但我认为更安全,更新核心方法是我发现没有得到警告的唯一方法。我还想我不应该修改这些文件而不是更新它们吗?
所以,简单地说,我想:
我可能已经忘记了一些信息,谢谢
答案 0 :(得分:0)
我最终更新了Sanitize类的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']);
}
我称之为
$value = Sanitize::html($value, array('remove'=>true,'quotes'=>ENT_NOQUOTES));
每当我从数据库中读取它们的值时,我就会以这种方式解码文本字段
$data['Model']['field'] = html_entity_decode($data['Model']['field'], ENT_NOQUOTES, "UTF-8");
另外,我没有使用CakePHP 1.3.7(与蛋糕控制台混淆);我正在使用1.2.4,所以更新函数后不适合。
我保留了版本1.2,这次我只是将第二个参数更改为数组,如下所示,它似乎可以解决问题,因为我不再收到警告了。
function html($string, $options = array()) {
if ($options['remove']) {
$string = strip_tags($string);
} else {
$patterns = array("/\&/", "/%/", "/</", "/>/", '/"/', "/'/", "/\(/", "/\)/", "/\+/", "/-/");
$replacements = array("&", "%", "<", ">", """, "'", "(", ")", "+", "-");
$string = preg_replace($patterns, $replacements, $string);
}
return $string;
}