PHP 板


LINE

看板 PHP  RSS
※ 引述《yo0401 (羽无伦)》之铭言: : 小弟我想做复选的限制查询 : 但是第一次做,不知道有没有更好的写法 : 我的想法是: : 譬如衣服的颜色 黄、绿、红 : SELECT * FROM 资料表 WHERE 栏位 like XXX $limit; : $limit="limit $color1 $color2 $color3"; :  if (empty($color=红){ : $color1=null; : }else{ : $color1="color=红 and" : } : . : . : . : (没测试过,只是有这个想法,上面的想法还有很多问题还待解决) : 不知道有没有人有更好的写法,或是有参考的网站(希望是中文) : 我的目的是要限制查询的条件,而且是复选 这个问题要从两方面来看,一个是如何在php里面取得表单栏位的复选资料, 一个是如何写出SQL query。 在HTML表单里面要做复选通常是使用核取方块(checkbox): <form action="act.php" method="get"> 颜色: <input type="checkbox" name="color[]" value="黄" /> <input type="checkbox" name="color[]" value="绿" /> <input type="checkbox" name="color[]" value="红" /> <input type="submit"> </form> 注意栏位名称是color[],有了[],php会帮你把这些栏位资料转成阵列, 在act.php里面你可以透过$_GET['color']来取得使用者勾选的颜色。 如果使用者勾选了黄和绿,$_GET['color']会是 array( 0 => '黄', 1 => '绿' ) 如果都没有勾选,$_GET['color']这个变数就不存在(这很重要,是 不存在,而不是一个空的阵列,这两者差异很大)。 在SQL query方面,首先LIMIT这个语法(适用mysql, postgresql) 的使用方式跟你原本设想的并不一样,它是用来限制传回的资料笔数 而不是过滤哪些资料会被传回。如果你使用IN语法的话,若使用者 勾选黄色绿色,那麽: SELECT ..... WHERE color IN ('黄', '绿') 便会找出color栏位值"等於"黄或者绿的资料。所以问题变成如何组出 以上的SQL。你可以使用: $query = "SELECT...WHERE color IN ('".implode("','", $_GET['color'])."')"; 但是这是假设使用者至少有勾选一项颜色。如果完全没勾选就送出, 如同前面所述,此时$_GET['color']并不存在,因此implode()那里 就会出现错误讯息,指出$_GET['color']不是一个有效的阵列。 (如何处理万一使用者没有勾选任何颜色的状况就不讨论了。 提示:isset())。 但是IN语法只能找出栏位值完全符合的资料,如果要找出栏位值 "包含"黄或者绿的资料,那得改用LIKE搭配万用字元。 SELECT...WHERE color LIKE '%黄%' OR color LIKE '%绿%' 会找出color栏位值"包含"黄或者绿的资料。要组出这个SQL,可以: $query = "SELECT...WHERE 1 = 0 "; foreach($_GET['color'] as $color) { $query .= (" OR color LIKE '%".$color."%' "); } 这会组出: SELECT...WHERE 1 = 0 OR color LIKE '%黄%' OR color LIKE '%绿%' 你可能会觉得那个 1 = 0 是做啥的。这算是个撇步,它可以让你在组 出後面的OR...的时候不用考虑现在不是在阵列的第一个元素(是的话 就不能加上OR,不是才能加上OR,否则组出来的字串会有问题)。 mysql本身有最佳化功能,会把1=0这种显然不成立的条件忽略掉。 同样,这里也没有考虑万一使用者没有勾选任何颜色的状况。 -- 是说後半段其实比较适合丢去database板。 --



※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 220.132.153.19
1F:→ MrMarcus:如果能确定要比对的字串都出现在栏位值的开头,那就使用 07/01 02:02
2F:→ MrMarcus:LIKE '黄%',这会比 LIKE '%黄%'的查询速度快。 07/01 02:02







like.gif 您可能会有兴趣的文章
icon.png[问题/行为] 猫晚上进房间会不会有憋尿问题
icon.pngRe: [闲聊] 选了错误的女孩成为魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一张
icon.png[心得] EMS高领长版毛衣.墨小楼MC1002
icon.png[分享] 丹龙隔热纸GE55+33+22
icon.png[问题] 清洗洗衣机
icon.png[寻物] 窗台下的空间
icon.png[闲聊] 双极の女神1 木魔爵
icon.png[售车] 新竹 1997 march 1297cc 白色 四门
icon.png[讨论] 能从照片感受到摄影者心情吗
icon.png[狂贺] 贺贺贺贺 贺!岛村卯月!总选举NO.1
icon.png[难过] 羡慕白皮肤的女生
icon.png阅读文章
icon.png[黑特]
icon.png[问题] SBK S1安装於安全帽位置
icon.png[分享] 旧woo100绝版开箱!!
icon.pngRe: [无言] 关於小包卫生纸
icon.png[开箱] E5-2683V3 RX480Strix 快睿C1 简单测试
icon.png[心得] 苍の海贼龙 地狱 执行者16PT
icon.png[售车] 1999年Virage iO 1.8EXi
icon.png[心得] 挑战33 LV10 狮子座pt solo
icon.png[闲聊] 手把手教你不被桶之新手主购教学
icon.png[分享] Civic Type R 量产版官方照无预警流出
icon.png[售车] Golf 4 2.0 银色 自排
icon.png[出售] Graco提篮汽座(有底座)2000元诚可议
icon.png[问题] 请问补牙材质掉了还能再补吗?(台中半年内
icon.png[问题] 44th 单曲 生写竟然都给重复的啊啊!
icon.png[心得] 华南红卡/icash 核卡
icon.png[问题] 拔牙矫正这样正常吗
icon.png[赠送] 老莫高业 初业 102年版
icon.png[情报] 三大行动支付 本季掀战火
icon.png[宝宝] 博客来Amos水蜡笔5/1特价五折
icon.pngRe: [心得] 新鲜人一些面试分享
icon.png[心得] 苍の海贼龙 地狱 麒麟25PT
icon.pngRe: [闲聊] (君の名は。雷慎入) 君名二创漫画翻译
icon.pngRe: [闲聊] OGN中场影片:失踪人口局 (英文字幕)
icon.png[问题] 台湾大哥大4G讯号差
icon.png[出售] [全国]全新千寻侘草LED灯, 水草

请输入看板名称,例如:e-shopping站内搜寻

TOP