php mysqli我应该使用real_escape_string吗?

时间:2012-11-18 15:48:35

标签: php mysqli

  

可能重复:
  Do I need to escape data to protect against SQL injection when using bind_param() on MySQLi?

我有一个简化查询的类。以下是如何插入数据的代码示例:

$dbi->prepare("INSERT INTO `temp` (`name`,`content`) VALUES (?,?);")->execute($name,$content);

类中有一个函数:

public function execute(){
        if(is_object($this->connection) && is_object($this->stmt)){
            if(count($args = func_get_args()) > 0){
                $types = array();
                $params = array();

                foreach($args as $arg){
                    $types[] = is_int($arg) ? 'i' : (is_float($arg) ? 'd' : 's');
                    $params[] = $arg;
                                              /*
                                                 or maybe $params[] = $this->connection->real_escape_string($arg);
                                              */
                }

                array_unshift($params, implode($types));

                call_user_func_array(
                    array($this->stmt, 'bind_param'),
                    $this->_pass_by_reference($params)
                );
            }

            if($this->stmt->execute()){
                $this->affected_rows = $this->stmt->affected_rows;
                return $this;
            }
            else {
                throw new Exception;
            }
        }
        else {
            throw new Exception;
        }
    }

当我声明$params[]时,我喜欢$params[] = $arg;我应该放$params[] = $this->connection->real_escape_string($arg);吗?

感谢。

2 个答案:

答案 0 :(得分:3)

没有。使用参数时,不需要转义字符串。

实际上,你一定不能转义字符串,因为你最终会在包含文字反斜杠的数据库中存储字符串。这不是你想要的。

答案 1 :(得分:2)

根据PHP Manual on mysqli和准备好的陈述:

  

转义和SQL注入

     

绑定变量将由服务器自动转义。该   服务器将其转义值插入到适当的位置   执行前的语句模板。必须提供一个提示   服务器为绑定变量的类型,以创建合适的   转换。有关更多信息,请参阅mysqli_stmt_bind_param()函数   信息。

     

有时会自动转义服务器中的值   被认为是一种防止SQL注入的安全功能。相同   如果是,可以使用未准备好的陈述来实现安全程度   输入值正确转义。

所以不,你不必小心逃避,服务器会为你逃避。

手动转义将导致双重转义值。在我个人看来,占位符?在sql语句中的最大优点是你不必关心转义。