1

我正在使用 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("&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() 没有在这个方法中调用,但是如果我用 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 & à la fenêtre

我无法克服这种做法

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

因为我使用的是 PHP 5.3.6,所以我不能使用常量 ENT_HTML401

如果我使用另一个常量,如 ENT_NOQUOTES,它会忽略引号(显然),但不会忽略法语口音和其他特殊字符,这些字符旨在以这种方式工作,但我想完全按照我引用的方式保存文本(或至少阅读它) .

我猜我不需要使用 htmlentities,但我认为更新核心方法更安全,这是我发现没有收到警告的唯一方法。我还想我不应该真正修改这些文件,而不是更新它们?

所以,简而言之,我想:

  • 摆脱警告
  • 以正确的格式保存/读取数据

我可能忘记了一些信息,谢谢

4

1 回答 1

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

编辑:我不得不撤消我上面描述的内容,因为在 1.3 版本的函数中编码数据的方式使得我们必须在读取整个应用程序时解码整个应用程序中的数据。

另外,我没有使用 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("&amp;", "&#37;", "&lt;", "&gt;", "&quot;", "&#39;", "&#40;", "&#41;", "&#43;", "&#45;");
        $string = preg_replace($patterns, $replacements, $string);
    }
    return $string;
}
于 2012-07-06T15:51:38.370 回答