2012-07-05 2 views
1

저는 CakePHP 1.3.7을 사용 중이며 매우 구체적인 문제가 있습니다.CakePHP 1.3 경고 array_merge sanitize

내 응용 프로그램에서 사용되는 Sanitize 핵심 클래스 메서드는 버전 1.2 중 하나입니다. /usr/share/php/cake/libs/sanitize.php에 의 배열을 인수 # 2되지 않습니다

경고 : array_merge() 나는 특정 데이터를 저장할 때, 나에게 경고를 제공 줄 113

하지만 올바른 인코딩/형식으로 저장합니다. 여기

이 경고의 원인이되는 방법이다 (라인 113에없는 버전 1.2,하지만 난 나중에 올거야)

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

지금은 1.3 버전에서 html로() 메소드를 대체하는 경우가 있지만, array_merge()가이 방법으로 호출되지 않습니다 볼 수

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()는 정확히

내가 지금은 더 이상 경고를하지 않는이 방법을() HTML

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

를 호출 할 경우 라인 (113)에 떨어진다. 그러나 내 데이터는 더 이상 올바른 인코딩/형식으로 저장되지 않습니다. 여기

내가

L' ENVOI 디부 UNE 통신 & 일품 인 Fenetre

내가 할 수있는 '(이 UTF-8 인코딩 프랑스어이며 필요) 저장해야하는 텍스트의 예 t 내가 이렇게 내가 상수 ENT_HTML401

을 사용할 수 없습니다 PHP 5.3.6을 사용하고 있기 때문에이

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

을하고 극복

ENT_NOQUOTES와 같은 다른 상수를 사용하면 따옴표 (명백하게)가 무시되지만 프랑스어 악센트와 다른 특수 문자는 무시됩니다.이 방법으로 작동하도록 의도되었지만 인용 된 것과 똑같은 텍스트를 저장하려고합니다 (또는 적어도 읽어).

나는 htmlentities를 사용할 필요가 없다고 생각하지만, 핵심 방법을 업데이트하는 것이 더 안전하다고 생각합니다. 경고를받지 못하는 유일한 방법입니다. 또한이 파일을 업데이트하는 것 이외의 다른 파일을 수정해서는 안된다고 가정합니다.

그래서, 간단하게, 내가 원하는 에 :

  • 저장/오른쪽 형식으로
나는 몇 가지 정보를 정기적으로 잊어 버린 수

, 감사

데이터를 읽어 경고 제거하기

답변

0

다음과 같이 버전 1.3과 일치하도록 Sanitize 클래스의 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']); 
} 

나는이

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

과 같이 호출 내가 데이터베이스에서

$data['Model']['field'] = html_entity_decode($data['Model']['field'], ENT_NOQUOTES, "UTF-8"); 

편집을 자신의 값을 읽을 때마다 나는 단순히 텍스트 필드이 방법을 디코딩 : 나는 무엇을 취소했다 I 왜냐하면 데이터가 1.3 버전의 함수로 인코딩 되었기 때문에 그것을 읽을 때 전체 애플리케이션의 데이터를 디코딩해야했기 때문입니다.

또한, 나는 CakePHP 1.3.7을 사용하지 않고 있습니다 (케이크 콘솔과 혼동스러워합니다). 나는 함수를 업데이트하는 것이 afterall에 적합하지 않기 때문에 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; 
}