顯示具有 PHP 標籤的文章。 顯示所有文章
顯示具有 PHP 標籤的文章。 顯示所有文章

2012年3月20日 星期二

如何使用PHP將資料直接輸出到印表機


利用PHP寫一支小程式,將文件直接輸出到印表機。本來以為這是個簡單的事情,將網路上查到的PHP印表機函數,直接套用即可。

我錯了,執行測試程式時,會出現未定義的錯誤訊息。查官方網站,才知道這個函式屬於外掛的,放在PECL這個延伸函式庫。

以下介紹如何使用PHP輸出到印表機:

1.到以下網站下載PECL for Windows元件。

2. 下載並解壓縮後,裡面有一堆dll元件,而我們只需要php_printer.dll這個檔案。我是用AppServ,因此將該元件複製到 “C:\AppServ\php5\ext”路徑底下。


3. 接下來開啟php.ini檔,加入extension=php_printer.dll




4. 重啟Apache

5. 利用”phpinfo();”查詢Printer是否已啟用。


6. 寫一支測試程式,看看列印是否正常!!
$printer = "\\\\主機\\分享的印表機名稱";
$ph=printer_open($printer); //連線到印表機
$content="測試PHP列印到印表機!!";
printer_write($ph, $content); //輸出資料到印表機
printer_close($ph); //關閉印表機連線

7. 官方印表機函式手冊

2011年6月17日 星期五

AJAX基礎運作說明

我在找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方式

PHP提供兩種方式,透過ODBC連到MS-SQL:


一、第一種稱為DSN Connect :

1. 首先到ODBC管理員中,選擇系統資料來源名稱,點選新增。


2. SQL Server為範例,點選SQL Server後按完成。

3. 建立名稱,並選擇伺服器。若在SQL Server在本機,選擇Local

4.輸入登入SQL Server所需要的帳號、密碼。

5.選擇資料庫,這裡以Northwind為範例。

6.這裡皆使用預設值,按完成。

7.最後按測試資料來源,測試是否正確連線。
 
 
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資料遇到的問題(二)

PHP撈MS-SQL資料時,只要資料大一點就會出現錯誤訊息。直接到MS-SQL上查,發現在本機執行就會出現逾時過期的錯誤。本機都會Timeout了,難怪遠端查詢會錯誤。


測了好久,改了幾個在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

很久以前寫了一篇APPServ安裝PEAR的文章,那時是以AppServ 2.4.4a為例,現在已經過時了。
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資料很多年前就嘗試過了,那時候是將PHP與MS-SQL都裝在同一台Server上,利用ODBC去撈的。

上個禮拜有個小任務,同樣也是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
3. 解決上述問題後,畫面總算出現東西了,卻秀出無法連線到Server的訊息。找了好久,最後解決方式是將連線程式內,原本連線到MS-SQL是用IP的,改為主機名稱就解決了。

這個問題比較奇怪,照理來講,用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函式

PHP雖然內建Mail函式,但是只能傳文字檔。
以下這個網站,它所提供的Mail函式,除了一般的Mail功能,還能傳附加檔案。真的不錯用。

http://lwest.free.fr/doc/php/lib/index.php3?page=mail&lang=en

2010年11月23日 星期二

PHP撈AD資料

其實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如何顯示中文

JPGraph(以下簡稱JP)預設只能顯示英文, 若輸入中文,會如下圖所示呈現亂碼。



若要正確顯示中文,需要調整一些東東,才能做得到。

1.首先開啟jpg-config.inc.php,找到以下參數,告訴JP你的中文字型位置。
我的是Windows base,因此字型位置指向”C:/Windows/Fonts/”。




2.接下來開啟jpgraph_ttf.inc.php,告訴JP要用哪一種中文字體。在此案例中我使用”mingliu.ttc(細明體)”。




3.最後在程式碼中,需加入紅框處的制式程式碼,才能顯示中文。




中文已能正確顯示了。

2010年10月18日 星期一

PHP圖表繪製 -- JPGraph

這幾天佛心來也,突然想研究PHP如何顯示圖表。請股溝大師推薦,結果找到JPGraph(以下簡稱JP)這套程式。之後研究使用方法,果然一試成主顧。

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檔,然後再匯到MySQL。
更好的方式是把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套件錯誤訊息處理

在PHP5安裝PEAR套件時,會出現以下錯誤訊息:

到php.ini,將extension=php_exif.dll移到extension=php_mbstring.dll後面。再重新安裝一次PEAR,就不會出現錯誤訊息了。

2009年8月17日 星期一

PEAR[3]--Spreadsheet_Excel_Writer安裝

PEAR有一個非常好用的東西,就是將資料匯出到Excel。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安裝

***安裝步驟***

1、到http://pear.php.net/package/OLE/download 下载OLE(目前版本為OLE-1.0.0RC1.tar),並放到C:\AppServ\php\PEAR下。

2、進入DOS模式後,並到C:\AppServ\php\PEAR\下,輸入
pear install OLE-1.0.0RC1.tar。

3、如果成功將會出現
install ok: channel://pear.php.net/OLE-1.0.0RC1

PEAR[1]--PEAR套件安裝

在Windows上,裝完AppServ後(在此以appserv-win32-2.4.4a為例),預設是沒有安裝PEAR套件。PEAR套件本身是有相依性的,請按照以下步驟安裝PEAR套件。安裝時,會到PEAR網站下載必要元件,因此Internet要通才能安裝。

***安裝步驟***

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繼續。



7、最後會出現一段訊息,提醒你到D:\AppServ\php\PEAR\PEAR_ENV.reg ,點擊這個檔案,將目前資料登錄到機碼。
按任何鍵後,DOS視窗會自動關閉。執行PEAR_ENV.reg,完成PEAR安裝。


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



4、將設定值存檔後,關閉瀏覽器。重新開啟瀏覽器,進入phpMaAdmin,將會發現這個訊息已經不見了。