2012年3月20日 星期二
如何使用PHP將資料直接輸出到印表機
2011年6月17日 星期五
AJAX基礎運作說明
傳統的網頁請求模式,是將整個頁面傳送回Server。而Server整理用戶端的回應後,將整個頁面再全部傳送回給用戶端。
AJAX請求模式,用戶端只有要請求的資料,透過XHR(XMLHttpRequest)這個物件傳送到Server,不再是整個頁面。
Server也不再將整個頁面做回應,它只將要回應的資料,透過XHR送回用戶端。 而XHR擺在頁面上的甚麼地方,就只有那個地方會產生回應資料。大幅減少資料頁面回應的更新。
如果上面還看不懂,舉例來說:
你的電腦風扇壞了,因為你不懂如何修電腦,只好將整台電腦搬到維修公司更換風扇,然後再整台搬回來。
後來,你請了一個助手,他懂如何修電腦。風扇再次壞掉,他只要到維修公司去買了一個風扇回來更換,你的電腦就修好了。XHR就是這位助手。
目前各大瀏覽器及伺服器都支援XHR物件,若XHR執行有問題,先檢查瀏覽器或伺服器是否太舊,導致無法執行。
XHR基本使用方式:
1. 產生一個XHR物件
2. 將用戶端請求,利用XHR物件傳送到Server
3. Server收到後產生回應,將結果回傳。
以下的範例是,當你按下一個按鈕後,XHR會呼叫abc.txt文字檔案,並將內容產生於螢幕上:
============
<html>
<head>
<title>XMLHttpRequest Test</title>
<meta http-equiv="Content-Language" content="zh-tw">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<script type="text/javascript">
//一、這是一個產生XHR物件標準的函式,檢查瀏覽器是否
//支援ActiveX的XHR物件,若不支援,則使用JavaScript原
//生XHR物件。
var xmlHttp;
function createXMLHttpRequest() {
if (window.ActiveXObject) {
xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
}
else if (window.XMLHttpRequest) {
xmlHttp = new XMLHttpRequest();
}
}
//二、這個函式是當用戶端按下按鈕時,XHR會開啟abc.txt檔案
function startRequest()
{
createXMLHttpRequest();
xmlHttp.onreadystatechange = handleStateChange;
xmlHttp.open("GET", "abc.txt", true);
xmlHttp.send(null);
}
//三、XHR會在Server回應readyState == 4(完成),status = 200
//(HTTP對應OK)後,因為是文字檔,以”responseText”方法,將
//資料產生在名為”disp”的ID上。
function handleStateChange()
{
if(xmlHttp.readyState == 4) {
if(xmlHttp.status == 200) {
document.getElementById("disp").innerHTML=xmlHttp.responseText;
}
}
}
</script>
</head>
<body>
<form action="#">
<input type="button" value="click me" onClick="startRequest();" />
<div id="disp"></div>
</form>
</body>
</html>
===========
將範例搞清楚後,再查看網路上XHR所提供的其他方法及屬性,應該就比較清楚如何應用了。
我還在努力了解AJAX中,一起加油吧。
2011年5月12日 星期四
PHP透過ODBC連線到MS-SQL方式
一、第一種稱為DSN Connect :
1. 首先到ODBC管理員中,選擇系統資料來源名稱,點選新增。
5.選擇資料庫,這裡以Northwind為範例。
8. 上述設定完畢後,再寫一個連線程式,供PHP連線呼叫使用。
$dsn = "ABC";
$user = "sa" ;
$password = "123456" ;
$conn = odbc_connect($dsn,$user,$password);
二、第二種稱為DSN-Less Connect :
不用設定ODBC管理員,直接將DSN寫在程式內,提供PHP呼叫使用。
$server="(local)"; //備註:local須加括號,如果用主機名稱就不用加括號
$database="Northwind";
$user="sa";
$password="123456";
$conn = odbc_connect("Driver={SQL Server};Server=$server;Database=$database;", $user, $password);
瞭解了嗎? 一個透過ODBC UI介面,設定DSN。一個則是手動建立DSN。
這兩種方式皆可,不影響效能。實務上會建議採用DSN-Less Connect方式,可以省去ODBC UI的設定,且參數值可直接在程式上設定,例如Server或Database。
PHP撈MS-SQL資料遇到的問題(二)
測了好久,改了幾個在SQL Manager上參數都沒用,最後決定改用ODBC方式連線到MS-SQL。 測試結果比之前好,查詢速度快很多,而且查大量資料,不再顯示錯誤訊息。
先前使用Windows Extension的連線方式,也就是PHP透過特定的DLL檔跟MS-SQL溝通。方法簡單,但是可用函式太少,而且拿來查大量資料容易出問題。(也有可能我沒調好)
而ODBC發展早、技術成熟,而且PHP對ODBC支援的函數較多。以後如果有需要用PHP撈MS-SQL資料的人,建議還是使用ODBC方式較佳。
2011年5月10日 星期二
APPServ 2.5.10 安裝 PEAR
http://mike7120.blogspot.com/2009/08/pear.html
目前我都使用AppServ 2.5.10,在PEAR的安裝上,畫面及程序都更簡單。
如果有需要裝PEAR的人,可參考以下小惡魔(AppleBOY)所寫的這篇網路文章。
http://blog.wu-boy.com/2009/03/windows-appserv-%E5%AE%89%E8%A3%9D-pear-%E5%A5%97%E4%BB%B6/
安裝完PEAR之後,環境變數路徑需要手動變更。
到php.ini,在include_path輸入PEAR執行的路徑,存檔後重啟Apache才會生效。
PHP撈MS-SQL資料遇到的問題
上個禮拜有個小任務,同樣也是PHP撈MS-SQL資料。這個案子只是測試版,短期又不會上線,等於是沒功勞的案件。不過呢,我喜歡搞這種異質平台的整合方案,就當成在練功吧。
這次測試過程遇到不少問題,紀錄下來,做為日後參考:
1. MS-SQL記得要設定一組使用者帳號,提供給PHP連線函式使用。並將這組帳號,賦予給要存取的Table,否則會出現權限不足,無法存取的訊息。
2. 在本機Win7上測試PHP連線到MS-SQL都正常,換到Windows 2003卻出現畫面空白。到網路查解決方式,將以下兩個檔案複製到Windows\System32底下,並將Apache services重啟即可。
- C:\AppServ\php5\ext\php_mssql.dll
- C:\AppServ\php5\ntwdblib.dll
這個問題比較奇怪,照理來講,用IP解析會比用名稱解析來的直接及快速。不管了,先可以用再說。這問題以後有想到再來研究。
4. 當PHP查詢MSSQL資料時(尤其是大量資料),常會出現”Fatal error: Maximum execution time….”的錯誤訊息。到php.ini將max_execution_time值調高(預設30秒),就不會因為查詢時間逾時,而出現錯誤訊息。
(PS.PHP查MySQL速度很快,就算資料大也是很快就回應。但是改成MS-SQL就很慢,不知道是誰的錯?)
5. 當PHP查MS-SQL遇到大量資料時,會將記憶體給塞滿,然後出現這段錯誤訊息:”Fatal error: Allowed memory size of 25430681 bytes exhausted (tried to allocate 2054 bytes)”。
到php.ini修改memory_limit值,可以解決這個問題。但是我從預設24M一路上修到800M,發現只要遇到那種大量資料查詢,就會出現記憶體不足的情形。 最後我只好使用筆數限制來解決這個問題。
(PS.我不清楚PHP撈MS-SQL資料,到底去抓甚麼東西,竟然可以將記憶體塞爆。當然,這也有可能是我技術太差,或有甚麼東西沒調整好所引起。上述情形在MySQL還沒遇到過,看來PHP跟MS-SQL需要一段磨合期。)
最後,PHP撈MS-SQL語法可參考此網站:
http://cch8.blogspot.com/2010/11/phpmssql.html
2011年2月18日 星期五
PHP Mail函式
以下這個網站,它所提供的Mail函式,除了一般的Mail功能,還能傳附加檔案。真的不錯用。
http://lwest.free.fr/doc/php/lib/index.php3?page=mail&lang=en
2010年11月23日 星期二
PHP撈AD資料
最近想到要做分機表,從AD上既有的通訊錄去撈出來做是最快的,因此花了兩天的時間,完成此次作品。
在寫此程式前,請先到php.ini檔,打開php_ldap.dll的功能(預設是關閉的),否則執行時會出現未定義函數的錯誤訊息。(打開後記得要重啟apache服務,功能才會生效)
在範例檔中,前面的連線程式屬於制式化的寫法,沒有什麼問題。花我最多時間的就是AD欄位名稱的查詢,以及資料的撈出。
PHP撈AD有兩種模式(應該是),我選擇類似資料庫的模式,也就是將資料一筆一筆撈出(ldap_first_entry / ldap_next_entry),然後將每一筆資料的欄位屬性解析出來(ldap_get_values)。
這次收穫蠻多的,除了使用PHP撈AD資料外,還學會如何查AD的欄位名稱。參考這篇如何查詢AD欄位屬性。
//連到AD Server的帳號密碼
$account="帳號";
$password="密碼";
$server="Server IP";
//連線到AD server
$conn=ldap_connect($server) or die("Could not connect to LDAP server");
//以下兩行務必加上,否則AD無法在不指定OU下,作搜尋的動作
ldap_set_option($ldapconn, LDAP_OPT_PROTOCOL_VERSION, 3);
ldap_set_option($ldapconn, LDAP_OPT_REFERRALS, 0);
//連線bind帳號密碼
$ldap_bd=ldap_bind($conn,$account,$password);
//檢查帳號密碼是否正確
if ($ldap_bd) {
echo "Auth passed!";
} else {
echo "Auth failed!";
}
//設定AD搜尋範圍
$dn="ou=Users,dc=abc,dc=com,dc=tw";//查詢的路徑
$filter = "CN=欲查詢的姓名";//過濾物件
$result = ldap_search($conn,$dn,$filter);//查詢LDAP資訊
//計算找到幾筆資料
$count=ldap_count_entries($conn,$result);
echo $count;
//取得 ldap_search搜尋結果第一筆ID資料
$entry = ldap_first_entry($conn, $result);
if ($entry)
{
$attr = array("description","displayName","title","mail","telephoneNumber","mobile","ipPhone","department");
do
{
foreach ($attr as $attribute)
{
$val=ldap_get_values($conn, $entry, $attribute);
echo "$attribute: $val[0]
";
}
echo "<hr>";
}
while ($entry = ldap_next_entry($conn, $entry));
}
//關閉ldap連線
ldap_close($conn);
最後感謝一整天大大,因為參考他的大作,才能將原始程式碼刊出,不再使用圖片方式張貼。
http://272586.blogspot.com/2009/01/blogspot.html
2010年10月19日 星期二
JPGraph如何顯示中文
2010年10月18日 星期一
PHP圖表繪製 -- JPGraph
1.首先到JPGraph網站下載這支程式 http://jpgraph.net/download/
2.解壓縮之後,會看到dosc及src兩個資料夾。
--docs是說明檔,裡面有很詳盡的各種範例。
--Src就是我們要的JP函式檔。把它放到Apache所存取的目錄底下即可。例如我是使用Windows Base,Apache是存取我的”C:\appserv\www\” 這個目錄,因此我把”src”放到這個路徑底下。並且為了方便識別,將”src”改名為”jpgraph”。

