基于多选框过滤mysql结果


Filter mysql results based on multiselect box

我正试图根据多选框中的值筛选一个mysql表,以便它返回所有已选择值的结果。例如,这是我的多选框:

<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>

如果用户选择了"him"answers"gadgets",那么它应该返回mysql表中的所有结果,其中包含"his"或"gadgetes"

mysql表将每个产品的数据作为字符串存储在一列中(即,在"礼物"列下,它可能会说他、她、孩子、小工具,或者在另一行,它可能是她、小工具。在上面的示例中,我希望它同时返回两行)。

结果由AJAX返回,我曾尝试使用WHERE IN子句,但无法使其正常工作。这是我的代码(上面已经有HTML选择框):

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();
}

结果.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表和数据注意:我只显示了两行的礼物列、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表中只分配了一个值,这似乎是有效的,但当它有多个值时就没有了。从我读到的内容来看,我认为我可能在一列中存储多个条件,但不确定如何修复它。非常感谢。

你这样做是错误的。

首先,阅读有关数据库规范化的内容。你必须有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'];

然后您可以使用join:构建查询

$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的效率非常低。

好的,所以我找到了一个解决方案,但很确定它不是正确的方式,因为它不是很优雅。欢迎提出任何改进建议。我将$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对此进行重新编码。