同时使用nl2br和mysql_real_escape_string

时间:2009-12-07 09:55:06

标签: php

以下列方式使用nl2br的正确方法是什么。

我发布了来自文本区域输入的数据

        $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 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分:0)

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

我假设您想要在PHP脚本的开头转义所有数据,这样您就不必担心转义了。

不应该在那里包含用于SQL查询的转义字符串,因为这是一种糟糕的设计方法:

  1. 将转义字符串添加到HTML表单的输入元素时会发生什么? 原始客户的字符串将被修改。
  2. 将准备好的语句与已经转义的数据一起使用是一种不方便或有问题的方法。
  3. 我认为应该使用以下代码:

    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查询中添加字符串,可以决定使用预准备语句或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);
    }