3.以下這個程式,是JP所提供的線條圖範例,你可以在docs找到:
4.執行之後,就可以得到以下這個漂亮圖形。
5.結語:JP功能很強大,很多參數我都還在實驗中(雖然不是很懂..哈)。但基本上只要善用它所提供的範例,不管是長條圖、大餅圖、線圖…,都能讓你輕易建立快速又漂亮的圖形。
2010年8月17日 星期二
在PHP中將Excel檔轉出
更好的方式是把Excel資料直接上傳到MySQL,省掉轉CSV的動作。這個想法已經很久了,只是一直沒有去做。剛好最近有個小問題,需要用到這個功能,於是求助股溝大師找尋相關資料。並經過半天的測試,終於搞定。
這支程式稱為phpExcelReader,它可以讀取並上傳Excel的工作表。不過我在其他文章中有看到,這支程式只適用於Office 2003,讀取Office 2007時會出現錯誤。因為我手上沒有Office 2007,所以無法測試。直接進入主題:
1.首先到以下網址下載這支程式(壓縮檔)
http://sourceforge.net/projects/phpexcelreader/
2.將phpExcelReader這個檔案解壓縮後,把這個目錄放到php可執行的根目錄下。
3.測試執行時這支程式時,會出現錯誤,因此需要修改phpExcelReader\Excel\ reader.php這支程式。將 require_once 'Spreadsheet/Excel/Reader/OLERead.php'è改為 require_once 'oleread.inc';

