Pages

Subscribe:

Ads 468x60px

Labels

2015年5月6日 星期三

[教學] 如何利用PHP製作並匯出PDF報表


首先可以到FPDF網站下載程式,當然FPDF的網站有教學也值得前往觀看http://www.fpdf.org/
或直接點選這邊下載fpdf16.zip
因為FPDF的網站是英文的,因此若要使用中文字,
則需要再下載chinese-unicode.rar
好啦,將上面的檔案下載之後解壓縮放入網站的資料夾就可以開始囉

test.php
  1. $hostname = "localhost";   //主機名稱
  2. $database = "test";              //資料庫名稱
  3. $username = "xxxx";            //資料庫使用者帳號
  4. $password = "****";            //資料庫使用者密碼

  5. $test = mysql_pconnect($hostname, $username, $password) or trigger_error(mysql_error(),E_USER_ERROR); 
  6. mysql_select_db("test",$test);
  7. mysql_query("set names 'utf8'");

  8. ?>
複製代碼



reportSQL.php

  1. mysql_select_db($database, $test);

  2. //index(首頁)
  3. $query_index = "SELECT * FROM `flow` WHERE date = CURDATE( ) AND page = 'index'";
  4. $index = mysql_query($query_index, $test) or die(mysql_error());
  5. $totalRows_index = mysql_num_rows($index);
  6. $query_index2 = "SELECT * FROM `flow` WHERE page = 'index'";
  7. $index2 = mysql_query($query_index2, $test) or die(mysql_error());
  8. $totalRows_index2 = mysql_num_rows($index2);

  9. //introduce(品牌介紹)
  10. $query_introduce = "SELECT * FROM `flow` WHERE date = CURDATE( ) AND page = 'introduce'";
  11. $introduce = mysql_query($query_introduce, $test) or die(mysql_error());
  12. $totalRows_introduce = mysql_num_rows($introduce);
  13. $query_introduce2 = "SELECT * FROM `flow` WHERE page = 'introduce'";
  14. $introduce2 = mysql_query($query_introduce2, $test) or die(mysql_error());
  15. $totalRows_introduce2 = mysql_num_rows($introduce2);

  16. //......................(其餘頁面寫法同上)

  17. ?>
複製代碼



report.php
  1. require('chinese-unicode.php');            //匯入剛剛下載的中文化的FPDF
  2. require_once('../Connections/test.php');   //匯入連結資料庫的語法
  3. require_once('../require/reportSQL.php');  //匯入報表的SQL語法
  4. $pdf=new PDF_Unicode();                    //建立PDF_Unicode
  5. $pdf->Open();                              //開啟
  6. $pdf->AddPage();                           //新的一頁
  7. $pdf->AddUniCNShwFont('uni');              //加入中文
  8. $pdf->SetFont('uni','',16);                //設定字型與字體大小
  9. //接著將資料放入一維陣列中
  10. $row0=array('瀏覽頁面','今日人數流量(人)','總人數流量(人)');
  11. $row1=array('首頁',$totalRows_index,$totalRows_index2);
  12. $row2=array('品牌介紹',$totalRows_introduce,$totalRows_introduce2);
  13. $row3=array('經營理念',$totalRows_manage,$totalRows_manage2);
  14. $row4=array('代理品牌',$totalRows_agent,$totalRows_agent2);
  15. $row5=array('產品',$totalRows_product,$totalRows_product2);
  16. $row6=array('公告發佈',$totalRows_publish,$totalRows_publish2);
  17. $row7=array('活動新訊',$totalRows_activities,$totalRows_activities2);
  18. $row8=array('素材介紹',$totalRows_material,$totalRows_material2);
  19. $row9=array('營業據點',$totalRows_place,$totalRows_place2);
  20. $row10=array('聯絡我們',$totalRows_contact,$totalRows_contact2);

  21. //今日人數流量統計
  22. $today=$totalRows_index+$totalRows_introduce+$totalRows_manage+$totalRows_agent+$totalRows_product+$totalRows_publish+$totalRows_activities+$totalRows_material+$totalRows_place+$totalRows_contact;
  23. $total=$totalRows_index2+$totalRows_introduce2+$totalRows_manage2+$totalRows_agent2+$totalRows_product2+$totalRows_publish2+$totalRows_activities2+$totalRows_material2+$totalRows_place2+$totalRows_contact2;
  24. $row11=array('統計',$today,$total);
  25. //再將資料放入2維陣列中
  26. $trow=array($row0,$row1,$row2,$row3,$row4,$row5,$row6,$row7,$row8,$row9,$row10,$row11);

  27. //設定表格的寬度
  28. $w=array(60,65,60);

  29. //迴圈
  30. for($j=0;$j
  31.   for($i=0;$i
  32.    $pdf->Cell($w[$i],7,$trow[$j][$i],1,0,'C');     //將資料放入表格內
  33.   } $pdf->Ln();                                    //下一列
  34. }
  35. $pdf->Output();                                   //輸出呈現
  36. ?>
