人!
我有这个查询从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('%', ?, '%')
(糟糕,我知道),但它仍然无效。
基本上我最终想要实现的是:WHERE ? LIKE %?%
。可能吗?你能帮我一点吗?
干杯,Alex
答案 0 :(得分:0)
只需在严格的参数集上检查$where
:
if (!in_array($where, array("table1", "table2"))) {
//do smth with wrong parameter
}
请注意,in_array
以O(N)
复杂度运行,因此如果您的参数集很大,最好使用带有表名的关联数组作为键。
答案 1 :(得分:0)
mysql_real_escape_string或类似函数不会转义反引号(`),因此您的应用程序容易受到SQL注入攻击。
只需定义包含所有列的白名单,然后检查列是否在数组中。
要在LIKE %?%
之后进行搜索,只需在搜索字词的前面和后面添加%
即可。为了正确逃避这件事,请参阅:Escaping MySQL wild cards
答案 2 :(得分:-1)
您可以像这样动态查询,但您的网站很容易受到SQL注入攻击。
答案 3 :(得分:-1)
mysql_real_escape_string转义反引号,但您可以手动转义它们 将所有转义的内容移动到某种辅助库中也是个好主意。因此,您将获得两行数据:
$sql = "SELECT * FROM list WHERE ?n = ?s LIMIT 0,10";
$data = $db->getAll($sql, $_POST['what'], $_POST['where']);