【问题标题】:How to filter out the where clause in a query builder?如何过滤掉查询生成器中的 where 子句?
【发布时间】:2016-10-09 17:13:15
【问题描述】:

我正在构建一个带有查询构建器的动态应用程序,该查询构建器由四个选择列表组成,用户可以在其中输入表、列、运算符和属性名称。现在我还希望用户能够选择全部。所以用户应该可以选择只选择表和列名(=ALL)。但是我不知道如何过滤掉 where 子句。这是我目前的 php 脚本:

<?php

include "connect.php";

$table          = $_GET['tableSelected'];
$field          = $_GET['fieldSelected'];
$attribute      = $_GET['attributeSelected'];
$operator       = $_GET['operatorSelected'];
$tableList      = $_GET['tableList'];
$fieldList      = $_GET['fieldList'];
$attributeList  = $_GET['attributeList'];

$fieldstr = $fieldList . ",ST_AsGeoJSON(ST_Transform(l.geom,4326))";


$sql = "SELECT $fieldstr
        FROM $table l
        WHERE $field $operator '{$attribute}'";

if (!$response = pg_query($conn, $sql)) {
    echo "A query error occured.\n";
    exit;
}

while ($row = pg_fetch_row($response)) {
    foreach ($row as $i => $attr){
        echo $attr.", ";
    }
    echo ";";
}

?>

【问题讨论】:

  • 动态构建查询字符串,只有在需要的3个字段不为空时才添加WHERE条件。顺便说一句,您应该用占位符替换该值,并对数据库、表和列名使用白名单,以避免 sql 注入/破坏您的查询。
  • 是的,就是这个主意。但是如何做到这一点@jeroen?

标签: php sql ajax


【解决方案1】:

您应该动态构建字符串,并且仅在该部分的必填字段不为空时添加WHERE 条件。

例如:

$sql = "SELECT {$fieldstr}
        FROM {$table}";

if (!empty($field) && !empty($operator) && !empty($attribute)) {
    $sql .= " WHERE {$field} {$operator} '{$attribute}'";
}

顺便说一句,您应该用占位符替换该值,并对数据库、表和列名称以及运算符使用白名单,以避免 sql 注入/破坏您的查询。

【讨论】:

  • 感谢您的信息!我会在这方面工作。是的,我会调查占位符。但是您的意思是在 index.html 文件中使用占位符?还是在我的 php 文件中?
  • @L.fcg 我对pg_* 函数不太熟悉,但您应该寻找准备好的语句。
  • 我想为值使用占位符,但问题是我的选择列表是依赖的。因此,当用户选择表名时,列和属性选择列表会自动填写。
  • 你能帮我解决另一个问题吗?这是问题的链接:stackoverflow.com/questions/37807123/…
猜你喜欢
  • 1970-01-01
  • 2016-01-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-18
  • 1970-01-01
相关资源
最近更新 更多