제목 | set_value 시 htmlspecialchars 가 이상하게 동작하는 현상에 대하여 | ||
---|---|---|---|
글쓴이 | pithecus | 작성시각 | 2010/04/02 15:33:07 |
|
|||
CI 에 스마트에디터를 붙이려고 작업하던중에 이상한 문제를 발견했습니다.
<?php
class Common extends Controller{
function Common(){parent::Contoller()}
function test(){
$str = <<<EOF
<span style="background-color: rgb(147, 52, 216); color: rgb(255, 255, 255);">HELLO WORLD</span>
EOF;
$html = "<html><body>";
$html .= form_open("common/test2");
$html .= form_hidden("msg", $str);
$html .= form_submit("go", "go");
$html .= form_close();
$html .= "</body></html>";
echo $html;
}
function test2(){
echo "1:".set_value("msg");
echo "2:".set_value("msg");
}
}
?>
test2 에서 set_value 의 결과를 출력하도록 하는데 분명히 동일한 함수 set_value를 호출했는데 결과값이 다르게 나오길래 찾다보니 CI 의 helper - form 의 form_prep 에 원인이 있네요.
form 의 submit 페이지에서 set_value 를 이용해서 form 의 값을 받는 방식을 사용하고 있었는데
set_value 로 값을 받을 경우, CI 에서 htmlspecialchars 를 자동으로 호출하고 그 결과값을 return 합니다.
그런데 set_value 를 첫번째 호출한 경우와 두번째 호출한 경우의 값이 왜 달라지나 알아보니
form_helper 의 form_prep 함수에서 다음과 같은 내용을 찾았습니다
// we've already prepped a field with this name
// @todo need to figure out a way to namespace this so
// that we know the *exact* field and not just one with
// the same name
if (isset($prepped_fields[$field_name]))
{
return $str;
}
$str = htmlspecialchars($str);
...
if ($field_name != '')
{
$prepped_fields[$field_name] = $str;
}
한번 prep 한 값은 다시 prep 를 하지 않기 위해 prep 했던 내용을 기록해두었던 것이어서 첫번째 호출시에는 htmlspecialchars 가 적용된 값이 return 되었던 것이고 두번째는 htmlspecialchars 를 적용하지 않은 값을 return 한 것입니다.
에디터의 경우 html 을 변환하지 말고 저장해야 하기 때문에 set_value 를 사용하지 말고 다른 방법으로 값을 받아야 겠네요.
|
|||
태그 | set_value,htmlspecialchars | ||
다음글 | scaffolding을 하위디렉토리에서도 사용하기 (2) | ||
이전글 | PHPExcel를 CI속으로~ (6) | ||
변종원(웅파)
/
2010/04/02 18:09:02 /
추천
0
|
pithecus
/
2010/04/03 15:00:42 /
추천
0
네. 저도 예전에는 set_value 와 $this->input 을 구분하지 않고 사용했는데 앞으로는 구분해서 사용해야겠어요 ;)
|
SunFlower
/
2011/04/26 23:26:15 /
추천
0
감사합니다. 덕분에 문제 해결했네요 :).
이문제를 검색하려 해도 >, <는 제대로 검색이 안되서 고생했네요. 파서 손보다가 1시간, 에디터문젠가 해서 1시간, CI문젠가 해서 1시간 ... T_T |
set_value는 폼검증시 데이터를 복원하기 위한 역할을 합니다.
view에서 쓰는 것이구요.
mrthod에서는 $this->input->post()로 사용하셔야 합니다.