如何在 SQL 查询中动态累积复选框值
How to dynamically accumulate checkbox values in a SQL query
我有一个搜索表单,用户可以在其中选择几个复选框、设置日期范围、使用通配符搜索等,然后通过单击按钮,它会通过 ajax 发送到 PHP 文件并在 MySQL 查询中执行。
在 php 文件中,我设置了一个级联的 if 语句,以确保无论用户选择了某些值 f.e,查询都有效。像这样:
// 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.")
)
)
");
例如,我不会得到 'dog' 和 'cat' 的结果,但不会得到 'bird' 的结果(= 复选框 1 和 2 已选中但未选中 3)。
我知道这从一开始就是一个非常愚蠢的方法,不管复选框如何。遗憾的是,我还不知道如何做得更好。如果有人能指出我正确的方向,我会很高兴。我认为有一种更聪明的方法可以做到这一点,f.e。用数组?实在是太缺乏基础知识了!
我想你有这样的表格:
<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);
我同意朋友的意见,使用 mysqli
或 PDO
更好,至少转义字符串。
此外,不要在查询中说 MASTER.RISK_LEVEL != ''
或最差的 MASTER.CHECK = '' OR MASTER.CHECK != ''
.
在第一种情况下,我认为 risk_level 总是被定义的。所以不用说risk_level != ''
。在第二种情况下,说我想要字符串 null 或不想要 null 是没有用的。只要不问,你就会得到所有结果。
编辑:
如果您查看我回答开头的表格,我会添加一个 ID,它是 myFormId
。
所以对于jQuery,如果你想序列化你的表单数据,只需做:
javascript:
var formData = $('#myFormId').serialize();
我有一个搜索表单,用户可以在其中选择几个复选框、设置日期范围、使用通配符搜索等,然后通过单击按钮,它会通过 ajax 发送到 PHP 文件并在 MySQL 查询中执行。
在 php 文件中,我设置了一个级联的 if 语句,以确保无论用户选择了某些值 f.e,查询都有效。像这样:
// 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.")
)
)
");
例如,我不会得到 'dog' 和 'cat' 的结果,但不会得到 'bird' 的结果(= 复选框 1 和 2 已选中但未选中 3)。
我知道这从一开始就是一个非常愚蠢的方法,不管复选框如何。遗憾的是,我还不知道如何做得更好。如果有人能指出我正确的方向,我会很高兴。我认为有一种更聪明的方法可以做到这一点,f.e。用数组?实在是太缺乏基础知识了!
我想你有这样的表格:
<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);
我同意朋友的意见,使用 mysqli
或 PDO
更好,至少转义字符串。
此外,不要在查询中说 MASTER.RISK_LEVEL != ''
或最差的 MASTER.CHECK = '' OR MASTER.CHECK != ''
.
在第一种情况下,我认为 risk_level 总是被定义的。所以不用说risk_level != ''
。在第二种情况下,说我想要字符串 null 或不想要 null 是没有用的。只要不问,你就会得到所有结果。
编辑:
如果您查看我回答开头的表格,我会添加一个 ID,它是 myFormId
。
所以对于jQuery,如果你想序列化你的表单数据,只需做:
javascript:
var formData = $('#myFormId').serialize();