簡體   English   中英

如何在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();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM