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是處理成一個個數組的,我檢索廣州這個詞,就只需要判斷在這些數組中是否出現了廣州這個詞就可以了,所以比較簡單。具體實現我是這樣做的:
vcv509C1xNDFz6KjrMi7uvPRrbu31eK49rb+zqzK/dfpo6zDv7TO0a27t7XDtb3Su7j2yv3X6dDFz6KjrMi7uvPIpbj6ztLDx9KqvOzL97XEJiMyMDU0MDvIpbbUscijrMalxeS1vcHLvs29q9XiuPbK/dfpt8W1vc7Sw8e1xL3hufvK/dfp1tDIpaOsyLu689TauvPD5rXEstnX99bQ1/a94bn7tKbA7b7Nv8nS1MHLoaM8YnI+CtLytMu52NPaxKO6/bzsy/fV4rj2uabE3LXjvs3V4tH5yrXP1sHLoaM8YnI+Cjxicj4KPHN0cm9uZz7OyrTwz7XNs6O6PC9zdHJvbmc+PGJyPgrU2rm5y7zEo7r9vOzL97XEyrG68qOsztLSss/ro6zKx7fxxNzFqrj2uabE3MC0sO/W+s2s0ae72NLku9jS5LTz0ae1xLarzveho9PQwcvV4rj2z+u3qNauuvOjrM7SubnLvMHL0ru49r3Q1/bOyrTwtcS5psTco6y8tNPDu6e72Li0zsq08KOsz7XNs77Nt7W72NK7uPbOysziyMPTw7unyKW72LTwoaPV4tCpzsrM4ra8yse52NPatPPRp8n6u+61xKOsyOfRp7rF1q7A4LXEoaM8YnI+CtPQwcvV4rj2z+u3qNauuvOjrLHjv6rKvNfFytbKtc/WwcujrNLyzqrO0s/rtb278tDt0tS689XiuPa5psTcu+HT0MCp1bmjrMv50tTO0tLU0ru49sDgwLTKtc/Wo6zO0rPG1q7Oqs7S1eK49s+1zbO1xNK7uPbEo7/po6yx49PazbPSu7ncwO2hozxicj4Kvt/M5bXEyrXP1rrcvPK1paOsvs3Kx9Ta08O7p7vYuLShsM7KtPChsbXEyrG68qOs08MkX1NFU1NJT068x8K80rvPwtPDu6e/qsb0wcvOyrTwxKO/6aOsyLu689PDu6e1xM/C0ruyvbvYuLTQxc+ivs3Kx7vYtPDE2sjdwcujrLvYtPCyu7ncs8m5psqnsNy2vMfls/219CRfU0VTU0lPTrnY09rTw7unv6rG9M7KtPDEo7/ptcTQxc+ioaO40L711eLR+cq1z9a1w9PQteO88rWltNaxqaOsuf65/qGjPGJyPgq+38zlyrXP1rrcvPK1paOsvLi69cO709DF9rW9uty087XEzsrM4qOsy/nS1LK7zOG+38zlyrXP1sHLoaM8YnI+Cjxicj4KPHN0cm9uZz6w79b6z7XNs6O6PC9zdHJvbmc+PGJyPgo8cD6w79b6z7XNs87StcS5uc/rysejrMzhuanN5tXiuPa5q9bausW1xL3Ms8yjrLywvPK1pbXEuPzQwsjV1r65psTcoaPP67W90qrFqtXiw7S24KOsxMfDtNTZu9i4tM7Esb7Qxc+iv8+2qL7NsrvMq7rDwcujrMv50tS+zdDo0qq72Li0zbzOxMG0vdPBy6GjzbzOxMG0vdO1xLvYuLTU2rnZt721xL+qt6LOxLW11tC+zdPQvt/M5bXEy7XD98HLo6zO0r+0tb3N+NPRtcS3vbeoo6y9q8TH0ru087SueG1stK631r3iv6rAtLSmwO2jrM7S0rK4+tfF1eLDtNf2wcujujwvcD4KPHA+PGltZyBzcmM9"http://www.2cto.com/uploadfile/Collfiles/20140912/2014091209043527.png" alt="\">
傳過來一個數組,然後再做處理,就可以很方便的回復圖文鏈接了。
這裡再提一下關於點擊後跳轉的那個鏈接吧:
因為我壓根就不懂該怎麼弄那個鏈接(一點概念都沒有),後來想應該就是一個文件,這個鏈接就是這個文件的存放地址。然後我就隨便用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,同一個元素會被打印出兩次。所以在我做匹配的時候,會得到兩個同樣的數組。不知道是不是我在哪裡的使用出了問題。