日常開發中碰到就記一下, 如果有朋友愿意分享的 bug 可以在評論中討論啊url 當中的參數有 ×tamp=1234567890這樣的字段會被轉義成xtamp=1234567890
這個不僅存在于頁面解析當中,當使用 curl 請求時拼接的參數有這種格式的也會發生轉義
解決方法有兩個:
把 timestamp 這個參數放在 urlQuery 的最前面, ?timestamp=1234567890 這樣避免出現 &time發生轉義的情況
將&用&來代替
Automatically populating $HTTP_RAW_POST_DATA is deprecated and will be removed in a future version.出現這句話通常說明你在用的 php 版本是5.6.而且在php<=5.6的時候,進行 application/json格式的 post 提交會把數據放在$HTTP_RAW_POST_DATA這個系統變量里面,在php>=7的時候這個變量被移除了,統統歸總到php://input這里
解決方法:
根據系統提示的走:
Although that indeed would be technically impossible (as $HTTP_RAW_POST_DATA is populated in the bootstrapping phase of the PHP process) allow one to override the setting by means of calling ini_set.
要確保自己的系統中沒有使用 `HTTP_RAW_POST_DATA`這個變量,直接在`php.ini`里面禁掉它的設置,但是容易出現系統中又打開的情況(在框架中很常見)
改一下自己的提交方式, 使用 application/form-data或者application/x-www-form-urlencoded這種格式的提交, 然后在后端接收數據的時候再轉成自己需要的格式(通常是數組)
參考資料
這種情況出現在平時運行的好好的, 但是突然換 cli 模式后這個配置就出問題了,原因在當 host=localhost時走的是 unix:socket 鏈接, 當host=127.0.0.1走的是 tcp 鏈接,這在php-fpm和php-cli中有點區別,尤其是本地沒有安裝 mysql 的時候
解決方法有三種:
將本地鏈接配置統一成 127.0.0.1
查看 MySQL 中的user表, host=localhost和host=127.0.0.1是不是用的同一個賬號密碼
配置php.ini文件中的pdo_mysql.default_socket= 寫上完整的 socket 路徑
以上三種方法都可以試一下
參考資料
這個是 phper 很少碰到但是很常見的情況, 比如用 swoole 啟動了一個常駐進程的服務, 那么就一定要小心使用靜態變量,在同步模式下會發生變量污染, 還有就是 redis,mysql 這類的鏈接,你會發現長時間靜置以后就會出現一些摸不著頭腦的問題, 這種情況不妨想一下是不是 server 端回收了這個 socket,因此在 client 端怎么都寫入不進去. 還有就是 php 在讀取消息的時候,出現消息過長的情況,那么就要考慮EOF終止符的問題了... 單次 http 每一次請求都是全新的代碼, 不用自己考慮 gc 的問題, 但是在常駐內存的時候,這些就是一個個的大坑了
mysql has gone away產生這個錯誤的主要原因是 mysql server 端斷開了鏈接, client 端還拿著這個句柄去請求,解決方式有兩種:
show global variables like "%timeout"; 查看 wait_timeout 的時長,適當的調長一點, 這種方法治標不治本,而且有隱患
mysql> set global wait_timeout=10; mysql> show global variables like "wait_timeout";
使用 mysql 之前需要 mysql_ping() 一下, 如果出現斷開的錯誤就啟動重連機制
js 和 php 交互傳中文參數的編解碼問題之前碰到了問題是:
在 php 端 urlencode 的值為:
orderid%3D21111111110001954%26pid%3D257742%26reason%3D%E4%B8%AA%E4%BA%BA%E6%96%B9%E9%9D%A2%E5%8E%9F%E5%9B%A0_%E4%BD%BF%E7%94%A8%E7%BA%A2%E5%8C%85%E9%87%8D%E6%96%B0%E4%B8%8B%E5%8D%95%26token%3D041d9e5575f480b7bfd58b09bd14ab1c7ee9e9594f2fcdb9f0e3e39fc634b48f
需要 urldecode 一次
而在 js 端的結果是:
orderid%3D21111111110002170%26pid%3D257742%26reason%3D%25E4%25B8%25AA%25E4%25BA%25BA%25E6%2596%25B9%25E9%259D%25A2%25E5%258E%259F%25E5%259B%25A0_%25E4%25B8%25AA%25E4%25BA%25BA%25E8%25BA%25AB%25E4%25BD%2593%25E5%258E%259F%25E5%259B%25A0%26token%3D041d9e5575f480b7bfd58b09bd14ab1c7ee9e9594f2fcdb9f0e3e39fc634b48f
需要 urldecode 兩次
查閱資料后:
在后端是PHP程序的情況下,保持前端Javascript和PHP之間傳值的統一編碼可以使用以下函數進行處理: WEB前端JavaScript 編碼:escape(encodeURI(string)) 解碼:unescape(decodeURI(string)) WEB后端Php 編碼:urlencode(string) 解碼:urldecode(urldecode(string))
為什么要encodeURI(url)兩次才不會出現亂碼?
PHP中rawurlencode和urlencode、JS中encodeURI與encodeURIComponent 的區別rawurlencode遵守是94年國際標準備忘錄RFC 1738
urlencode實現的是傳統做法,和上者的主要區別是對空格的轉義是"+"而不是"%20"
javascript的encodeURL也是94年標準,而javascript的escape是另一種用"%xxx"標記unicode編碼的方法。
推薦在PHP中使用用rawurlencode。棄用urlencode
樣例
source:
超級無敵的人sadha sajdh數據樣本sdls fhejrthcxzb.file.jpeg
PHP urlencode:
%E8%B6%85%E7%BA%A7%E6%97%A0%E6%95%8C%E7%9A%84%E4%BA%BAsadha+sajdh%E6%95%B0%E6%8D%AE%E6%A0%B7%E6%9C%ACsdls+fhejrthcxzb.file.jpeg
PHP rawurlencode:
%E8%B6%85%E7%BA%A7%E6%97%A0%E6%95%8C%E7%9A%84%E4%BA%BAsadha%20sajdh%E6%95%B0%E6%8D%AE%E6%A0%B7%E6%9C%ACsdls%20fhejrthcxzb.file.jpeg
Javascript encodeURI|encodeURIComponent:
%E8%B6%85%E7%BA%A7%E6%97%A0%E6%95%8C%E7%9A%84%E4%BA%BAsadha%20sajdh%E6%95%B0%E6%8D%AE%E6%A0%B7%E6%9C%ACsdls%20fhejrthcxzb.file.jpeg
Javascript escape:
%u8D85%u7EA7%u65E0%u654C%u7684%u4EBAsadha%20sajdh%u6570%u636E%u6837%u672Csdls%20fhejrthcxzb.file.jpeg
帖子原文
在前端還有個問題就是, js 的 encodeURIComponent 和 encodeURI 都不會轉換 _-.!~*"()# 這些保留字符, 而在后端的rawurlencode 則是會轉換的, 因此需要前端多帶帶把這幾個給拎出來, 如下:
"*".charCodeAt(0) // 42 String.fromCharCode(42) // *
這里有張圖說的很明白
圖片來源
如果出現 mb_substr 這類操作的時候, 會出現字數判斷錯誤的問題, 這個有時候很難排查, 因為在 win 上,使用命令行或者 linux 上用cat命令是看不到字符間是有 的, 如下:
這玩意兒出現的場景就是: 在前端輸入框中輸入幾個字, 然后復制粘貼. 這樣盡管看起來之間沒有空格, 但是其中還是插入了這個字符
這玩意就叫 zero-width space 零寬空格, 處理的辦法也很簡單, 前端傳值之前給過濾一下, 比如 https://stackoverflow.com/que... 或 https://codeday.me/bug/201711...
后端 php 處理的話和這個不一樣, 使用 utf-8 的處理方式, 可以參考這篇文章 特殊字符<200b><200c><200d>的刪除辦法與原理
替換這種編碼
$value = str_replace("xe2x80x8b", "", $value); $value = str_replace("xe2x80x8c", "", $value); $value = str_replace("xe2x80x8d", "", $value);
編碼對照如下:
我的博客
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/29240.html
摘要:我們今天也來做一個萬能遙控器設計模式適配器模式將一個類的接口轉換成客戶希望的另外一個接口。今天要介紹的仍然是創建型設計模式的一種建造者模式。設計模式的理論知識固然重要,但 計算機程序的思維邏輯 (54) - 剖析 Collections - 設計模式 上節我們提到,類 Collections 中大概有兩類功能,第一類是對容器接口對象進行操作,第二類是返回一個容器接口對象,上節我們介紹了...
摘要:雖然有了十全的計劃,但如何高效率去記住上面那么多東西是一個大問題,看看我是怎么做的。 前言 前一篇文章講述了我在三月份毫無準備就去面試的后果,一開始心態真的爆炸,但是又不服氣,一想到每次回來后家人朋友問我面試結果的期待臉,越覺得必須付出的行動來證明自己了。 面經傳送門:一個1年工作經驗的PHP程序員是如何被面試官虐的? 下面是我花費兩個星期做的準備,主要分三部分: 有計劃——計劃好...
摘要:很多面試,很多人員能力要求都有高級工程師的字眼,如果您真心喜歡,并且您剛起步,那么我簡單說說一個高級工程師所應該具備的,希望給初級或已經達到中級的工程師一些幫助。程序的執行順序問題。 初次接觸PHP,就為其美所折服,于是一發不可收拾。 很多面試,很多人員能力要求都有PHP高級工程師的字眼,如果您真心喜歡PHP,并且您剛起步,那么我簡單說說一個PHP高級工程師所應該具備的,希望給初級或已...
閱讀 2508·2023-04-25 17:37
閱讀 1189·2021-11-24 10:29
閱讀 3696·2021-09-09 11:57
閱讀 692·2021-08-10 09:41
閱讀 2243·2019-08-30 15:55
閱讀 2811·2019-08-30 15:54
閱讀 1942·2019-08-30 15:53
閱讀 895·2019-08-30 15:43