PHP中使用GET方式进行MySQL模糊查询分页数据为空

Author: linbeet - Posted:6个月前 - View:342

大多数情况下,查询数据一般都是使用POST方式进行数据库查询,但是当遇到分页时,就没办法使用POST方式了,因为查询的参数都是通过GET方式将参数传到服务器的,这时候如果是普通查询语句还好,如果遇到模糊查询那就惨了,因为在点击超链接的时候,会看到URL中的空格或引号都被编码成“%20”或“%27”了,如下面的URL就是被编码了。

/index.php?m=user&page=1&select=WHERE%20deleted%20=%200%20AND%20status=%271%27%20and%20regtime%20LIKE%20%27%2023-09-03%%27

如果查询的条件是汉字还好,若是日期,点击分页是无法查询到任何数据的,因为模糊查询的格式如regtime LIKE '%2023-8-24%'形式,在URL中就会自动被编码,导致“%2023”被解码的时候就会直接被编码成“空格+23”了,以至于查询不到相应的数据出来。

不过经过自己的一番努力和测试,有以两种方式可以解决这个问题,比如:

  1. 在URL中使用“PATHINFO”模式来传输查询条件
  2. 使用正则表达式的MySQL查询语法来进行模糊查询
  3. 使用数据库的date_format函数也可达到目的

由于自己的站点是旧程序,传参使用的传统模式,要改来支持pathinfo太麻烦了,所以我选择的是第二种方式来进行数据查询,SQL语句只要稍微更改一下,就可以达到目的了,效果如下:

/index.php?m=user&page=1&select=WHERE%20deleted%20=%200%20AND%20status=%271%27%20and%20regtime%20REGEXP%20%272023-09-03%27

一目了然,就是将regtime LIKE '%2023-8-24%'改成regtime REGEXP '2023-8-24'即可。

虽然问题解决了,功能也能凑合用,但是缺点也很明显,比如:

  1. regexp形式的查询无法应用到索性,数据量大是灾难
  2. 存储时间最好不用datetime,用int型最好了
  3. 时间类型无法使用全文搜索功能

说一千道一万,以上也只是说了后端的一部分问题,同时也暴露了我的程序太古老,无法一次性重构,都只是打补丁而已,不过程序仅是用于内网应用后台,安全这块可以稍微放松点,如果是线上,直接使用超链接进行传入SQL语句来进行模糊查询绝对是找黑了,对于前台最保险的还是推荐使用pathinfo方式最妥当,传入更少的条件,SQL的组合也放到后台程序去了,安全性要可靠的多。

0 人点赞  ∙  0 人收藏  
加入收藏 点赞 我要评论
目前尚无回复