TIP게시판

제목 set_value 시 htmlspecialchars 가 이상하게 동작하는 현상에 대하여
글쓴이 pithecus 작성시각 2010/04/02 15:33:07
댓글 : 3 추천 : 1 스크랩 : 0 조회수 : 13793   RSS
 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
사용하는 곳이 틀려서 그렇습니다. ^^

set_value는 폼검증시 데이터를 복원하기 위한 역할을 합니다.
view에서 쓰는 것이구요.

mrthod에서는 $this->input->post()로 사용하셔야 합니다.
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