成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

JS+PHP+MYSQL處理JSON的全面總結(jié)

騫諱護(hù) / 1376人閱讀

摘要:結(jié)論把存入數(shù)據(jù)庫(kù)前必須做次處理中文處理包含中文的字符串時(shí),會(huì)將中文字符轉(zhuǎn)換為的形式,而且通過(guò)是不能恢復(fù)的。處理特殊字符通過(guò)解決中文問(wèn)題會(huì)帶來(lái)新問(wèn)題,的特殊字符處理。

開(kāi)發(fā)過(guò)程中經(jīng)常碰到要把前端的json格式的數(shù)據(jù)傳遞到后端php,php做一些業(yè)務(wù)處理后把數(shù)據(jù)存到mysql,然后,php再?gòu)膍ysql中取出數(shù)據(jù)返回到前端。雖然這是一個(gè)再基礎(chǔ)不過(guò)的處理過(guò)程,但還是有不少問(wèn)題需要認(rèn)真研究。下面從幾個(gè)環(huán)節(jié)看看可能出現(xiàn)的各種問(wèn)題。

存入mysql前

假設(shè)前端傳入的數(shù)據(jù)是:

{"html":"a"b"}

json_decode后,PHP對(duì)象是:

object(stdClass)#3 (1) {
  ["html"]=>
  string(3) "a"b"
}

注意要處理的數(shù)據(jù)中包含了雙引號(hào),這個(gè)字符在json中需要轉(zhuǎn)意,在mysql中也需要轉(zhuǎn)意。假如要把這個(gè)對(duì)象轉(zhuǎn)換為json串存入mysql,先用json_encode處理:

