php使用给定函数清理数组

php使用给定函数清理数组,php,Php,我有一个简单的清理函数,它在foreach语句中嵌套一个switch语句,我在某个地方读到这是一个不好的做法,但我还没有找到更好的解决方案,我的代码如下,希望您能提供帮助 public static function DB_Sanitize($input, $santype = 'SQL', $cleanKeys = FALSE) { $type = strtoupper($santype); if (!is_array($input)) { $input = a

我有一个简单的清理函数,它在foreach语句中嵌套一个switch语句,我在某个地方读到这是一个不好的做法,但我还没有找到更好的解决方案,我的代码如下,希望您能提供帮助

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;
}

无论如何,您不应该这样做sql转义。准备好的语句和/或占位符几乎完全不需要这样做。无论如何,您不应该在数据库中存储“损坏”的html。当您检索html时,请清理html,并知道您将使用它做什么。如果您在交换机中执行foreach,您将有更多的代码,但执行时间更短,因为不会对每个tiem执行交换机检查。取决于$input tbh中有多少个值..谢谢marc b,但是对于“可选”的准备语句,您认为我应该做什么?我认为,由于准备语句主要用于减少执行时间,它们可能不应该理所当然地用于只执行一次的语句。感谢用户1020317,您的意思是开关有点像if语句,其中只有在条件为true时才执行代码,因此,在脚本中检查条件和选择的条件会占用时间。为什么名为
DB_Sanitize
的方法(重点是DB)希望对上下文HTML进行转义呢?HTML Sanitize用于已从数据库中提取的数据,如果数据可能是代码或已由用户输入,但更可能的是数据库中的代码在我的情况下,最终目标是一个存储库来帮助我管理代码,我如何在不回答我自己的帖子的情况下发布我正在处理的示例?主要是一些DB类和一些活动记录
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;

}