2012-07-05 42 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; 
}