【问题标题】:Preparing a query with mysqli_stmt_prepare binding a logical criteria after WHERE使用 mysqli_stmt_prepare 准备查询,在 WHERE 之后绑定逻辑条件
【发布时间】:2017-05-10 00:14:03
【问题描述】:

我需要根据随时间变化的过滤器动态启动查询。每次过滤器都在字符串变量$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);

【问题讨论】:

  • 这是一种奇怪的绑定方式。我希望看到WHERE GENDER = ?,而您会将F 绑定到该参数...
  • ^ 这也适用于列。
  • 这个想法是 $filter 可能会改变并且并不总是指代 GENDER:它可能是 CITY='NY' 等等。

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


【解决方案1】:

您只能绑定值,不能绑定语法元素。所以要么保留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");

【讨论】:

    【解决方案2】:

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

    因此您必须动态创建查询。
    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();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-03
      相关资源
      最近更新 更多