根据多选框筛选 mysql 个结果
Filter mysql results based on multiselect box
我正在尝试根据 multiselect 框中的值过滤 mysql table,以便 return 所有结果的值都是 select编辑。例如,这是我的多个 select 框:
<select name="gift[]" id="gift" multiple="multiple" onchange="change()">
<option value="him">Him</option>
<option value="her">Her</option>
<option value="kids">Kids</option>
<option value="teens">Teens</option>
<option value="mothersday">Mothers Day</option>
<option value="fathersday">Fathers Day</option>
<option value="valentines">Valentines Day</option>
<option value="gadgets">Gadgets</option>
<option value="secretsanta">Secret Santa</option>
</select>
如果用户 selects "him" 和 "gadgets" 它应该 return 来自 mysql table 的所有结果 "him" 或 "gadgets" 在里面。
mysql table 将每个产品的数据作为字符串存储在单个列中(即在 'gift' 列下,它可能会说他、她、孩子、小工具或对于另一行,它可能是她,小工具。在上面的示例中,我希望它 return 两行)。
结果由 AJAX return编辑,我尝试使用 WHERE IN 子句但无法获取它 working.Here 是我的代码(HTML select框已经在上面):
AJAX 注意:为简单起见,没有完整的代码
function change(){
var giftarray = new Array();
$.each($("#gift option:selected"), function(){
giftarray.push($(this).val());
});
var gift = "'" + giftarray.join("','") + "'";
if (window.XMLHttpRequest)
{// code for IE7+, Firefox, Chrome, Opera, Safari
xmlhttp=new XMLHttpRequest();
}
else
{// code for IE6, IE5
xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
}
xmlhttp.onreadystatechange=function()
{
if (xmlhttp.readyState==4 && xmlhttp.status==200)
{
document.getElementById("product").innerHTML=xmlhttp.responseText;
}
}
var url="results.php"
url=url+"&gift="+gift;
xmlhttp.open("GET",url,true);
xmlhttp.send();
}
Results.PHP 注意:为简单起见,没有完整的代码
$gift=$_GET['gift'];
$gift=str_replace("\","",$gift);
$sql= "SELECT * FROM $productstable WHERE gift IN ($gift)";
$result = mysql_query($sql) or die ('Unable to run query:'.mysql_error());
while($item = mysql_fetch_array($result))
{
code to view products here
}
<? } mysql_close() ?>
Mysql Table 和数据 注意:我只显示了两行的礼物列、id 和数据(希望没问题)
CREATE TABLE `products` (
`id` int(255) NOT NULL AUTO_INCREMENT,
`gift` varchar(100) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=6 ;
INSERT INTO `products` VALUES(1,'him,her');
INSERT INTO `products` VALUES(2,'him,her,teens,gadgets');
如果产品在 mysql table 中只分配了一个值,这似乎有效,但当它有多个时则无效。从我读过的内容来看,我认为在单个列中存储多个条件可能会出错,但不确定如何修复它。非常感谢。
好的,所以我找到了解决方案,但很确定这不是正确的方法,因为它不是很优雅。欢迎任何改进建议。我将 explode $gift 变量设置到一个数组中,然后生成几个带有通配符的 OR LIKE 语句进行匹配。看起来我的多选框中只有 9 个选项,因为这种方法很快就会变得乏味。
代码:
RESULTS.PHP
$gift=$_GET['gift'];
$gift=str_replace("\","",$gift);
$gift=str_replace("'","%",$gift);
$gift=explode(",",$gift);
$sql= "SELECT *
FROM $productstable
WHERE gift LIKE '$gift[0]'
OR gift LIKE '$gift[1]'
OR gift LIKE '$gift[2]'
OR gift LIKE '$gift[3]'
OR gift LIKE '$gift[4]'
OR gift LIKE '$gift[5]'
OR gift LIKE '$gift[6]'
OR gift LIKE '$gift[7]'
OR gift LIKE '$gift[8]'
OR gift LIKE '$gift[9]'";
$result = mysql_query($sql) or die ('Unable to run query:'.mysql_error());
while($item = mysql_fetch_array($result))
{
code to view products here
}
<? } mysql_close() ?>
完全不喜欢这种方法,因为我认为 IN 应该这样做,但就是无法让它发挥作用。这会对速度产生负面影响吗?
稍后还将使用 PDO 重新编码。
你这样做是错误的。
首先,了解数据库规范化。您必须有 3 个表。
type { id, title } for storing him,her,teens,gadgets as rows with unique id
product { id, product_title, ...... } for storing products
product_type {product_id, type_id} to store relation product -> type
您必须将选项数据作为数组发送:
index.php?options[1]=him&options[2]=her&options[3]=kids
然后在 PHP 中你得到它作为:
$options = $_GET['options'];
然后您可以使用连接构建查询:
$q = "SELECT a.id, a.product_title from product a JOIN product_type b ON a.a=b.product_id WHERE b.type_id IN('".implode("','",$options )."')";
p.s。
这只是例子。很没有安全感。您必须需要准备好的安全语句、验证输入数据、创建正确的索引。您可以将 "type" 存储在带有 ID 的数组中,但我更喜欢存储在数据库中。
你的例子在关系数据库设计方面是错误的。此外,使用 LIKE 是非常低效的。
我正在尝试根据 multiselect 框中的值过滤 mysql table,以便 return 所有结果的值都是 select编辑。例如,这是我的多个 select 框:
<select name="gift[]" id="gift" multiple="multiple" onchange="change()">
<option value="him">Him</option>
<option value="her">Her</option>
<option value="kids">Kids</option>
<option value="teens">Teens</option>
<option value="mothersday">Mothers Day</option>
<option value="fathersday">Fathers Day</option>
<option value="valentines">Valentines Day</option>
<option value="gadgets">Gadgets</option>
<option value="secretsanta">Secret Santa</option>
</select>
如果用户 selects "him" 和 "gadgets" 它应该 return 来自 mysql table 的所有结果 "him" 或 "gadgets" 在里面。
mysql table 将每个产品的数据作为字符串存储在单个列中(即在 'gift' 列下,它可能会说他、她、孩子、小工具或对于另一行,它可能是她,小工具。在上面的示例中,我希望它 return 两行)。
结果由 AJAX return编辑,我尝试使用 WHERE IN 子句但无法获取它 working.Here 是我的代码(HTML select框已经在上面):
AJAX 注意:为简单起见,没有完整的代码
function change(){
var giftarray = new Array();
$.each($("#gift option:selected"), function(){
giftarray.push($(this).val());
});
var gift = "'" + giftarray.join("','") + "'";
if (window.XMLHttpRequest)
{// code for IE7+, Firefox, Chrome, Opera, Safari
xmlhttp=new XMLHttpRequest();
}
else
{// code for IE6, IE5
xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
}
xmlhttp.onreadystatechange=function()
{
if (xmlhttp.readyState==4 && xmlhttp.status==200)
{
document.getElementById("product").innerHTML=xmlhttp.responseText;
}
}
var url="results.php"
url=url+"&gift="+gift;
xmlhttp.open("GET",url,true);
xmlhttp.send();
}
Results.PHP 注意:为简单起见,没有完整的代码
$gift=$_GET['gift'];
$gift=str_replace("\","",$gift);
$sql= "SELECT * FROM $productstable WHERE gift IN ($gift)";
$result = mysql_query($sql) or die ('Unable to run query:'.mysql_error());
while($item = mysql_fetch_array($result))
{
code to view products here
}
<? } mysql_close() ?>
Mysql Table 和数据 注意:我只显示了两行的礼物列、id 和数据(希望没问题)
CREATE TABLE `products` (
`id` int(255) NOT NULL AUTO_INCREMENT,
`gift` varchar(100) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=6 ;
INSERT INTO `products` VALUES(1,'him,her');
INSERT INTO `products` VALUES(2,'him,her,teens,gadgets');
如果产品在 mysql table 中只分配了一个值,这似乎有效,但当它有多个时则无效。从我读过的内容来看,我认为在单个列中存储多个条件可能会出错,但不确定如何修复它。非常感谢。
好的,所以我找到了解决方案,但很确定这不是正确的方法,因为它不是很优雅。欢迎任何改进建议。我将 explode $gift 变量设置到一个数组中,然后生成几个带有通配符的 OR LIKE 语句进行匹配。看起来我的多选框中只有 9 个选项,因为这种方法很快就会变得乏味。
代码: RESULTS.PHP
$gift=$_GET['gift'];
$gift=str_replace("\","",$gift);
$gift=str_replace("'","%",$gift);
$gift=explode(",",$gift);
$sql= "SELECT *
FROM $productstable
WHERE gift LIKE '$gift[0]'
OR gift LIKE '$gift[1]'
OR gift LIKE '$gift[2]'
OR gift LIKE '$gift[3]'
OR gift LIKE '$gift[4]'
OR gift LIKE '$gift[5]'
OR gift LIKE '$gift[6]'
OR gift LIKE '$gift[7]'
OR gift LIKE '$gift[8]'
OR gift LIKE '$gift[9]'";
$result = mysql_query($sql) or die ('Unable to run query:'.mysql_error());
while($item = mysql_fetch_array($result))
{
code to view products here
}
<? } mysql_close() ?>
完全不喜欢这种方法,因为我认为 IN 应该这样做,但就是无法让它发挥作用。这会对速度产生负面影响吗?
稍后还将使用 PDO 重新编码。
你这样做是错误的。
首先,了解数据库规范化。您必须有 3 个表。
type { id, title } for storing him,her,teens,gadgets as rows with unique id
product { id, product_title, ...... } for storing products
product_type {product_id, type_id} to store relation product -> type
您必须将选项数据作为数组发送:
index.php?options[1]=him&options[2]=her&options[3]=kids
然后在 PHP 中你得到它作为:
$options = $_GET['options'];
然后您可以使用连接构建查询:
$q = "SELECT a.id, a.product_title from product a JOIN product_type b ON a.a=b.product_id WHERE b.type_id IN('".implode("','",$options )."')";
p.s。 这只是例子。很没有安全感。您必须需要准备好的安全语句、验证输入数据、创建正确的索引。您可以将 "type" 存储在带有 ID 的数组中,但我更喜欢存储在数据库中。
你的例子在关系数据库设计方面是错误的。此外,使用 LIKE 是非常低效的。