Download as pdf or txt
Download as pdf or txt
You are on page 1of 44

PHP 網站設計經驗分享

ㄚ凱 (Darkhero)
SA@Taipei
Zend Certified Engineer

1
大綱

認識 PHP

PHP 設計經驗談
– 為什麼要用樣板 ?
– 為什麼要用資料庫介面 ?
– 什麼是 PEAR ?
– PHP + MySQL4.1s

2
認識 PHP

跨平台網頁程式語言

PHP 可以做的事情

大量的 OpenSource 套件

3
跨平台的 PHP

LAMP
– Linux + Apache + MySQL + PHP

幾乎所有的 Linux Dist 預設都有這些套件

WAMP
– Windows + Apache + MySQL + PHP

快速環境建立
– Appserv
– Easyphp

PHP For IIS

4
PHP 可以做的事情

Server-side scripting
– 網頁程式設計

Command line scripting
– 用 PHP 來寫 Shell Script

Client-side GUI applications
– PHP-GTK

5
大量的 OpenSource 套件 (1)

Forum:
– phpBB2

CMS
– Xoops
– Mambo,Joomla
– PhpNuke
– postnuke

Calender
– PHP iCalendar
– phpCalendar
– EasyPHPCalendar
6
大量的 OpenSource 套件 (2)

Groupware
– Egroupware
– DotProject
– Phpgroupware

List
– PHPList

Webmail
– Squirrelmail

Blog
– WordPress
– Plog
7
初學者的問題

程式碼直接寫在 HTML 中
– 市面上的書大都以此為教學
– 市面上大部份 PHP 的書本沒有說到樣版系統
– 習慣直接用 echo 輸出資料

不夠熟悉 HTML
– 表格跨行,跨欄的使用
– 表單的設計
– POST 與 GET 的使用時機

不習慣在 register_globals=Off 工作

錯誤訊息的不熟悉
– 對英文的恐懼 ?
8
怎樣的程度才不算新手 ?

清楚了解 Server Side 跟 Client Side 的差別

清楚了解 register_globals 設定的意義

不會搞不清邏輯判斷跟變數值指定的分別

清楚了解 POST 跟 GET,COOKIE 跟 Session 等的
關係與差別

對於基本錯誤訊息有辦法解讀

具備基本 HTML 分析能力
– 一般常用 TAG 分析與參數使用
– TABLE tag 結構分析

9
PHP 設計經驗談

PHP 程式設計標準

幾個進階時可以考慮學習
– 建立一個標準的檔案架構
– 至少熟悉一套樣版程式
– 採用資料庫介面
– 多多使用 PEAR

MySQL4.1
– Sub-Select
– Charset 的影響

10
建立一個標準的檔案架構

你應該建立一個標準的檔案目錄架構
– 函式庫該放哪裡?
– 樣版該放哪裡 ?
– 外掛程式 ?
– 是否有網站設定檔 ?
– 是否有管理介面 ?

多參考目前幾個 OpenSource 的 CMS
– Xoops, phpbb2,mambo 等

可以簡單的 , 就不要複雜

11
PHP 程式設計標準

訂定專案程式設計標準的好處
– 變數,物件,函式有固定的命名方式
– 專案的程式風格統一,降低維護複雜度

進行中的專案不要任意變換標準
– 標準訂定應該是專案一開始就要決定的
– 標準訂定應該由專案參與人一同討論決定

可以參考的設計標準資料
– PHP 程式設計標準
http://doc.twpug.net/php_coding_standard.h
tml

12
PHP 程式設計標準之外 (1)

架構整個網站的時候應該使用的方法
– 至少使用三層式程式設計

表現層 - 實際輸出 html

邏輯層 - 處理程式流程

資料處理層 - 處理資料存取
– 就是使用 MVC(Model-View-Controller) 架構你
的網站
– 函式,物件之中不要直接輸出資料

儘量採用 return $html 的方式處理

13
PHP 程式設計標準之外 (2)

該用 echo 還是 printf ?
– 輸出一般字串用 echo
– 輸出內含變數的字串用 printf

printf('a href='%s' target='%s'>%s</a>',$url,$
target,$name);

printf('a href='%s' target='%s'>%s</a>',array
($url,$target,$name));
– 當建立 SQL 語法的時候用 sprintf

