首页 > 代码库 > PHP微信公众开发笔记(七)

PHP微信公众开发笔记(七)

PHP微信公众开发笔记系列
日期:2014.9.6

这篇日记是补昨天的,昨天没来得及写;

主要实现的功能:模糊检索、问答系统、帮助系统
修复了:_SESSION 的id
调整了验证机制

要注意的:mysql的语法问题、mysql的模糊匹配、PHP的关联数组好像用count计算的话其大小会有原有数据的两倍大(即数组中只有两个数据,count会得到4,这个需要再验证,好像是用到了foreach就出现了这个问题)

学到了:PHP中数组的操作

2014.9.10整理笔记:
写这个笔记的时候,在赶功能,所以也就是简单的记几笔当时的工作内容,现在功能开发得差不多了,就来整理之前的笔记。当时就很简单的记录了上文的那几句。
我记得,那天来上班的路上,同学跟我说,希望的功能是:输入某个城市的名字,便能够得到在这个城市的同学的信息。其实这个功能便是我最初想弄这个微信公众号想要实现的功能了,这样便能很方便的进行信息检索了,虽然说现阶段我们或许没有很多人到处走动,没有那个需求。但排除不了偶然,所以就有了这个想法。

模糊检索:
模糊检索的话,说来说去也是基于数据库检索的,这里应该弄一个关键词,以便服务台程序可以捕获这个关键词,我设定为查看+XX来查看信息,比如说想查看广州的信息,则回复“查看广州”即可。
具体实现:
首先是关键词捕获了,这个跟笔记六里面提到的类似,无非是用两个字符串处理函数了:strstr,str_replace处理用户输入的信息;关键是如何处理从数据库中检索信息了,刚开始我的想法是是否能在数据库中做模糊检索,实在不行的话就首先得到所有的信息,然后去对比;
方案一、关于数据库的模糊匹配:
从网上查阅到的资料显示是支持模糊检索的,但是我试了好几个小时,就是没有效果,不知道是不是我对这个模糊检索的理解有错误,网上查看到的语法是:
1、select from xxx(数据表名) where xxx(字段) like xxx(我们要检索的) ,网友给的介绍是,这个语法能从给定的数据表中,检索相应的字段值为我们要查找的信息。但我们这里要做的是多字段查看,即数据表中有省份、城市等字段信息,我需要做这些字段的模糊匹配,所以又开始查阅资料了;
2、select from xxx where concat(‘field_a‘,‘field_b‘,‘field_c‘) like xxx ,这里concat相当于是组合多个字段,然后去做模糊匹配,我照着这个来了,但是还是没有成功;
3、select from xxx where xxx.colum_name like xxx ,这也是查阅到的资料,改变之处在于字段名改为了:数据表.colum_name 这样去匹配的,但是还是没有用; 
具体的没有用根据我打印出来的信息是,用mysql_query 检索到了信息,但是这个结果用mysql_fetch_assoc或者mysql_fetch_array处理之后,并没有得到相应的数组,不知道是什么情况;在这里也要注意的是:like后面的那个模糊匹配信息,根据网友提供的意见是,如果是中文字符需要写成%检索%这样的格式,即两边都要有百分号。
在这里虽然说没有达到我的需求,但是还是感受到,要能很好的操作数据库,那么就需要好好的看看mysql操作手册了。
方案二、得到信息再去匹配对比
这个方案应该是说很简单易行的,因为我做的手游项目中就是这么处理的,其实我一开始有模糊检索这个需求的时候,也是想到这个方法的。但是我考虑到,首先从数据库中得到信息需要访问数据库检索,然后再去做对比又要花时间,这个可能会影响性能的,因此我才想到要在网上查询是否有解决方案的。但是事与愿违,没有达到预期所需,这个就留给以后看吧。

这个方案很简单,只需首先将所有的信息都得到,然后去做对比就可以了。这里用到了php数组的一个操作函数使之对比变得非常的简单:in_array();判断某个值是否在数组中。因为我们从数据库中得到的信息,php是处理成一个个数组的,我检索广州这个词,就只需要判断在这些数组中是否出现了广州这个词就可以了,所以比较简单。具体实现我是这样做的:



得到所有的信息,然后循环这个二维数组,每次循环得到一个数组信息,然后去跟我们要检索的值去对比,匹配到了就将这个数组放到我们的结果数组中去,然后在后面的操作中做结果处理就可以了。
因此关于模糊检索这个功能点就这样实现了。

