php+mysql 應用研習

208
PHP+MySQL 應應應應 新新新新新新新新 新新新 [email protected] 1 新新新新http://vod.pajh.hcc.edu.tw/moodle 新新新新http://dyna.idv.tw/moodle

Upload: hagop

Post on 12-Jan-2016

213 views

Category:

Documents


2 download

DESCRIPTION

PHP+MySQL 應用研習. 新竹縣立博愛國中 曾琳富 [email protected]. 線上教材: http://vod.pajh.hcc.edu.tw/moodle 備用網站 : http://dyna.idv.tw/moodle. 課程綱要. PHP+MySQL 環境建置 PHP 基本語法 MySQL 資料庫管理使用 SQL 語法介紹 PHP+MySQL 開發應用 ADODB 物件與 PEAR 應用. PHP+MySQL 環境建置. 先備知識. Linux/FreeBSD 基本操作知識 竹縣楊錦昌老師 APT - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: PHP+MySQL 應用研習

PHP+MySQL 應用研習

新竹縣立博愛國中 曾琳富[email protected]

1

線上教材: http://vod.pajh.hcc.edu.tw/moodle備用網站: http://dyna.idv.tw/moodle

Page 2: PHP+MySQL 應用研習

課程綱要 PHP+MySQL 環境建置 PHP 基本語法 MySQL 資料庫管理使用 SQL 語法介紹 PHP+MySQL 開發應用 ADODB 物件與 PEAR 應用

2

Page 3: PHP+MySQL 應用研習

PHP+MySQL 環境建置

3

Page 4: PHP+MySQL 應用研習

先備知識Linux/FreeBSD 基本操作知識

竹縣楊錦昌老師 APT http://apt.nc.hcc.edu.tw

鳥哥的 Linux 私房菜 http://linux.vbird.org/

藍色泡泡 http://ohaha.ks.edu.tw/

HTML 基本製作知識 網站建置百寶箱

http://dob.tnc.edu.tw/ HTML 入門

http://content1.edu.tw/publish/jackson/ material/593084/webpg1203/html/index.htm

4

Page 5: PHP+MySQL 應用研習

參考書籍參考書籍 PHP+MySQL 快速入門,松崗,吳弘凱 PHP&MySQL 完全架站攻略第二版 , 上奇 PHP 徹底研究新編第二版 , 博碩 專業 PHP5 程式設計指南 , 上奇 MySQL 學習手札 , 上奇 MySQL 徹底探索 , 博碩參考網站 http://www.php.net http://www.mysql.com http://www.php5.idv.tw http://vod.pajh.hcc.edu.tw/moodle/

5

Page 6: PHP+MySQL 應用研習

傳統網頁與動態網頁 傳統網頁執行方式

動態網頁執行方式

Web Server

IE 、 FireFox

要求網頁,如 index.htm

回應網頁 (HTML)

IE 、 FireFoxWeb Server

要求網頁,如 index.php

PHP 解譯器 MySQL

DB

回應網頁 (HTML)

<html><head></head><body><?php echo date(“Y-m-d”) ?></body></html>

<html><head></head><body>2008-04-12</body></html>

Apache / IIS

6

Page 7: PHP+MySQL 應用研習

PHP 是什麼? PHP為 (Personal Home Pages) 簡稱, PHP 是一種

server-side HTML-embedded 的 script 語言,由Rasmus Lerdorf 於 1994 發展至今,目前版本 PHP 4.4.7 (2007 年底停止發展 )及 PHP 5.2.3

其它類似產品 Microsoft ASP(ASP.NET) Adobe(Macromedia) ColdFusion SUN JSP

7

Page 8: PHP+MySQL 應用研習

PHP 的特色 開放原始碼而且是免費 跨平台 ( 作業系統、 Web 伺服器 ) 功能強大,支援各種資料庫、網路連結、檔案系統、 Java、 COM、 XML 等

支援物件導向 (PHP 5 較為完整 ) 快速發展週期及活躍支援社群

8

Page 9: PHP+MySQL 應用研習

PHP 的應用 動態網頁程式設計

如留言版、討論區、公告、電子相簿等

腳本檔 (Shell Script)

如與 Crontab 結合可定時執行程式 (PHP)

視窗應用程式 (Window Application)如視窗應用程式般執行如 PHP-GTK

9

Page 10: PHP+MySQL 應用研習

建構 Apache +PHP +MySQL 環境 Linux 平台

建議以 APT 方式安裝 FreeBSD 平台

建議以 Ports 方式安裝 Windows 平台

建議以 Xampp 或 AppServ 套件安裝

10

Page 11: PHP+MySQL 應用研習

php.ini 校調 以 xamp 為例,在瀏覽器網址列上鍵入 http://localhost,選擇左邊

選單的 phpinfo() 找到 php.ini 所在位置 C:\xampp\apache\bin\php.ini 以 PSPad 編輯 並修正以下設定值

244 max_execution_time = 60 每個 Script 最大執行時間245 max_input_time = 60表單輸入最大時間246 memory_limit = 16M記憶體最大限制409 post_max_size = 64M表單輸入最大檔案大小514 upload_max_filesize = 32M上傳檔案大小最大限制

11

Page 12: PHP+MySQL 應用研習

php.ini 校調292 error_reporting = E_ALL & ~E_NOTICE顯示程式執行中的所有錯誤除了 NOTICE 等級

299 display_errors = On顯示程式執行中的錯誤

101 output_buffering = Off緩衝區輸出

當程式會出現下列訊息時可以將 output_buffering 設成 ON Warning: Cannot modify header information - headers already sent by (output started at  XXX )

12

Page 13: PHP+MySQL 應用研習

建立開發 PHP 的環境 在Windows 底下開發及測試之後在上傳至伺服器 安裝 Xampp ( Apache+PHP+MySQL+phpMyAdmin) PHP 編輯器

PSPad Dreamweaver Topstyle Homesite Zend Studio

1. 支援 PHP 語法2. 強大的視覺化網頁編輯、程式碼半視覺化編輯

PSPad Dreamweaver

Topstyle

主要文字編輯器

CSS 編輯器

13

Page 14: PHP+MySQL 應用研習

PHP 基本語法

14

Page 15: PHP+MySQL 應用研習

第一個 PHP 程式<html><title> 第一個 PHP 程式 </title><body> Hello Word !<p>

<?php

echo "我的第一個 PHP 程式 <br>" ;

?>

</body></html>

PHP 程式碼開始符號

PHP 程式碼結束符號

程式碼以分號作為結束

echo 為 PHP 指令 ( 將後面的訊息顯示在螢幕上 )

15

Page 16: PHP+MySQL 應用研習

PHP 程式碼標記 PHP 程式碼標記方式的四種寫法<? echo “第一種 " ;

//這種寫法必須將 php.ini 中的 short_open_tags 設定為 On才可以使用

?>

<script language="php"> echo “第二種 " ; </script>

<% echo “第三種” ; // 這種寫法必須將 php.ini 中的 asp_tags 設定為 On才可以使用 %>

<?php echo “第四種 " ; ?>

請選擇這種寫法

16

Page 17: PHP+MySQL 應用研習

PHP 的註解<?php // echo “單行註解 " ; // 兩個雙斜線表示後面一行是註解 , 不會被顯示出來 /* echo "多行註解 " echo “在 /* 與 */ 之間為註解 , 不會被顯示出來 " ; */?>

17

Page 18: PHP+MySQL 應用研習

變數與常數

變數是會變動的資料 ( 可以包括 ) ,尤其在程式執行階段,可以任意變換內容的值1. 變數必須以 $ 開頭2. 第二個字元必須為英文字母或底線 (_)

3. 第二字元以後可以為 ( 底線、 大小寫字母、 數字 ) 的任意組合4. 變數是有區分大小寫, $a1 與 $A1 是不同變數5. 例如 $num = 10; $msg=‘歡迎光臨’ ;

常數是不會變動的數,即使在程式執行階段也不會改變其內容1.常數前面不加 $

2.習慣上常數用大寫表示3.例如 define(PI,3.14);

18

Page 19: PHP+MySQL 應用研習

基本輸出指令<?php echo “Hello!<BR>"; print “Hello!<BR>"; print(“Hello !<BR>"); echo "<hr width=50%>“; $msg="I am fine." ; echo "1: msg變數的內容是 $msg <BR>"; echo '2: msg變數的內容是 $msg <BR>' ;?>

雙引號內若有變數則會被取代,單引號則否

19

Page 20: PHP+MySQL 應用研習

PHP 與 HTML

<?php echo "我的第一個 PHP 程式 <br>" ;?><html><title> 第一個 PHP</title><body>Hello My Friend! <p> </body></html>

<html><title> 第一個 PHP</title><body> Hello My Friend! <p> <?php echo “ 我的第一個 PHP 程式” ; ?></body></html>

1.嵌入 HTML

3. 在 HTML標籤外

<?php

echo "我的第一個 PHP 程式 <br>" ;

?>

2.獨立存在

20

Page 21: PHP+MySQL 應用研習

資料型態類型

名稱 型態 範例Boolean 布林 $b = False;

Integer 整數 $b = 123;

Float 浮點 $b = 3.14;

String 字串 $b = “ 新竹縣” ;

Array 陣列 $b[0] = “ 竹北” ;

Object 物件 $b = new Class;

Resource 資源 $b = mysql_pcconnect();

Null Null $b = Null;

21

Page 22: PHP+MySQL 應用研習

布林型態 語法

True| False 由來

為了紀念提出此概念的十八世紀法國數學家 George Boole 大小寫視為相同

範例 $a = true; $b = FALSE;

通常用於判斷式,例如

if($a ) { //若 $a 為真 ,則執行括號內的指令 …..}

22

Page 23: PHP+MySQL 應用研習

整數型態 語法

[+|-] [0|0x] 數值 範例

$a = 456; // 正整數 $b = -123; //負整數 $c = 045; //八進制 $d = 0x4A; //十六進制

23

Page 24: PHP+MySQL 應用研習

浮點數型態– 一般浮點數

例如: 1.345

– 科學記號浮點數 例如: 1.23e2、 1.45e-4

24

Page 25: PHP+MySQL 應用研習

字串型態 字串是文字串列的組合,可用雙引號或單引號前後括號起來$a = “PHP研習課” ; $b = ‘PHP 研習課’ ;

在字串中遇到特殊符號需加個反斜線( \),如反斜線、單引號、雙引號、 $ 字號等$a = “I\’ll be back”; $b = ‘I love \“PHP\” ‘;

在雙引號中的變數才會被置換,單引號則不會echo “\$a = $a” ; echo ‘\$b = $b’ ;

\n \r \t 的使用 (只對網頁原始檔有效 )\n 換一行 \r 與 \n 相同 \t 跳一個定位點

25

Page 26: PHP+MySQL 應用研習

Heredoc 定界符 在區塊內可以不使用反斜線,就可以直接顯示反斜線、單引號、雙引號、 $字號這些字元

語法

例如

$變數 =<<< Heredoc標籤….….….Heredoc標籤 ;

$a = “hi”;$msg=<<< doc{$a} I’ll be back ! I love “PHP”doc;echo $msg;

Heredoc 標籤之前不可空白

26

Page 27: PHP+MySQL 應用研習

陣列型態陣列是變數的集合,陣列中的每一個元素各有自己的值,用索 引可參照到陣列中的元素,其中

1.陣列索引由 0 開始。2.陣列中的元素可包含不同的資料類型

語法 陣列名稱 [ 指標 ]

範例 $a[0] = 0; // 一維陣列 $a[1] = 10; $a[2] = 20; $c[“ 國文” ] = 85; //關連式陣列 $c[“數學” ] = 95;

27

Page 28: PHP+MySQL 應用研習

陣列型態 ( 一維 ) 語法

陣列名稱 [ 索引 ] = 陣列值 ; Array( 索引 1=>陣列值 1, 索引 2=>陣列值 2);

範例 $a[0] = 0; // 一維陣列 $a[1] = 10; $b[] = “忠” ; //未指明索引值,將從 0 開始 $b[] = “孝” ;

把陣列中每個元素都取一個名字,方便存取其中元素的名字叫做關鍵字 (key)元素的內容叫做值 (value)

$c[“ 國文” ] = 85; //關連式陣列 $c[“數學” ] = 95; $a=array(0=>0,1=>10,2=>20); $a=array(0,10,20);

28

Page 29: PHP+MySQL 應用研習

陣列型態 ( 二維 )

範例 $class[1][1] = “一年忠班” ; // 二維陣列 $class[1][2] = “一年孝班” ; $class[2][1] = “二年忠班” ; $class[2][2] = “二年孝班” ; $class[3][1] = “三年忠班” ; $class[3][2] = “三年孝班” ;

$class=array( 1=>array(1=>’ 一年忠班’ ,2=>’ 一年孝班’ ), 2=>array(1=>’ 二年忠班’ ,2=>’ 二年孝班’ ), 3=>array(1=>’三年忠班’ ,2=>’三年孝班’ ) );

29

Page 30: PHP+MySQL 應用研習

物件型態所謂的物件,就是類別 (Class)實體化之後的資料型態

語法://宣告類別class 類別名稱 {

var 資料成員 ;function 成員函數 (){

成員函數內容 ;}

}// 產生物件$a = new 類別名稱 ; //存取成員函數$a->showcolor();

30

Page 31: PHP+MySQL 應用研習

物件型態

// 宣告物件class table { var $color ; function set_color($new_color){ $this->color=$new_color ; } function show_color() { echo $this->color; echo "<br>\n" ; }}

// 使用物件$T = new table() ;$D = new table() ;$T->set_color("Red") ;$D->set_color("Blue") ;echo "T table color is " ;$T->show_color() ;echo "D table coloe is " ;$D->show_color() ;

this 是個關鍵字代表本物件

31

Page 32: PHP+MySQL 應用研習

資源型態// 建立 MySQL 連線$conn = mysql_connect(‘localhost’,’root’,1234’);

// 選擇資料庫mysql_select_db(“user”,$conn);

// 執行 SQL 語法$res = mysql_query(“select * from user”);

// 擷取每一筆資料while($row = mysql_fetch_array($res)){

echo $row[“name”];

}

