使用mysqli_stmt_prepare准备查询在WHERE之后绑定逻辑条件

时间:2016-12-24 18:23:21

标签: php mysql mysqli prepared-statement sql-injection

我需要根据随时间变化的过滤器动态启动查询。每次过滤器都在字符串变量 $filter 中。 我可以在WHERE之后将其绑定在以下代码中吗?它似乎不起作用。我期望得到的查询是SELECT NAME FROM PERSONA WHERE GENDER='F'

$filter = "GENDER='F'";
$stmt = mysqli_stmt_init($connection);
mysqli_stmt_prepare($stmt, "SELECT NAME FROM PERSONA WHERE ?");
mysqli_stmt_bind_param($stmt, 's', $filter);

2 个答案:

答案 0 :(得分:0)

您只能绑定值,而不能绑定句法元素。因此要么保持gender条件,只要绑定F值:

mysqli_stmt_prepare($stmt, "SELECT NAME FROM PERSONA WHERE GENDER=?");
mysqli_stmt_bind_param($stmt, 's', 'F');

或者使用字符串操作来构造查询:

mysqli_stmt_prepare($stmt, "SELECT NAME FROM PERSONA WHERE $filter");

答案 1 :(得分:-1)

另一个答案显然是错误的。由于第一个建议根本没有回答这个问题,第二个建议只适用于性别问题。虽然对于一个城市来说也是不可能的。

因此您必须动态创建查询 With mysqli it's too toilsome所以我将展示如何使用PDO:

$sql = "SELECT NAME FROM PERSONA WHERE 1";
$filters = [];
$params = []
if ($gender)
{
    $filters[] = " AND GENDER=:gender";
    $params['gender'] = $gender;
}
$sql .= implode("", $filters);
$stmt = $pdo->prepare($sql);
$stmt->execute($params);
$data = $stmt->fetchAll();
相关问题