| 제목 | 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()로 사용하셔야 합니다.