複製代碼

接下來從瀏覽器觀看的結果如下圖:



真的是一個超方便的工具喔 ^ ^~~


Cell(float w [, float h [, string txt [, mixed border [, int ln [, string align [, boolean fill [, mixed link]]]]]]])

w
Cell width. If 0, the cell extends up to the right margin.
h
Cell height. Default value: 0.
txt
String to print. Default value: empty string.
border
Indicates if borders must be drawn around the cell. The value can be either a number:
0: no border
1: frame
or a string containing some or all of the following characters (in any order):
L: left
T: top
R: right
B: bottom
Default value: 0.
ln
Indicates where the current position should go after the call. Possible values are:
0: to the right
1: to the beginning of the next line
2: below
Putting 1 is equivalent to putting 0 and calling Ln() just after. Default value: 0.
align
Allows to center or align the text. Possible values are:
L or empty string: left align (default value)
C: center
R: right align
fill
Indicates if the cell background must be painted (true) or transparent (false). Default value: false.
link
URL or identifier returned by AddLink().
Example

  1. // Set font
  2. $pdf->SetFont('Arial','B',16);
  3. // Move to 8 cm to the right
  4. $pdf->Cell(80);
  5. // Centered text in a framed 20*10 mm cell and line break
  6. $pdf->Cell(20,10,'Title',1,1,'C');
複製代碼

[教學] PHP如何做到多筆資料的同步

一次叫出多筆資料,然後在同一個網頁中「逐一」「分別」做不同的處理,最後「同時」對資料庫 update or insert 。每一筆資料所收到的update 、insert數據並不相同! ============================ 
處理要點在於 _____ loop + array 
1.從資料庫叫出資料: 
db_query進行looping的同時,把相關欄位需要update的資料通通納入array. 
依照各人需求,這些資料可以用text、checkbox、或者hidden等各種型態呈現。當然,checkbox是最常見的type. 
例如,郵件處理網頁就大量使用checkbox. 
2.修改後的資料回存作業 
要點在count(array) + loop + db_update: 
根據count的結果進行迴旋,把db_update放進去,讓loop去完成所有資料的update回存作業。 
範例如下: 
================================================ 
####1.update.php: 以loop+array取出資料以便update........
  1.  
  2. #在這裡呼叫資料庫
  3. $query="select * from $userstable where................... 
  4. #進入loop逐一取出資料 
  5. $i=0; 
  6. while ($i < $num): 
  7. ............... 
  8. $id=mysql_result($result,$i,"id"); 
  9. .................. 
  10. ............................ 
  11. #以適當的type取出必須更新的欄位,構成array ..........
  12. echo "
  13. echo "
