【问题标题】:Merge these 2 similar php functions合并这2个相似的php函数
【发布时间】:2011-11-02 09:22:57
【问题描述】:

正如标题所说,我想知道这两个相似的功能是否可以合并为一个:

这会清理一般输入:

function sanitize($input) 
 {
  if(get_magic_quotes_gpc() == true)
    {
     $input = stripslashes($input);
   }
     return htmlspecialchars($input);
}

并且这个会清理更新数据库的输入:

function sanitizeSQL($input) 
 {
  if(get_magic_quotes_gpc() == true)
    {
     $input = stripslashes($input);
   }
     return mysql_real_escape_string(htmlspecialchars($input));
}

也许用另一个 if 语句或其他东西来添加或删除 *mysql_real_escape_string()* ?只是不知道该怎么做...

像往常一样,感谢所有帮助并提前致谢。

【问题讨论】:

    标签: php function merge


    【解决方案1】:

    让我建议一种不同的方法。您应该按照example #2 here 尽快禁用magic_quotes,或者尽早去除所有get/post/cookie 数据上的斜线。

    不要将这部分代码用于准备 HTML 或 SQL。当您实际构建 HTML 文档或 SQL 语句时,这应该单独完成。到那时,您只需要htmlspecialchars(用于 HTML)或mysql_real_escape_string(用于 SQL)。

    不要误以为存在适用于所有输入的“通用”清理功能。事实上,最好不要将其视为消毒。纯文本已经很卫生了。您所做的只是转义特定输出格式(HTML、SQL、CSV、PDF 等)的文本。每种输出格式都有不同的转义方法,因此没有适用于所有格式的方法。这就是为什么 magic_quotes 是个糟糕的主意,以及为什么需要尽快撤消它的原因。

    【讨论】:

      【解决方案2】:

      我会让 sanitizeSQL 调用 sanitize。没有重复的代码,但函数名称不同。

      function sanitizeSQL($input) 
       {
        return mysql_real_esape_string(sanitize($input));
      }
      

      如果您确实只想调用 1 个方法,我会传入第二个参数:

      function sanitize($input, $forSql) 
       {
        if(get_magic_quotes_gpc() == true)
          {
           $input = stripslashes($input);
         }
      
        $input = htmlspecialchars($input);
      
        if($forSql == true)
          {
            $input = mysql_real_escape_string($input);
          }
      
        return $input.
      }
      

      【讨论】:

      • 我知道函数是如何知道 get_magic_quotes_gpc() 的,因为它本身就是一个内置函数,但它怎么知道 $forSql (在上面的答案中使用)是一个 sql 查询? (我是 php 新手):)
      • @Dizzi $forSql 是一个布尔值,而不是一个 sql 查询。所以如果你想清理输入,你可以调用 $input = sanitize($input, false)。如果你想清理数据库的输入,你可以调用 $input = sanitize($input, true)。
      【解决方案3】:
      function sanitizeBoth($input, $mysqlEscape) 
      {
          if(get_magic_quotes_gpc() == true)
          {
              $input = stripslashes($input);
          }
          $return = htmlspecialchars($input);
          if ($mysqlEscape){
              $return = mysql_real_escape_string($return);
          }
          return $return;
      }
      

      $mysqlEscape 是开关:如果为真,则作为“sanitizeSQL”工作,如果为“sanitize”,则为假。

      【讨论】:

        【解决方案4】:

        合并它们非常简单。

        function sanitize($input, $sql = false) { // $sql will default to false
            if (get_magic_quotes_gpc() === true) $input = stripslashes($input);
            $input = htmlspecialchars($input);
            return ($sql === true ? mysql_real_escape_string($input) : $input);
        }
        

        我们只需添加一个$sql 变量来说明它是否需要针对 SQL 进行清理。

        【讨论】:

          猜你喜欢
          • 2012-03-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-05-18
          • 2011-05-09
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多