CI 묻고 답하기

제목 $this->input->post 버그일까요???
글쓴이 DJ구스 작성시각 2011/11/02 09:57:38
댓글 : 8 추천 : 0 스크랩 : 0 조회수 : 24991   RSS
이거이 문제가 뭔가 고민중인데 코어버그는 아닌거 같고...음.. 저의 결백증 코딩의 원칙이 깨져버리냐 아니냐라서..==;

$this->input->post의 리턴 값이 값이 없을 경우 분명 FALSE가 맞는데.. 이상하게도 ===로 형까지 비교를 해서 저는 주로 처리를 하는데 이상하게도  리턴 되는 값이 boolen 값이 아니라 문자열인거 같아 코어를 봐도 분명  boolen값이 맞거든요.. 

=== 로 처리 하면 안맞고 ==해야만 정확히 값이 FALSE로 처리가 될까요..?? 분명 Type형은 Boolen인데 말이죠..==;


if(FALSE !== $this->input->post('msg_contents', TRUE))  {}

 /**
 * Fetch an item from the POST array
 *
 * @access public
 * @param string
 * @param bool
 * @return string
 */
 function post($index = NULL, $xss_clean = FALSE)
 {
  // Check if a field has been provided
  if ($index === NULL AND ! empty($_POST))
  {
   $post = array();

   // Loop through the full _POST array and return it
   foreach (array_keys($_POST) as $key)
   {
    $post[$key] = $this->_fetch_from_array($_POST, $key, $xss_clean);
   }
   return $post;
  }
  
  return $this->_fetch_from_array($_POST, $index, $xss_clean);
 }



 // --------------------------------------------------------------------

 /**
  * Fetch from array
  *
  * This is a helper function to retrieve values from global arrays
  *
  * @access private
  * @param array
  * @param string
  * @param bool
  * @return string
  */
 function _fetch_from_array(&$array, $index = '', $xss_clean = FALSE)
 {
  if ( ! isset($array[$index]))
  {
   return FALSE;
  }

  if ($xss_clean === TRUE)
  {
   return $this->security->xss_clean($array[$index]);
  }

  return $array[$index];
 }


 
 다음글 검색기능. (3)
 이전글 외부에서 CI 사용하기? (3)

댓글

변종원(웅파) / 2011/11/02 10:50:51 / 추천 0
폼전송할때 msg_contents라는 필드가 있고 빈값이 넘어왔다면 false가 아닌 빈값이 반환되는건 당연한거겠고
 
폼전송할때  msg_contents 라는 값을 넘기지 않았는데 컨트롤러에서 호출을 한다면 FALSE를 반환해야 하는데.. 배열변수를 참조하는 것에서 그런 현상이 발생하는것 같은데 딱히 설명을 못하겠네요. ㅋ
 
폼전송후 전송되지 않은 값에 대한 에러를 보시면 이해가 되실겁니다.
 
$dd = $this->input->post('b');
$cc = $_POST['b'];

첫 줄은 아무런 에러가 없습니다. 
두번째 줄은 Message: Undefined index: b 라고 나옵니다.
DJ구스 / 2011/11/02 11:25:04 / 추천 0
$this->input->post('msg_contents') 에 아무런 값이 없으면 false 리턴이 맞지 않을까요? 웅파님..?

메뉴얼과 코어 소스를 분석해보니 return false 가 맞던거 같던데 말입니다.. 

아 이게 잘 못되면 그동안 소스 짢거 다 수정해야겠네여.. 경우의 수를 빡세게 쪼으는 습관이라..==;
한대승(불의회상) / 2011/11/02 12:59:27 / 추천 0
! isset($array[$index])
이 부분은 key로 변수가 설정되어 있는 부분을 확인 하는거니까...
웅파님 말대로 form에 msg_contents가 선언(?)되어 있다면 블린값이 안나오는게 맞네요.






변종원(웅파) / 2011/11/02 13:01:15 / 추천 0
값이 없이 넘어왔다면

_fetch_from_array()에 의해서
return $array[$index]; 이게 반환됩니다.

<input type="text" name="a">로 해서 아무 값 없이 넘기면 false가 아닌 ""이 넘어갑니다.
DJ구스 / 2011/11/03 17:00:29 / 추천 0
제가 다시 한번 봐야겠습니다. 메뉴얼을 보다가....

 CodeIgniter는 POST, COOKIE 혹은 SERVER 아이템을 가져오기 위해서 3가지 헬퍼함수를 제공합니다. 각 아이템들을 직접가져오는것보다($_POST['something']) 헬퍼를 사용하면 더 좋은 이유는 ,헬퍼가 아이템이 세팅되어있는지를 먼저체크하고 세팅되어있지않다면 false 를 반환하기 때문입니다. 아이템이 존재하는지 먼저 검사하고 처리할 필요가 없어집니다. 다시말하면 , 일반적으로 여러분안 아래와 같이 프로그램할 것입니다.:if ( ! isset($_POST['something']))
{
    $something = FALSE;
}
else
{
    $something = $_POST['something'];
}

CodeIgniter 에서는 아래와 같이 간단하게 위의 기능을 수행할 수 있는것이죠:

$something = $this->input->post('something');



DJ구스 / 2011/11/04 09:44:15 / 추천 0
 역시 isset과 empty와 is_null의 개념이었군요... ==;

즉 post변수에 값이 비어 있어도 true이고 post변수 자체가 존재 하지 않을 경우에 false를 리턴 하는군요.. 

한참 멍떼리고 있었네요.. ==; 
한대승(불의회상) / 2011/11/04 17:39:53 / 추천 0
isset은 변수가 있는지 여부를 가리는 함수이고, empty는 변수에 값이 비어 있는지를 가리는 함수 인데요.

isset의 경우 변수가 존재하면 값이 있느냐, 없느냐를 판정하지 않고 True를 반환 합니다.
empty는 변수가 존재 하지 않아도 PHP의 특성상 자동으로 변수를 생성하므로 변수가 없어도 True, 값이 '', arrary(), false, null 일 경우 True를 반환 합니다.

CI와 함께 즐거운 코딩 되세요 ^^
변종원(웅파) / 2011/11/04 18:05:08 / 추천 0
아래 소스로 테스트 했을때 정상적으로

null b
array(1) {
  ["a"]=>
  string(0) ""
}

출력이 됩니다. 

                if($_POST) {
   if( false == $this->input->post('b') ) echo "null b<br>";
   if(FALSE  === $this->input->post('b')) var_dump($_POST);
  }
  else
  { ?>
   <form action="" method="post">
   <input type="text" name="a" >
   <input type="submit" value="go">
   </form>
  <?php
  }