存储多个复选框的最佳方式,以便我以后可以轻松查询它们

时间:2016-11-23 21:10:43

标签: php mysql multi-select

让我们说我有一个客户正在寻找具有特定区域的对象。 所以我有多个复选框,可以从中检查他想要的复选框。

<input type="checkbox" name="area[]" value="10" /> 10
<input type="checkbox" name="area[]" value="20" /> 20
<input type="checkbox" name="area[]" value="30" /> 30
<input type="checkbox" name="area[]" value="40" /> 40
<input type="checkbox" name="area[]" value="50" /> 50

这可能不是存储区域值的最佳方式,因为我想轻松查询符合我标准的行。用这种方式表达会更好:

 <input type="checkbox" name="area_10" value="true" /> 10
 <input type="checkbox" name="area_20" value="true" /> 20
 <input type="checkbox" name="area_30" value="true" /> 30
 <input type="checkbox" name="area_40" value="true" /> 40
 <input type="checkbox" name="area_50" value="true" /> 50

因此我在数据库表中有单独的列(area_10,area_20,area_30等)。如果这是最佳解决方案,那么sql查询会查找检查10到40之间区域的行?

2 个答案:

答案 0 :(得分:0)

使用多对一数据,您需要使用关系数据存储。你需要一个&#34;区域&#34;用于存储属于对象的区域的表。每一行都有区号和对象外来id。因此,您可以编写一个连接,将多个数据转换为一个数据,并使其易于存储,理解和查询。

和连接的示例,它将拉出为对象#1972选择和存储的区域:

select
  o.id, o.name, group_concat(a.area) areas
from
  objects o left join
  area a on o.id = a.object_id
where
  o.id = 1972;

修改 一个如何选择包含30到60之间区域的所有对象的示例

select
  o.id, o.name, group_concat(a.area) areas
from
  objects o left join
  area a on o.id = a.object_id
where
  a.area between '30' and '60';

并且另外面积等于90

select
  o.id, o.name, group_concat(a.area) areas
from
  objects o left join
  area a on o.id = a.object_id
where
  a.area = '90';

答案 1 :(得分:0)

没有足够的信息来提供最佳解决方案,但基本上如果所需要的只是查找客户端中具有与所选值相对应的特定区域的所有对象,那么服务器端所需的全部是表格( say objects_table)有两列,即对象(或它的id)和它的区域。

服务器端从客户端接收所选复选框的值列表(例如10,20,40),并相应地构建并运行简单查询(不要忘记转义值以避免可能的注入) ,

SELECT id, area FROM objects_table WHERE area IN (10, 20, 40)

由于我怀疑区域在现实生活中会有不错的离散值,我认为这是一个教育的例子,或者我误解了这个问题......