$SQL = sprintf('Select * from %s where ID = %
s',$tableName,$id);

14
至少熟悉一套樣版程式

為什麼要用樣版 ?

兩套我推薦的樣版程式
– Smarty
– TBS

15
為什麼要用樣版 ?

別讓今天的程式,成為明天維護的負擔

美術設計不再為了都是程式碼的網頁苦惱

程式設計不再為了都是 HTML Tag 的程式苦惱

網站設計改版將會是輕鬆的事情

16
沒使用樣版的程式碼

17
使用樣版的程式碼

18
網頁樣版檔

19
官方推薦 Smarty

Smarty 為 PHP 推薦使用的樣版引擎
– http://smarty.php.net

Smarty 採用預先編譯樣版
– 速度較快

Smarty 可以直接 assign 物件,陣列等

Smarty 提供全域變數
– $smarty.get , $smarty.post ,$smarty.server

Smarty 可直接輸出靜態頁面進行 Cache

Smarty 支援外掛模組的使用
– SmartyValidate
20
輕量化的 Smarty-lite

較適合單純的樣版需求環境

速度較 Smarty 更快

系統記憶體需求較少

功能上較 Smarty 少一些
– 無法 assign 物件
– 少了輸出前中後的過濾器
– 不支援樣版存入資料庫的模式

21
小而強大的 TBS

TBS – TinyButStrong
– http://www.tinybutstrong.com

所見即所得的樣版引擎

支援 Cache

直接存取資料庫顯示資料
– $TBS->MergeBlock('blk1',$cnx_id,'select *
from t_country',$p_size,$p_num,$nbr_rec);

22
為什麼要用資料庫介面 ?

為了寫出通用各資料庫的 PHP 程式

更方便使用的資料庫的功能

減少程式撰寫上的複雜

23
ADOdb

降低 Windows 程式設計師學習門檻
– 部份介面設計類似 Microsoft's ADO

支援多種資料庫
– MySQL,PgSQL,Oracle,MSSQL etc......

增加了許多方便的方法,程式撰寫更輕鬆
– SelectLimit
– PageExecute,AtfirstPage,AtLastPage,Absolut
ePage
– getInsertSQL,getUpdateSQL,autoExecute

資料庫快取,同樣的資料不用再讀資料庫
– CacheExecute
– CachePageExecute 24
ADOdb-lite

ADOdb-lite 為 ADOdb 精簡版

資料庫支援程度幾乎不相上下

少了許多 ADOdb 提供的 Function

也減少了許多系統記憶體的耗用

25
ADOdb 開發範例

設計分頁功能
– 分頁功能的應用很多

留言版 , 討論區 , 資料列表 , 訂單列表 ..etc
– $rs = $db->PageExecute($sql,$onePageStep,$
_GET['page']);
if(!$rs->AtFirstPage()){
... // 進行上一頁聯結輸出
}
if(!$rs->AtLastPage()){
... // 進行下一頁聯結輸出
}

26
什麼是 PEAR

PHP Extension and Application Repository
– http://pear.php.net/
– 類似 Perl 的 CPAN
– 提供安裝程式與更新升級程式 pear

共 31 種分類的程式套件可供取用
– 常用的像 Database HTML Mail Networking

27
安裝 pear 提供的套件

常用的 pear 指令
– 檢視已安裝套件 pear list
– 檢視全部套件 pear list-all
– 檢視可升級套件 pear list-upgrades
– 安裝指定套件 pear install package_name
– 升級指定套件 pear upgrade package_name
– 升級全部套件 pear upgrade-all
– 移除指定套件 pear uninstall package_nam
e

安裝與移除的時候都會提示相依套件

28
幾個好用的 PEAR 套件

HTML 類 ●
PHP 類
– HTML_QuickForm – PHPUnit
– HTML_Table – PhpDocumentor
– Pager ●
Services 類

XML 類 – Services_Delicious
– XML_RSS – Services_Yahoo
– XML_sql2xml
– XML_Tree

Mail 類
– Mail
– Mail_Queue
29
MySQL4.1

不久的將來各 Linux Dist 將預設 MySQL 4.1

MySQL4.1 的優點
– 支援 Sub-Select
– 更完整的多國語系支援
– 速度更快

4.x 起 MySQL 有 Query Cache 功能

MySQL4.1 還差什麼 ?
– Trigger
– Stored Procedures

30
MySQL Subqueries

MySQL 4.1 以前並沒有 Subqueries

Subqueries 的好處
– SQL 語法更簡潔
– 可查詢的方式更多樣

請不要客氣的使用這個方便好用的功能吧 !

官方文件資料
– http://dev.mysql.com/doc/mysql/en/subqueri
es.html

31
Trigger 跟 Stored Procedures 呢 ?

MySQL4.x 沒有 Trigger,Stored Procedures

MySQL5 以後才會支援 Trigger

MySQL5 以後才會支援 Stored Procedures
– 不過目前 MySQL5 還在 beta 階段
– 但是目前已經有部份網站已經使用

http://www.pixnet.net/

32
讓 MySQL 更快

千萬不要忘記去調整你的 my.cnf
– /etc/my.cnf
– 可以參考 /usr/share/mysql 下的範例

既然有 query_cache 就別浪費

使用 EXPLAIN 去分析你的 SQL 語法 .

33
當更新到 MySQL4.1 常見問題

為什麼我的資料抓出來都是 ????

為什麼在 phpMyAdmin2.6 中看到的都是亂碼 ?

為何使用 myqldump 的資料庫都是亂碼 ?

34
一切都是多國語系支援惹的禍

4.1 後需要設定資料庫與 client 編碼
– 設定好資料庫預設語系

/etc/my.cnf
– [mysqld]
– default-character-set=utf8
– character-set-server = utf8
– collation-server = utf8_general_ci

如果系統都跑 utf8
– init_connect='SET NAMES utf8′
– default-character-set = utf8
– default-collation = utf8_general_ci
– PHP 連線 MySQL 後請設定 Client 編碼

當資料庫連線後送出 'set names utf8'
– $db->Execute('SET NAMES utf8');
– mysql_query('SET NAMES utf8');
35
一定要用 UTF8 嗎 ?

不一定要用 UTF8

資料庫或是資料表編碼指定

資料庫
– CREATE DATABASE `MyTABLE` DEFAULT CHARACTER SET big5
COLLATE big5_chinese_ci;

資料表
– CREATE TABLE `myTable` (
– ..... etc ....
– ) ENGINE=MyISAM DEFAULT CHARSET=big5 ;

儘量讓 Server 跟 Client 都用相同的 Char
– 若不同的 Character MySQL 會試著幫忙轉換
– 例如可以同一套 Database 資料 (utf8)
– 同時提供 big5 跟 gb2312 的 Client.

但是部份的轉換會失敗 , 所以會有像是漏字或 ?? 產生 36
匯出匯入語系設定

大部份的人會用 mysqldump 備份資料
– mysql4.1 以前你可以不指定語系
– mysql4.1 以後務必要指定語系
– mysqldump -u root -p --default-character-set=big5 my
Table

重新匯入資料
– 請記的也要加上語系設定
– mysql --default-character-set=big5 -u root -p < myTa
ble.sql

37
網站與參考文章 (1)

PHP
– http://www.php.net

Smarty
– http://smarty.php.net
– Smarty-Lite

http://www.paullockaby.com/projects/smarty-lig
ht/

PEAR
– http://pear.php.net

TBS – TinyButStrong
– http://www.tinybutstrong.com
38
網站與參考文章 (2)

ADOdb
– http://adodb.sf.net
– ADOdb-lite

http://adodblite.sf.net/

MySQL
– http://www.mysql.com

中文參考網站
– http://www.twpug.net
– http://www.php5.idv.tw

39
PHP Command line scripting

如果你沒有學 Shell Script 的編寫

如果你像我一樣基本上最熟的就是 PHP

或許你可以考慮用 PHP 寫 Command line scri
pting

40
PHP Command line scripting

需要些什麼
– 可執行的 PHP 執行檔

例如 Mandriva 是提供 php-cli 的套件
– 還有你要知道執行檔放在那

Mandriva 放在 /usr/bin/php

怎麼寫 ?
– 就跟網頁程式一樣

語法 , 可用的函式 , 輸出 ~ 都一樣

41
PHP Command line scripting

怎麼執行呢 ?
– 直接 [shell#] PHP ScriptFileName 去執行
– 在檔案開頭加上 #!/usr/bin/php -q

記的檔案要 chmod +x 喔

還有什麼要注意的 ?
– 執行時 include 的路徑

建議這類的檔案使用絕對路徑 include

尤其當該 script 是要放入 crontab 時
– 程式的輸出或許應該要去掉 html

42
如何邁向更進階 ?

Framework 的學習

Framework 的目的
– 簡化開發流程
– 加快效率
– 專注程序處理邏輯,而不是技術問題。

Framework 的缺點
– 學習曲線太長
– 初學者就學習 Framework 容易忽略基礎技術

43
幾個推薦的 Framework

CakePHP
– 參考 Ruby on Rails
– 較其他 frameword 輕量化

php.MVC
– 參考 Java 的 Struts

目前樂多日誌 (Blog.yam.com) 使用

Seagull
– 使用 PEAR 程式庫

PRADO
– Zend 獲獎作品 , 事件驅動模式
– Only PHP5
44

You might also like