2013年3月3日 星期日

HTML表單傳送中文字到 PHP + MySQL 問題

最近在學習PHP + MySQL 資料庫碰到以下問題:

用表單傳送中文字到 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

所以中文字就一直有問題。但經過以上的方西調整後,目前都沒問題了。



2013年3月2日 星期六

Windows 7 遠端桌面關機 - 關閉遠端電腦

Windows 7 使用遠端桌面登入到遠端電腦,
使用完畢想要順手把遠端電腦也給關機怎麼做呢?

Solution:

Ctrl + ALT + END ( = 對遠端電腦下達 Ctrl+alt+del  )
此時螢幕右下角有個電源鈕,按下後遠端電腦就會進行關機動作,
此時遠端連線也會中斷 (廢話,都關機了...)

Solution 2:  (這個方法比較簡單)
Alt + F4
此時跳出選單,選擇關機