用表單傳送中文字到 PHP 網頁中,再將中文字存入MySQL中。
使用phpMyAdmin去看MySQL資料表單,發現文字都無法正確的傳入
中文字的內容都是空的。若改用英文字都沒有這些問題。
初學這些東西,HTML的表單不熟,PHP也不熟,MySQL也不熟,所以這問題還真麻煩。
只好一步一步Debug.
英文字可以傳送,表示整個傳送的機制是對的,但就中文字不行,表示傳中文字時的編碼
可能有問題。這個時候就會想問幾個問題。
1. 表單是怎麼傳送文字? 機制是如何?編碼方式?
2. Php在Server端怎麼收到這些文字? 是否有正確收到
3. Php怎麼把文字寫入資料庫? database 的編碼方式?
把問題列出來後,就開始Google 找答案了:
1. 表單是怎麼傳送文字?
表單傳送有分 Post 和 Get, 可以用Get method來實驗,因為
Get 方式會將傳送資料顯示網址上,如此我們可知道表單傳了時麼東西出去。
由實驗得知,若表單文字是英文就直接送出,若是中文字會經過編碼再送出。
寫個簡單的表單如下:
<form action="test.php" method="get" >
請輸入:
<input type="text" name="foodName" >
<input type="text" name="cost" >
<input type="submit" value ="送出" >
</form>
分別送出 "English" 和 "中文" ,送出後得到網址分別如下:
http://127.0.0.1/test2.php?foodName=English&cost=222
http://127.0.0.1/test2.php?foodName=%A4%A4%A4%E5&cost=222
發現上面 "中文" 被編碼成 %A4%A4%A4%E5
修改送出編碼方式如下: (改成utf-8)
<form action="test.php" method="get" accept-charset="utf-8">
請輸入:
<input type="text" name="foodName" >
<input type="text" name="cost" >
<input type="submit" value ="送出" >
</form>
http://127.0.0.1/test.php?foodName=%E4%B8%AD%E6%96%87&cost=222
發現上面 "中文" 被編碼成 %E4%B8%AD%E6%96%87
有明確指定編碼方式,永遠都是比較好的做法。
2. PHP 收到甚麼?
PHP 的資料型態是不需要很嚴謹的定義的,不像C語言有很嚴謹的資料型別定義。
當然這樣各種作法有好有壞拉(本人比較喜歡定義)。上面表單傳過來的東西 PHP
到底會收到甚麼?
$food = $_REQUEST['foodName'];
$cost = $_REQUEST['cost'];
echo gettype($food) . "<br>"; // $food 讀取其資料型態
echo gettype($cost) . "<br>"; // $cost 讀取其資料型態
使用 gettype() 讀取$food 和 $cost資料型態,可知不管你傳文字還是數字,資料型態都會自動變成string.
由此可知,假設我只單純的把自echo出來,那echo出來的這個網頁所使用的編碼方式
就很重要了,那依舊是必須要能夠匹配的編碼方式才行囉!
<head>
<meta content="text/html; charset=utf-8" http-equiv="content-type">
<title></title>
</head>
所以如果送過來的是採用 UTF-8的編碼方式,這邊網頁就必須採用UTF-8的方式(如上例)
依此類推,big5...都一樣
3. Php怎麼把文字寫入資料庫? database 的編碼方式?
$food = $_REQUEST['foodName'];
$cost = $_REQUEST['cost'];
$sqlCmd = "insert into menu
( `index`, `foodName`, `cost` )
values
( NULL, '{$food} ', {$cost} )";
上面這個PHP code 是把資料寫入資料庫中的語法,基本上沒有甚麼編碼方式的問題
只要網頁的編碼方式正確(第二點)就沒問題了。
但是資料庫的編碼方式就必須注意了。下圖採用phpMyAdmin連線進去我的編碼方式
也是採用utf8
以上這樣應該就都OK了。
我一開始會出現問題是因為
1. 我的表單傳送時並沒有指定編碼方式 (變成default)
2. 我的接收php網頁的編碼方式適用big5
所以中文字就一直有問題。但經過以上的方西調整後,目前都沒問題了。