黃玲娜
摘要:Ajax技術(shù)被廣泛應(yīng)用于網(wǎng)頁開發(fā)過程,可以實現(xiàn)無刷新與數(shù)據(jù)庫交互,大大節(jié)約了數(shù)據(jù)搜索的時間、提高了搜索的效率。但是由于Ajax技術(shù)默認(rèn)UTF-8編碼方式,在開發(fā)網(wǎng)站過程中,很有可能由于編碼問題導(dǎo)致中文查詢實現(xiàn)不了的情形。在編碼方式統(tǒng)一的前提下,運(yùn)用encodeURI()函數(shù)能有效地解決問題,實現(xiàn)中文查詢。
關(guān)鍵詞:中文查詢;Smarty模板;Ajax技術(shù);PHP
中圖分類號:TP311.1 文獻(xiàn)標(biāo)識碼:A 文章編號:1009-3044(2015)26-0071-02
Research on Chinese Query using Ajax Technology in PHP and Smarty Environment
HUANG Ling-na
(Wuxi City College of Vocational Technology,Wuxi 214000,China)
Abstract:Ajax technology is widely used in the process of web development, it can achieve no refresh and database interaction, greatly saving the time of data search, improve the efficiency of the search. However, due to the default Ajax technology UTF-8 encoding way, in the development of the site process, it is possible that the problem caused by encoding's Chinese query cannot achieve the situation. Under the premise of the unity of the encoding mode, the use of encodeURI () function can effectively solve the problem, to achieve the Chinese query.
Key words:Chinese Query;Smarty;Ajax;PHP
隨著電子商務(wù)的發(fā)展,越來越多的人們選擇在網(wǎng)絡(luò)平臺上購物,而信息搜索是電商網(wǎng)站最基本、也是極其重要的一項功能,用戶在網(wǎng)頁上可以通過搜索快速找到自己感興趣的商品,從而免去了逐個查找的不便,大大提高了購物速度,省卻了時間和精力。
PHP是一種在服務(wù)器上運(yùn)行的開發(fā)語言,是一種類似ASP的服務(wù)器端腳本語言[1],在TIOBE 編程語言排行榜上名列前茅,是一種網(wǎng)站開發(fā)的主流開發(fā)技術(shù)。在PHP眾多開發(fā)模板中,Smarty模板一直處于領(lǐng)先地位,利用Smarty模板可以實現(xiàn)網(wǎng)頁代碼控制和頁面美工分離開來,從而使得開發(fā)過程更加清晰明了,利于后期的修改和完善。Smarty運(yùn)行速度極快;效率高;模板只需被解析一次,無需重復(fù)[2],正是由于Smarty模板的高效性以及合理的開發(fā)模式,使得Smarty模板在網(wǎng)站開發(fā)過程中成為開發(fā)人員的有力臂膀。
在開發(fā)網(wǎng)站搜索功能時,Ajax技術(shù)可以實現(xiàn)在不刷新頁面的情況下與數(shù)據(jù)庫交互,這項技術(shù)極大地提高了網(wǎng)頁和數(shù)據(jù)庫之間的訪問速度,Ajax技術(shù)具有以下優(yōu)點(diǎn):[3]
1)減輕了服務(wù)器的負(fù)擔(dān)。因為 AJAX 技術(shù)是按需取數(shù)據(jù),所以最大可能地減少了冗余請求和響應(yīng)對服務(wù)器造成的負(fù)擔(dān)。
2)無刷新更新頁面,減少用戶的等待時間。
在利用Ajax技術(shù)實現(xiàn)查詢功能時需要特別注意編碼問題,Ajax不支持多種字符集,默認(rèn)的字符集是UTF-8,所以在使用Ajax技術(shù)時應(yīng)該進(jìn)行編碼轉(zhuǎn)換,否則程序中出現(xiàn)的中文字符將變成亂碼,[4]從而影響中文查詢的結(jié)果。
1 Ajax技術(shù)實現(xiàn)查詢的過程
1.1 初始化XMLHttpRequest對象,建立createxmlhttp.js文件
XMLHttpRequest是一個具有應(yīng)用程序接口的JavaScript對象,該對象通過HTTP連接服務(wù)器,利用XMLHttpRequest技術(shù),Ajax可以像桌面應(yīng)用程序一樣只同服務(wù)器進(jìn)行數(shù)據(jù)層面的交換,而不用每次都刷新頁面,從而減輕了服務(wù)器的負(fù)擔(dān),又加快了查詢的響應(yīng)速度??紤]到XMLHttpRequest對象不是一個W3C,在實際應(yīng)用中,不同的瀏覽器,有不同的初始化方法,因此,可以創(chuàng)建createxmlhttp.js文件,針對不同的瀏覽器初始化為不同的實例對象。
1.2通過open()方法以及XMLHttpRequest對象的常用屬性完成異步查詢請求
XMLHttpRequest對象提供了open()方法用于設(shè)置異步請求目標(biāo)的URL,在利用xmlhttp.open("GET",url,true)請求數(shù)據(jù)庫響應(yīng)的過程中,其中的參數(shù)url為請求目標(biāo)的URL,往往為一個PHP文件,在提交請求的同時可以將查詢關(guān)鍵字通過附加URL的方式一同提交給目標(biāo)URL。XMLHttpRequest對象還提供了一系列的常用屬性,可以通過ready State屬性的值來判斷請求的狀態(tài);response Text屬性為服務(wù)器的響應(yīng),根據(jù)服務(wù)器返回值的不同可以給出不同的查詢結(jié)果;onreadystatechange屬性往往可以和匿名函數(shù)聯(lián)合使用用于確保每個狀態(tài)改變時都會觸發(fā)這個事件處理器。
1.3編寫請求目標(biāo)PHP文件,實現(xiàn)Ajax查詢
在調(diào)用open()方法進(jìn)行異步請求的過程中設(shè)置了請求目標(biāo)的url,該目標(biāo)URL所對應(yīng)的文件主要是進(jìn)行數(shù)據(jù)查詢,在查詢過程中,文件首先將通過附加URL變量方式傳遞過來的查詢關(guān)鍵字接收,通過編寫SQL語句對數(shù)據(jù)庫進(jìn)行查詢,并可將查詢結(jié)果記錄在Session變量中供后期顯示在網(wǎng)頁上,同時將查詢狀態(tài)返還給XMLHttpRequest對象。
2 Ajax技術(shù)在查詢過程中出現(xiàn)的中文亂碼問題
Ajax技術(shù)并不支持多種字符集,默認(rèn)支持的是UTF-8字符集,這也就意味著在發(fā)送數(shù)據(jù)的時候Ajax會使用UTF-8編碼后發(fā)送,這時候如果頁面使用的不是同樣的編碼,就會出現(xiàn)以下情形:明明數(shù)據(jù)庫中有數(shù)據(jù),但中文搜索卻查詢不到。假使在程序運(yùn)行過程中利用跟蹤技術(shù)就可以發(fā)現(xiàn)通過附加URL變量發(fā)送數(shù)據(jù)時,PHP接收到的是亂碼,因此在使用select語句查詢時where子句的條件配對成了問題。
3 中文查詢亂碼的解決方法
3.1編碼方式的統(tǒng)一
在實際開發(fā)過程中,往往將客戶端和服務(wù)器端都使用統(tǒng)一的編碼,可以使用以下方法設(shè)置編碼方式:
1) 在創(chuàng)建頁面的過程中指定編碼方式
2) 在頁面頂部使用header()語句指定發(fā)送數(shù)據(jù)的編碼方式
3.2使用encodeURI()函數(shù)編碼
由于Ajax技術(shù)在發(fā)送數(shù)據(jù)的時候默認(rèn)使用的是UTF-8字符集,所以當(dāng)Ajax發(fā)送中文數(shù)據(jù),PHP負(fù)責(zé)接收的時候就有可能由于編碼的不同導(dǎo)致亂碼的產(chǎn)生。這時候encodeURI()函數(shù)就起到了至關(guān)重要的作用。
encodeURI() 函數(shù)是一個Javascript函數(shù),可把字符串作為 URI 進(jìn)行編碼。在實際使用中,可以使用該函數(shù)先對需要通過Ajax發(fā)送的數(shù)據(jù)進(jìn)行編碼,然后再發(fā)送出去,由PHP負(fù)責(zé)接收,這樣一來就能解決由于編碼不同導(dǎo)致接收亂碼的問題。
如想在頁面上實現(xiàn)通過搜索商品名稱查詢商品信息,可以使用以下JS代碼解決問題。
var name=encodeURI(form.name.value);//獲取文本框的值
var url="search.php?name="+name;
xmlhttp.open("GET",url,false);//不刷新驗證是否存在該商品
xmlhttp.onreadystatechange=function()
{
if(xmlhttp.readyState==4)
{
var ishave=xmlhttp.responseText;//返回值是一個字符串
ishave=ishave.replace(/\s+/g,"");
if(ishave=='1')
{
alert("不存在該商品");
form.name.select();
return false;
}
if(ishave=='2')
{
form.name.select();
window.location.href='main.php?page_type=search2';
}
}
}
xmlhttp.send(null);
作為一種無刷新即可查詢數(shù)據(jù)庫的技術(shù)手段,Ajax技術(shù)被廣泛應(yīng)用于網(wǎng)頁查詢中,而查詢支持中文是一項最基本的要求。因此,在開發(fā)過程中,程序員要特別注意各個頁面編碼方式的統(tǒng)一,同時靈活運(yùn)用encodeURI()對發(fā)送的數(shù)據(jù)進(jìn)行編碼轉(zhuǎn)換,實際有效的解決中文查詢過程中出現(xiàn)的亂碼問題,開發(fā)出真正符合用戶實際需求的搜索界面。
參考文獻(xiàn):
[1] 趙鶴芹. 設(shè)計動態(tài)網(wǎng)站的最佳方案 Apache+PHP+MySQL[J].計算機(jī)工程與設(shè)計,2007(2):993-994.
[2] 宋尚平,李興保. PHP模板引擎Smarty的安裝配置及應(yīng)用實現(xiàn)[J].現(xiàn)代教育技術(shù),2007(9):80.
[3] 呂林濤,萬經(jīng)華,周紅芳. 基于 AJAX 的 Web 無刷新頁面快速更新數(shù)據(jù)方法[J]. 計算機(jī)應(yīng)用研究,2006(11):199.
[4] 明日科技.PHP從入門到精通[M].北京:清華大學(xué)出版社,2012:449.