4.接下來可以開始實測了。phpExcelReader有附一個範例檔(example.php),我加入說明如下:
5.之後你可以將輸出的資料,做任何處理。例如塞到MySQL。
這支程式真的很方便,解決我的問題,推薦給有需要的人使用。
2010年8月11日 星期三
PHP5 安裝PEAR套件錯誤訊息處理
2009年8月17日 星期一
PEAR[3]--Spreadsheet_Excel_Writer安裝
在PEAR的世界中,元件有其相依性。因此要裝Spreadsheet_Excel_Writer,順序如下:
PEAR-->PEAR OLE-->Spreadsheet_Excel_Writer
***安裝步驟***
1、到http://pear.php.net/package/Spreadsheet_Excel_Writer/download下載Spreadsheet_Excel_Writer-0.9.1.tgz,並放到C:\AppServ\php\PEAR下。
2、進入DOS模式後,並到C:\AppServ\php\PEAR下,輸入
pear install Spreadsheet_Excel_Writer-0.9.1.tgz
3、如果成功將會出現
install ok: channel://pear.php.net/Spreadsheet_Excel_Writer-0.9.1
PEAR[2]--PEAR OLE安裝
PEAR[1]--PEAR套件安裝
***安裝步驟***
1、請到http://pear.php.net/go-pear,將此頁面程式碼存成go-pear.php。
2、將go-pear.php檔,放到C:\AppServ\php\PEAR目錄底下。
3、在C:\AppServ\php目錄下,執行go-pear.bat,之後會跳出DOS畫面。
4、選擇”8”,指定php.exe的path為c:\appserv\php\,之後按Enter確定。再按一次Enter繼續往下。
5、再問你一次是否要安裝?輸入Y,按Enter後,開始安裝並下載所需元件。