// 關閉 MySQL 連結mysql_close($conn);

32

Page 33: PHP+MySQL 應用研習

NULL 型態Null 表示變數中沒有值以下三種情況變數將會被視為 Null

1.變數被設成 Null

2.變數未定義3.變數被 unset()後

33

Page 34: PHP+MySQL 應用研習

變數初始值 PHP 不需要事先設定變數型態,由初始值的資料型

態決定,程式執行中會將$a = 10;

$b = 12.3;

$a =“今天好嗎?” ;

PHP 指派變數方式,等號右邊運算完後指派給等號左邊

$A = 30;

$B = $A + 30;

$C = $C + 30;

34

Page 35: PHP+MySQL 應用研習

傳值與傳址<?php

$A = 10 ; // $A 的值為 10

$B = $A ; // $A 的值複製給 $B

$C = &$A ; // $A 的記憶體位置給 $C

echo " 執行計算前 <br>";

echo "A=$A <br>" ;

echo "B=$B <br>";

echo "C=$C <p>";

$B=$B+10 ; // $B 的值加 10

$C=$C+20 ; // $C 的值加 20

echo " 執行計算後 :<br>" ;

echo "A=$A <br>"; // 顯示 $A, $B, $C 的值echo "B=$B <br>" ;

echo "C=$C ";

?>

35

Page 36: PHP+MySQL 應用研習

變數種類 區域變數

在函數內宣告的變數為區域變數,可視範圍只限於函數中,在函數中若想使用全域變數,需將變數宣告成 global

全域變數 在 PHP Script 中 (排除函數內 ) 所宣告的變數

靜態變數 在函數中宣告成靜態變數 (static) ,重複呼叫該函數,其變數會保留其值

36

Page 37: PHP+MySQL 應用研習

變數種類 動態變數 (變數的變數 )<?php

$name="John" ;

$$name="Lee" ;

echo $John;

?>

最後會顯示 Lee

37

Page 38: PHP+MySQL 應用研習

超級全域變數 超級全域變數 ($_SESSION、 $_GET、 $_POST 、$ _COOKIE、 $_FILES、 $_REQUEST)

當切換網頁時,用來記錄與接收的變數( 一 ) GET

瀏覽器網址列: http://localhost/test.php? user=hs1600

<html><head><title>接收 URL變數 </title></head><body><?php echo $_GET[‘user’]; ?></body></html>

test.php38

Page 39: PHP+MySQL 應用研習

超級全域變數( 二 ) POST – 以表單傳遞變數

<form action="test.php" method="post"> <input type=“files" name="frm_name"> <input type="submit" value="送出 "> </form>

<body><?php echo $_POST[‘frm_name’]; ? ></body>

39

REQUEST : 同時接收在自 GET與 POST變數

Page 40: PHP+MySQL 應用研習

超級全域變數( 三 ) FILES – 上傳單一檔案

<form action="test.php" method="post“ enctype="multipart/form-data" > <input type=“file" name="frm_up"> <input type="submit" value="送出 "> </form>

<?php echo $_FILES[‘frm_up’][‘name’]; // 上傳檔案名稱echo $_FILES[‘frm_up’][‘type’]; // 檔案類型echo $_FILES[‘frm_up’][‘size’]; // 檔案大小echo $_FILES[‘frm_up’][‘tmp_name’]; //暫存檔檔名echo $_FILES[‘frm_up’][‘error’]; // 錯誤訊息?>

test.php

40

Page 41: PHP+MySQL 應用研習

超級全域變數( 三 ) FILES – 上傳單多檔案

<form action=“test.php” method=“post“ enctype=”multipart/form-data” > 檔案 1 : <input type=“file" name="frm_up[]"> 檔案 2 : <input type=“file" name="frm_up[]"> <input type="submit" value="送出 "> </form>

<?php echo $_FILES[‘frm_up’][‘name’][0]; // 上傳檔案名稱 1echo $_FILES[‘frm_up’][‘tmp_name’][0]; //暫存檔檔名 1

echo $_FILES[‘frm_up’][‘name’][1]; // 上傳檔案名稱 2echo $_FILES[‘frm_up’][‘tmp_name’][1]; //暫存檔檔名 2?>

? >

test.php

41

Page 42: PHP+MySQL 應用研習

超級全域變數( 四 ) SESSION : 儲存在伺服器中,用來記錄客戶端一些資料

1.php

2.php42

Page 43: PHP+MySQL 應用研習

超級全域變數( 五 ) COOKIE : 儲存在客戶端電腦中,用來記錄客戶端一些資料

Cookie 的限制:每個使用者的瀏覽器只能支援 ( 存取 )300 個 Cookie每個瀏覽器只能針對同一個伺服器存取 20 個 Cookie每個 Cookie 的大小最多僅 4k Bytes 的容量 有些瀏覽器可以把 Cookie 的功能關掉,若關掉後 Cookie 就不能使用

//儲存 user的 COOKIE變數於客戶端,其值為 Peter ,保存時間為 1 小時setcookie("user", "Peter", time()+3600);

1.php

// 顯示 COOKIE[‘user’] 的值echo $_COOKIE[‘user'];

2.php

43

Page 44: PHP+MySQL 應用研習

超級全域變數( 六 ) SERVER : 系統變數

echo $_SERVER[‘PHP_SELF’]; // 顯示目前執行 Script 的檔案echo $_SERVER[‘REMOTE_ADDR’]; // 顯示客戶端 IPecho $_SERVER[‘HTTP_USER_AGENT‘]; // 顯示客戶端的瀏覽器

// 當有 Proxy Server 時取得客戶端 IP

if($_SERVER["HTTP_X_FORWARDED_FOR"] == "") $your_ip = $_SERVER["REMOTE_ADDR"] ;else $your_ip = $_SERVER["HTTP_X_FORWARDED_FOR"];

44

Page 45: PHP+MySQL 應用研習

常數 語法: define(常數名稱 ,常數值 )

例如:<?php

define(PI,3.14);

echo PI;

?>

45

Page 46: PHP+MySQL 應用研習

算術運算子算術運算子 意義 範例 範例結果

+ 加法 $a + $b 5+10 結果 15

- 減法 $a - $b 10-5 結果 5

* 乘法 $a * $b 10*5 結果 50

/ 除法 $a / $b 10/5 結果 2

% 求餘數 $a%$b 10%3 結果 1

46

Page 47: PHP+MySQL 應用研習

指定運算子

指定運算子 意義 範例 範例說明

=指定,等號右邊的值指定給等號左邊

$a = 10;

$b = $a;

$c = $a + $b;

$a = $a + 10;

$a = 0 ;$a = $a + 1;

$a 結果為 1

+= 相當與本身加 $a+=10; $a 本身加上 10

-= 相當與本身減 $a-=5; $a 本身減掉 5

*= 相當與本身乘 $a*=3; $a 本身乘以 3

/= 相當與本身除 $a /=2; $a 本身除以 2

47

Page 48: PHP+MySQL 應用研習

邏輯運算子

邏輯運算子 意義 範例

! 反相 !$a

and(&&) 交集 $a and $b

or(||) 聯集 $a or $b

xor xor $a xor $b

48

Page 49: PHP+MySQL 應用研習

關係運算子

關係運算子 意義 範例

< $a 小於 $b $a < $b

<= $a 小於等於 $b $a <= $b

> $a 大於 $b $a > $b

>= $a 大於等於 $b $a >= $b

== $a 等於 $b $a == $b

!= 或 <> $a 不等於 $b $a != $b

=== $a 等於 $b(型態也要相同 )

$a === $b

49

Page 50: PHP+MySQL 應用研習

字串運算子字串運算子 意義 範例

˙ 連接字串 “hello”. “World”;

$a = ‘ 今天日期為:’ ;$b = ’97年 4月 13日’ ;$c = $a . $c;echo $c // 顯示結果為今天日期為: 97年 4月 13日

50

Page 51: PHP+MySQL 應用研習

錯誤運算子字串運算子 意義 範例

@ 抑制錯誤訊息 $a = @($b/0)

@unlink($file_path) //刪除檔案 $file_path ,當檔案不存在時 抑制錯誤訊息$c = 0;$a = @(30/$c); //抑制除以 0 的錯誤訊息

51

Page 52: PHP+MySQL 應用研習

三元運算子運算子 意義 範例

? :若 $x 為真傳回 $y

若 $x 為否傳回 $z

$x ? $y : $z

//假若 $b 等於 1, $a 等於 10 ,否則 $a 等於 20$a = ($b == 1) ? 10 : 20;

//取得客戶端 IP $your_ip = ($_SERVER[“HTTP_X_FORWARDED_FOR”] == “”) ? $_SERVER[“REMOTE_ADDR”] : $_SERVER["HTTP_X_FORWARDED_FOR”];

52

Page 53: PHP+MySQL 應用研習

遞增遞減運算子運算子 範例 說明

++( 前置 ) ++ $a $a 加一

--( 前置 ) --$a $a 減一

(後置 )++ $a++ $a 加一

(後置 )-- $a-- $a 減一

前置:先加減完再使用,後置:先用完後再加減$a = 10;echo $a++; // 結果為 10 echo $a; // 結果為 11echo --$a ; // 結果為 10echo $a ; // 結果為 10

53

Page 54: PHP+MySQL 應用研習

位元運算子運算子 範例 說明

& $a & $b $a 與 $b作 AND運算

| $a | $b $a 與 $b作 OR運算

