这是一个创建于 1252 天前的主题,其中的信息可能已经有所发展或是发生改变。
在看 discuz 时候,发现搜索帖子时候
1 个关键词
SELECT t.tid, t.closed, t.author, t.authorid FROM pre_forum_thread t WHERE t.fid IN ('2','36','37','4','39') AND t.displayorder>='0' AND (0 OR t.subject LIKE '%key%') ORDER BY tid DESC LIMIT 500
多个关键词:
SELECT t.tid, t.closed, t.author, t.authorid FROM pre_forum_thread t WHERE t.fid IN ('2','36','37','4','39') AND t.displayorder>='0' AND (1 AND t.subject LIKE '%key%' AND t.subject LIKE '%key1%') ORDER BY tid DESC LIMIT 500
就是 0 OR 与 1 AND 链接 like,这个有什么用处吗?
是防止 SQL 注入吗?
4 条回复 • 2021-01-13 15:56:43 +08:00
![eason1874](https://cdn.v2ex.com/avatar/3d27/4899/442190_normal.png?m=1668415623) |
|
1
eason1874 2021-01-13 10:34:32 +08:00
不是安全考虑,就是为了方便,没查询价值的,查询的时候会被优化掉。
其中一个条件为真,那就整个前缀 where 0,后面所有追加直接 OR condition 就行了,不用判断是不是第一个,要不要写 OR
所有条件为真就整个前缀 where 1,后面追加直接 AND condition
|
![taogen](https://cdn.v2ex.com/gravatar/5f16eccf4fb12baac91df365bf33a3d4?s=48&d=retro) |
|
2
taogen 2021-01-13 10:37:38 +08:00 via Android
可能是方便动态拼接 SQL
|
![msg7086](https://cdn.v2ex.com/avatar/4dfa/8c1c/38436_normal.png?m=1560377701) |
|
3
msg7086 2021-01-13 15:46:45 +08:00 2
当年还没有各种 ORM,所以要复杂的检索查询就需要手拼查询字符串。 就像上面说的,先放一个 "1",然后后面每次追加 "AND xxx LIKE xxx",比合并条件然后再去删掉一个 AND 方便。
|
![sodadev](https://cdn.v2ex.com/avatar/5b5b/6a3c/396232_normal.png?m=1562847556) |
|
4
sodadev 2021-01-13 15:56:43 +08:00 via Android
主要是懒
|