传递FILTER_SANITIZE_STRING

时间:2013-01-05 16:54:09

标签: php filter mysqli

我有一个问题:

$query="select * from news where news_id = (select max(news_id) from news where news_id< $id)";

执行我使用类。在这堂课

public function query($query) 
{
  $this->_query = filter_var($query, FILTER_SANITIZE_STRING);
  $stmt = $this->_prepareQuery();
  $stmt->execute();
  $results = $this->_dynamicBindResults($stmt);
  return $results;
}

是否有任何方式<信号未被过滤?

1 个答案:

答案 0 :(得分:2)

这是运行查询的完全错误方式 FILTER_SANITIZE_STRING与SQL完全无关。

在构建SQL查询时,必须使用特定于SQL的例程。

首先,您应该了解查询数据之间的区别。
虽然查询应保持不变,但必须根据某些规则格式化数据。

您当前执行的查询功能是错误的 如果它是通用功能,要运行所有类型的查询,您必须实现一些占位符来表示查询中的数据。像这样的函数

function paraQuery()
{
    $args  = func_get_args();
    $query = array_shift($args);
    $query = str_replace("%s","'%s'",$query); 

    foreach ($args as $key => $val)
    {
        $args[$key] = $this->mysqli->real_escape_string($val);
    }

    $query  = vsprintf($query, $args);
    $result = $this->mysqli->query($query);
    if (!$result)
    {
        throw new Exception($this->mysqli->error()." [$query]");
    }
    return $result;
}

所以,你将能够以这种方式运行它

$query = "select * from news where news_id = (select max(news_id) from news where news_id<%d)";
$result = $db->paraQuery($query, $id);