预备知识点:
10 |
在 php 中可以通过 decbin() 函数将十进制数字转换为二进制数字. |
12 |
位运算符 & (按位与), 什么是 & 运算呢? |
13 |
以 $c = $a & $b 表达式为例, & 运算是将 $a, $b 的二进制数值相比较, 只要两个二进制数中某位都是1, 则结果的二进制数中该位都为1, 否则结果为 0. |
16 |
$a 的值为 2 (十进制), 它的二进制数值为 10 |
17 |
$b 的值为 4 (十进制), 它的二进制数值为 100 |
18 |
那么 $c 为 0 (十进制) 因数 $a & $b 的结果为 000(二进制数值), 转换为十进制数值就为 0 |
21 |
$a 的值为 2 (十进制), 它的二进制数值为 10 |
22 |
$b 的值为 6 (十进制), 它的二进制数值为 110 |
23 |
那么 $c 为 2 (十进制) 因数 $a & $b 的结果为 010(二进制数值), 转换为十进制数值就为 2 |
25 |
Javascript/php/mysql 都支持 & 运算. |
OK. 进入正题:
我们现在要记录用户的兴趣爱好, 兴趣爱好有很多选项, 可以复选, 表现在页面上就是一堆的 checkbox , 它看起来像是这样子的
1 |
<input type= "checkbox" name= "hobby[]" value= "aa" >爱好1 <br> |
2 |
<input type= "checkbox" name= "hobby[]" value= "bb" >爱好2 <br> |
3 |
<input type= "checkbox" name= "hobby[]" value= "cc" >爱好3 <br> |
4 |
<input type= "checkbox" name= "hobby[]" value= "dd" >爱好4 <br> |
5 |
<input type= "checkbox" name= "hobby[]" value= "ee" >爱好5 <br> |
6 |
<input type= "checkbox" name= "hobby[]" value= "ff" >爱好6 <br> |
7 |
<input type= "checkbox" name= "hobby[]" value= "gg" >爱好7 <br> |
假设用户勾选的是 “爱好1”, “爱好3”, “爱好5”, 我们要怎么把用户勾选的值保存到数据库呢?
方法1:
1 |
用特定的分隔符(比如,)把用户勾选的 value 值串连起来? 那么保存到数据库中的值应该是 "aa,cc,ee" |
方法2:
1 |
保存到数据库的值是 "1010100" , 这个字串是怎么得来的呢? 设计这种方法的思想是这样的: 数据库中保存一个长度与复选框个数一样的字符串, 这个字串中的第一位就表示第一个复选框, 如果第一个复选框的勾选了, 那字串的第一位就是1. 同样的道理所以字串的第3位,第5位值为1, 其它位值为0. |
我用的是方法3:
1 |
重新设计 checkbox 的值, 将它们设置成2的N(N>=0)次方. 它看起来像这样子: |
2 |
<input type="checkbox" name="hobby[]" value="1" >爱好1 <br> |
3 |
<input type="checkbox" name="hobby[]" value="2" >爱好2 <br> |
4 |
<input type="checkbox" name="hobby[]" value="4" >爱好3 <br> |
5 |
<input type="checkbox" name="hobby[]" value="8" >爱好4 <br> |
6 |
<input type="checkbox" name="hobby[]" value="16">爱好5 <br> |
7 |
<input type="checkbox" name="hobby[]" value="32">爱好6 <br> |
8 |
<input type="checkbox" name="hobby[]" value="64">爱好7 <br> |
9 |
而我要保存到数据库中的值是 21, 没错, 它是一个数字, 它是怎么来的呢? 1+4+16 = 21, 它就是将用户勾选的复选框 value 值累加而以. |
为什么是2的N(N>=0)次方? ( 1, 2, 4, 8, 16, 32, … )
03 |
echo decbin (1). "<br>" ; |
04 |
echo decbin (2). "<br>" ; |
05 |
echo decbin (4). "<br>" ; |
06 |
echo decbin (8). "<br>" ; |
07 |
echo decbin (16). "<br>" ; |
08 |
echo decbin (32). "<br>" ; |
09 |
echo decbin (64). "<br>" ; |
19 |
echo decbin (1+2). "<br>" ; |
20 |
echo decbin (1+2+4). "<br>" ; |
21 |
echo decbin (4+8). "<br>" ; |
22 |
echo decbin (1+4+16). "<br>" ; |
38 |
echo (21 & 16). "<br>" ; |
39 |
echo (21 & 32). "<br>" ; |
40 |
echo (21 & 64). "<br>" ; |
我们来看看页面前端 javascript 是怎么保存和还原用户勾选的选项的:
01 |
<input type= "button" value= "要保存到数据库中的值" onclick= "get_save_value('hobby[]')" > |
02 |
<input type= "button" value= "清除勾选" onclick= "clear_all('hobby[]')" > <br> |
04 |
<input type= "text" name= "set_check_value" id= "set_check_value" ><br> |
05 |
<input type= "button" value= '先点击 "清除勾选" 再点我' onclick= "set_check('hobby[]', document.getElementById('set_check_value').value)" > <br> |
07 |
<script language= "JavaScript" > |
10 |
function set_check(name, value){ |
11 |
var obj = document.getElementsByName(name); |
12 |
for ( var i=0; i<obj.length; i++){ |
13 |
if ( (obj[i].value & value) == obj[i].value ){ |
14 |
obj[i].checked = true ; |
20 |
function get_save_value(name){ |
21 |
var obj = document.getElementsByName(name); |
23 |
for ( var i=0; i<obj.length; i++){ |
25 |
saveValue += parseInt(obj[i].value); |
28 |
document.getElementById( "set_check_value" ).value = saveValue; |
32 |
function clear_all(name){ |
33 |
var obj = document.getElementsByName(name); |
34 |
for ( var i=0; i<obj.length; i++){ |
35 |
obj[i].checked = false ; |
我们来看看后端数据库是查询用户勾选项的:
假设我们 tableName 中的 hobby 字段是保存用户的兴趣爱好值
一个用户一第记录, 如果前面的例子成功记录到数据库中, 那么 tableName 中应该有一条 hobby==21 的值的记录.
04 |
SQL: SELECT * FROM tableName WHERE (hobby&1) OR (hobby&4); |
09 |
SQL: SELECT * FROM tableName WHERE (hobby&1) AND (hobby&4); |
14 |
SQL: SELECT * FROM tableName WHERE hobby=(1+4) |