摘要:結(jié)論把存入數(shù)據(jù)庫前必須做次處理中文處理包含中文的字符串時,會將中文字符轉(zhuǎn)換為的形式,而且通過是不能恢復(fù)的。處理特殊字符通過解決中文問題會帶來新問題,的特殊字符處理。
開發(fā)過程中經(jīng)常碰到要把前端的json格式的數(shù)據(jù)傳遞到后端php,php做一些業(yè)務(wù)處理后把數(shù)據(jù)存到mysql,然后,php再從mysql中取出數(shù)據(jù)返回到前端。雖然這是一個再基礎(chǔ)不過的處理過程,但還是有不少問題需要認真研究。下面從幾個環(huán)節(jié)看看可能出現(xiàn)的各種問題。
存入mysql前假設(shè)前端傳入的數(shù)據(jù)是:
{"html":"a"b"}
json_decode后,PHP對象是:
object(stdClass)#3 (1) { ["html"]=> string(3) "a"b" }
注意要處理的數(shù)據(jù)中包含了雙引號,這個字符在json中需要轉(zhuǎn)意,在mysql中也需要轉(zhuǎn)意。假如要把這個對象轉(zhuǎn)換為json串存入mysql,先用json_encode處理:
{"html":"a"b"}
注意:雙引號前面加上了反斜杠。再用real_escape_string處理:
{"html":"a"b"}
注意:所有的雙引號和反斜杠(json_encode加上的那個)都加上了反斜杠。存入數(shù)據(jù)庫的內(nèi)容:
{"html":"a"b"}
按照這樣的過程處理數(shù)據(jù)是正常的,從數(shù)據(jù)庫取出后,用json_decode可以恢復(fù)原來的數(shù)據(jù)。但是如果在存入數(shù)據(jù)庫前沒有做real_escape_string的處理,直接存入數(shù)據(jù)庫,那么數(shù)據(jù)庫的內(nèi)容:
{"html":"a"b"}
注意:這時a和b之間的雙引號前面的反斜杠被mysql去掉了,數(shù)據(jù)庫中的內(nèi)容已經(jīng)不是合法的json串。
結(jié)論1:把json存入mysql數(shù)據(jù)庫前必須做1次real_escape_string
處理中文json_encode處理包含中文的字符串時,會將中文字符轉(zhuǎn)換為unicode的形式(uXXXX),而且通過json_decode是不能恢復(fù)的。例如處理前的對象是:
object(stdClass)#3 (1) { ["html"]=> string(6) "你好" }
json_encode后的json串是:
{"html":"u4f60u597d"}
real_escape_string處理后存入mysql數(shù)據(jù)庫:
{"html":"u4f60u597d"}
這樣帶來的問題是在mysql中就無法直接對這個串做處理,例如:
like "%你%"
解決這個問題的方法是,在進行json_encode前先對要處理的對象的值用urlencode處理一遍,json_encode后再用urldecode恢復(fù)回來,這樣的到j(luò)son串是:
{"html":"你好"}
結(jié)論2:通過urlencode解決json_encode將中文字符編碼為unicode的形式。
處理特殊字符通過urlencode解決中文問題會帶來新問題,json的特殊字符處理。例如:雙引號會被編碼為“%22”,json_encode不會對%22特殊處理,【你"好】本應(yīng)該編碼為【你"好】,對雙引號進行轉(zhuǎn)義,但是結(jié)果是【你"好】,已經(jīng)不是一個合法的json字符串。
解決這個問題前首先要搞清楚json中有哪些特殊字符,看下圖:
來自:http://www.json.org/
解決這個問題的思路是在進行urlencode之前,先在這些特殊字符前加上反斜杠,這樣urldecode之后就有了轉(zhuǎn)義的反斜杠。
$str = str_replace(array("", """, " ", " ", " "), array("", """, " ", " ", " "), $str);
執(zhí)行這個操作時要注意,必須先替換反斜杠,再替換其它特殊字符,否則,給特殊字符添加的反斜杠又會被再加上反斜杠。另一個問題注意要用雙引號,php中單引號的內(nèi)容不會轉(zhuǎn)義,雙引號才會。
總結(jié):通過上述3個方面的處理,應(yīng)該可以正確的處理json的問題了。但是,也許應(yīng)該直接寫一個拼接json串的方法,徹底不用json_encode,這樣效率更高些,以后有機會試試。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.hztianpu.com/yun/22125.html
摘要:結(jié)論把存入數(shù)據(jù)庫前必須做次處理中文處理包含中文的字符串時,會將中文字符轉(zhuǎn)換為的形式,而且通過是不能恢復(fù)的。處理特殊字符通過解決中文問題會帶來新問題,的特殊字符處理。 開發(fā)過程中經(jīng)常碰到要把前端的json格式的數(shù)據(jù)傳遞到后端php,php做一些業(yè)務(wù)處理后把數(shù)據(jù)存到mysql,然后,php再從mysql中取出數(shù)據(jù)返回到前端。雖然這是一個再基礎(chǔ)不過的處理過程,但還是有不少問題需要認真研究。下...
摘要:的毫秒級超時也有問題。。中超時實現(xiàn)一初級最簡單的超時實現(xiàn)秒級超時思路很簡單鏈接一個后端,然后設(shè)置為非阻塞模式,如果沒有連接上就一直循環(huán),判斷當前時間和超時時間之間的差異。實際處理這個調(diào)用的部件在完成后,通過狀態(tài)通知和回調(diào)來通知調(diào)用者。 概述 在PHP開發(fā)中工作里非常多使用到超時處理到超時的場合,我說幾個場景: 異步獲取數(shù)據(jù)如果某個后端數(shù)據(jù)源獲取不成功則跳過,不影響整個頁面展現(xiàn) 為了保...
摘要:后端知識點總結(jié)基礎(chǔ)不是是一種軟件開發(fā)平臺,它的競爭對象歷史第一次有一種語言可以通吃前后端網(wǎng)站阿里云鏡像版本年初年中年底最新版本功能強大可靠,適合大型企業(yè)級項目簡單易用適合互聯(lián)網(wǎng)項目易用適合平臺性能好適合服務(wù)器端密集型項目不適合密集型項目密集 后端知識點總結(jié)——NODE.JS基礎(chǔ) 1.Node.js Node.js不是JS,是一種軟件開發(fā)平臺,它的競爭對象JSP/PHP/ASP.NET...
摘要:日期和時間使用類完成讀取設(shè)置比較和計算日期與時間。單元測試單元測試是從編寫開始,貫穿于整個開發(fā)周期的一種用于保證函數(shù)類和方法的行為與預(yù)期一致的編程方法。是應(yīng)用的單元測試框架的業(yè)界標準,其他幾個可選框架是行為驅(qū)動開發(fā)行為驅(qū)動開發(fā)有兩種方式和。 《php之道》閱讀地址:http://wulijun.github.io/php-the-right-way/#code_style_guide ...
摘要:注意事項以下版本要設(shè)置默認編碼,,否則程序可能無法正確顯示中文。組成部分協(xié)議是對請求和響應(yīng)的報文內(nèi)容進行了約束和規(guī)范。請求報文請求是由客戶端發(fā)起,其規(guī)范格式為請求行請求頭請求主體。 showImg(https://segmentfault.com/img/remote/1460000013696283?w=1920&h=1080); Ajax 前言 前面我們已經(jīng)學習了js基礎(chǔ)知識和一些...
閱讀 2526·2021-11-22 09:34
閱讀 3146·2021-10-25 09:43
閱讀 2061·2021-10-11 10:59
閱讀 3487·2021-09-22 15:13
閱讀 2397·2021-09-04 16:40
閱讀 477·2019-08-30 15:53
閱讀 3261·2019-08-30 11:13
閱讀 2665·2019-08-29 17:30