{"html":"a"b"}

注意:雙引號(hào)前面加上了反斜杠。再用real_escape_string處理:

{"html":"a"b"}

注意:所有的雙引號(hào)和反斜杠(json_encode加上的那個(gè))都加上了反斜杠。存入數(shù)據(jù)庫(kù)的內(nèi)容:

{"html":"a"b"}

按照這樣的過(guò)程處理數(shù)據(jù)是正常的,從數(shù)據(jù)庫(kù)取出后,用json_decode可以恢復(fù)原來(lái)的數(shù)據(jù)。但是如果在存入數(shù)據(jù)庫(kù)前沒(méi)有做real_escape_string的處理,直接存入數(shù)據(jù)庫(kù),那么數(shù)據(jù)庫(kù)的內(nèi)容:

{"html":"a"b"}

注意:這時(shí)a和b之間的雙引號(hào)前面的反斜杠被mysql去掉了,數(shù)據(jù)庫(kù)中的內(nèi)容已經(jīng)不是合法的json串。

結(jié)論1:把json存入mysql數(shù)據(jù)庫(kù)前必須做1次real_escape_string

處理中文

json_encode處理包含中文的字符串時(shí),會(huì)將中文字符轉(zhuǎn)換為unicode的形式(uXXXX),而且通過(guò)json_decode是不能恢復(fù)的。例如處理前的對(duì)象是:

object(stdClass)#3 (1) {
  ["html"]=>
  string(6) "你好"
}

json_encode后的json串是:

{"html":"u4f60u597d"}

real_escape_string處理后存入mysql數(shù)據(jù)庫(kù):

{"html":"u4f60u597d"}

這樣帶來(lái)的問(wèn)題是在mysql中就無(wú)法直接對(duì)這個(gè)串做處理,例如:

like "%你%"

解決這個(gè)問(wèn)題的方法是,在進(jìn)行json_encode前先對(duì)要處理的對(duì)象的值用urlencode處理一遍,json_encode后再用urldecode恢復(fù)回來(lái),這樣的到j(luò)son串是:

{"html":"你好"}

結(jié)論2:通過(guò)urlencode解決json_encode將中文字符編碼為unicode的形式。

處理特殊字符

通過(guò)urlencode解決中文問(wèn)題會(huì)帶來(lái)新問(wèn)題,json的特殊字符處理。例如:雙引號(hào)會(huì)被編碼為“%22”,json_encode不會(huì)對(duì)%22特殊處理,【你"好】本應(yīng)該編碼為【你"好】,對(duì)雙引號(hào)進(jìn)行轉(zhuǎn)義,但是結(jié)果是【你"好】,已經(jīng)不是一個(gè)合法的json字符串。

解決這個(gè)問(wèn)題前首先要搞清楚json中有哪些特殊字符,看下圖:

來(lái)自:http://www.json.org/

解決這個(gè)問(wèn)題的思路是在進(jìn)行urlencode之前,先在這些特殊字符前加上反斜杠,這樣urldecode之后就有了轉(zhuǎn)義的反斜杠。

$str = str_replace(array("", """, "
", "
", "	"), array("", """, "
", "
", "	"), $str);

執(zhí)行這個(gè)操作時(shí)要注意,必須先替換反斜杠,再替換其它特殊字符,否則,給特殊字符添加的反斜杠又會(huì)被再加上反斜杠。另一個(gè)問(wèn)題注意要用雙引號(hào),php中單引號(hào)的內(nèi)容不會(huì)轉(zhuǎn)義,雙引號(hào)才會(huì)。

總結(jié):通過(guò)上述3個(gè)方面的處理,應(yīng)該可以正確的處理json的問(wèn)題了。但是,也許應(yīng)該直接寫(xiě)一個(gè)拼接json串的方法,徹底不用json_encode,這樣效率更高些,以后有機(jī)會(huì)試試。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/22125.html

相關(guān)文章

  • JS+PHP+MYSQL處理JSON全面總結(jié)

    摘要:結(jié)論把存入數(shù)據(jù)庫(kù)前必須做次處理中文處理包含中文的字符串時(shí),會(huì)將中文字符轉(zhuǎn)換為的形式,而且通過(guò)是不能恢復(fù)的。處理特殊字符通過(guò)解決中文問(wèn)題會(huì)帶來(lái)新問(wèn)題,的特殊字符處理。 開(kāi)發(fā)過(guò)程中經(jīng)常碰到要把前端的json格式的數(shù)據(jù)傳遞到后端php,php做一些業(yè)務(wù)處理后把數(shù)據(jù)存到mysql,然后,php再?gòu)膍ysql中取出數(shù)據(jù)返回到前端。雖然這是一個(gè)再基礎(chǔ)不過(guò)的處理過(guò)程,但還是有不少問(wèn)題需要認(rèn)真研究。下...

    anRui 評(píng)論0 收藏0
  • PHP超時(shí)處理全面總結(jié)

    摘要:的毫秒級(jí)超時(shí)也有問(wèn)題。。中超時(shí)實(shí)現(xiàn)一初級(jí)最簡(jiǎn)單的超時(shí)實(shí)現(xiàn)秒級(jí)超時(shí)思路很簡(jiǎn)單鏈接一個(gè)后端,然后設(shè)置為非阻塞模式,如果沒(méi)有連接上就一直循環(huán),判斷當(dāng)前時(shí)間和超時(shí)時(shí)間之間的差異。實(shí)際處理這個(gè)調(diào)用的部件在完成后,通過(guò)狀態(tài)通知和回調(diào)來(lái)通知調(diào)用者。 概述 在PHP開(kāi)發(fā)中工作里非常多使用到超時(shí)處理到超時(shí)的場(chǎng)合,我說(shuō)幾個(gè)場(chǎng)景: 異步獲取數(shù)據(jù)如果某個(gè)后端數(shù)據(jù)源獲取不成功則跳過(guò),不影響整個(gè)頁(yè)面展現(xiàn) 為了保...

    I_Am 評(píng)論0 收藏0
  • 后端知識(shí)點(diǎn)總結(jié)——NODE.JS基礎(chǔ)

    摘要:后端知識(shí)點(diǎn)總結(jié)基礎(chǔ)不是是一種軟件開(kāi)發(fā)平臺(tái),它的競(jìng)爭(zhēng)對(duì)象歷史第一次有一種語(yǔ)言可以通吃前后端網(wǎng)站阿里云鏡像版本年初年中年底最新版本功能強(qiáng)大可靠,適合大型企業(yè)級(jí)項(xiàng)目簡(jiǎn)單易用適合互聯(lián)網(wǎng)項(xiàng)目易用適合平臺(tái)性能好適合服務(wù)器端密集型項(xiàng)目不適合密集型項(xiàng)目密集 后端知識(shí)點(diǎn)總結(jié)——NODE.JS基礎(chǔ) 1.Node.js Node.js不是JS,是一種軟件開(kāi)發(fā)平臺(tái),它的競(jìng)爭(zhēng)對(duì)象JSP/PHP/ASP.NET...

    Freeman 評(píng)論0 收藏0
  • php之道》讀后總結(jié) php學(xué)習(xí)綱要

    摘要:日期和時(shí)間使用類完成讀取設(shè)置比較和計(jì)算日期與時(shí)間。單元測(cè)試單元測(cè)試是從編寫(xiě)開(kāi)始,貫穿于整個(gè)開(kāi)發(fā)周期的一種用于保證函數(shù)類和方法的行為與預(yù)期一致的編程方法。是應(yīng)用的單元測(cè)試框架的業(yè)界標(biāo)準(zhǔn),其他幾個(gè)可選框架是行為驅(qū)動(dòng)開(kāi)發(fā)行為驅(qū)動(dòng)開(kāi)發(fā)有兩種方式和。 《php之道》閱讀地址:http://wulijun.github.io/php-the-right-way/#code_style_guide ...

    gitmilk 評(píng)論0 收藏0
  • JavaScript 進(jìn)階知識(shí) - Ajax篇

    摘要:注意事項(xiàng)以下版本要設(shè)置默認(rèn)編碼,,否則程序可能無(wú)法正確顯示中文。組成部分協(xié)議是對(duì)請(qǐng)求和響應(yīng)的報(bào)文內(nèi)容進(jìn)行了約束和規(guī)范。請(qǐng)求報(bào)文請(qǐng)求是由客戶端發(fā)起,其規(guī)范格式為請(qǐng)求行請(qǐng)求頭請(qǐng)求主體。 showImg(https://segmentfault.com/img/remote/1460000013696283?w=1920&h=1080); Ajax 前言 前面我們已經(jīng)學(xué)習(xí)了js基礎(chǔ)知識(shí)和一些...

    Dongjie_Liu 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<