2012-11-09 71 views
0

我正在使用PDO并提供用户可以用其搜索结果选择的选项。一些示例是排序,结果数量,页码等。我尝试使用预准备语句来验证此数据以防止SQL注入攻击,但变量永远不会传递到查询中。为PDO使用MySQL查询选项准备好的语句

我在做什么错?结果的排序和数量是SELECT菜单,页码是文本输入表单,可以输入数字。

$query = "SELECT SQL_CALC_FOUND_ROWS * FROM people ORDER BY id :sortBy LIMIT $start, :total"; 
$result = $conn->prepare($query); 
$result->bindValue(":sortBy", $sortBy, PDO::PARAM_STR); 
$result->bindValue(":total", $total, PDO::PARAM_INT); 
+0

你如何确定“变量永远不会传递到查询中”? – deceze

+1

你为什么要绑定一些,而不是全部?即'$ start'。 –

+0

当我删除bindValues并在查询中输入ASC和100代替:sortBy和:totalResults时,它可以工作。 – Zoolander

回答

2

绑定参数适用于要传递到查询中的实际数据。你不能绑定实际的控制命令 - MySQL会将它们解释为数据,而不是命令。

你可以做什么,而不是你的排序是检查你发送,并通过'ASC'或'DESC'到查询。您不会将用户提供的信息传递给查询,而是用于确定您要传入的一组预定义命令中的哪一个。没有注入风险。

+0

这不完全正确。你可以绑定任何你想要的。问题不在于你无法绑定某些东西,而是它绑定的方式。 –

+0

我的观点是,如果你绑定类似于表标识符的东西,它将不会被MySQL识别,并且你的查询将失败。 – dersam