6、接下來問你是否要調整php.ini,輸入”Y”,按Enter繼續。
2009年8月13日 星期四
[MySQL] 解決 “必須設定 $cfg['PmaAbsoluteUri'] 在設定檔內!”的問題
使用AppServ安裝完之後,打開phpMaAdmin畫面,會發現“必須設定 $cfg['PmaAbsoluteUri'] 在設定檔內!”的紅色錯誤訊息。

$cfg['PmaAbsoluteUri']這個功能,是記錄 phpMyadmin 的執行路徑,一般預設值為空白,代表程式會自動偵測環境來執行。
執行路徑的寫法如下:http://網域名稱/phpMyadmin的目錄/
例如你是在自己機器上執行MySQL,而且phpMyadmin 的路徑在根目錄下,那麼這個設定值為:
$cfg['PmaAbsoluteUri'] = 'http://localhost/phpMyAdmin/';
假設你註冊一個網域名稱為boyandgirl.com.tw,並要在這台主機上執行phpMyadmin,路徑則為:
$cfg['PmaAbsoluteUri'] = 'http:// boyandgirl.com.tw/phpMyAdmin/';
二、解決步驟
1、使用AppServ安裝,通常這個設定檔放在C:\AppServ\www\phpMyAdmin\config.inc.php
2、在第39行,找到$cfg['PmaAbsoluteUri'],就可以依照上述去設定。

3、剛剛有提到,預設值是空白,程式會自動偵測執行。如果不確定這個程式,以後執行的路徑,只想要讓它繼續運作,不想看到這行訊息,可以更改以下的設定值:
$cfg['PmaAbsoluteUri_DisableWarning'] = FALSE更改為TRUE


























