2007年8月25日

【PHP】解決PHP+Mysql5.x亂碼問題

相信這是初學者最常遇到的問題吧!!

往往在自己電腦裡執行都正常(假設使用者電腦的Mysql版本是4.x或以下版本)

傳上server後卻都是亂碼(假設server上的Mysql版本是5.x)

我第一次遇上時也是摸不著頭緒

還是我的老朋友google幫了我

有個觀念一定要先搞清楚

亂碼問題一定跟編碼有關

用什麼編碼存進資料庫,就用什麼編碼秀出來

好了

有了這觀念

問題就好解決多了



在使用者層面來說

可以先檢查網頁的charset

如果網頁的charset是utf-8

那麼post的資料就都是utf-8的編碼

如果不想更改charset又想使post出去的資料是自己想要的編碼

可以使用iconv來轉換

ex:iconv('原始編碼','欲轉換的編碼','欲轉換的字串')



再來伺服器層面

開啟phpmyadmin檢查Mysql系統變數

如果您並無管理者權限

無法更動Mysql的系統變數值

那麼php在連結mysql時可加入以下語法

mysql_query("SET NAMES 'big5'");

mysql_query("SET CHARACTER SET big5");

mysql_query("SET CHARACTER_SET_RESULTS=big5'");

big5可任意更換成您要的編碼語系

以確保抓出來或存進去的資料為你要的



關於這方面的觀念我搞了好久才稍微有個頭緒

如以上所說有誤

歡迎指正^^

【PHP】PHP圖形驗證

圖形驗證功能我想在許多地方都用的上

只要是需要防止機器人連續作業的時候都是必要的

在此作個簡單的解說吧

以下為最重要產生圖片的的image.php








<?php

 //啟動SESSION

session_start ();

//設定亂數種子

mt_srand(microtime());

//srand ((double)microtime()*1000000000);




//設定產生幾個字

$fontLenth = 4;

//產生數字+英文的亂數字

$num = "";

for( $i = 0; $i < $fontLenth; $i++ ){

$num .= dechex( rand( 1, 15 ) );

}


//設定SESSION給check.php做檢查

$_SESSION['img_num'] = $num;

//設定字體大小

$fontSize = 12;

//設定字型

$font = 'verdana.ttf';

//設定圖片寬

$picx = $fontSize * $fontLenth;

//設定圖片長

$picy = $fontSize*2;

//建立一個圖型

$im = imagecreate($picx, $picy);

//圖片背景為白色

$bg = imagecolorallocate($im, 255, 255, 255);

//文字顏色為藍色

$textcolor = imagecolorallocate($im, 0, 0, 255);

// 將文字放到圖片裡面

imagettftext($im, $fontSize,0, round($fontSize/3,0)+1, round($fontSize*4/3,0), $textcolor, $font, $num);

//輸出圖片

header("Content-type: image/png");

imagepng($im);

?>





可用<img src="image.php">產生驗證圖片

2007年8月20日

【PHP】PHP強制下載檔案(使用header)

這個暑假我寫了一個網路硬碟的小程式

雖然功能不盡完善

但還是盡我所能的加強

其中有個小部份是比較麻煩的

當遇到jpg,txt等會在IE等瀏覽器中直接開啟的檔案

點選下載後就不會出現詢問視窗

而是直接開啟

這樣就沒有達到網路硬碟的需求了!!

造訪了google大神之後

瞭解到可以使用header來達到此效果

但是中文網站中的範例

我一直都跑不出來

在灰心之餘

想起http://www.php.net

查到header的所有用法與範例

並把最關鍵的那篇找了出來,如下

http://au3.php.net/manual/tw/function.header.php#48538

我想此篇已經寫的非常詳細

不需要在此多作贅述了!!

祝各位馬到成功摟^^

【PHP】使用session_start()竟出現Error!!!!

今天我第一次遇到這個問題

真是驚訝萬分

兩台都是Win server 2003

一台可以正常跑

一台竟然會出現錯誤!!

錯誤訊息入下:

Cannot send session cache limiter - headers already sent

天阿....這是什麼情況!!

嚇得我馬上膜拜了google大神

喔~~好險第一篇就有答案了

答案請參考此篇

http://twpug.net/modules/smartfaq/faq.php?faqid=31



正如他所說

我的檔案是UTF-8的

所以把

;output_buffering = Off

前面分號拿掉

把Off改成4096之後就ok摟

真是太感謝那篇啦^^



===========================



2008/04/15

也可用Notepad++將檔案轉換成檔首無BOM的UTF-8

在無法修改php.ini的虛擬主機上只好用這招

【PHP】PHP留言有時差?

相信很多人都會遇到這個問題

使用php的取得時間函數

都會發現和台灣時間會差8個小時

說到此

相信很多人都知道該去改哪個檔了!

沒錯

就是修改php.ini

找到date.timezone

修改成

date.timezone = "Asia/Taipei"

就可以了!

非常簡單^^