0

人们!

我有这个查询,它WHERE$_POST. 问题是我想动态获取两个比较值,而不为每个值创建查询。我现在拥有的是:

$what = $mysqli->real_escape_string($_POST['what']);
........
$query = "SELECT * FROM list WHERE ";
$query .= $what . " = ? LIMIT 0,10";
........
$stmt->bind_param('s', $what);

我的第一个问题:这在实践中有多安全?由于我无法绑定两个参数,是否有另一种更好的方法可以管理同一件事?

我遇到的第二个问题是:我想将其更改= ?LIKE %?%,但无法正常工作。我尝试使用CONCAT('%', ?, '%')(bad, I know) ,但它仍然无法正常工作。基本上我最终想要实现的是:WHERE ? LIKE %?%. 是否可以?你能帮我解决这个问题吗?

干杯,亚历克斯

4

4 回答 4

0

只需检查$where严格的参数集:

if (!in_array($where, array("table1", "table2"))) {
   //do smth with wrong parameter
}

请注意,in_array它运行O(N)复杂,因此如果您的参数集很大,最好使用带有表名的关联数组作为键。

于 2013-02-11T15:07:39.143 回答
0

mysql_real_escape_string 或类似函数不会转义反引号 (`),因此您的应用程序容易受到 SQL 注入的攻击。

只需为所有列定义一个白名单,然后检查该列是否在数组中。

对于搜索后,LIKE %?%只需%在搜索词的前面和后面附加一个。要正确转义这个东西,请参阅:Escaping MySQL wildcards

于 2013-02-11T15:09:56.587 回答
-1

您可以进行这样的动态查询,但您的网站将容易受到 SQL 注入的攻击。

于 2013-02-11T15:07:47.083 回答
-1

mysql_real_escape_string 转义反引号,但您可以手动转义它们。
将所有转义的东西移动到某种帮助库中也是一个好主意。因此,您将在 2 行中获取数据:

$sql  = "SELECT * FROM list WHERE ?n = ?s LIMIT 0,10";
$data = $db->getAll($sql, $_POST['what'], $_POST['where']);
于 2013-02-11T15:53:48.037 回答