问答系统:
在构思模糊检索的时候,我也想,是否能弄个功能来帮助同学回忆回忆大学的东西。有了这个想法之后,我构思了一个叫做问答的功能,即用户回复问答,系统就返回一个问题让用户去回答。这些问题都是关于大学生活的,如学号之类的。
有了这个想法之后,便开始着手实现了,因为我想到或许以后这个功能会有扩展,所以我以一个类来实现,我称之为我这个系统的一个模块,便于统一管理。
具体的实现很简单,就是在用户回复“问答”的时候,用$_SESSION记录一下用户开启了问答模块,然后用户的下一步回复信息就是回答内容了,回答不管成功失败都清除掉$_SESSION关于用户开启问答模块的信息。感觉这样实现得有点简单粗暴,哈哈。
具体实现很简单,几乎没有碰到很大的问题,所以不提具体实现了。

帮助系统:

帮助系统我的构想是,提供玩这个公众号的教程,及简单的更新日志功能。想到要弄这么多,那么再回复文本信息肯定就不太好了,所以就需要回复图文链接了。图文链接的回复在官方的开发文档中就有具体的说明了,我看到网友的方法,将那一大串xml串分解开来处理,我也跟着这么做了:



传过来一个数组,然后再做处理,就可以很方便的回复图文链接了。
这里再提一下关于点击后跳转的那个链接吧:
     因为我压根就不懂该怎么弄那个链接(一点概念都没有),后来想应该就是一个文件,这个链接就是这个文件的存放地址。然后我就随便用php写了个文件,放到SAE的Storage里,把这个链接放过来,测试了下效果就是这样的。
     经常浏览网页的时候,又看到网页多是html的,所以又想该怎么生成html文件,在网上查资料html文件该怎么生成,又是网页在线生成、又是word保存为html、后来回家又是用dreamweaver的。后来html文件是生成了,可是没有很好的匹配手机浏览的需求,应该说是压根不像一个网页,可能我稍微有点网页设计基础应该就可以了,网上有很多的模板素材。
     后来我无意在公众平台的素材库看到了我同学们做的一些文档,心想,能不能直接把我要用的那个帮助文档也用这个素材库来处理,直接创建一个新的素材,里面的内容就是帮助文档的信息。说来就来,将直接写好的帮助文档,添加至我新创建的素材中去,然后保存好再测试效果。结果很满意,就是我要的效果,这才像手机打开的网页嘛。因为有点强迫症,总是要调整格式啥的,所以那天忙到快十二点了才整理好,那天是周五,回到租的房子差不多是晚上八点了,回来后稍微收拾了下就是在整理公众平台了,然后忙到十二点左右。虽然累,但是很开心。

PHP注意点:
1、这天开发的时候遇到了问题,$_SESSION出问题了:保存的信息,每个用户都是可以访问的。当时在网上查资料的时候,要使得每个用户得到的信息不一致,需要通过设置ID来实现,即使用一个唯一的用户信息来设置id,这样就能保证每个用户得到的信息是不一致的:
session_id() 使用这个函数来设置id
因为微信公众号得到的收到的信息,里面有一个表示的是发送信息的用户,可以通过以这个为id使得值唯一,所以我就是以用户的信息来设置id的,但是后来出问题了。我一开始以为是这个机制的问题,以为我使用不当。所以调整了函数的调用顺序:
本来是
session_id();
session_start();
这样的调用顺序的,我想是不是这个顺序不对,我就换了下,结果还是不对。后来,我认真的看了下设置的这个id,才发现是我把那个用户信息写错了,大小写没分清楚,真是马虎害死人。
从微信服务器得到的用户信息是这样的:
$postObj->FromUserName     
而我用成这样了 $postObj->fromUserName 
而我却一直都没发现。。。诶。。。
2、php的数组:
使用关联数组的时候,如果使用foreach做循环,循环次数会有其count大小的两倍。这个在我做模糊检索的时候碰到了这个问题。当时我不是用in_array做匹配,而是使用循环数组来做匹配的,在网上查到的资料是说关联数组使用foreach来做匹配,这样还可以得到键值:
foreach ($array as $key => $value) 
{
       if($array[$key] == xxx)
       $res_array[] = $array[$key];
}
当时我这样做的时候,这个循环的次数为数组大小的两倍,我打印了这个key,显示出:既把关联的key打印出来了,又把数值键打印出来了。即第一次打印出的是数值key,第二次打印对应的关联key,同一个元素会被打印出两次。所以在我做匹配的时候,会得到两个同样的数组。不知道是不是我在哪里的使用出了问题。

PHP微信公众开发笔记(七)