我有一个问题:
$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;
}
是否有任何方式<
信号未被过滤?
答案 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);