如何在 SQL 查询中动态累积复选框值


How to dynamically accumulate checkbox values in a SQL query

我有一个搜索表单,用户可以在其中选择几个复选框,设置日期范围,使用通配符搜索等,并通过按钮单击将其通过ajax发送到PHP文件并在MySQL查询中执行。

在 php 文件中,我设置了一连串的 if 语句,以确保无论用户是否选择了某些值,查询都可以工作,例如:

// variable from a risk level dropdown menu
if ($_POST['risklevelcount']=="") {
    $risklevel = "MASTER.RISK_LEVEL != ''";
}
else {
    $risklevel = "MASTER.RISK_LEVEL = "' . $risklevelcount . "'";
}

然后,变量在 MySQL 查询的 where 子句中实现,如下所示:

$result = mysql_query("
SELECT *
FROM        MASTER
WHERE 
        (( ". $buttonvalue ." ) AND ( ". $date . " ) AND ( ". $risklevel ." ))
");

为了确保无论用户是否选中复选框,查询都能执行,我类似地在 if 子句中实现了它们,如下所示:

if(!empty($checkbox1)) 
    $checkbox1 = "MASTER_CHECK like '%dog%'"; 
else $checkbox1 = "MASTER.CHECK = '' OR MASTER.CHECK != ''";
if(!empty($checkbox2)) 
    $checkbox2 = "MASTER_CHECK like '%cat%'"; 
else $checkbox2 = "MASTER.CHECK = '' OR MASTER.CHECK != ''";
if(!empty($checkbox3)) 
    $checkbox3 = "MASTER_CHECK like '%bird%'"; 
else $checkbox3 = "MASTER.CHECK = '' OR MASTER.CHECK != ''";

如果我将这些添加到上面的 MySQL 查询 where 子句中,我显然不会得到我想要的结果:

$result = mysql_query("SELECT *
FROM        MASTER
WHERE 
        (
            ( ". $buttonvalue ." ) AND ( ". $date . " ) AND (". risklevel .") AND
                (
                    (". $checkbox1.") OR (". $checkbox2.") OR (". $checkbox3.")
                )
        )
");

例如,我不会得到"狗"和"猫"的结果,但不会得到"鸟"的结果(= 复选框 1 和 2 已选中,但未选中 3)。

我知道这从一开始就是一种非常愚蠢的方法,无论复选框如何。可悲的是,我还不知道如何做得更好。如果有人能指出我正确的方向,我会很高兴。我认为有一种更聪明的方法可以做到这一点,例如使用数组?我只是真的缺乏真正的基础知识!

我想你有这样的表格:

<form id="myFormId" method="POST" action="index.php">
    <div>
        <label for="level">Level :</label>
        <select name="risklevelcount">
            <option value="">-- all level --</option>
            <option value="1">1</option>
            <option value="2">2</option>
            <option value="3">3</option>
        </select>
    </div>
    <div>
        <label>Any Pet ?</label>
        <input type="checkbox" name="pet[]" value="dog">dog
        <input type="checkbox" name="pet[]" value="cat">cat
        <input type="checkbox" name="pet[]" value="bird">bird
    </div>
    <input type="submit" value="submit">
</form>

这是我对PHP部分的建议:

$strWhere = '1=1';
if(true === isset($_POST['risklevelcount']) && true === is_numeric($_POST['risklevelcount']))
{
    $strWhere = ' AND MATER.RISK_LEVEL = '.mysql_escape_string($_POST['risklevelcount']);
}
if(true === isset($_POST['pet']) && 0 < sizeof($_POST['pet']))
{
    $strWhere .= 'AND (';
    foreach($_POST['pet'] as $pet)
    {
        $strWhere .= ' MASTER_CHECK like "%'.mysql_escape_string($pet).'%" OR ';
    }
    //remove last OR
    $strWhere = substring($strWhere, 0, -3);
    $strWhere .= ')';
}
$result = mysql_query("SELECT * FROM MASTER WHERE ".$strWhere);

我同意伴侣的观点,使用mysqliPDO更好,至少转义字符串。此外,不要再在您的查询中说MASTER.RISK_LEVEL != ''或最坏MASTER.CHECK = '' OR MASTER.CHECK != ''.

在第一种情况下,我认为risk_level总是被定义的。所以不用说risk_level != ''.在第二种情况下,说我想要字符串 null 或不 null 是没有用的。只是不要问,你会得到所有的结果。

编辑:

如果您检查我答案开头的表格,我会添加一个 ID myFormId .所以使用 jQuery,如果你想序列化你的表单数据,只需做:

JavaScript:

var formData = $('#myFormId').serialize();