標籤:javascript 資料庫 程式語言 單引號 雙引號
php, html, javascript, mysql 之間的特殊字元處理
特殊字元指在程式中有具有特殊的控制意義的字元,一般來講各個程式語言所使用
的特殊字元大部分都來源於傳統的 C 語言,加上自身的擴充,便較為完整的滿足了編程
需求。
程式自身的轉義處理能夠解決自身的處理需求,問題基本上都集中在程式語言之間
的不同轉移策略所帶來的匹配差異上。幾乎對所有語言來說單引號(‘)和雙引號(")
都會帶來一些麻煩。
php 中對字元的轉義採用反斜線(\),再與資料庫進行互動時採用的函數有:
1 addslashes($str);
這個函數是重建一個轉義後的字串,使用時要注意。
如 $str = ‘""""""""‘;//這個解析沒有問題,但是輸出時就會出現問題;
1 htmlspecialchars($str);
這個是在輸出時處理對 html 具有特殊意義的字元;
1 striptslashes($str);
這個是在輸出時去掉轉義用的反斜線(\)
Javascript 中則使用反斜線(\)對特殊字元轉義;
查詢特殊字元無法使用(#, ?, =, &)的原因是因為該類特殊字元屬於 html 語言 url
參數傳遞(Get 方式)時用來進行參數拼接的,直接使用會導致參數傳遞紊亂,結局方法是:
前台字串參數傳遞使用 javascript 的 urlencode 內建函數進行包裹,將字串參數中的
特殊字元轉為相應的 unicode 編碼,php 取參時無需進行處理,能夠直接顯示該 unicode
所代表的特殊字元。
Php 與 Mysql 中需要特別注意對於反斜線(\)的轉義處理。反斜線是比較通用的轉義
符號,要匹配字串中的反斜線字元(‘\‘),原則上來說只需要使用 2 個反斜線(\\)
就可以了,但是 php 與 mysql 中在進行反斜線匹配時卻需要 3 或 4 個反斜線(\\\\)
來匹配 1 個字串中的反斜線(\)。如為了將字串中的 1 個反斜線替換為 4 個反斜
杠(\\\\)以使 sql 語句能夠匹配資料庫中的具有 1 個反斜線(\) 的欄位的記錄,需要
使用以下的轉換:
= ("/\\\\/", "\\\\\\\\\\\\\\\\", ); = ("/‘/", "‘‘", ); = ("/_/", "‘_", ); = ("/%/", "‘%", );
這樣資料庫中的匹配才是合理的。使用之後,為了將 $str 回顯,要做相應的逆向處理:
= ("/\\\\\\\\\\\\\\\\/", "\\\\", ); = ("/‘‘/", "‘", ); = ("/‘_/", "_", ); = ("/‘%/", "%", ); = ();
這樣便滿足了特殊字元的查詢處理需求。
sql 中的特殊字元有底線(_), 百分比符號(%),和單引號(‘);
1) php (\) 轉義符問題
sql 中有特殊含義:表示換行
需要轉為 \\\ (3個) 進行匹配;
寫成三個‘\‘的原因是反斜線符號會被文法剖析器剝離一次,在進行模式比對時,
又會被剝離一次,最後會剩下一個反斜線符號接受匹配
如:
資料庫中有資料如下:
1 "*_.%‘"[email protected]
2 "*_.%‘"[email protected]\‘
3 "*_.%‘"[email protected]\\
4 "*_.%‘"[email protected]\\\
5 "*_.%‘"[email protected]\\\\
1 搜尋 "*_.%‘"[email protected] 會匹配 "*_.%‘"[email protected];
2 搜尋 "*_.\%‘"[email protected] 會匹配 "*_.%‘"[email protected];
1 搜尋 "*_.%‘"[email protected]\ sql 會報語法錯誤
2 搜尋 "*_.\%‘"[email protected]\ sql 會報語法錯誤
1 搜尋 "*_.%‘"[email protected]\\ 匹配 0 行
2 搜尋 "*_.\%‘"[email protected]\\ 匹配 0 行
1 搜尋 "*_.%‘"[email protected]\\\% 匹配結果如下:
2 "*_.%‘"[email protected]\‘
3 "*_.%‘"[email protected]\\
4 "*_.%‘"[email protected]\\\
5 "*_.%‘"[email protected]\\\\
1 搜尋 "*_.%‘"[email protected]\\\\% 匹配結果如下:
2 "*_.%‘"[email protected]\‘
3 "*_.%‘"[email protected]\\
4 "*_.%‘"[email protected]\\\
5 "*_.%‘"[email protected]\\\\
1 搜尋 "*_.\%‘"[email protected]\\\\\ 匹配 0 行
2 搜尋 "*_.\%‘"[email protected]\\\\\\ 匹配 0 行
3 搜尋 "*_.\%‘"[email protected]\\\\\\\ 匹配 1 行
4 搜尋 "*_.\%‘"[email protected]\\\\\\\\ 匹配 1 行
總結:
反斜線做查詢時要變 1 個為 4 個,這樣總能得到正確的結果。
另:
1 $senameEnter = preg_replace("/\\\/", "\\\\\\\\\\\\\\\\", $senameEnter);
這句代碼將 $senameEnter 中的一個反斜線(\)替換為四個反斜線(\\\\),以匹配
sql 中查詢一個反斜線(\)需要用四個反斜線(\\\\)去匹配。
為了統一替換的數值可以設為使用四個反斜線(\\\\)替換一個,如下面代碼:
1 $senameEnter = preg_replace("/\\\\/", "\\\\\\\\\\\\\\\\", $senameEnter);
php Regex中反斜線(\)是用來進行特殊字元轉義的,匹配反斜線原則上只要
使用兩個反斜線(\\),但是實際使用時卻需要三個反斜線(\\\)進行匹配。php 字元
串中需要由四個反斜線(\\\\)來表示一個反斜線的替代。詳細的原因比較複雜,需要
根據程式設計的內部機制進行解釋。
2) & 符號問題
& 符號的問題原因是:在url傳遞參數時這個符號代表了傳遞字元的串連符。
同樣存在問題的還有等號(=)和問號(?)。
解決方案:
js 拼湊URL時先對這三個符號進行處理,傳遞之後再進行逆向處理。
如果編碼是將其編碼為相應的unicode碼,後台無需在特別處理。
1 url = url.replace(/\?/g,"%3F").replace(/&/g,"%26").replace(/=/g,"%3D");
使用 jquery 取出來的字串如果包含 ‘&‘ 符號,javascript 會將其妝化為相應的等式實體 &
回顯需要進行特別處理(無內建函數):
1 sename = $(obj).html().replace(/&/g, ‘&‘);
php, html, javascript, mysql 之間的特殊字元處理