~ ~ $a $a 做補數運算

^ $a ^ $b $a 與 $b作 XOR運算

>> $a >> $b $a 向右移動 $b 個位元

<< $a << $b $a 向左移動 $b 個位元

將數字以 bit 為單位作運算

54

Page 55: PHP+MySQL 應用研習

運算子優先順序1.先乘除後加減

2.由左到右

3.以括號來強化優先順序

4.避免寫出難以維護 ( 了解 ) 的運算

55

Page 56: PHP+MySQL 應用研習

善用大括號 {}

56

echo “你輸入的值為” . $_POST[‘msg’];echo “你輸入的值為 {$_POST[‘msg’]}“;

echo “查詢結果為” . $row[“score”] . “分” ;echo “查詢結果為 {$row[“score”] }分” ;

Page 57: PHP+MySQL 應用研習

條件判斷 -if

格式一: if(條件判斷式 )

敘述句… .

若敘述句超過一個,則以大括號 { } 包圍之

$act = ‘add’;if($act == ‘add’) { echo ‘進行新增動作…’ ; echo ‘ 新增完畢’ ;}

57

Page 58: PHP+MySQL 應用研習

條件判斷 -if

格式二:if(條件判斷式 ){

敘述句… .

}else{

敘述句… .

}

$act = ‘add’;if($act == ‘add’) { echo ‘進行新增動作…’ ; echo ‘ 新增完畢’ ;}else { echo ‘不進行新增動作’ ;}

58

Page 59: PHP+MySQL 應用研習

條件判斷 -if

