2013-08-28 2 views
0

저는 어딘가에서 읽은 foreach 문 안에 switch 문을 중첩시키는 간단한 sanitize 함수를 가지고 있지만, 더 나은 해결책을 제시하지 못했습니다 내 코드는 다음과 같다, 어떤 도움php는 주어진 함수로 배열을 살균합니다.

public static function DB_Sanitize($input, $santype = 'SQL', $cleanKeys = FALSE) { 
    $type = strtoupper($santype); 
    if (!is_array($input)) { 
     $input = array($input); 
    } 
    foreach ($input as $key => $value) { 
     switch ($type) { 
      case 'SQL': 
       if ($cleanKeys) { 
        $key = $this->_mysqli->escape_string($key); 
       } 
       $value = $this->_mysqli->escape_string($value); 
       $clean[$key] = $value; 
       break; 
      case 'HTML': 
       if ($cleanKeys) { 
        $key = htmlentities($key); 
       } 
       $value = htmlentities($value); 
       $clean[$key] = $value; 
       break; 
      default: 
       if ($cleanKeys) { 
        $key = $this->_mysqli->escape_string($key); 
       } 
       $value = $this->_mysqli->escape_string($value); 
       $clean[$key] = $value; 
       break; 
    } 
    return $clean; 
} 
+5

당신은 어쨌든이 같은 탈출 SQL을 수행해서는 안 ... 감사하겠습니다. 준비된 진술 및/또는 자리 표시자는 거의 전적으로이 필요성을 제거합니다. 그리고 어쨌든 "mangled"html을 DB에 저장해서는 안됩니다. html을 깨끗이하면 무엇을 사용하고 있는지 알아낼 수 있습니다. –

+0

스위치 내에서 foreach를 수행하면 스위치 체크가 모든 tiem에 대해 실행되지 않으므로 더 많은 코드가 있지만 실행 시간은 줄어 듭니다. 얼마나 많은 값을 $ 입력에 넣었습니까? tbh .. – user1020317

+0

marc b에 감사하지만 '선택적'준비된 명령문의 목적을 위해 무엇을해야한다고 생각합니까? 준비된 문이 주로 실행을 줄이기 위해 사용되기 때문에 시간, 그들은 아마도 한 번만 실행됩니다 진술에 대한 물론의 문제로 사용해서는 안됩니다. 그 user1020317에 감사드립니다. 그래서 switch는 조건이 true 일 때만 코드가 실행되는 if 문과 비슷합니다. 따라서 조건과 선택된 조건을 검사 할 때 스크립트에서 시간이 걸릴 수 있습니다. – user1205600

답변

0
public function DB_Sanitize($input, $context = 'SQL', $cleanKeys = FALSE) { 

    $type = gettype($input); 
    $context = strtoupper($context); 
    if (!is_array($input)) { 
     $input = array($input); 
    } 
    switch($context) { 
     case 'SQL': 
      $filter = array('options' => array($this->_mysqli, 'escape_string')); 
      break; 
     case 'HTML': 
      $filter = 'html_entities'; 
      break; 
     default: 
      $filter = array('options' => array($this->_mysqli, 'escape_string')); 
      break; 
    } 
    foreach ($input as $key => $value) { 
     if ($type == 'string') $strkey = $key; 
     if ($cleanKeys && is_string($key)) { 
      $key = filter_var($key, FILTER_CALLBACK, $filter); 
     } 
     $value = filter_var($value, FILTER_CALLBACK, $filter); 
     $clean[$key] = $value; 
    } 
    if (isset($strkey)) return $clean[$strkey]; 
    return $clean; 

}