准备语句中的动态参数

时间:2013-02-11 15:02:37

标签: php mysql mysqli prepared-statement

人!

我有这个查询从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

4 个答案:

答案 0 :(得分:0)

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

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

请注意,in_arrayO(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']);