2012-07-05 44 views
1

我正在使用CakePHP 1.3.7并遇到了一个非常特殊的问题。CakePHP 1.3警告array_merge清理

在我的应用程序中使用的Sanitize核心类方法是版本1.2中的一个。当我想保存的特定数据,它给了我一个警告:

警告:array_merge():参数#2不 数组/usr/share/php/cake/libs/sanitize.php上行113

但它确实保存,并具有正确的编码/格式。

这里是谁导致此警告的方法(版本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通信&点菜Fenêtre两家

我不能牛逼克服这个做

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

因为我使用PHP 5.3.6所以我不能用恒定的ENT_HTML401

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

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

所以,简单地说,我想:

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

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

的警告

回答

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(与控制台控制台混淆);我不使用CakePHP 1.3.7(与控制台控制台混淆);而且,我不使用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; 
}