Javascript 如何为php中的多个下拉筛选创建优化的sql查询?

Javascript 如何为php中的多个下拉筛选创建优化的sql查询?,javascript,php,mysql,sql,Javascript,Php,Mysql,Sql,我是php新手,正在从事一个项目。一开始有两个过滤器,我在编写带有4个条件的sql查询时不太担心。但是现在我有8个不同的下拉列表,我需要为过滤器功能编写一个优化的sql。根据要写入的条件计数,我需要写入256个条件,这是最糟糕的想法 这里的问题是,没有强制性的文件可供选择进行过滤。这让我在应用不同的方法时遇到了更多的问题 有没有其他办法来解决这个问题?优化查询的最佳方法是什么 示例代码 代码如下所示: $sql = 'SELECT * FROM TABLE WHERE '; $first = t

我是php新手,正在从事一个项目。一开始有两个过滤器,我在编写带有4个条件的sql查询时不太担心。但是现在我有8个不同的下拉列表,我需要为过滤器功能编写一个优化的sql。根据要写入的条件计数,我需要写入256个条件,这是最糟糕的想法

这里的问题是,没有强制性的文件可供选择进行过滤。这让我在应用不同的方法时遇到了更多的问题

有没有其他办法来解决这个问题?优化查询的最佳方法是什么

示例代码


代码如下所示:

$sql = 'SELECT * FROM TABLE WHERE ';
$first = true;
foreach($_POST as $paramName => $value) {
    if ($first) {
        $sql .= "{$paramName}='{$value}'";
        $first = false;
        continue;
    }
    $sql .= " AND {$paramName}='{$value}'";
}
$sql .= ' AND ' . mysqli_real_escape_string($connection, htmlspecialchars($paramName)) . "='" . mysqli_real_escape_string($connection, htmlspecialchars($value)) . "'";
$sql = 'SELECT * FROM TABLE WHERE ';
$first = true;
foreach($_POST as $paramName => $value) {
    $protectedParamName = mysqli_real_escape_string($connection, htmlspecialchars($paramName));
    $protectedValue = mysqli_real_escape_string($connection, htmlspecialchars($value));

    if (empty($value)) {
        continue;
    }

    if ($first) {
        $sql .= "{$protectedParamName}='{$protectedValue}'";
        $first = false;
        continue;
    }

    $sql .= " AND {$protectedParamName}='{$protectedValue}'";
}
由于$\u POST是一个传入变量的数组,您可以通过一个简单的foreach循环对其进行检查,并将其附加到SQL查询字符串。第一个可能的参数不需要AND运算符,因此您必须以不同的方式处理它,这就是为什么$first变量用于

但是,此代码存在SQL注入漏洞,因此最好将参数名称和值附加到SQL字符串,如下所示:

$sql = 'SELECT * FROM TABLE WHERE ';
$first = true;
foreach($_POST as $paramName => $value) {
    if ($first) {
        $sql .= "{$paramName}='{$value}'";
        $first = false;
        continue;
    }
    $sql .= " AND {$paramName}='{$value}'";
}
$sql .= ' AND ' . mysqli_real_escape_string($connection, htmlspecialchars($paramName)) . "='" . mysqli_real_escape_string($connection, htmlspecialchars($value)) . "'";
$sql = 'SELECT * FROM TABLE WHERE ';
$first = true;
foreach($_POST as $paramName => $value) {
    $protectedParamName = mysqli_real_escape_string($connection, htmlspecialchars($paramName));
    $protectedValue = mysqli_real_escape_string($connection, htmlspecialchars($value));

    if (empty($value)) {
        continue;
    }

    if ($first) {
        $sql .= "{$protectedParamName}='{$protectedValue}'";
        $first = false;
        continue;
    }

    $sql .= " AND {$protectedParamName}='{$protectedValue}'";
}
您还将收到空值,您不希望附加到SQL查询字符串。因此,最终的代码也需要处理这个问题,经过一点格式化后,它将如下所示:

$sql = 'SELECT * FROM TABLE WHERE ';
$first = true;
foreach($_POST as $paramName => $value) {
    if ($first) {
        $sql .= "{$paramName}='{$value}'";
        $first = false;
        continue;
    }
    $sql .= " AND {$paramName}='{$value}'";
}
$sql .= ' AND ' . mysqli_real_escape_string($connection, htmlspecialchars($paramName)) . "='" . mysqli_real_escape_string($connection, htmlspecialchars($value)) . "'";
$sql = 'SELECT * FROM TABLE WHERE ';
$first = true;
foreach($_POST as $paramName => $value) {
    $protectedParamName = mysqli_real_escape_string($connection, htmlspecialchars($paramName));
    $protectedValue = mysqli_real_escape_string($connection, htmlspecialchars($value));

    if (empty($value)) {
        continue;
    }

    if ($first) {
        $sql .= "{$protectedParamName}='{$protectedValue}'";
        $first = false;
        continue;
    }

    $sql .= " AND {$protectedParamName}='{$protectedValue}'";
}
在本例中,$connection变量是一个mysqli对象:

$connection = new mysqli(
    $dbConfig['host'],
    $dbConfig['user'],
    $dbConfig['password'],
    $dbConfig['databaseName'],
    $dbConfig['port']
);
foreach$\u POST as$paramName=>$值将在每个$\u POST数组值上执行,因此,如果您不希望在SQL查询中使用某些字段,则可以使用黑名单筛选,在其中指定$paramName是否在黑名单中,则不会将其附加到SQL查询

例如:

$blackList = [
    'action'
];
foreach($_POST as $paramName => $value) {
    if (in_array($paramName, $blackList)) {
        continue;
    }
}

规则是什么?所有过滤器都必须处于或关系中?整个查询是与一个表相关还是与多个表相关?总共有256个字段,还是仅仅是该字段可以接受的可能值的数量?你能给我们一点更详细的信息吗?所有都是和条件,我使用的结果视图。所以把它看成是一张桌子。256不是字段数。如果我考虑正常的编写代码和条件扫描的方法,那就没有可能的条件了。你给我看一个有2个条件的例子。嗨,DavidHlavati,用样本条件更新了问题。谢谢,David Hlavati,我一定要试试这个。在这里告诉你结果。再次感谢:嗨@David Hlavati,它运行得很好。但它也赋予了动作属性。我已经在问题中更新了上面的代码。请考虑一下。添加了一些如何用黑名单过滤参数的示例代码,这样就可以解决不必要的参数SujyIaA它的工作该死的好。谢谢你的帮助,@David Hlavati。你救了我