代码之家  ›  专栏  ›  技术社区  ›  mrpatg

同时使用nl2br和mysql\u real\u escape\u字符串

php
  •  1
  • mrpatg  · 技术社区  · 15 年前

    我有来自文本区域输入的post数据

            $data = $_POST;
            $escaped_data = array();
            foreach ($data as $key => $val) {
                $escaped_data[$key] = mysql_real_escape_string($val);
            }
            $desc = $escaped_data[description];
            $desc = nl2br($desc);
    
    2 回复  |  直到 15 年前
        1
  •  5
  •   Björn    15 年前

    实际上,使用nl2br()的正确方法不是在存储数据时使用它,而是在从数据库读取数据并将其输出到客户端时使用它。当数据插入数据库时不应该格式化,如果您以后想创建一个REST服务并且您真的需要那些换行而不是HTML元素,该怎么办?

        2
  •  0
  •   Dor    15 年前

    一般来说,如果希望将字符串添加到SQL查询中,应该在将其添加到SQL查询之前立即对其进行转义。

    我假设您希望在PHP脚本开始时转义所有数据,这样就不必担心转义了。

    1. 将转义字符串添加到HTML表单的输入元素时会发生什么?
    2. 对已经转义的数据使用准备好的语句是一种不方便或有问题的方法。

    我认为应该使用以下代码:

    function init_filter_input($method_array /* $_GET, $_POST, or whatever you wish */ )
    {
        filter_UTF8($method_array); // for a UTF8 encoded string
        filter_HTML($method_array);
    }
    
    function filter_UTF8($mixed)
    {
        return is_array($mixed)
            ? array_map('filter_UTF8',$mixed)
            : iconv('UTF-8','UTF-8//IGNORE',$mixed);
    }   
    
    function filter_HTML($mixed)
    {
        return is_array($mixed)
            ? array_map('filter_HTML',$mixed)
            : htmlspecialchars(trim($value),ENT_QUOTES);
    }
    

    当您想向SQL查询中添加字符串时,可以决定使用prepared语句或sprintf:

    // sprintf example:
    
    query('SELECT ... WHERE username="%s"', $unescaped_username);
    
    function query($query_str, $params)
    {
        if (is_array($params))
        {
            $params = array_map('filter_SQL', $params);
            $query_str = vsprintf($queryStr, $params);
        }
        else
            $query_str = sprintf($query_str ,filter_SQL($params));
    
        mysql_query($query_str);
    }
    
    推荐文章