格式三:if(條件判斷式 1){

敘述句… .

}elseif(條件判斷式 2){

敘述句… .

}else{

敘述句… .

} if($act == ‘add’) { echo ‘進行新增動作…’ ;}elseif(($act == ‘edit’) { echo ‘進行編輯動作…’ ;}else { echo ‘進行刪除動作… .’;}

59

Page 60: PHP+MySQL 應用研習

多重判斷 -switch格式:switch(判斷變數 ){ case 條件 1: 敘述句… . break; case 條件 2: 敘述句… . break; default: 敘述句… .}

switch ($act) {case ‘add’: echo ‘進行新增動作…’ ; break;case ‘edit’: echo ‘進行編輯動作…’ ; break;case ‘del’: echo ‘進行刪除動作… .’; break;default: echo ‘進行檢視動作… .’;}

60

Page 61: PHP+MySQL 應用研習

迴圈 -for

格式:for(起始值 ;迴圈判斷條件 ;增減值 ){

敘述句… .

}// 列印出 1~10for($i=1;$i<11;$i++){ echo $i . ‘<br>’; }

// 列印出 9 X 9乘法表for($i=1;$i<10;$i++) { for($j=1;$j<10;$j++) { echo $i . ‘X’ . $j . ‘=’ . $i*$j . ‘<br>’; }}

61

Page 62: PHP+MySQL 應用研習

迴圈 - while

格式一:while(判斷式 ){

敘述句… .

}

格式二:do{

敘述句… .

}while(判斷式 )

62

// 列印出 1~10for($i=1;$i<11;$i++){ echo $i . ‘<br>’; }

// 列印出 9 X 9乘法表for($i=1;$i<10;$i++) { for($j=1;$j<10;$j++) { echo $i . ‘X’ . $j . ‘=’ . $i*$j . ‘<br>’; }}

Page 63: PHP+MySQL 應用研習

迴圈 -foreach(陣列使用 )

格式一foreach(array as $value)

格式二

foreach(array as $key=>$value)

63

   $a = array ( "one" => 1, "two" => 2, "three" => 3);

foreach($a as $k => $v) {             echo "\$a[$k] => $v.\n";     }

   $a = array (1, 2, 3, 17);     foreach ($a as $v) {          echo "Current value of \$a: $v.\n";     }

Page 64: PHP+MySQL 應用研習

break 的使用break 會強迫跳離 for、 while迴圈及 switch 指令

while(True){

$i++; if($i == 100) break; print $i;

}

break n;

n 代表跳脫的迴圈數

64

Page 65: PHP+MySQL 應用研習

continue 的使用continue 會忽略 continue 以下迴圈敘述,回到迴圈起始位

while(True) { $i++; if($i > 100) continue; print $i;

}

65

Page 66: PHP+MySQL 應用研習

函數函數是一段可重複使用的程式碼片段,讓程式碼可以重複使用,增加程式的易讀性

格式:function 函數名稱 ( $ 參數 1, $ 參數 2, $ 參數 3,… ){

程式碼…return $ 傳回值

}

使用方式: 函數名稱 ( $ 參數 1, $ 參數 2, $ 參數 3,… );

66

Page 67: PHP+MySQL 應用研習

PHP常用內定函數 -文字處理 addslashes 將字串加上反斜線 echo 輸出字串 explode 切開字串 htmlspecialchars 轉換特殊字元成為 HTML實體 trim去除字串開始處與結束處的空白 nl2br轉換新行成為 HTML的 <BR> wordwrap使用字串斷行字元將字串包裹成指定的字元數目 stripslashes去除 addslashes( )引用的斜線 strlen取得字串長度 strpos   找出字串第一次出現的位置 substr 取得部份字串

67

Page 68: PHP+MySQL 應用研習

PHP常用內定函數 -日期 / 時間處理 checkdate 有效的日期 / 時間 date 將本地的時間 /日期格式化 getdate取得日期 / 時間資訊 mktime取得日期的 UNIX 時間戳記

68

Page 69: PHP+MySQL 應用研習

PHP常用內定函數 -陣列處理 (1) array() 建立新陣列 range() 可將一系列遞增或遞減的數字,依序填入陣列中 shuffle() 將陣列內容如洗牌般,將之弄亂 array_rand() 將陣列元素任取固定個數出來 list() 將陣列內的函數取出,對應到指定的變數內 count() 計算陣列元素個數 array_count_values() 計算陣列內各種值的出現頻率 array_sum() 將陣列內容值加總 array_key_exists() 查看某個 key 是否存在於陣列中 array_search() 查看某個 value 是否存在於陣列中,若有將該值的索引傳回

in_array() 查看某個內容值是否存在於陣列之中。若有,則傳回 true

69

Page 70: PHP+MySQL 應用研習

PHP常用內定函數 -陣列處理 (2) array_flip() 將關聯陣列中的關鍵字與內容值對調 array_unique() 將陣列中重複的內容值拿掉,只保留第一份 array_reverse() 將陣列內容的順序反轉 asort()對陣列內容值作順向排序 (AZ) ,會保持內容值與關鍵字的關連性

ksort()對陣列 key 值作順向排序 (AZ) ,會保持內容值與關鍵字的關連性

array_shift() 將元素由陣列頭部移出 array_unshift() 將元素值由陣列頭部塞入 array_walk() 會由陣列第一個元素,依序一個個抽出,塞入

array_walk() 所指定的函數去運算

70

Page 71: PHP+MySQL 應用研習

PHP常用內定函數 -陣列處理 (3) key() 將陣列指位器目前所指的 key 傳回來 current() 將陣列指位器目前所指的 value 傳回來 each() 將陣列指位器目前所指的 key 及 value 都傳回來 reset() 將陣列指位器設定在陣列開頭 end() 將陣列指位器設定在陣列結尾 prev() 將陣列指位器向開頭移動一格 next() 將陣列指位器向尾端移動一格

71

Page 72: PHP+MySQL 應用研習

PHP內定函數 - 檔案 / 目錄有關函數 copy() 複製檔案 unlink() 刪除檔案 mkdir() 建立目錄 rmdir() 刪除目錄 filesize() 取得檔案的大小 feof() 測試指標是否在檔案結束處 file_exists() 檢查檔案是否存在 is_writeable() 辨別檔案名稱是否是可寫入的檔案 fopen 開啟檔案或 URL fread 以位元組方式讀檔 fgetcsv 從檔案指標取得行並且剖析 CSV欄位 fwrite   將資料寫入檔案 fclose   關閉已開啟的檔案指標

72

Page 73: PHP+MySQL 應用研習

PHP內定函數 -MySQL 有關函數 mysql_connect() 與Mysql 建立資料庫連線 mysql_pconnect()與Mysql 建立資料庫持續連線 mysql_select_db() 選擇資料庫 mysql_create_db() 建立資料庫 mysql_close()關閉與資料庫連線 mysql_query() 執行 SQL 指令 mysql_num_rows()查詢結果總筆數 mysql_fetch_array() 將查詢結果以陣列表示 mysql_fetch_row() 將查詢結果以變數表示 mysql_insert_id() 前一筆紀錄新增時的 ID 值 mysql_error()Mysql 錯誤訊息 mysql_errno() Mysql 錯誤訊息編號

73

Page 74: PHP+MySQL 應用研習

PHP常用內定函數 - 其他函數• srand() 設定亂數種子• rand() 產生亂數值• round()取四拾五入• ceil() 取得大於指定數的最小整數值• floor()  取得小於指定數的最大整數值• intval()取得變數的整數值• getImageSize()取得 GIF、 JPEG、 PNG或 SWF圖形的大小• unset() 刪除變數• isset() 測定變數是否設定• empty() 測定變數是否為空• print_r() 列出變數資訊• var_dump() 列出變數資訊• ereg() 正規表達比對

更多函數請參考線上手冊74

Page 75: PHP+MySQL 應用研習

函數的預設參數值 定義:

當呼叫一個函數時,若某些參數沒被提供, PHP 會自動將該參數設為某個預設值的功能。

格式:function 函數名稱 ($ 參數 1, $ 參數 2 = 預設值 1,…)

注意:預設參數值的變數必須置於最右邊

75

Page 76: PHP+MySQL 應用研習

取得可變動長度參數的函數 可變動長度參數

func_num_args() 傳回目前傳入了幾個參數

func_get_arg($ 參數註標 ) 指名要存取哪個參數。第一個參數的註標為 0

array func_get_args() 將這次傳入的參數,以陣列的方式傳回來。

76

Page 77: PHP+MySQL 應用研習

函數中變數可視範圍 函數內的變數只能在該函數內可以使用 在函數中若需要使用到全域變數需將變數宣告成 global 在函數中宣告成靜態變數 static ,重複呼叫該函數,其變數會保留其值

超級全域變數在函數中可以直接使用不須宣告

77

Function ret_query() { global $db; static $num; for($i=1;$i<$_POST[‘$totalnum’];$i++) { …….. …….. }}

Page 78: PHP+MySQL 應用研習

引入檔一、引入外部檔include()

require()

require若遇到檔案不存在將會終止程式, include卻不會

二、引入一次include_once()

require_once()

用在函數庫、物件庫

78

Page 79: PHP+MySQL 應用研習

檔案處理格式: int fopen( 檔案名稱 , 開檔格式 )

格式 說明r 開啟唯讀檔r+ 開啟可讀可寫檔,將檔案指標置於起始位

置w 開啟可寫檔,並清除檔案內容w+ 開啟可寫檔,並清除檔案內容,將檔案指

標置於起始位置a 開啟可寫檔,將檔案指標置於檔尾a+ 開啟可讀可寫檔,將檔案指標置於檔尾

79

Page 80: PHP+MySQL 應用研習

檔案處理 讀取檔案: fgets( 檔案指標 ,寫入資料 ) 寫入檔案: fputs( 檔案指標 ,寫入資料 ) 關閉檔案: fclose( 檔案指標 ) 檔案是否結束: feof( 檔案指標 )

<?php $fp = fopen(‘test.txt’,’r+’); while(!feof($fp)){ $bf = fgets($fp,2048); echo $bf; } fputs($fp,’寫入資料測試’ ); fcolse($fp);?>

80

Page 81: PHP+MySQL 應用研習

header函數

header()會傳送標題訊息給瀏覽器,瀏覽器會作適當的回應,例如

header(“location:http://www.edu.tw”); //轉向目的網站

header(“location:index.php?account=123”);

<script> window.location.href=‘test.php’</script>

81

Page 82: PHP+MySQL 應用研習

MySQL 資料庫管理使用

82

Page 83: PHP+MySQL 應用研習

MySQL 簡介 MySQL 是一個快速穩定多執行緒多使用者的資料庫伺服

器,可以與 C、 C++、 Java、 Perl、 PHP 等語言很容易的連結,可以運作在許多平台上 例如 : Sun Solaris 、 RedHat 、 Linux 、 FreeBSD 、 OS/2 、Windows ... 等平台,目前已經有相當多的企業單位採用。

83

Page 84: PHP+MySQL 應用研習

MySQL 資料欄位型態 大小 範圍說明

char(N)char(N) binary

固定長度 N=1~255binary :分辨大小寫

varchar(N)varchar(N) binary

固定長度N=1~255 ,內容長度差異大

時使用binary :分辨大小寫

tinytexttextmediumtextlongtext

可變長度

255 bytes(2^8-1)65535 bytes(2^16-1)16777215 bytes(2^24-1)4294967295 bytes (2^32-1)

tinyblobblobmediumbloblongblob

可變長度Binary Large

Object註 1 :有分大小寫註 2 :可放 2 進位資

255 bytes(2^8-1)65535 bytes(2^16-1)16777215 bytes(2^24-1)4294967295 bytes (2^32-1)

enum(value1, value2, …)

列舉型態(單選 ) 可設定 65535 個值

set(value1, value2, …)

集合型態(複選 ) 最多可有 64 個值

文字型態

84

Page 85: PHP+MySQL 應用研習

MySQL 資料欄位 數值型態

類型 大小 範圍說明

tinyinttinyint unsigned

1byte-128~127UNSIGNED : 0~255

smallintsmallint unsigned

2bytes-32768~32767UNSIGNED: 0~65535

mediumintmediumint unsigned

3bytes-8388608~8388607UNSIGNED: 0~16777215

integerinteger unsigned

4bytes-2147483648~2147483647UNSIGNED: 0~4294967295

bigintbigint unsigned

8bytes-9.2*10^18~9.2*10^18(約 )UNSIGNED: 0~1.8*10^19(約 )

Float [(M,D)]註: M 為長度, D 為小數 4bytes -3.4E+38~3.4E+38(約 )

double [(M,D)]註: M 為長度, D 為小數 8bytes -1.79E+308~1.79E+308(約 )

85

Page 86: PHP+MySQL 應用研習

MySQL 資料欄位 日期時間型態

類型 大小 範圍說明

Year 1byte年份 (1901~2155)格式: YYYY

Date 3bytes日期 (1000-01-01~9999-12-31)格式: YYYY-MM-DD

Time 3bytes時間格式: HH:MM:SS

Datetime 8bytes日期與時間 (1000-01-01~9999-12-31)格式: YYYY-MM-DD HH:MM:SS

timestamp(N)

4bytesN=2,4,6,8,10,12,14

格式 (1970~2037)14 : YYYYMMDDHHMMSS(Default)12 : YYYYMMDDHHMM10 : YYYYMMDDHH8 : YYYYMMDD6 : YYMMDD4 : YYMM2 : YY

86

Page 87: PHP+MySQL 應用研習

MySQL管理 -phpMyAdmin

87

Page 88: PHP+MySQL 應用研習

關連式資料庫對應型態關連性:一對一

作者編號 作者姓名 作者學歷

1 林雯 博士

2 林娟 碩士

3 林惠 學士

作者編號 作者生日 作者地址1 60.10.2 高雄市2 62.3.1 桃園縣3 65.7.3 屏東縣

88

Page 89: PHP+MySQL 應用研習

關連式資料庫對應型態關連性:一對多

訂單編號 客戶編號 訂單內容

4 1 Intel CPU

10 2 NoteBook

7 3 DVD-RW

3 2 Print

客戶編號 客戶姓名 客戶地址1 林文 台中縣2 林舞 桃園縣3 林全 屏東縣

89

Page 90: PHP+MySQL 應用研習

關連式資料庫對應型態關連性:多對多

書名

PHP 入門

MySQL 入門

HTML 入門

作者

Dr.Tzeng

Dr.Lee

Dr.Wang

90

Page 91: PHP+MySQL 應用研習

資料庫正規化

正規化的目的簡單的說就是要將資料的重覆性降至最低(避免資料重複的狀況發生)。

第一正規化( First Normal Form,簡稱 1NF):->移除重複的群

ID Name Address Book1 Book2 Book3

1 李姿育 高雄市 PHP 入門 MySQL 入門 Linux 入門

ID Name Address Book

1 李姿育 高雄市 PHP 入門1 李姿育 高雄市 MySQL 入門1 李姿育 高雄市 Linux 入門

91

Page 92: PHP+MySQL 應用研習

資料庫正規化

第二正規化 (Second Normal Form,簡稱 2NF)-> 移除重複出現的資料

CountyID NameID Book

1 1 PHP 入門1 1 MySQL 入

門1 1 Linux 入門

NameID Name

1 李姿育

ID Name Address Book

1 李姿育 高雄市 PHP 入門1 李姿育 高雄市 MySQL 入門1 李姿育 高雄市 Linux 入門

CountyID Address

1 高雄市

92

Page 93: PHP+MySQL 應用研習

資料庫正規化

訂單編號 訂戶姓名 訂戶地址 訂戶電話 訂單日期 付款方式

第三正規化( Third Normal Form,簡稱 3NF): ->移除與主鍵沒有功能相依的資料

93

Page 94: PHP+MySQL 應用研習

SQL 語法介紹

94

Page 95: PHP+MySQL 應用研習

SQL 簡介何謂 SQL   SQL 是「結構化查詢語言」( Structured Query Language)的簡稱,在 1970 年代初期所開發的,是專門用於關連式資料庫的一種查詢語言。利用 SQL 可以用來定義資料庫結構、建立表格、指定欄位型態與長度,也能新增、異動或查詢資料,它已經成為關聯式資料庫的標準語言。

目前 SQL 的標準化是所謂的「 SQL-92」或SQL2」,新一代的規格「 SQL-99」仍在持續發展中。

95

Page 96: PHP+MySQL 應用研習

SQL 簡介SQL 的分類 資料定義語言( Data Definition Language, DDL)

可以用來建立、更改或刪除 table、 schema、 domain、index 與 view 。主要指令有三: CREATE、 ALTER 與 DROP。

資料操作語言( Data Manipulation Language, DML)

DML 係用來操作資料。主要指令有四: SELECT、 INSERT、UPDATE 和 DELETE。

資料控制語言( Data Control Language, DCL )

DCL 提供資料庫的安全性。主要指令有四: GRANT 和 REVOKE、 COMMIT、 ROLLBACK

96

Page 97: PHP+MySQL 應用研習

常用 SQL 語法Select 語法

SELECT 欄位 1, 欄位 2, …

FROM 資料表名稱[WHERE 條件 ];

SELECT [ALL | DISTINCT] column1 [,column2]FROM table1 [,table2]  [WHERE "conditions"]  [GROUP BY "column-list"][HAVING "conditions] [ORDER BY "column-list"] [ASC | DESC] DISTINCT GROUPHAVINGORDER BYASC|DESC

97

Page 98: PHP+MySQL 應用研習

常用 SQL 語法Select 語法select * from user# 選擇所有紀錄所有欄位

select name,address from user order by name # 選擇所有紀錄 (name,address)兩個欄位,並按姓名升冪排列 (asc 升冪、 desc 降冪 )

select * from user where city = ‘ 台東縣‘# 選擇 city欄位為新竹縣的紀錄

select * from user where id >10 and id<20 # 選擇 id欄位介於 10至 20的紀錄

select * from user limit 3,10 # 選擇第 3 筆到 13筆紀錄

98

Page 99: PHP+MySQL 應用研習

常用 SQL 語法Insert 語法

INSERT INTO 資料表名稱 ( 欄位 1, 欄位 2, …)

VALUES (值 1, 值 2, …);

例如:Insert Into member(name,sex,county)

values (‘林政宏’ ,1,’$frm_county’)

99

Page 100: PHP+MySQL 應用研習

常用 SQL 語法Update 語法

UPDATE 資料表名稱 SET 欄位 1 = 值 1, 欄位 2

=值 2, … WHERE 條件 ;

例如:Update member set

name = ‘$frm_name’,

sex = ‘$frm_sex’,

county = ‘$frm_county’

where id = ‘$frm_id’

100

Page 101: PHP+MySQL 應用研習

常用 SQL 語法Delete 語法

DELETE FROM 資料表名稱 WHERE 條件 ;

例如: Delete From member where id = ‘$frm_id’

101

Page 102: PHP+MySQL 應用研習

常用 SQL 語法Create 語法 Create Database/Table 名稱# 建立一個新的資料庫 create database stuednt # 建立一個新的資料表create table student (  id smallint not null auto_increment, account varchar(12) binary not null, name varchar(12) not null, sex  tinyint(1) default 0 , date datetime, primary key(id));

102

Page 103: PHP+MySQL 應用研習

常用 SQL 語法Drop 語法

DROP TABLE 資料表名稱 ;

drop database student #刪除一個資料庫 drop table student #刪除一個資料表

103

Page 104: PHP+MySQL 應用研習

常用 SQL 語法Alter 語法# 更改 name 的資料型態,無法改變欄位名稱 alter table user modify name char(20) not null

# 新增 parent 的欄位alter table  user add parent char(12) not null

# 刪除 parent 的欄位alter table  std drop parent

104

Page 105: PHP+MySQL 應用研習

常用 SQL 語法Grant/Revoke 語法

grant select,insert,update,delete on books.*  to reader identified by ‘1234’→ 新增一位使用者 reader 密碼為 1234 對 books資料庫內的資料表有 select,insert,update,delete權限

grant all on books.*  to reader   identified by ‘1234’ → 新增一位使用者 reader 密碼為 1234 對 books資料庫內的資料表有所有權限

revoke all on books.* from reader→ 移除在 books資料庫中 reader 所有權限

105

Page 106: PHP+MySQL 應用研習

再探 SQLSelect 語法範例 (1)Select * from membersSelect address,name as n from members Select name as n from members mSelect * from members where name =‘$inputname’Select * from members where grade >3Select * from mmebers where grade != 3Select * from members where garde < 3 and sex = 1Select * from members where garde in (1,3,5,7)Select * from members where grade between 1 and

10Select * from members where address is Null

106

Page 107: PHP+MySQL 應用研習

再探 SQLSelect 語法範例 (2)Select name from members where address like ‘% 中山路 %’Select account from members where address like ‘_0001’Select distinct county from members

Select count(*) as totalnum from members

Select max(stdnum) as maxid from members

Select min(stdnum) as minid from members

Select sum(score) as totalnum from members

Select avg(score) as averge from members

Select * from members where 1=1

107

Page 108: PHP+MySQL 應用研習

再探 SQL

Select 語法範例 (3)Select count(*) as countynum,county from members

group by county

Select count(*) as countynum,county from members group by county having countynum > 10

Select * from members order by county desc,name asc

Select * from members limit 0,10

108

Page 109: PHP+MySQL 應用研習

再探 SQL

訂單編號OrderID

客戶編號CustomID

書籍編號BookID

訂貨時間OrderDate

1 1 3 2004-10-01

2 2 2 2005-01-12

3 4 5 2005-02-01

4 2 3 2005-01-30

書籍編號BookID

書籍名稱BookName

書籍價格BookCost

1 PHP 入門指南 5002 PHP5 寶典 6803 MySQL 學習手札 450

客戶編號CustomI

D

客戶姓名CustomNa

me

客戶地址CustomAddress

1 王姿慧 台北縣2 王姿雅 新竹縣3 王姿雯 台東縣 Custom

Order

Book109

Page 110: PHP+MySQL 應用研習

再探 SQL

資料表的結合

* Inner Join(內部連結 )

* Left Outer Join(左連結)

* Right Outer Join(右連結 )

* Cross Join(笛卡兒連結 )

110

Page 111: PHP+MySQL 應用研習

再探 SQLInner Join(內部連結 )選取出在 2005-01-24之後訂單 (order) ,並顯示訂單編號、書籍名稱、書籍價格

Select Order.OrderID, Book.BookName,Book.Cost from Order,book where Order.BookID = Book.BookID and Order.OrderDate >‘2005-01-24’

Select Order.OrderID, Book.BookName,Book.Cost from Order Inner Join Book on Order.BookID = Book.BookID where Order.OrderDate >‘2005-01-24’

Select O.OrderID, B.BookName,B.Cost from Order as O Inner Join Book as B on O.BookID = B.BookID where O.OrderDate >‘2005-01-24’

111

Page 112: PHP+MySQL 應用研習

再探 SQLInner Join(內部連結 )選取出在 2005-01-24之後訂單 (order) ,並顯示訂單編號、書籍名稱、書籍價格、客戶姓名

Select Order.OrderID, Book.BookName,Book.Cost,Custom.CustomName from Order,Book,Custom where Order.BookID = Book.BookID and

Order.CustomID = Custom.CustomID and Order.OrderDate >‘2005-01-24’

Select O.OrderID, B.BookName,B.Cost,C.CustomName from Order as O Inner Join Book as B Inner Join Custom as C on O.BookID = B.BookID and O.CustomID = C.CustomID where O.OrderDate >‘2005-01-24’

112

Page 113: PHP+MySQL 應用研習

再探 SQLLeft (Right) Outer Join( 左、右連結 )選取出在客戶資料表中沒有訂閱書籍的客戶

select C.CustomName from Custom as C Left Join Order as O on C.CustomID = O.CustomID where B.BookID is null

選取出在書籍資料表中沒有被訂閱的書籍

select B.BookName from Order as O Right Join Book as B on B.BookID = O.BookID where O.BookID is null

113

Page 114: PHP+MySQL 應用研習

再探 SQLCross Join(笛卡兒連結 )select * from Order as O Cross Join Book as B

select * from Order as O , Book as B

114

Page 115: PHP+MySQL 應用研習

系統開發流程 流程分析 (FA)

了解客戶需求、客戶作業流程 系統分析 (SA)

根據流程分析的結果,提出系統規劃並與客戶進行討論 系統設計 (SD)

評估系統採用的程式語言、資料庫、作業系統 專案的延展性、可擴充性

程式設計 (RD) 程式撰寫與開發

系統測試 (QA) 進行系統測試

115

Page 116: PHP+MySQL 應用研習

PHP+MySQL 開發應用

116

Page 117: PHP+MySQL 應用研習

PHP的MySQL函數連接資料庫 mysql_pconnect (server,username ,password)  //持續性的資料庫連接例如:

$conn=mysql_pconnect(‘localhost’,’root’,’1234’); mysql_connect(server,username ,password)

//非持續性的資料庫連接例如: $conn=mysql_connect(‘localhost’,’root’,’1234’);

117

Page 118: PHP+MySQL 應用研習

PHP的MySQL函數選擇資料庫 mysql_select_db (database_name ,[link_id])

例如:mysql_select_db("std");

118

Page 119: PHP+MySQL 應用研習

PHP的MySQL函數執行查詢 mysql_query (string query ,[ resource link_id])

例如:$result = mysql_query("select * from user ");

119

Page 120: PHP+MySQL 應用研習

PHP的MySQL函數處理查詢結果 (1)mysql_fetch_array (resource result, [intresult_type])

例如$link = mysql_pconnect(“localhost”, “learn”, “123”) or die(“無法建立連線 "); mysql_select_db("std") or die("無法選擇 std 資料庫 ");$myquery = "select * from std";$result = mysql_query($myquery) or die("查詢 Query 錯誤 ");

//取出資料列while($row = mysql_fetch_array($result)){ $row["name"],$row["city"],$row["stdnum"],$row["address"] ;}

120

Page 121: PHP+MySQL 應用研習

PHP的MySQL函數處理查詢結果 (2)mysql_num_rows (resource result, [intresult_type])

例如$link = mysql_pconnect(“localhost”, “learn”, “123”) or die(“無法建立連線 "); mysql_select_db("std") or die("無法選擇 std 資料庫 ");$myquery = "select * from std";$result = mysql_query($myquery) or die("查詢 Query 錯誤 ");

//取出資料列for($i=0;$i<mysql_num_rows($result);$i++) {$row = mysql_fetch_array($result); $row["name"],$row["city"],$row["stdnum"],$row["address"] ;}

121

Page 122: PHP+MySQL 應用研習

PHP的MySQL函數處理查詢結果 (3)mysql_num_rows (resource result, [intresult_type])

例如$num_rows = mysql_num_rows($result);for ( $i=0; $i<$num_rows; $i++ ) {list($value1, $value2) = mysql_fetch_row($result);

echo $value1,$value2;}

while ( list($value1, $value2) = mysql_fetch_row($result) ) { echo $value1,$value2;}

while ( $value = mysql_fetch_row($result) ) { echo $value[0],$value[1]; }

122

Page 123: PHP+MySQL 應用研習

PHP的MySQL函數關閉資料庫連結 mysql_close ([resource link_identifier])

例如:myql_close($conn)持續性的資料庫連結 (mysql_pconnect)才需關閉連結

123

Page 124: PHP+MySQL 應用研習

PHP的MySQL函數傳回剛插入紀錄筆數的 ID

mysql_insert_id ([resource $result])

例如:echo mysql_insert_id($result);

124

Page 125: PHP+MySQL 應用研習

PHP的MySQL函數顯示 SQL 執行錯誤mysql_error ( [resource $result])

例如:mysql_select_db("nonexistentdb", $link);

echo mysql_errno($link).mysql_error($link);

125

Page 126: PHP+MySQL 應用研習

安全性 顯示使用者輸入資料請加上 htmlspecialchars

避免使用者輸入時夾帶 HTML與 Java Script 語法

使用輸入者輸入資料進行 SQL查詢,請加上 addslashes 避免 SQL Injection 攻擊

允許使用者上傳檔案,請務必排除附檔名為 php 檔案 避免上傳具有執行力,危害整個系統

使用 session超級變數時要加上 IP檢查 避免在 PHPSESSID 不當被植入 SESSION變數值

MySQL 儲存會員密碼時,請務必以 md5 函數編碼過 避免因MySQL 洩漏所有密碼

126

Page 127: PHP+MySQL 應用研習

公佈欄系統實作 (規劃 )

127

功能需求會員帳號維護

管理者可新增、編輯、刪除會員帳號批次匯入會員帳號 (CSV) ,匯出會員帳號資料(CSV)會員修改個人帳號資料

公告系統 可發佈公告 (含附件檔 )

Page 128: PHP+MySQL 應用研習

公佈欄系統實作 (規劃 ) 目錄規劃

pub modules( 程式碼所在位置 ) includes(共用程式碼 ) images(圖檔 ) data( 上傳檔案 ) docs(文件說明 )

128

Page 129: PHP+MySQL 應用研習

公佈欄系統實作 (規劃 ) 資料庫規劃 資料庫名稱: pub

資料表 members、 pubs、 files

129

• 讓 phpMyAdmin(2.10.x)以 Big5 編碼顯示資料• 編輯 C:\xampp\phpMyAdmin\libraries\select_lang.lib.php

• 修改 339 行 zhtw-big5 多加 -utf-8

Page 130: PHP+MySQL 應用研習

公佈欄系統實作 (規劃 )

130

• 決定資料庫的編碼 (utf-8 ,big5 或 latin1?)• MySQL 文字編碼 CHARSET=big5• MySQL 連線校對 COLLATE=big5_chinese_ci

建立 meb_utf8 資料表,文字編碼為 utf8 、連線校對為 utf8_general_ci

CREATE TABLE `meb_utf8` ( `meb_id` int(11) NOT NULL auto_increment, `meb_account` varchar(32) NOT NULL, `meb_name` varchar(32) NOT NULL, PRIMARY KEY (`meb_id`)) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci

CHARSET = big5 | utf8 | latin1COLLATE = big5_chinese_ci | utf8_general_ci | latin1_general_ci

Page 131: PHP+MySQL 應用研習

公佈欄系統實作 (規劃 )

131

• 決定資料庫的編碼 (utf-8 ,big5 或 latin1?)

• 連線 MySQL編碼 mysql_query("set names 'UTF8';”);

mysql_query("set names 'BIG5';”);

• 瀏覽器網頁編碼 <meta http-equiv="content-type" content="text/html; charset=big5">

• 網頁檔案編碼 ( 當網頁中有中文字時 ) : big5 or utf8 ConvertZ 對檔案進行編碼轉換

Page 132: PHP+MySQL 應用研習

公佈欄系統實作 (規劃 )

132

<?phpmysql_select_db('pub',$conn);mysql_query("set names ‘BIG5';”);?><meta http-equiv="content-type" content="text/html; charset=big5"> <?php // 顯示資料表內容 ?>

<?phpmysql_select_db('pub',$conn);mysql_query("set names 'UTF8';”);?><meta http-equiv="content-type" content="text/html; charset=utf-8"> <?php // 顯示資料表內容 ?>

UTF8 版本 ( 檔案編碼為 UTF8)

Big5 版本 ( 檔案編碼為 Big5)

Page 133: PHP+MySQL 應用研習

公佈欄系統實作 (規劃 )

資料庫 建立資料庫 (以 phpMyAdmin 建立 ) 建立資料表 (以 phpMyAdmin匯入 )

資料夾 Xampp 安裝 pub 目錄複製至 C:\xampp\htdocs

133

Page 134: PHP+MySQL 應用研習

公佈欄系統實作 (初步 )

pub 資料庫關聯圖

134

DBDesign 產生

Page 135: PHP+MySQL 應用研習

公佈欄系統實作 (初步 ) config.inc.php 引入檔設定將系統一定會使用的變數、程式碼 ( 如與 MySQL 建立連結程式部分 ) 置於其中

將網頁檔分成將檔頭、檔身、檔尾。檔頭及檔尾寫成函數置於 libfunc.php 中供日後呼叫用

HTML 輸出部分建議以 Dreamweaver 視覺化編輯,提高生產力

只要是符合 member內的帳號與密碼,就允許通過,並記錄登入者的身份別 (session) 將這部分寫成函數 login() 置於中 libfunc.php

135

Page 136: PHP+MySQL 應用研習

Access 資料庫

136

Microsoft Access 資料庫擁有親合使用者界面,適合單機使用,一旦同時存取資料庫使用者超過三四個,效能會大幅降低。

對現有運作中的 Access處理方式 將現有的 Access 資料庫轉成 MySQL(使用M

yODBC) 透 ADODB以 PHP存取 Access 資料庫 

Page 137: PHP+MySQL 應用研習

ADODB 物件與 PEAR 應用

137

Page 138: PHP+MySQL 應用研習

PHP 應用程式

呈現層:網頁瀏覽器

呈現邏輯層: PHP產生 HTML內容,如 Smarty樣版

應用程式邏輯層: PHP進行程式作業

資料存取層: PHP進行資料存取,如 ADODB函式

資料層:如 MySQL

138

Page 139: PHP+MySQL 應用研習

物件導向觀念 何謂物件 將所需資料,以及操作該資料的函數,打包起來變成物件,並給物件一個名字以方便操作的概念。

結構化程式設計與物件導向程式設計

139

Page 140: PHP+MySQL 應用研習

物件與類別 類別與物件的關係

類別 (Class) :物件的設計藍圖 物件 (Object) :根據類別所建造出來的實體

(Instance) 重要名詞

屬性 (Property) 方法 (Method) 成員 (Member) 類別 (Class) 物件 (Object)

140

Page 141: PHP+MySQL 應用研習

物件導向三大支柱 封裝 (Encapsulation )

將資料 (變數 ) 與操作方式(函數)包在一起 繼承 (Inheritance)

繼承父類別所有屬性與方法。 多型 (Polymorphism )

同一件事情有兩種以上的解釋稱為『多型性』。

141

Page 142: PHP+MySQL 應用研習

類別與產生物件 語法: class 類別名稱 {

類別的定義}

例如: class car {

var $color ;function set_color($c){

$this->color=$c ;}function get_color(){

return $this->color ;}

}$mycar = new car;$mycar->ser_color(“ 藍色” );echo $mycar->get_color();

142

Page 143: PHP+MySQL 應用研習

建構元 (Constructor) 語法: class 類別名稱 {

function 類別名稱 (){ //宣告與類別名稱相同的函式 …. // 物件產生後會第一個被自動執

行 }}

例如: class car {

var $color ; fonction car() { $this->color=”白色” ; }

function set_color($c){$this->color=$c ;

}function get_color(){

return $this->color ;}

} 143

Page 144: PHP+MySQL 應用研習

有參數的建構元 (Constructor) class car {

var $color ; var $defcolor fonction car($defcolor) { $this->color = $defcolor; }

function set_color($c){$this->color=$c ;

}function get_color(){

return $this->color ;}

} $mycar = new car(“ 藍色” ); echo $mycar->get_color();

144

Page 145: PHP+MySQL 應用研習

繼承 (Inheritance) class A4car extends car {

function skylight($yn){ return ($yn == 1) ? ” 有天窗” : “無天

窗” ; }} $mycar = new A4car(“ 藍色” ); echo $mycar->get_color(); echo $mycar-> skylight(1);

145

Page 146: PHP+MySQL 應用研習

存取父類別的屬性與方法語法:

父類別名稱 ::父類別方法 例如: class A4car extends car { function skylight($yn){

if ($yn == 1) echo “你的車是” . $car::color . “ 色、有天窗” ;

else echo “你的車是” . $car::color . “ 色、無天窗” ; }} $mycar = new A4car(“ 藍色” ); echo $mycar-> skylight(1);

146

Page 147: PHP+MySQL 應用研習

多型 呼叫名稱相同的函數,卻在不同情況下有不同的表現,

稱之為函數的多型。當您不滿意由父類別那裡繼承到的函數時,您可以寫一個同名函數,把它蓋掉。

class A4car extends car {function set_color($c){ $this->color=$c ;

echo “顏色被設定” ; }}

147

Page 148: PHP+MySQL 應用研習

ADODB 的簡稱 ADODB是 Active Data Objects Data Base 的簡稱,它是一種PHP存取資料庫的函式元件,它提供統一介面存取資料庫,當資料庫異動時,如由 MySQL轉成 PostgreSQL時只需修該一行連結指令,可以完全不用修改任何程式碼

ADODB 支援的資料庫種類非常地多,例如:MySQL、 PostgreSQLOracle、 Informix、 MS SQL 、 Foxpro、 Access、Sybase、DB2 及 ODBC

參考網站:ADODB 入門 http://linux.tnc.edu.tw/techdoc/adodb/book1.html官方網站 http://adodb.sourceforge.net/

148

Page 149: PHP+MySQL 應用研習

ADODB使用

http://adodb.sourceforge.net/

將 adodb410.zip 解開,會建立一個新目錄 adodb

內有 adodb.inc.php 檔是每一次執行需要引入的,例如

include_once('路徑 /adodb/adodb.inc.php');

下載:

準備:

149

Page 150: PHP+MySQL 應用研習

ADODB使用一、建立連線

//建立 (MySQL) ADO 物件$conn = &ADONewConnection('mysql');

//與 MySQL建立連線$conn->Connect($hostname,$db_user,$db_passwd,$use_db)$conn->PConnect($hostname,$db_user,$db_passwd,$use_db)

//例如$conn->PConnect(“localhost”,”root”,”1234”);

$link = mysql_pconnect(“hostname",“user",“password");

mysql_select_db ($use_db)

150

Page 151: PHP+MySQL 應用研習

ADODB使用二、執行 SQL語法$res = $conn->Execute(SQL 語法 )//例如 :$res = $conn->Execute(“select * from member”);

$conn->Execute(“insert into member(name,sex) values(‘ 念娟’ ,1)”) or trigger_error(“ 新增紀錄錯誤 ", E_USER_ERROR);

$conn->Execute(“update member set name = ‘ 憶惠’ where id=‘1’ ”) or die(“更新紀錄錯誤 ");

$res = $conn->Execute(“delete member where id=‘1’ ”) if (!$res) echo $conn->ErrorMsg();

$res = mysql_query(SQL語法 )

151

Page 152: PHP+MySQL 應用研習

ADODB使用三、啟動偵錯模式$conn->debug=true;

//發生 SQL語法錯誤會出現以下訊息(mysql): insert into t values ('', ) 1064: You have an error in your SQL syntax. Check the manual that corresponds to your MySQL server version for the right syntax to use near ')' at line 1ADODB_mysql._Execute(insert into t values ('', ), false) % line 833, file: adodb.inc.php ADODB_mysql.Execute(insert into t values ('', )) % line 6, file: test.php You have an error in your SQL syntax. Check the manual that corresponds to your MySQL server version for the right syntax to use near ')' at line 1

152

Page 153: PHP+MySQL 應用研習

ADODB使用四、取得查詢紀錄 (1)$res = $conn->Execute(“select * from member”);

while($row = $res->FetchRow()) {

echo $row[“name”], $row[“address”];

}

$res = mysql_query(SQL語法 )

while($row = mysql_fetch_array($res)) {

echo $row[“name”],$row[“address”];

}

$ADODB_FETCH_MODE = ADODB_FETCH_NUM; $ADODB_FETCH_MODE = ADODB_FETCH_ASSOC ;

153

Page 154: PHP+MySQL 應用研習

ADODB使用五、取得查詢紀錄 (2)$res = $conn->Execute(“select * from member”);

for($i=0;$i<$res->RecordCount();$i++) {

$row = $res->FetchRow();

echo $row[“name”], $row[“address”];

}

$res = mysql_query(SQL 語法 )

for($i=0;$i<mysql_num_rows ($res);$i++){

$row = mysql_fetch_array($res);

echo echo $row[“name”],$row[“address”];

}

154

Page 155: PHP+MySQL 應用研習

ADODB使用六、取得一定筆數的查詢紀錄 ( 從 0-9共 10筆 )$res = $conn-> SelectLimit(“select * from member”,10,0); while($row = $res->FetchRow()) { echo $row[“name”], $row[“address”];}//第 1 參數: SQL語法//第 2 參數:取得筆數//第 3 參數:啟始位置 ( 以 0 開始 )

$res = mysql_query(SQL語法 limit $rec_start,$res_offset )

155

Page 156: PHP+MySQL 應用研習

ADODB使用七、取得欄位資料 $res = $conn-> SelectLimit(“select * from member”,1,0); if($res) for($i=0;$i<$res->FieldCount();$i++){ $fd = $res->FetchField($i); echo $fd->name,$fs->type; echo $res->MetaType ($fs->type); }}

mysql_num_fileds($res);// 欄位總數mysql_field_table ($res);// 欄位所在的表格mysql_filed_type($i);// 欄位型態mysql_filed_name($i);// 欄位名稱mysql_filed_lengths($i);// 欄位最大長度

156

Page 157: PHP+MySQL 應用研習

ADODB使用八、取得剛新增一筆資料的 id(auto_increment)$res = $conn-> Execute(“insert into member(name,sex) values(‘ 子龍’ ,1)”); echo $res->Insert_ID();

echo mysql_insert_id($res)

157

Page 158: PHP+MySQL 應用研習

ADODB使用九、快速分頁session_start();include(‘adodb/adodb-pager.inc.php’);$query = “select name as ‘ 姓名’ ,sex as ‘ 性別’ from members”; $res = $conn-> Execute( $query ); $page = new ADODB_Pager($conn, $query );$page->Render($rows_per_page=10);

158

Page 159: PHP+MySQL 應用研習

ADODB使用十、匯出 CSV檔include(‘adodb/toexport.inc.php’); $query = “select name as ‘ 姓名’ ,sex as ‘ 性別’ from members”; $res = $conn-> Execute( $query ); $pt = fopen(‘test.csv’, “w”); if ($pt) { rs2csvfile($res, $pt); fclose($pt); }

159

Page 160: PHP+MySQL 應用研習

PEAR (PHP Extension and Application Repository)

160

PEAR的開始是從 1999年 11月 2l日。有一位名叫 Stig S.Bakken 的先生,這位仁兄發起了一個專案, 號召許多的 PHP高手來共同投

入,他首先為這個專案建立了一些程式碼的基礎規則,希望 PHP的開發者加入這個專案時所撰寫的 PHP程式碼都需要遵守這些規則。

這個專案名稱就是 PEAR,其實是 PHP Extension and Application Repository的縮寫,意即「 PHP的延續與應用程式庫」,簡單的來說 PEAR其實是一個 PHP 的官方開放源碼物件庫。 PEAR將 PHP程序開發過程中常用的功能編寫成物件庫,涵蓋頁面呈面、資料庫查詢、文件操作、資料結構、網路協定等許多方面,用戶可以很方便地使用。 PEAR 的大部分 Package採用 LGPL、 PHP、 BSD許可證,可以自由地使用源碼 。

「不要重複發明輪子!」 PEAR 是為 PHP 程式碼的重用而開發的。使用 PEAR 可以大大提高 PHP 程式的開發效率。前人已經完成的工作,我們可以直接使用,不需要重複開發,更可以保證開發程式碼的質量

Page 161: PHP+MySQL 應用研習

PEAR

161

套件庫的分類 - 共 35類

http://pear.php.net/packages.php

Page 162: PHP+MySQL 應用研習

PEAR – 安裝 先安裝 PEAR 的一些基本套件,所謂的「基本套件」 就是所有 PEAR 套件都需要的套件,例如,除錯是每一個套件都需要的,所以基本套件中就包含了除錯套件,只有先安裝除錯的套件,其它的套件才可以順利進行除錯。

針對開發者的需求,安裝特定的套件。例如,安裝完基本套件後.若開發者想在網頁中加入計算執行時間的功能,就必須用指令安裝Benchmark 套件,這個套件不是基本套件,必須由開發者自行安裝。

Page 163: PHP+MySQL 應用研習

PEAR 應用類別 1.AUTH 登入認證 2.Pager 分頁 3.Spreadsheet Excel 讀取 xls 與寫入 xls 4.XML RSS 輸出 5.HTML Area 網頁所見即所得編輯器 6.PDF 輸出

163

Page 164: PHP+MySQL 應用研習

PEAR – Auth認證物件應用 //引入 Auth.php 物件檔 require_once('Auth/Auth.php');

// 建立 Auth 物件前的參數 $parms = array( 'dsn' => "mysql://root:1234@localhost/pub", //MySQL帳號 :MySQL密碼 @MySQL主機 / 資料庫

'table'=> 'members', //紀錄帳號的資料表 'usernamecol' => 'meb_account', //帳號欄位名稱 'passwordcol' => 'meb_passwd', //密碼欄位名稱 'cryptType' => True, //啟動 MD5加密 'db_fields' => array('meb_name','meb_mode','meb_id') //額外欄位名稱 );

// 建立 Auth 物件 $auth = new Auth("DB",$parms,show_login_frm); //容器 DB 登入表單 show_login_frm $auth->start(); if($auth->checkAuth()){ //登入成功 return true; }

Page 165: PHP+MySQL 應用研習

PEAR – Pager分頁物件應用 //引入 Pager 物件檔 require_once('../includes/Pear/Pager/Pager.php'); // 建立查詢 $res_pub = $conn->Execute (“select * from pubs”)

while($row_pub = mysql_fetch_row($res_pub)){ $rows[] = $row_pub; } $parms = array( 'mode'=>'Jumping', //Jumping or Sliding 兩種模式 'perPage'=>10, // 每頁出現筆數 'delta'=>5, // 頁面檢索會出現的頁碼數 'itemData' =>$rows // 要顯示資料組成的陣列 ); //$pager = new Pager($parms); $pager = Pager::factory($parms); //PHP5請採用此種呼叫 $datas = $pager->GetPageData();

Page 166: PHP+MySQL 應用研習

PEAR – Spreadsheet Excel 物件應用 $temp_filename = date("Ymdhis"). '.xls';

require_once('Spreadsheet_Excel_Writer/Writer.php'); $workbook = new Spreadsheet_Excel_Writer(); // 初始化類 $workbook->setVersion(8); $worksheet =& $workbook->addWorksheet('sheet-1');

// 加入一個工作表 sheet-1 $worksheet->setInputEncoding('utf-8'); for ($row = 0; $row < count($data); $row ++) { for ($col = 0; $col < count($data[0]); $col ++) { $worksheet->writeString($row, $col, $data[$row][$col]);

// 在 sheet-1 中寫入數據 } } $workbook->send($temp_filename); // 發送 Excel 文件名供下載 $workbook->close(); // 完成下載

Page 167: PHP+MySQL 應用研習

PEAR – XML RSS 物件應用 //引入 Serializer 物件檔 require_once("XML/Serializer.php");

$option = array("indent"=> " ", "linebreak"=> "\n“,,"addDecl" => true, "encoding"=> "utf-8","rootName" => "rss","rootAttributes" =>

array("version" => 2),"defaultTagName"=> "item");

$msg_body[] = array( 'title'=>"{$row_pub["pub_title"]}", 'link'=>"http://localhost/pub_b/index.php?pub_id={$row_pub["pub_id"]}", 'description'=> "{$row_pub["pub_body"]}" );

$data['channel'] = array_merge($msg_head,$msg_body); $serializer = new XML_Serializer($option); if($serializer->serialize($data)){ header('Content-type: text/xml'); echo $serializer->getSerializedData(); }

Page 168: PHP+MySQL 應用研習

無障礙網頁開發規範

168

國內「無障礙網頁開發規範」 14條規範

90條相關的檢測要點 分屬: 3 個優先等級

第 1優先等級:網頁內容開發者在開發網頁時必須遵循這個等級的檢測碼。

第 2優先等級:網頁內容開發者在開發網頁時應該滿足這個等級的檢測碼。

第 3優先等級:網頁內容開發者在開發網頁時可以納入這個等級檢測碼的要求。

A+ 等級:通過第 1優先等級無障礙設計,且具有定位點 (:::)搭配鍵盤快速鍵 (Accesskey)- 原第 3優先等級、網站導覽功能 (Sitemap) - 原第 2優先等級,及網頁瀏覽工具具有使用鍵盤設計 - 原第 2優先等級。

標章: A標章:已符合第 1優先等級之無障礙設計規範。 A+標章:已符合第 1優先及 A+ 等級之無障礙設計規範。 AA標章:已符合第 1 及第 2優先等級之無障礙設計規範。 AAA標章:已符合第 1 、第 2 及第 3優先等級之無障礙設計規範。

Page 169: PHP+MySQL 應用研習

標章申請流程

169

1. 通過機器檢測 (Freego)

2. 自行完成人工檢測建議3. 加入無障礙空間服務網會員4. 按下申請標章登錄按鈕 5. 填寫相關資料及上傳檢測結果6. 依網站回傳資訊設定標章連結路徑7. 等待無障礙空間服務網進行人工檢測8. 退件:檢視全網站修正相關錯誤,回到步驟 5

9. 修正:進行修正後回覆後完成

Page 170: PHP+MySQL 應用研習

常見退件錯誤 (1)

170

網站導覽 (SITE MAP)未設定,或按 TAB三次未到達網站定位點 ( 導盲磚。

Page 171: PHP+MySQL 應用研習

常見退件錯誤 (2)

171

定位其顯示方式是利用三個冒號 (:::)來代表,且需要搭配快速鍵設計來使用。主要用途在於幫助使用者快速定位及搜尋。定位點配置建議中間主內容區使用 ALT+C(C代表CONTENT) ,左側區使用 ALT+L ,右側區使用 ALT+R。

<a accesskey=“C" href="accesskey.php" title="" tableindex="100">:::</a>

Page 172: PHP+MySQL 應用研習

常見退件錯誤 (3)

172

各項資料表格的行列標題請使用正確 TH標籤。

使用 th標籤表示行列主題

Page 173: PHP+MySQL 應用研習

常見退件錯誤 (4)

173

網頁在 JAVA SCRIPT不支援時無法使用,請提供替代方案及替代文字說明。

滑鼠 鍵盤Onmousedown Onkeydown

Onmouseseup Onkeyup

Onclick Onkeypress

Onmouseover Onfocus

Onmouseout Onblur

<noscript> Javascript 不支援時替代方案</noscript>

<a href=“javascript:sideshow()” onkeypress =“javascript:sideshow()”> 顯示 </a>

Page 174: PHP+MySQL 應用研習

常見退件錯誤 (5)

174

各項不同圖片請提供不同且有意義替代文字說明或文字圖片提供文字詳細描述內容。

項目符號 ALT =“*”

無意義圖示 ALT =“”

相簿中的相片 ALT 值都要不一樣

Page 175: PHP+MySQL 應用研習

常見退件錯誤 (6)

175

影音媒體未提供內容說明

<embed src=“” quality=“high” pluginspage=“http://www.macromedia.com/go/getflashplayer” type=“application/x-shockwave-flash”>

<noembed>當 Embed失敗時提供替代方案 </noembed>

Page 176: PHP+MySQL 應用研習

常見退件錯誤 (7)

176

盡量不要使用 javascript:history.back() 框架使用方式 <frameset rows="*" cols="*">

<frame src="menu.php" name="left" title=" 左側選單區 " >

<frame src="first.php" name="right" title="右側顯示區 " >

</frameset>

<noframes>

框架不支援時替代方案 </noframes>

Page 177: PHP+MySQL 應用研習

Smarty 樣版

177

Page 178: PHP+MySQL 應用研習

樣版PHP程式碼與 HTML交雜在一起,產生1.程式複雜化 ( 有邏輯運算又有視覺展現 )2.程式設計師無法和美工設計者協同合作,在大的專案 更顯窘態

使用樣版可將程式邏輯與網頁展現分離,讓程式人員與美工人員各司其值。目前 PHP的樣版有PHPLib、 FastTemplat e、 Smarty等,

在何種情況不建議使用樣版1.小專案,一個人獨自開發整個系統,因為要多學一套樣 版語言2.要求程式執行速度,使用樣版執行速度較慢 ( 因為多的一 層樣版引擎進行解譯動作 )

178

Page 179: PHP+MySQL 應用研習

樣版

圖檔來源: PHP5 知識交換中心 179

Page 180: PHP+MySQL 應用研習

Smarty 樣版

圖檔來源: PHP5 知識交換中心 180

Page 181: PHP+MySQL 應用研習

Smarty 樣版

參考網站:Smarty 入門 http://www.php5.idv.tw/documents/smarty/smarty20040209.htm

官方網站 http://smarty.php.net/

一、下載 http://smarty.php.net/do_download.php?download_file=Smarty-2.6.6.tar.gz

二、安裝1.將 Smarty-2.6.6.tar.gz解開,會建立一個新目錄 Smarty-2.6.6

2.在專案底下建立以下目錄 templates //存放網頁樣版 templates_c //存放編譯後的 PHP檔 (權限設成 777)

configs //存放設定檔 cache //存放快取檔案 (權限設成 777)

class //*將 Smarty-2.6.6中 libs內所有檔案複製至此 modules //* 各模組程式至於此 includes //*共同引入檔

181

Page 182: PHP+MySQL 應用研習

Smarty 樣版的使用步驟

1.引入 Smarty.class.php 檔案2.產生 Smarty 物件3.設定 Smarty 物件的參數

5.顯示樣版

4.設定樣版中的變數

將它整合至config.inc.php

182

Page 183: PHP+MySQL 應用研習

Smarty 樣版的使用範例 include (“class/Smarty.class.php”); //引入 Smarty 物件 define(‘__SITE_ROOT’, ‘c:/appserv/www/learn’); // 定義網站根目錄 $tpl = new Smarty(); // 產生樣版物件

//樣版預設值 $tpl->template_dir = __SITE_ROOT . "/templates/"; $tpl->compile_dir = __SITE_ROOT . "/templates_c/"; $tpl->config_dir = __SITE_ROOT . "/configs/"; $tpl->cache_dir = __SITE_ROOT . "/cache/"; $tpl->left_delimiter = '<{'; $tpl->right_delimiter = '}>';

// 指定變數 $tpl->assign(‘title’,’ 第一個 Smarty 程式’ ); $tpl->assign(‘msg’,’多媒體教材平台’ ); // 顯示樣版 $tpl->display(‘test.htm’);

main.php183

Page 184: PHP+MySQL 應用研習

Smarty 樣版的使用範例<html><head>

<title><{title}></title></head><body> <font size=“5”> <{msg}> </a></body></html>

test.htm

184

多媒體教材平台

Page 185: PHP+MySQL 應用研習

Smarty 樣版語法一、基本語法 (Basic Syntax)

二、變數 (Variables)

三、修飾變數 (Variable Modifiers )

四、內建函數 (Built-in Functions )

五、樣版應用函數 (Custom Functions )

185

Page 186: PHP+MySQL 應用研習

Smarty 樣版 - 基本語法一、註解<{* 這是一個註解 *}>

二、函數<{config_load file="colors.conf"}>

<{include file="header.tpl"}>

<{if $highlight_name}>

Welcome, <font color=“<{#fontColor#}>"><{$name}>!</font>

<{else}>

Welcome, <{$name}>!

<{/if}>

<{include file="footer.tpl"} >

186

Page 187: PHP+MySQL 應用研習

Smarty 樣版 - 基本語法三、函數的參數<{include file="header.tpl"}>

<{include file=$includeFile}>

<{include file=#includeFile#}>

<{html_select_date display_days=yes}>

<select name="company"> <{html_options values=$vals selected=$selected output=$output} >

</select>

Smarty函數的參數類似 HTML 的寫法,參數如有預設值,可以不設定,另外參數值若為布林值時,可設成 true, on,yes, 或 false, off, no

187

Page 188: PHP+MySQL 應用研習

Smarty 樣版 - 基本語法三、將雙引號內 "" 代入變數 語法範例

<{func var="test $foo test"}> <-- sees $foo

<{func var="test $foo_bar test"} > <-- sees $foo_bar

<{func var="test $foo[0] test"} > <-- sees $foo[0]

<{func var="test $foo[bar] test"} > <-- sees $foo[bar]

<{func var="test $foo.bar test"} > <-- sees $foo (not $foo.bar)

<{func var="test `$foo.bar` test"} > <-- sees $foo.bar

實際範例

<{include file="subdir/$tpl_name.tpl"} > <-- will replace $tpl_name with value

<{cycle values="one,two,`$smarty.config.myval`"}> <-- must have backticks

188

Page 189: PHP+MySQL 應用研習

Smarty 樣版 - 基本語法四、運算 <{$foo+1}>

<{$foo*$bar}>

< {* some more complicated examples *}>

< {$foo->bar-$bar[1]*$baz->foo->bar()-3*7}>

< {if ($foo+$bar.test%$baz*134232+10+$b+10)}>

< {$foo|truncate:"`$fooTruncCount/$barTruncFactor-1`"} >

<{assign var="foo" value="`$foo+$bar`"} >

189

Page 190: PHP+MySQL 應用研習

Smarty 樣版 - 基本語法五、跳脫符號

<?php$smarty = new Smarty;$smarty->left_delimiter = '<{';$smarty->right_delimiter = '}>';$smarty->assign('foo', 'bar');$smarty->display('example.tpl');?>

190

Page 191: PHP+MySQL 應用研習

Smarty 樣版 -變數一、由 PHP 指派變數給樣版 (變數、陣列、物件 )

$smarty->assign(‘firstname ’,’Grace’); // 單一變數$smarty->assign(‘Contacts’,      array( ‘fax’ => ‘555-222-9876’,            ‘email’ => ‘[email protected]’,           ‘phone’ => array(‘home’ => ‘555-444-3333’,                            ‘cell’ => ‘555-111-1234’ ))); //陣列

$smarty->assign(‘myobj’,$conn); // 物件

樣版中取得方式<{$firstname}> <{* 單一變數 *}>

<{$Contacts.fax}><{$Contacts.phone.home}> <{* 取得陣列以 . *}><{$Contacts[0]}><{$Contacts[2][0]}> <{* 取得陣列以 [] *}>

<{$myobj->setcolor()}> <{* 取得物件以 -> *}>

191

Page 192: PHP+MySQL 應用研習

Smarty 樣版 -變數二、從樣版中載入 config 檔

foo.conf: pageTitle = "This is mine" bodyBgColor = "#eeeeee" tableBorderSize = "3" tableBgColor = "#bbbbbb" rowBgColor = "#cccccc“

index.tpl: <{config_load file=“foo.conf”} > <html> <title> <{#pageTitle#} ></title> <body bgcolor=“<{#bodyBgColor#}>"> <table border=“<{#tableBorderSize#}>” bgcolor=“<{#tableBgColor#}>"> <tr bgcolor=“<{#rowBgColor#}>”> <td>First</td> <td>Last</td> <td>Address</td> </tr> </table> </body> </html >

192

Page 193: PHP+MySQL 應用研習

Smarty 樣版 -變數三、 <{$smarty}> 保留變數 (1)

<{* display value of page from URL (GET) *}> <{$smarty.get.page}> <{* display the variable "page" from a form (POST) *}> <{$smarty.post.page}>

<{* display the value of the cookie "username" *}><{$smarty.cookies.username}>

<{* display the server variable "SERVER_NAME" *}><{$smarty.server.SERVER_NAME}>

<{* display the php session variable "id" *}> <{$smarty.session.id} >

<{* display the variable "username" from merged get/post/cookies/server/env *}>{$smarty.request.username} >

193

Page 194: PHP+MySQL 應用研習

Smarty 樣版 -變數三、 <{$smarty}> 保留變數 (2)

{$smarty.now}

{$smarty.const}

{$smarty.capture}

{$smarty.config}

{$smarty.section}, {$smarty.foreach}

{$smarty.template}

{$smarty.version}

{$smarty.ldelim} and {$smarty.rdelim}

194

Page 195: PHP+MySQL 應用研習

Smarty 樣版 - 修飾變數常用的修飾變數

//換行 (遇 \n換成 <br>)

1. {$articleTitle|nl2br}

// 計算字元2. {$articleTitle|count_characters}

// 時間格式3. {$yesterday|date_format:"%H:%M:%S"}

//換行 (幾個字元就換行 )

4. {$articleTitle|wordwrap:30:"<br />\n"}

更多修飾變數

195

Page 196: PHP+MySQL 應用研習

Smarty 樣版 - 修飾變數

capitalize 首字大寫 nl2br 換行count_characters

計算字元 regex_replace

正規化取代

cat 連結字串 replace 取代count_paragraphs

計算段落數 spacify 說明符號

count_sentences

計算句子數 string_format

字串格式

count_words 計算字數 strip 去除date_format 日期時間格式 strip_tags 去除標籤default 預設值 (變數未指

派 )truncate 保留前幾個字

escape 跳脫 upper 轉小寫indent 縮排 Wordwrap 幾個字元就換

行lower 轉小寫

196

Page 197: PHP+MySQL 應用研習

Smarty 樣版 -內建函數一、 config_load

二、 if,elseif,else

<{if $name eq "Fred"}>

Welcome Sir.

<{elseif $name eq "Wilma"} >

Welcome Ma'am.

<{else} >

Welcome, whatever you are.

<{/if}

197

Page 198: PHP+MySQL 應用研習

Smarty 樣版 -內建函數三、 section,sectionelse

<{section name=customer loop=$custid}>

id: <{ $custid[customer] }><br>

<{/section}>

<{section name=customer loop=$custid}> id: <{ $custid[customer]}><br> name:< {$name[customer]}><br> address: <{$address[customer]}><br>

<{section name=contact loop=$contact_type[customer]}> <{$contact_type[customer][contact]}><br> <{/section}> <p> <{/section}>

$s_custid = array(1,2,3,4 }$s_contact_type = array(array(‘598766’,’654372’), array(‘876312’,’5432233’), array(‘653323’,’2334556’), array(‘765432’,’3244545’))

$tpl->assign($custid,$s_custid);$tpl->assign($name,$s_name);$tpl->assign($address,$s_address);$tpl->assign($contact_type,$s_contact_type)

198

Page 199: PHP+MySQL 應用研習

Smarty 樣版 -內建函數三、 section,sectionelse

<{section name=customer loop=$contacts}> name: <{$contacts[customer].name}><br> home: <{$contacts[customer][home]}><br> cell: <{$contacts[customer].cell}><br> e-mail: <{$contacts[customer][email]}><p>

<{/section} >

<{section name=customer loop=$custid}> id: <{$custid[customer]}><br> <{sectionelse}> there are no values in $custid. <{/section} >

199

Page 200: PHP+MySQL 應用研習

Smarty 樣版 -內建函數三、 section,sectionelse

<{section name=customer loop=$custid}> <{$smarty.section.customer.index}> id: <{$custid[customer]}><br> <{/section} >

<{section name=customer loop=$custid}> <{$smarty.section.customer.index}> id: <{$custid[customer]}><br> <{if $custid[customer.index_prev] ne $custid[customer.index]}> The customer id changed<br> <{/if}> <{/section} >

200

Page 201: PHP+MySQL 應用研習

Smarty 樣版 -樣版應用函數一、 html_checkboxes $smarty->assign('cust_checkboxes', array(              1000 => 'Joe Schmoe',             1001 => 'Jack Smith',             1002 => 'Jane Johnson',            1003 => 'Charlie Brown'));$smarty->assign('customer_id', 1001);

<{html_checkboxes name="id" options=$cust_checkboxes selected=$customer_id separator=“<br />"} >

<label><input type="checkbox" name="id[]" value="1000" />Joe Schmoe</label><br /> <label><input type="checkbox" name="id[]" value="1001" checked="checked" />Jack Smith</label><br />

<label><input type="checkbox" name="id[]" value="1002" />Jane Johnson</label><br /> <label><input type="checkbox" name="id[]" value="1003" />Charlie Brown</label><br />

201

Page 202: PHP+MySQL 應用研習

Smarty 樣版 -樣版應用函數二、 html_image {html_image file="pumpkin.jpg"}

<img src="pumpkin.jpg" alt="" border="0" width="44" height="68" />

202

Page 203: PHP+MySQL 應用研習

Smarty 樣版 -樣版應用函數三、 html_radiossmarty->assign('cust_radios',

array( 1000 => 'Joe Schmoe', 1001 => 'Jack Smith',1002 => 'Jane Johnson', 1003 => 'Charlie Brown'));

$smarty->assign('customer_id', 1001);

{html_radios name="id" options=$cust_radios selected=$customer_id separator="<br />"}

<input type="radio" name="id" value="1000">Joe Schmoe<br /> <input type="radio" name="id" value="1001" checked="checked">Jack Smith<br /> <input type="radio" name="id" value="1002">Jane Johnson<br /> <input type="radio" name="id" value="1003">Charlie Brown<br />

203

Page 204: PHP+MySQL 應用研習

Smarty 樣版 -樣版應用函數四、 html_options $smarty->assign('cust_options',

array( 1001 => 'Joe Schmoe', 1002 => ‘Jack Smith', 1003 => 'Jane Johnson', 1004 => 'Charlie Brown'));

$smarty->assign('customer_id', 1001);

<select name=customer_id> <{html_options options=$cust_options selected=$customer_id} ></select>

<select name=customer_id> <option value="1000">Joe Schmoe</option> <option value="1001" selected="selected">Jack Smith</option> <option value="1002">Jane Johnson</option> <option value="1003">Charlie Brown</option> </select>

204

Page 205: PHP+MySQL 應用研習

Smarty 樣版 -樣版應用函數五、 html_select_date 、 html_select_time

<{html_select_date prefix="StartDate" time=$time start_year="-5" end_year="+1" display_days=false} >

<{html_select_time use_24_hours=true} >

205

Page 206: PHP+MySQL 應用研習

Smarty 樣版 -樣版應用函數六、 html_table

<?phprequire('Smarty.class.php');$smarty = new Smarty;$smarty->assign('data',array(1,2,3,4,5,6,7,8,9));$smarty->assign('tr',array('bgcolor="#eeeeee"','bgcolor="#dddddd"'));$smarty->display('index.tpl');?>

<{html_table loop=$data}>

<{html_table loop=$data cols=4 table_attr='border="0"'}>

<{html_table loop=$data cols=4 tr_attr=$tr}>

206

Page 207: PHP+MySQL 應用研習

XOOPS與Moodle 模組開發 XOOPS模組開發

http://xoops.tnc.edu.tw/modules/tadbook2/open_book.php?book_sn=1

http://php.tcc.edu.tw/xoops/book1.html

Moodle模組開發 http://docs.moodle.org/

207

Page 208: PHP+MySQL 應用研習

Shool、Dyna、 Library 關於學校整合模組 (School) 、動態網頁模組 (dyna) 、圖書管理系統 (Library)

學校整合模組 (School) 示範點: http://www.pajh.hcc.edu.tw/school《說明》提供一套國中小校園網站建置解決方案,由模組單獨使用到全面使用,共計班級、教師、學生網頁登錄、教職員工簡介 、學校公告、行事曆、營養午餐、段考試題、活動相簿、師生作品相簿、網網相連、檔案下載、影音媒體櫃、維修通報、教室預約、線上投票、留言版、討論區、計數器等模組。《用途》學校網站建置或主題網站建置

動態網頁模組 (Dyna) 示範點: http://dyna2.nc.hcc.edu.tw《說明》提供一套可以快速完成網站的模組,既可以一起使用成為一個完整網站,也可以分開使用加在自己網頁中單獨使用。計有最新消息 、最新公告 、行事曆 、相簿冊 、網網相連 、檔案管理 、線上投票 、留言版、討論區、計數 器、影音櫃、樹狀選單 ( 整合以上模組成為獨立網站 ) 等。《用途》學校老師製作教學網站、製作班級網頁、各處室網站、各種主題式網站

圖書媒體管理系統 (Library) 示範點: http://www.pajh.hcc.edu.tw/library《說明》提供國中小圖書媒體借用管理系統可分為 (1) 開放界面 :主要提供一般讀者查詢、心得發表等功能 (2)管理界面 : 為圖書、設備、媒體、雜誌管理(借閱、歸還、新增、編輯、刪除等)《用途》圖書室書籍媒體借閱自動化

檔案下載 : http://dyna.hcc.edu.tw 備用網站: http://dyna.idv.tw