"; 
  • echo ""; 
  • $i++; 
  • endwhile; 
  • 複製代碼====================================================== 
    ####2.activate.php:資料更新後,透過loop+array完成回存...................
    1. ....... 
    2. for ($i = 0; $i < count($Cname); $i++) { 
    3. $name = $Cname[$i]; 
    4. $id= $Cid[$i]; 
    5. $query = "update $userstable set name='$name' where id='$id'";
    複製代碼


    原文出處:http://www.jb51.net/article/1939.htm

    【教學】 PHP多個核取方塊如何放到同一個欄位

    資料來源 飛肯設計學苑
    緣 起:

       先說廢話,我在織夢線上發現有很多大大都在問說如何利用多個核取方塊放到同一個欄位,老實說我對這功能並不感興趣,因為我覺得這樣做並不實用,所以我原本是不打算寫教學的,直到前幾天有位織夢線上的大大寫封MAIL給我,信的內容是他現在在做學校的畢業專題,遇到了多個核取方塊如何放到同一個欄位的問題,希望我能指導他,信的內容不但把他所遇到的問題寫的很詳細,且有提出他的想法(也就是他想到的結決方法)且有抓圖說明,讓我覺得他是真的有心想學習,而非只是為了要交作業而已,所以我才決定寫這一篇"多個核取方塊如何放到同一個欄位教學",希望能對有需要的大大有所幫助,好了,不廢話進入主題了。
    第1步:新增一個"delfile"資料庫。

    第2步:新增一個"checkbox"資料表。

    第3步:新增"id"及"checkbox"二個欄位,id為主鍵、型態為int、自動編號;checkbox為記錄興趣欄位,型態為varchar、長度為200。

    第4步:新增一張表單。

    第5步:新增八個核取方塊如下圖,核取方塊名稱用checkbox[](八個核取方塊名稱都要用用checkbox[]),表示我們要用陣列處理。

    第6步:核取的值輸入若使用者選取該核取方塊時,所要寫入資料庫的值。

    第7步:選取form標籤。

    第8步:伺服器行為 ---> 插入記錄。

    第9步:把checkbox欄和隨便一個FORM.checkbox[]配對,並把送出為改為'文字'(一定要記得改喔!)。

    第10步:插入後,請前往的部份選ok.php。

    第11步:把index.php切換至'程式碼'編輯模式。

    第12步:找到這一段 if ((isset($_POST["MM_insert"])) && ($_POST["MM_insert"] == "form1")) {。

    第13步:在剛剛那一段下方新增下列的程式碼。

    foreach($_POST['checkbox'] as $box) {

    $box2 .= $box;


    我解釋一下這一段的意思好了,foreach()是PHP用來處理陣列的特有迴圈,詳細的用法我在我上一篇的[一次刪除複數檔案]的教學中解釋過了,在此不再贅述,有興趣的大大請自行參閱該教學。
    在這一段最重要的在這一句'$box2 .= $box; ',一般PHP的要指派值給變數都是用=(等於)不過在此卻是用.=(在等於之前多一個點),在PHP中=是用來指派變數值,但同一個變數若指派給二種不同的值,新值會覆蓋舊值,用echo輸出時只會輸出新值,不會輸出舊值,在PHP中.=是用累加的方法來指派值,所以新值與舊值都會存在,因為我們須將所有陣列的值合併成同一個值,以能插入同一個欄位,所以要用.=來作。
    第14步:把

    $insertSQL = sprintf("INSERT INTO checkbox (checkbox) VALUES (%s)",
    GetSQLValueString($_POST['checkbox[]'], "text"));

    改成

    $insertSQL = sprintf("INSERT INTO checkbox (checkbox) VALUES (%s)",
    GetSQLValueString($box2, "text"));

    我解釋一下這一段的意思好了,我們要插入checkbox欄位的值,已經變成$box2了,而不是$_POST['checkbox']所以要改成我上述的樣子。

    第15步:簡單吧!只改4行字就完成了,我們來測試看看!

    第16步:嗯!果然成功了。

    第17步:去資料庫看看,剛剛 選取的資料有無插入資料庫中,果然成功寫入資料庫,YA!成功。

    第18步:在ok.php的頁面新增一個資料集,把剛剛輸入的資料庫資料取出,以確定我們真的成功了。

    其實這個步驟可以不用作,我會這樣做的原因是要讓各位大大知道,如果用剛剛的方法去作,所有的輸出資料都會擠在一起,不但不美觀且不實用(因為無關鍵字,所以無法把字串拆成陣列),那要怎麼辦呢?請繼續往下看。

    第19步:找到我們剛剛改的那段程式。

    foreach($_POST['checkbox'] as $box) { $box2 .= $box;} 

    把它改成

    for($i=0;$i < count($_POST['checkbox']);$i++) {

    if(count($_POST['checkbox'])==1) {

    $box2=$_POST['checkbox'][$i];

    }elseif($i == (count($_POST['checkbox'])-1)) {

    $box2.=$_POST['checkbox'][$i];

    }elseif($i < count($_POST['checkbox'])) {

    $box2.=$_POST['checkbox'][$i];

    $box2.='、';


    這樣就可以了。我解釋一下程式碼的意思好了,我們改用for迴全圈來跑陣列(for迴圈用法請自行參閱相關資料,不在此解釋之),並在迴圈內新增3個判斷式,為什麼要新增3個判斷式呢?且聽我道來。



    第一個判斷式:if(count($_POST['checkbox'])==1) ,先說count這個函式好了,它是一個統計函式,用以統計陣列中有幾筆資料,再來說說判斷式的內容,這個判斷式為真的條件是,當陣列的資料只有一筆時,不用多作處理,直接去執行$box2=$_POST['checkbox'][$i];這一段,也就是把表單變數指派給變數$box2,好讓dw把$box2的值插入checkbox欄位,也就是直接去執行步驟14,而不需要使用第三個判斷式內的方法處理。



    第二個判斷式:elseif($i == (count($_POST['checkbox'])-1)) {,當第一個判斷式不成立,就會去比對第二個判斷式是否成立,而這個判斷式為真的條件是當 $i 的值等於$_POST['checkbox']陣列的資料總筆數減1的值時,就會去執行$box2.=$_POST['checkbox'][$i];,先說一下為什麼要用$_POST['checkbox']陣列的資料總筆數減1的值去和 $i 比對,因為 $i 的值代表的是陣列的索引鍵值,因為陣列若不指定索引鍵的值會自動從'0'開始,而統計函數統計出來的值卻是從'1'開始,2者差1,所以當 $i 的值等於$_POST['checkbox']陣列的資料總筆數減1的值時,表示是陣列的最後一筆資料了,直接累加資料就可以,不需使用第三個判斷式內的方法處理。



    第三個判斷式:elseif($i < count($_POST['checkbox'])) {,當第一及第二個判斷式不成立,就會去比對第三個判斷式是否成立,而這個判斷式為真的條件當 $i 的值小於$_POST['checkbox']陣列的資料總筆數時(也就是不是陣列最後一資料時),去執行

    $box2.=$_POST['checkbox'][$i];

    $box2.='、';

    這二行的意思就是說,變數$box2的值為累加的$_POST['checkbox'][$i]陣列值,因為我們是用迴圈處理陣列,所以在迴圈重覆之前我們把變數$box2的值再累加一個 '、' 的值上去,然後再去重覆迴圈,而當第一及第二個判斷式成立時不會累加 '、' 這個值上去,這麼做有什麼用處呢?繼續看下去你就知道了。

    第20步:新增一筆資料。

    第21步:把步驟17的資料集所輸出的資料改用重覆區域輸出,看看二者有什麼不同。

    第22步:開啟ok.php的頁面並切換到程式碼編輯。

    第23步:找到。

    第24步:把修改如下:

    $check = split('、',$row_Recordset1['checkbox']);

    foreach($check as $check2) {

    echo $check2;

    echo '
    ';

    }

    我解釋一下這一段的意思好了, split()函式是用來分割字串的,而 '、' 就是要分割的條件,$row_Recordset1['checkbox']就是要被分割的字串,分格完後會自動以陣列方式儲存並指派給變數$check,然後用foreach迴圈輸出值,這一段其實可以不用作,我會這樣作的原因主要是要讓各位大大知道沒有 '、' (第一種方法)與有 '、' (第二種方法)差別在那?因為第一種方法沒 '、' 當分割關鍵值,所以無法分割字串,我們來看看成果吧!

    第25步:囉!這就是結果。
    PS:其實我也不贊成這種作法,因為將來要updata會很麻煩,且就如gordon大大在篇討論中的說明[url]http://www.dreamweaver.com.tw/forumD...p?main_id=5374[/url],這不符合正規化原則,其實我覺得用gordon大大說的那個方法會比較好一點。

    2015年4月29日 星期三

    網頁(UTF-8) 於 瀏覽器 出現亂碼解法

    一般來說,我是使用第一種解法,但是很不幸的在手機上卻還是產生亂碼
    於是乎
    再使用第一種方法外,在PHP網頁的第一行在加上方法二的處理
    果然就排除的中文亂碼的問題
    正確解法有下面幾種:
    1. 於 HTML head 指定此頁編碼為 UTF-8

    2. PHP 送 Header 告訴瀏覽器這頁是 UTF-8 編碼
      header("Content-Type:text/html; charset=utf-8");
      ?>
    3. 設定 Apache 送出頁面預設語系 UTF-8 (比較不建議用此方法)
      addDefaultCharset UTF-8
      # 不過建議這行要包在 Directory 或 VirtualHost 內, 才不會影響到其它網頁.

      addDefaultCharset UTF-8



      addDefaultCharset UTF-8