PHP入門講義

1. 關於PHP

一、寫PHP的建議環境:Apache、PHP、MySQL

  1. Apache是網站伺服器軟體,好讓您在電腦中的網頁可以給全世界的人看到。當然斯斯有兩種,網站伺服器也有兩種,不....其實有很多種,例如windows下的IIS(唉唉ㄟ死),或很厲害的nginx...都是,但Apache牌子老,信用好,所以咱們就用它。 (PHP也可以裝在IIS網站伺服器上,與ASP並存,唯過程稍微複雜一點,且和此次研習無關,故有需要者請自行Google一下)
  2. MySQL是高效率的資料庫軟體,裝了它,您的電腦就擁有一套強大的資料庫伺服器。(八卦一下,MySQL後來被甲骨文買走了,原開發者又做了一套完全相容MySQL的資料庫,叫做菲傭瑪莉亞:MariaDB
  3. PHP則是活在網頁伺服器中的程式語言,配合資料庫,可以讓您開發出各種實用的網路應用程式系統,當然要做出沒路用的系統也可以。
  4. 這三者都是開放原碼的自由軟體,免費,並且以穩定、高效能、安全著稱!一般通稱AMP環境。若是把這環境搬到Windows,則通稱WAPM。

二、開發PHP程式所需的環境及軟體

  1. 要開發測試PHP只需要APM環境+文字編輯器+瀏覽器即可,通通不用錢,也不用去買大補帖。
  2. PHP是一般的純文字檔而已,所以,撰寫程式時,只需要一套文字編輯器即可,例如PSPad(本研習示範用編輯器)或notepad++
  3. PHP寫好可以用瀏覽器來觀看其執行結果,但若直接用瀏覽器開啟該檔案將無法正確執行!PHP必須透過網站伺服器才能運作(在檔案總管將php檔點兩下,還問為什麼PHP不能跑得這種行為若發生...請別跟人家說您有跟我學過PHP),例如:輸入網址「http://網址/xxx.php 」才能正確執行PHP。
  4. 沒有網址怎麼辦?去買一個?錢多嗎你....請輸入「http://localhost/xxx.php」或「http://127.0.0.1/xxx.php」就可以了!「http://localhost」和「http://127.0.0.1」就是本機電腦中的網站伺服器的位置(每台電腦都一樣,所以請別問我隔壁那台電腦是不是 127.0.0.2....我會很傷心)。
  5. 簡單講,您可以在自己的電腦安裝AMP環境,如此,就不見得要上網才能撰寫PHP了。

三、安裝網站伺服器(也就是APM環境)

不管是安裝那一套,安裝前,請先關閉skype,不是因為他被微軟買走就唾棄他,而是因為它會暫住80port,導致網頁伺服器無法啟動。

Uniform Server(這是新歡,因為他縮得妙...體積很小,才16MB不到)本地下載8.8.8版

  1. http://www.uniformserver.com/
  2. 請將 Uniform Server 安裝到「C:」或「D:」,然後執行之。
  3. 若想日後一開機就自動執行,請執行「C:\UniServer\Start_as_service.exe」
  4. 若想自己手動執行,請執行「C:\UniServer\Start_as_program.exe」
  5. 打開瀏覽器,輸入「http://localhost」或是「http://127.0.0.1」即可。
  6. php.ini的位置「C:\UniServer\usr\local\php\php.ini 」

XAMPP (這是舊愛,很有份量,光安裝程式就破100MB...難怪沒人愛新歡和舊愛擇一安裝就好,不然會爭風吃醋....

  1. http://www.apachefriends.org/zh_tw/xampp-windows.html
  2. 請將 xampp 安裝到「C:」或「D:」,然後執行之。
  3. 若不是裝在根目錄(例如:C:\tad\xampp),那您需先執行setup_xampp.bat,讓它偵測路徑。(執行一次就好)
  4. 執行「C:\xampp\xampp_start.exe」以啟動伺服器環境。
  5. 打開瀏覽器,輸入「http://localhost」或是「http://127.0.0.1」即可。
  6. php.ini的位置「C:\xampp\php\php.ini 」

四、您的「網頁目錄」:

  1. 所有PHP程式必須放在「網頁目錄」中才能被讀取到,瀏覽器可於網址列輸入「http://localhost」或「http://127.0.0.1」,此時會對應到「C:\UniServer\www」或者「C:\xampp\htdocs」。
  2. 若是程式放在「C:\UniServer\www\tad」或「C:\xampp\htdocs\tad」中,那麼,執行網址為「http://localhost/tad/」或「http://127.0.0.1/tad/」,依此類推。

五、如何學好PHP?

  1. PHP基本上算是很好學的,資料也多,可查詢的資源相當豐富。
  2. 要學好PHP,要有目的。當然,目的是來吹冷氣的不算...換言之,您要有一個想寫的東西。寫個學校網站,寫個校友系統,寫個簡單的新聞區或相簿...等,都可以,盡可能的和工作和生活結合,利用程式來簡化繁瑣的人工步驟,或者提昇工作效率,有目標,才會有動力,才會有想法。
  3. 學PHP不需要背。跟您說,您背不完的,您只要就好了。像函數就不用背(反正也不是考試),常用的打久了你就背起來了,不常用的,等到要用時,知道去哪裡找就好。換言之,函數懂越多,功力越高強。
  4. 程式碼可以複製貼上,但一定要知道為什麼要這麼寫,不要傻傻的照著打,可以的話,自己打一遍最好,最上乘就是可以說出每一行程式碼的作用和前因後果。或者,故意打錯,看看會怎樣。錯誤訊息看久了,功力也就提昇了。
  5. 常寫,常想,常問。程式這種東西,學完放個三天就忘了...所以,常寫是學好的不二法門。若是常寫對您有困難,那就代表:其實您也不怎麼需要學程式阿~
  6. 學習的先後順序:HTML(網頁的最根本)→CSS(美化網頁用)→PHP(就是讓網頁可以互動)→JavaScript(增加友善性)
  7. 基本規則還是要懂,例如底下這些是基本中的基本,我知道很煩,但基本的東西還是要了解一下的,不然老是少加「 ;」分號或者少打「"」引號也是常常會引起錯誤的。

六、PHP的執行原則

  1. 所有PHP程式的副檔名,一律為「.php」。
  2. PHP可以和HTML寫在一起,要進入PHP模式,請用「<?php 程式碼; ?>」來告知編譯器,這段需要用PHP來執行。
  3. PHP的程式是由上到下(↓),由左至右(→)執行,只有函數例外,函數是呼叫時才會有作用。
  4. PHP的變數長相都是像這樣:「$var」,使用時無須宣告。
  5. 每一個函數,就是一段有特定功能的程式。函數有PHP內建成千上萬的函數,也可以自己寫函數。
  6. 凡是在PHP使用「字串」均需加上引號(數字、常數、變數都不用),例如:「$var="Hello world!";」。
  7. 每用PHP來進行一個動作,我們稱之為一個「敘述句」,敘述句需以「;」作為結束。
  8. 「echo」是最常用來輸出到螢幕的PHP語言結構,例如:「echo $var;」。
  9. 將檔案存檔「C:\網頁目錄\index.php」,用瀏覽器執行「http://localhost」即可看到執行結果。
  10. 試試看,怎麼把秀出來的文字加上顏色!

PHP入門講義

1-1 安裝 Uniform Server

一、Uniform Server下載

二、Uniform Server 完整版的安裝

  1. 點兩下執行即可,建議裝在根目錄下,意即C: 或者D:。
  2. 裝完後會在C:磁碟生出一個UniServer資料夾,所有伺服器軟體都在裡面,要反安裝的話,直接刪除該資料夾即可。
  3. 裝好後,若想日後一開機就自動執行,請執行「C:\UniServer\Start_as_service.exe」,然後直接按「Start/Install Apache and MySQL Services」全部啟動即可,總之,都是綠燈就表示OK。
  4. 若想自己手動執行,請執行「C:\UniServer\Start_as_program.exe」
  5. 若老是啟動失敗,請手動執行「C:\UniServer\alt_diag\run_as_service」或「C:\UniServer\alt_diag\run_as_program」底下的批次檔
  6. 在Uniform Server的控制面版中, 你可以啟動 / 停止所有的伺服器。

 

三、修改 /php/php.ini

 

補充:自定Apache目錄列表格式方法

<Directory "C:/UniServer/www">

    Options Indexes Includes

    indexOptions FancyIndexing ScanHTMLTitles NameWidth=128 DescriptionWidth=256 HTMLTable VersionSort FoldersFirst
    
    AllowOverride All

    Require all granted
</Directory>

更詳細資訊請參考資料來源

PHP入門講義

1-2 安裝 XAMPP

一、XAMPP 下載

二、XAMPP 完整版的安裝

  1. 點兩下執行即可,點兩下執行即可,建議裝在根目錄下,意即C: 或者D:。(若是電腦有裝還原系統的可安裝 XAMPP Lite)。
  2. 裝好後,你可以在「開始→程式集→XAMPP」下找到XAMPP。在XAMPP的控制面版中, 你可以啟動 / 停止所有的伺服器。

網站網址 http://localhosthttp://您的IP(建議用IP)

網頁目錄 C:\xampp\htdocs

 

三、修改 /php/php.ini

   (1) short_open_tag = On(約在226行,允許使用<?這種短標籤)
   (2) date.timezone = Asia/Taipei(約在1013行,設定時區)
   (3) magic_quotes_gpc = On(約在749行,自動把特殊字元加上拖曳符號)
   (4) error_reporting = E_ALL | ~E_STRICT(約在516行,xampp 1.7.4 以後的版本才要改

四、加強安全性

刪除底下資料夾:

 

PHP入門講義

2. 基礎語法

一、基本結構:

<html>
<head><title>PHP練習1</title></head>
<body>
<!--這是網頁用的註解,不可用在PHP模式中-->
<?php
/*
這是PHP的長註解
可以寫很多東西
*/
echo "嗨!<font color=blue>您好!</font>";   //這是PHP的短註解,僅一行
?>
</body>
</html>

二、PHP是嵌入式語言

  1. PHP可以和HTML寫在一起,如同上例,只要利用 <?php 即可進入PHP模式,而遇到 ?> 代表PHP程式語法結束。
  2. 寫程式請養成寫註解的習慣,不然過陣子,您就看不懂自己在寫什麼了。
  3. 學進一步學習HTML?請至:http://www.w3school.com.cn/html/index.asp

 

PHP入門講義

3. PHP與HTML表單

一、基礎表單的HTML語法

PHP的變數很大一部份來自於表單,因此我們來看一下表單的寫法。

<form action="接收程式.php" method="傳送方式">表單</form>
  1. action屬性:用來指定表單內容,要送到哪個程式來執行。
  2. method屬性:指定表單內容的傳送方法,可以是POST(建議)或GET(預設)
  3. 如果希望表單可以上傳,必須加入enctype="multipart/form-data"

二、最基礎的input表單元件的HTML語法

<input type="格式" name="名稱" size="大小" value="預設值">
  1. 其中的name最重要!一定要有!因為name送出後,會變成PHP的變數名稱。例如表單有個:<input type="text"  name="tel">,表單送出後:

三、常用的表單元件HTML語法及屬性

  1. 文字框:<input type="text" name="名稱" value="預設值" size="大小">
  2. 隱藏框:<input type="hidden" name="名稱" value="預設值">
  3. 密碼框:<input type="password" name="名稱" size="大小" value="預設值">
  4. 上傳框:<input type="file" name="名稱" size="大小">
  5. 送出鈕:<input type="submit" value="按鈕文字">
  6. 單選框(圓形鈕):<input type="radio" name="名稱"  value="值1">選項文字1
    • a.單選框通常同時會有好幾個選項,一組選項就要一組<input>
    • b.而且name都要一樣才行!
    • c.若要預設選取,要加上 checked="checked"
  7. 複選框(方形鈕):<input type="checkbox" name="名稱[]"  value="值1">選項文字1
    • a.複選框通常同時會有好幾個選項,一組選項就要一組<input>
    • b.而且name都要一樣才行!而且因為是複選,所以要加上[],如此會送出陣列。
    • c.若要預設選取,要加上 checked="checked"
  8. 下拉選單:<select name="名稱" size=1>選項</select>
    • (1) 選項:<option value="值">選項文字</option>
      • a.一組選項,就是一組<option>
      • b.若要預設選取:要在<option>中加入 selected="selected"
    • (2) 若希望下拉選單可以複選,除了 name要加上[]外,還要加上multiple 屬性。
  9. 大量文字框:<textarea name="名稱" cols="欄寬" rows="列高">預設值</textarea>

四、表格HTML語法及屬性

  1. <table><tr><td>儲存格1</td><td>儲存格2</td></tr></table>
  2. <tr></tr> 是一列,裡面要放儲存格,一組<td></td>就是一格。

五、PHP的算術運算元

  1. 「加、減、乘、除」分別是「+」、「-」、「*」、「/」
  2. 單位轉換範例:1坪=3.30579平方公尺

六、幾個實用的函數

  1. PHP函數(function)是非常實用的東西,每個函數都有一個固定用途,在此介紹兩個接收變數時,會用到的函數:
  2. implode("串接符號",$陣列)→會把陣列串接起來成一個大字串。
  3. nl2br($大量文字)→會把換行符號(\n)轉換成網頁換行語法<br>。

七、來設計一個榮譽榜的發布界面吧!

  1. 至少有以下欄位:得獎者名稱(文字框)、得獎日期(文字框)、事由(文字框)、內容(大量文字框)、校內校外(下拉選單)、是否發布(單選)

PHP入門講義

3-1 變數

變數:就是用來暫時存個資料用的東西啦!

變數來源:自訂變數、外部變數(來自表單或session、Cookie、環境變數)

一、自訂變數

  1. $變數名稱="變數值";
  2. 例:$name="tad";
  3. 名稱盡量有意義。
  4. 變數名稱有區分大小寫,開頭不能用數字
  5. php支援以下的資料形態:integer(整數)、double(浮點數)、string(字串)、array(陣列)、object(物件)。
    $a=123;   //$a → integer整數
    $a=12.3;   //$a → double浮點數
    $a="123";   //$a → string字串
    $a=array(1,2,3);   //$a → array陣列
  6. PHP的變數無須宣告其型態,資料形態也會視情況自動做轉換,如下例 $a、$b 都是字串,$c 卻是整數形態。
    $a = "2年級";
    $b = "3年級"
    $c = $a + $b;

二、外部變數:

  1. $_GET['變數']:用get方法傳來的變數,常見於連結(常用)
  2. $_POST['變數']:用post方法傳來的變數,常用於表單(常用)
  3. $_REQUEST['變數']:取得來自get、post、cookie的變數(偶爾用到)
  4. $_SESSION['變數']:來自session的變數,session存於主機端(偶爾用到)
  5. $_COOKIE['變數']:來自cookie的變數,cookie存於客戶端(不常用)
  6. $_FILES['變數']:上傳檔案的變數,是一個陣列(僅檔案上傳才會用到)
  7. $_SERVER['變數']:系統變數,可用phpinfo()觀看(偶爾用到)
  8. $_ENV['變數']:環境變數,可用phpinfo()觀看(幾乎沒人在用)

三、來自表單

  1. 表單預設傳遞方式為GET(method="get"),收到之變數即為 $_GET['名稱']
  2. 若用method="post"來指定傳遞方式為post,收到之變數為 $_POST['名稱']
  3. GET的缺點是傳遞資料的量有上限,看瀏覽器和伺服器設定,一般是2kb - 8kb(IE 和 Safari 是 2KB,Opera 為 4KB,Firefox 為 8KB),但優點是可以將傳遞的參數記錄下來(可能也是缺點),要做成書籤、分頁、或分享給別人都比較容易。
  4. POST的優點是容量無上限(其實有,但是看伺服器的設定),缺點就是參數看不見,無法將POST的傳遞結果分享給別人。
  5. 一般來說,j若用於搜尋,建議用GET,其餘用POST。這樣比較容易分。

四、環境變數

  1. 變數除了自己設以外,還能夠利用現成的環境變數。
  2. 用phpinfo()即可看出有哪些還變數可以用,如:

    本頁名稱:$_SERVER['PHP_SELF']
    根目錄位置:$_SERVER['DOCUMENT_ROOT']
    主機位置:$_SERVER['HTTP_HOST']
    您的瀏覽器版本:$_SERVER['HTTP_USER_AGENT']
    使用者的IP位置:$_SERVER['REMOTE_ADDR']
    主機的IP位置:$_SERVER['SERVER_ADDR']
    您用的網站伺服器是:$_SERVER['SERVER_SOFTWARE']

五、 PHP變數範圍

  1. 變數只存活於當頁。
  2. 變數要送到另一頁使用,需傳遞過去(post、get、cookie、session)
  3. 變數不能直接拿到函數或類別中使用(除非有用global宣告)。
  4. 同樣名稱的變數,以後面定義的值為準。(相同的變數,後面的值會蓋掉前面的值)

PHP入門講義

3-2 PHP常數

  1. 常數:定義其值之後,其值已無法修改。
  2. 常數定義方式:define("常數名稱" , "常數值") ,例如:
    define("_USER_ID" , "tad");
    define("_USER_PASSWD" , "5711438");
  3. 常數一樣有分大小寫,與變數一樣的命名規則(但約定成俗的用法為:全部大寫,前面加底線,以利辨識)
  4. 常數值只能是:字串、數字、浮點數、布林值,不能是陣列、物件...等。
  5. 常數可以直接在函數中使用(變數不行)。

PHP預定常數

  1.  __LINE__:目前行數
  2.  __FILE__:目前檔案路徑
  3.  __FUNCTION__:目前函數名稱
  4.  __CLASS__:目前物件名稱
  5.  __METHOD__:目前物件方法的名稱

PHP入門講義

3-3 運算子(運算元)

 PHP的運算子

  1. 算術運算子
  2. 指定運算子
  3. 位元運算子
  4. 比較運算子
  5. 錯誤控制運算子
  6. 執行運算子
  7. 加一/減一運算子
  8. 邏輯運算子
  9. 字串運算子
  10. 陣列運算子

算術運算子

運算子
範例
用途
+
$a + $b
$a 和 $b 的和。
-
$a - $b
$a 和 $b 的差。
*
$a * $b
$a 和 $b 的乘積。
/
$a / $b
$a 除以 $b 的商。
%
$a % $b
$a 除以 $b 的餘數。

 指定運算子

即「=」。意思是將「右邊的值」指定給「左邊的變數」。

所以在程式技巧中,可以把表示式簡寫為下列方式:

標準式
簡單式
$a = $a + $b
$a += $b
$a = $a - $b
$a -= $b
$a = $a * $b
$a *= $b
$a = $a / $b
$a /= $b
$a = $a % $b
$a %= $b

比較運算子

範例
名稱
解釋
$a == $b
等於
TRUE,如果 $a 等於 $b。
$a === $b
全等
TRUE,如果 $a 等於 $b,並且它們的類型也相同。
$a != $b
不等
TRUE,如果 $a 不等於 $b。
$a <> $b
不等
TRUE,如果 $a 不等於 $b。
$a !== $b
非全等
TRUE,如果 $a 不等於 $b,或者它們的類型不同。
$a < $b
小與
TRUE,如果 $a 小於 $b。
$a > $b
大於
TRUE,如果 $a 大於 $b。
$a <= $b
小於等於
TRUE,如果 $a 小於或者等於 $b。
$a >= $b
大於等於
TRUE,如果 $a 大於或者等於 $b。

三元運算符: 
(expr1) ? (expr2) : (expr3);
如果 expr1 的值為 TRUE,則此運算式的值為 expr2,如果 expr1 的值為 FALSE,則此運算式的值為 expr3。

錯誤控制運算子

 即「@」,放在運算式或函數前,可隱藏錯誤訊息。

執行運算子

即「`系統指令 `」,此為重音符號,非單引號。

邏輯運算子

邏輯運算子就是要用來作邏輯判斷用的!其中and可以用符號(&&)來替代,or可以用符號(||)來表示。

 

$a and $b and(與) 只有$a 與 $b兩者皆為真,結果才為真
$a && $b and(與) 只有$a 與 $b兩者皆為真,結果才為真
$a or $b or(或) 只要$a 或 $b兩者之一為真,結果就為真
$a || $b or(或) 只要$a 或 $b兩者之一為真,結果就為真
$a xor $b exclusive or(互斥) 只有$a 與 $b一為真、一為假時,結果才為真
!$a not(否) 只有$a為假時,結果才為真

 

字串運算子

即「.」,可連接字串與變數(或函數)。

陣列運算子

即「+」,它把右邊的陣列附加到左邊的陣列後,但是重複的索引值不會被覆蓋。

 

PHP入門講義

3-4 PHP資料類型

  1. 字串 string
    • (1)  純字串用單引號包住,內含變數之字串用雙引號包住。(簡單講,用單引號不檢查裡面有無變數,用雙引號才會檢查裡面有無變數)
      $str1 = '這是純文字' ;
      $str2 = "這裡面有 $var 變數" ;  //偷懶的寫法,遇到陣列就不行了
      $str3 = "這裡面有{$var}變數" ;  //建議寫法
      $str4 = '這裡面有' . $var . '變數' ;  //利用字串運算子元(.)的寫法
    • (2)  欲把特殊字元($、"、'...等)當作自顯示,需用「\」來解除其作用(而且用雙引號包住)
      • a. \n → 純文字換行
      • b. \r → 也是換行(微軟換行符通常為 \r\n )
      • c. \t → 純文字Tab定位
    • (3)  Heredoc定界符<<<的用法:
      $txt = <<<note
      這裡面要秀出$或"或'都不用加\
      note;
  2. 整數 integer
    • (1)  整數可分正負,如100或-100
    • (2)  整數不需加任何引號
  3. 浮點數 float
    • (1)  有內含小數點的數字
    • (2)  浮點數也不需要加任何引號
  4. 布林值 boolean
    • (1)  即true與false
    • (2)  無大小寫之分
    • (3)  true:非空字串、非0數值
    • (4)  false:空字串、數字0、NULL
  5. 陣列 array(另外說明)
  6. 物件 object(另外說明)
  7. 資源 resource
    • (1)  通常是一些連接伺服器,或者開啟目錄、開啟檔案的傳回值
  8. 無值 NULL
    • (1)  需大寫
    • (2)  NULL和空值意義並不一樣。

 

PHP入門講義

3-5 PHP陣列array

  1. 變數僅能放一個值,陣列可以放許多值。
  2. 一個陣列元素由「索引」和「值」組成。
  3. 以字典為例,一個部首,就是一個陣列,部首裡面包含許多字(值),要找到那個字,只要翻到該頁即可(索引)
  4. 陣列定義方式:
    • $陣列名稱=array("索引1"=>"值1","索引2"=>"值2"...);
    • $陣列名稱["索引1"]="值1";
      $陣列名稱["索引2"]="值2";
  5. 索引若沒寫,會自動從0開始編號
  6. 索引可以是數字(也可跳號),或文字(要用引號包住),亦可混合。
  7. 二維陣列或多維陣列:即陣列中的陣列
  8. 二維陣列定義方式:
    • (1)  $陣列名稱=array(
       "索引1"=>array("索a"=>"值1a" , "索b"=>"值1b"),
       "索引2"=>array("索a"=>"值2a" , "索b"=>"值2b")
      ...);
    • (2)  $陣列名稱["索引1"]["索a"]="值1a";
       $陣列名稱["索引1"]["索b"]="值1b";
       $陣列名稱["索引2"]["索a"]="值2a";
       $陣列名稱["索引2"]["索b"]="值2b";

 

PHP入門講義

4. 函數

一、關於函數:

  1. 函數有兩種,一組是PHP內建函數,另一種是自訂的函數。
  2. 一個函數通常都有其獨特的功能,可視為具特定功能的小零件,直接呼叫函數名稱即可使用,如:phpinfo(),有些有傳回值,有些沒有;有些需要輸入參數,有些不用。
  3. 完整函數手冊:http://www.php.net/manual/en/funcref.php
  4. PHP中文手冊:http://www.php.net/manual/zh/index.php
  5. 函數基本結構:傳回值 函數名稱(參數1,參數2...);
  6. 自訂函數的基本結構:
    function 函數名稱($參數1="預設值1", $參數2="預設值2",...){
        global 宣告為全域變數;
        程式內容;
        程式內容;
        return 傳回值;
    }
  7. 參數、預設值、global、傳回值都不一定要有。
  8. 函數可以擺在<?php ... ?>中的任何地方,放在哪裡都可以,前後都不影響程式。
  9. 函數內的變數無法與外界互通,只能以global方式或設成參數放進函數中。

二、函數傳回值:

  1.  string(字串)
  2.  int(整數)
  3.  array(陣列)
  4.  object(物件)
  5.  bool(布林值)
  6.  void(無傳回值)
  7.  mixed(不一定)
  8.  new(建立物件)

PHP入門講義

4-1 "引入"函數

  1. include() 和require() 都可以用來引入檔案,但原理不太一樣。
  2. require() :置換,他的運作方式是把本身以指定的檔案置換,這個讀入與置換的動作發生在 PHP 引擎編譯程式碼的時候,而不是發生在 PHP 引擎開始執行編譯好的程式碼時。故若檔案有誤,會導致程式停擺。適合用來引入靜態的內容(如版權宣告)
  3. include():插入,當程式執行include的時候,會先進行插入才會讀取檔案。若檔案有誤,僅秀出警告,程式仍繼續運作。適合用來引入動態的程式碼(程式內容會依其他程式碼而變動)或者放入流程控制中。


require_once() 與 include_once() :

引入進來的檔案若是相同的,只會 include 或 require一次。

PHP入門講義

5. 條件判斷與流程控制

一、利用 if() 來讓程式長智慧

二、常用於條件的符號

  1. 「==」比較左右兩邊的值是否相同,例如「4==4」就為真,「3==4」就為假。
  2. 「===」除了比較值以外,還會比較資料型態是否相同,如:「4==="4"」為假,前者是數字4,後者是文字4。「4=="4"」為真,因為==並不管資料型態。
  3. 「!=」判斷左右是否不相等(不相等才為真)。
  4. 「>」大於;「>=」大於等於;「<」小於;「<=」小於等於。
  5. 同時比較兩個以上的條件,且都需成立,用「and」或「&&」。
  6. 同時比較兩個以上的條件,且僅其一成立,用「or」或「||」。

三、$op 流程控制技巧

  1. 這不是PHP內建的方法,也不是什麼固定的流程控制語法,只是簡單的程式技巧而已,可以讓您的檔案完全依照您想要的流程來跑的一種方法。
  2. 送出前:
    <input type='hidden' name='op' value='欲執行動作'>
  3. 接收後:
    if($_REQUEST['op'] == "欲執行動作"){
        執行動作;
    }

四、switch 搭配 $op 流程控制技巧

switch($變數名稱){
    case "值1":
        執行動作1;
        break;
    case "值2":
        執行動作2;
        break;
    default:
        預設執行動作;
        break;
}

 

PHP入門講義

5-1 迴圈

一、 while迴圈

不曉得要跑幾圈的迴圈最適合用while迴圈

while (條件){
   敘述句
}

二、 for 迴圈

1. for迴圈適合用在已經知道要跑幾圈的情況。

for(expr1 ; expr2 ; expr3){
    敘述句…
}


2. 在for( )裡面分別有三個部份,expr1 代表初始值, expr2 代表迴圈測試條件,條件若測試成立,迴圈繼續;條件測試失敗,迴圈停止,expr3 是條件成立後累進次數,"敘述句"代表每次繞一圈後所要進行的動作。

3. 假設,我們要列印出1到10的數字,那麼,我們可以這麼寫:

for($i=1;$i<=10;$i++){
    echo $i;
}

4. 整個執行流程,用文字來表示便是如下的5個步驟,您可以在腦海中試著運作一遍看看:
【步驟1】進入for迴圈,執行expr1,設定初始值,由於要列印1到10,所以我們設定變數 $i 的初始值是1。
【步驟2】進入expr2,也就是進入條件測試 $i<=10,若$i確實小於或等於10,則進行步驟3,若條件測試失敗($i>10時)則跳到步驟5。
【步驟3】執行{}中的敘述句「echo $i ;」,也就是印出 $i 的意思,執行完後,跳到步驟4。
【步驟4】執行expr3,也就是$i++,$i++的意思就是變數$i的值+1的意思!也就是變數$i的值從1變成2,接下來跳回步驟2。
【步驟5】結束迴圈

5. 上面的例子,您高興的話,這樣寫也行:

$i=1;
for(;$i<=10;$i++){
    echo $i;
}

6. 或是這樣寫也行:

$i=1;
for(;$i<=10;){
    echo $i;
    $i++;
}

7. 基本上,只要 for 迴圈做的到的動作,while迴圈也應該做得到。

三、 foreach迴圈

1. foreach迴圈適合用在陣列上

foreach($陣列 as $值) {
    敘述句
}

//例如:
$stud[1] = '張三';
$stud[2] = '李四';
$stud[3] = '王五';
foreach($stud as $name) {
    echo "<div>學生 {$name}</div>";
}

2. 也可以同時取出索引和值

foreach($陣列 as $索引=>$值) {
    敘述句
}

//例如:
$stud[1] = '張三';
$stud[2] = '李四';
$stud[3] = '王五';
foreach($stud as $num => $name) {
    echo "<div>學生 {$name} 的座號是 {$num}</div>";
}

四、 break 和 continue

1. break 和 continue都是在迴圈裡使用的語法(break還可以用在switch中),一個是用來中斷迴圈,一個則是用來略過迴圈。

PHP入門講義

6. 認識MySQL資料庫

一、關於phpMyAdmin

  1. phpMyAdmin不是MySQL,phpMyAdmin是一套程式,用來管理MySQL,因為MySQL本身沒有圖形管理介面,只有一堆指令,所以,利用phpMyAdmin來操作會比操作指令簡單許多。
  2. 若是使用Uniform server,請自行下載中文語系,並將zh_TW資料夾放入C:\UniServer\home\us_phpmyadmin\locale即可。
  3. 打開瀏覽器,輸入「http://localhost/phpmyadmin」即可執行phpMyAdmin。(若是用 Uniform Server 則是 http://localhost/us_phpmyadmin)
  4. 基本動作:設好欄位名稱→指定資料型態→(若是varchar則一定要設定「長度」;若是數字則「屬性」多為「unsigned」;若是要當作流水號,則在「附加」選擇「auto_increment」)→最後指定哪些欄位要當作索引。

二、建立資料表要注意的事項

  1. 「資料庫」和「資料表」名稱不能以「數字」或特殊符號作為開頭。
  2. MySQL 4.1 以後,建立資料表時,若要使用UTF8,在「校對」選項請選擇「utf8_general_ci」。

三、MySQL常用資料類型一覽

  1. (M,D):M是資料位數,最大為255;D是小數位數。
  2. []中括號,表示M或D可以省略不寫,不寫的話則以內定範圍為準。
  3. unsigned表示正整數狀態,也就是沒有負數。
  4. zerofill表示位數不足補0,如int(4),存28這個數字,資料庫會將之存成0028。

PHP入門講義

6-1 規劃資料庫欄位

  1. 資料有大有小!所以,我們也要規劃適當的欄位空間來存放資料!換句話說,「規劃欄位」就是選用適當的資料類型以及適當的大小空間來給資料存放!
  2. 不良的欄位規劃,可能會導致「浪費資料空間」、「拖慢資料庫執行速度」、「程式運算錯誤」...等情形。
  3. 資料有很多種形態,包括「文字」、「數字」、「日期」...等等,例如:以一個班級資料庫為例,學生學號是數字類型,姓名是文字類型,生日是日期類型...等,各種不同的資料,就要找出最適合它的資料類型。
  4. MySQL的資料形態可分為幾大類:數字、文字、日期時間、特殊類等資料形態。
  5. 底下的表格中,(M,D)中的M是顯示大小,最大為255,也就是設定欄位時,若寫int而已,那依內定可以顯示到10位數,若指定寫成int(8),則僅顯示8位數的數字。D則是小數位數。
  6. 若(M)或(M,D)是灰色,則表示可以不加,不加的話則以內定範圍為準。若是黑色的話就一定要加喔!
  7. unsigned表示正整數狀態,也就是沒有負數的狀態。
  8. zerofill表示位數不足補0,如int(4)話,且設為zerofill,則存28這個數字,資料庫會將之存成0028。

 數字類型

類型 bytes 範圍 選項 說明
TINYINT(M) 1 -128到127,unsigned狀態則為0到255 unsigned、zerofill TINYINT(非常小的整數)正整數僅到255,所以適合超小數值資料,例如:成績、座號、身高、體重...等資料。
SMALLINT(M) 2 -32768到32767,unsigned狀態則為0到65535 unsigned、zerofill SMALLINT(較小整數)正整數可以算到6萬左右的數字,適合小數值資料,例如:學校人數、萬元內的物品價錢...等。
MEDIUMINT(M) 3 -8388608到8388607,unsigned狀態則為0到16777215 unsigned、zerofill MEDIUMINT(中等整數)正整數可以計算到1600萬左右的數字,適合中型數值,例如:城市人口、土地大小、留言版的筆數序號...等。
INT(M) 4 -2147483648到2147483647unsigned狀態則為0到4294967295 unsigned、zerofill INT(標準整數)正整數已經可以用到42億左右的數字,適合用來做一國人口總數、公司營業額...等。
BIGINT(M) 8 -9223372036854775808到9223372036854775807unsigned狀態則為0到18446744073709551615 unsigned、zerofill 這個BIGINT(大整數)已經大到不像話了,正整數已經大到1800京左右了,工友想破頭也想不出要拿來記錄什麼非得用到這麼大不可,大概適用計算很精密的數字才用得到吧!
FLOAT(M) 4 FLOAT(M,D)最小非零值:±1.175494351E - 38FLOAT(4)最大非零值:±3.402823466E + 38FLOAT(8)最大非零值:±1.7976931348623157E + 308 zerofill FLOAT單精確度浮點數,能夠記錄小數點,例如精密的成績計算、各類數值記錄...等都相當適合!此外,FLOAT(4) 和FLOAT(8) 是為了與ODBC相容而提供的。
DOUBLE(M) 8 最小非零值:±2.2250738585072014E - 308 zerofill DOUBLE雙精度浮點數,和FLOAT差不多的用途,不過,DOUBLE所用掉的空間是FLOAT的兩倍,所以,除非特別需要高精度或範圍極大的值,一般來說用FLOAT來儲存資料應該是夠了。
DECIMAL(M,D) M 可變;其值的範圍依賴於M和D zerofill DECIMAL也是浮點數的一種,DECIMAL類型不同於FLOAT和DECIMAL,其中DECIMAL實際是以串存放的。DECIMAL可能的最大取值範圍與DOUBLE一樣,但是其有效的取值範圍由M和D的值決定。如果改變M而固定D,則其取值範圍將隨M的變大而變大。

日期類型資料:

底下的例子中,您會看到一堆的Y、M、D這些東西,Y代表的是年,YY代表2位數的年,如97年,YYYY代表4位數的年,如2001年,其餘的M(月)、D(日)依此類推。 

類型 bytes 範圍 用途 說明
DATE 3 1000-01-01到9999-12-31 以YYYY-MM-DD來儲存日期

MySQL接受以下的輸入方法:「2001/03/10」、「2001-3-10」、「01/3/10」、「2001@3@10」、「20010310」,換句話說,只要可以辨認的分隔符號,都能成功的輸入到MySQL中。

當年份數字在00-69之間,則會被當作2000-2069,若是在70-99之間,則當作1970-1999!

DATETIME 8 1000-01-01 00:00:00到9999-12-31 23:59:59 以YYYY-MM-DD hh:mm:ss來儲存日期時間 您在輸入DATETIME資料時,例如:2001年3月10日18時5分30秒,MySQL接受以下的輸入方法:「2001/03/10 18:05:30」、「2001-3-10 18+5+30」、「20010310180530」,換句話說,和DATE一樣,只要是可以辨認的分隔符號,都能成功的輸入到MySQL中。
TIMESTAMP(M) 4 1970-01-01 00:00:00到2037 以YYYYMMDDhhmmss來記錄時間戳記

有些函數只接受TIMESTAMP的日期形態,因此,在某些情況下您是不得不用他的。

若是TIMESTAMP沒有特別去指定,則會以目前的時間來作記錄。

TIME 3 -838:59:59到838:59:59 以hh:mm:ss來記錄時間

MySQL接受以下的輸入方法:「18:05:30」、「18.5.30」、「180530」,沒錯,只要是可以辨認的分隔符號,都能成功的輸入到MySQL中。

若是只輸入「2212」,那麼會被當成「00:22:12」,換言之,若有位數不足的情況下,MySQL會自動在前方補0,因此,若是您想輸入11時22分,那麼,您得寫成「112200」喔!不然,若只寫「1122」則會被當作11分22秒

YEAR 1 1901到2155 僅以YYYY來記錄年份 YEAR只能記錄年份...用在什麼地方呢?例如大範圍的生日年份調查統計...等。老實說,並不太常用。

 文字類型資料:

 

類型 bytes 範圍 用途 說明
CHAR(M) M位元組(隨M值大小來決定) 1<=M<=255 固定長度字串

CHAR固定長度字元,例如CHAR(4)則只能儲存4位元組(bytes)的資料,超出也不管...例如:CHAR(4)的欄位存入「abcdefg」的字串,則只剩下「abcd」四個字。所以哩!要用的時候,除非您確定字串不會超過某個範圍,例如IP都是固定15個位元組,在這種情形下再用CHAR吧!

請注意喔!CHAR(M)最多只能設到255。

VARCHAR(M) 視實際字串位元組大小+1 1<=M<=255 變動長度字串

VARCHAR就比CHAR有智慧一點了,例如:VARCHAR(6)的欄位遇到「abcdefg」的字串,那麼該欄位一樣只能存「abcdef」,而且,他還要多用一個位元組來儲存資料長度,導致儲存「abcdef」會用到7個位元組,這也就是為什麼他所用的空間大小是「視實際字串位元組大小+1」的原因了。那這個VARCHAR不就很糟糕?還要比CHAR多佔用一點空間?不!他有個優點,假設他遇到「abc」這樣的字串,那麼他會自動縮小所需空間,只要4個位元組就夠囉!如此,就省下空間啦!

VARCHAR (M)一樣最多也只能設到255。

TINYTEXT 視實際內容所用之位元組大小+1 255個字元 TINYTEXT 非常小的文本串 TEXT適用來儲存大容量資料的欄位,例如留言內容、文章內容等等。這一系列的TEXT除了空間大小不一樣以外,其餘的相同!由於TEXT和BLOB這種欄位實在是太像了,所以,我們也先來介紹一下BLOB再一併做比較。
TEXT 視實際內容所用之位元組大小+2 65535個字元 TEXT小文本串
MEDIUMTEXT 視實際內容所用之位元組大小+3 16777215個字元 MEDIUMTEXT中等文本串
LONGTEXT 視實際內容所用之位元組大小+4 4294967295個字元 LONGTEXT大文本串
TINYBLOB 視實際內容所用之位元組大小+1 255個字元 超小型BLOB

BLOB這種欄位格式可以用來儲存二進位的資料,例如圖像、音樂等,他和TEXT幾乎是一樣的功用!差別僅在於BLOB裡的資料是有分大小寫的,而TEXT裡的資料是不分大小寫。

BLOB和TEXT也都是和VARCHAR一樣,屬於可以自動判斷資料量而自動縮小其使用空間。例如您拿BLOB來存一個500個字元的資料,原本BLOB最大是可以存65535個位元組的,不過當他遇到這種情形時,他會自動縮小為502位元組而已(視實際內容所用之位元組大小+2),而不會真的用掉65535個位元組那麼多

BLOB或TEXT在ySQL 3.23以後版本中可以進行索引,不過再進行所以之前,您必須擷取前面幾個字元拿來當索引就好了!不然整個資料庫的速度可是會被拖垮的!因此,一般來說,我們也幾乎都不鼓勵用BLOB或TEXT來作為索引。

由於BLOB和TEXT值變化很大,尤其在常常刪減、更新的情形下,容易造成資料表資料破碎的情形產生,因此,我們應該定期地利用OPTIMIZE TABLE的指令,來讓資料表最佳化。

BLOB 視實際內容所用之位元組大小+2 65535個字元 小型BLOB
MEDIUMBLOB 視實際內容所用之位元組大小+3 16777215個字元 中型BLOB
LONGBLOB 視實際內容所用之位元組大小+4 4294967295個字元 大型BLOB

 特殊類型資料: 

類型 bytes 範圍 用途 說明
ENUM 1或2位元組 最多65535個選項 單選選項

ENUM簡單講就是單選題,您自己預設一些內容,該欄位只能存入您所設定的內容之一,例如:男、女;低年級、中年級、高年級...等,這些固定且單一答案的選項,都適合用ENUM資料欄位。 

這種欄位是用機碼在運作的,因此速度相當快,所需空間小,而且不怕使用者亂填資料!因為使用者填寫的資料料若不在選項裡面,那他會當作是NULL值,因此,工友在此推薦,若您的欄位是固定選項、且單一資料,那一定要用ENUM。

SET 1,2,3,4或8位元組 最多64個選項 複選選項 SET和ENUM也差不多的意思,不過他可以複選,也就是同時可以儲存一個以上的資料項,例如:興趣調查、購物選購單...等。

 建立資料表

  1. 建立資料表的方法如下:

    CREATE TABLE 資料表名稱 (

    欄位名稱1 資料類型 欄位設定選項,

    欄位名稱2 資料類型 欄位設定選項,

    索引 欄位

    ); 

  2. 一般來說,「欄位名稱」和「資料類型」都是必需的!至於「欄位設定選項」則是視情形存在。
  3. 常見的「欄位設定選項」有以下這些:
    • 空值設定:NULL(預設)、NOT NULL
    • 設定欄位的預設值:DEFAULT '預設內容'
    • 自動編號(加流水號):auto_increment
  4. 一個資料表只能有一個欄位使用auto_increment,而且此欄位必須是整數數值類型資料,而且這個欄位也必須設成索引!每次新增一筆資料,此欄位就會自動把編號加一。 
  5. 基本上,沒有索引的資料表運作起來效率上可能會差了上百倍!所以,在整個欄位都設定好了之後,通常我們會指定某個欄位為資料庫索引,以加快資料庫的讀取效率。 
  6. 索引有以下種類:
    • PRIMARY KEY: 主鍵索引,一個資料表也只能有一個,因此,通常都設給有auto_increment的欄位。
    • KEY 或 INDEX: KEY和INDEX相同,一個表可以有多個!
    • UNIQUE: 不重複索引或唯一索引,一個表可以有多個!PRIMARY KEY也是不重複索引,不過,它只能一個。

 

 

PHP入門講義

7. PHP與MySQL資料庫

一、讓PHP連上MySQL:

  1. 用法:int mysql_connect("主機位置","資料庫帳號"," 資料庫密碼");
    mysql_connect("主機位置","資料庫帳號"," 資料庫密碼");
  2. 範例:$link=mysql_connect("localhost","root","12345");
    $link=mysql_connect("localhost","root","12345");
  3. 該函數會傳回一個int(整數),我們稱之為「連線編號」。
  4. 只要程式和資料庫都在同一台主機,「主機位置」填入「localhost」即可。
  5. 結束連線可使用:「mysql_close($link);」,不過,其實不用也沒關係。
    mysql_close($link);

二、讓MySQL可以順利寫入UTF8中文

  1. 用法:mysql_query("SET NAMES 'utf8'");
    mysql_query("SET NAMES 'utf8'");
  2. 在連線之後,加入此行即可。
  3. 若是要強迫指定為Big5,則改為:「mysql_query("SET NAMES 'big5'");」當然連線校對得設為big5_chinese_ci
  4. 若不想在程式中指定,您也可以在my.cnf中設定成資料庫預設值
    [mysqld]
    character-set-server=utf8
    collation-server=utf8_unicode_ci
    init-connect='SET NAMES utf8'

    [client]
    default-character-set=utf8
    default-collation = utf8_general_ci

三、選擇資料庫

  1. 用法:mysql_select_db("資料庫名稱")

四、讓PHP執行SQL語法:

  1. 用法:int mysql_query( "SQL語法" [, 連線編號]);
  2. 範例:mysql_query("insert into users (`id`, `passwd`) values('tad' , '1234')");
  3. 該函數會傳回一個int(整數),我們稱之為「結果編號」。

五、執行後轉向

  1. header("location:http://網址");
  2. 凡是有儲存、更新、刪除到資料庫的動作,執行後,一律建議執行轉向動作。

 

PHP入門講義

7-1 新增資料

寫入一筆資料到MySQL中,就要用insert的語法,insert的用法如下:

LOW_PRIORITY、DELAYED 關鍵字

PHP入門講義

7-2 讀出資料庫

要讀出MySQL的資料,那您就要用select這指令。

SELECT 查詢內容 [FROM  `資料表名稱`  篩選條件]

「篩選條件」有以下幾個東西!注意喔!由上到下就是其語法的先後順序喔!您可不能把LIMIT拿到WHERE的前面,那是錯誤的喔!

[where 篩選條件]
[group by 欄位名稱][having group的篩選條件]
[order by {unsigned_integer | 欄位名稱 | formula} [asc | desc]
,...]
[limit [起點,] 筆數]

查詢範例

  1. select * from `money`;
    查詢money資料表中所有欄位的所有資料。則會把money資料表中的東西,通通列出來。
  2. select `name` , `salary` from `money`;
    查詢money資料表中name和salary欄位中的所有資料。則只會列出每人的姓名(name)以及薪水(salary)的資料,其餘的資料,如發薪 日是不會列出來的。
  3. select `salary` , `date` from `money` where `name` = 'tad' ;
    查詢money資料表中,「符合name欄位為tad」的salary和date欄位資料。也就是說,要找出資料庫中名字(name)為tad的薪水 (salary)和發薪日(date)的資料。
  4. select `salary` , `date` from `money` where `name` = 'tad' and `salary` = '1000';
    篩選條件可以不只是一個,您可以用and(和)、or(或)...設很多個。
  5. select `salary` from `money` group by `salary` ;
    查詢money資料表中,以相同的薪水為群組(group by salary),列出薪水欄位的資料。group by會把該欄位相同的值當作一個群組。
  6. select `salary` , count(`salary`) from `money` group by `salary` ;
    通常,我們用這種方式可以了解資料庫中,某種資料的分類情形,這是相當實用的,底下我們利用MySQL的count()函數, 配合group by更能求出該群組的數目,如此,您便能得知,哪一種群組,各有多少人,我們留言板中,幾月份有幾個人留言,亦可利用此種方式算出。
  7. select `name` , max(`salary`) from `money` group by `name` having max(`salary`) > 3500 ;
    這一行的意思就是,從各個name的群組(group by name)中,列出其中薪水最高max(salary)者的姓名以及其薪水。於是,首先資料庫會把姓名分四個群組,然後,根據having max(salary)>3500,他會把這四個群組中,最高薪有超過1500的人篩選出來
    請注意HAVING的角色和WHERE很像!只不過WHERE是給SELECT用來篩選,而HAVING則是專給GROUP BY做篩選用!也就是說,沒有GROUP BY就沒有HAVING!
  8. select `date` , `name` , `salary` from `money` order by `date` ;
    查詢money資料表中date,name,salary欄位的資料,並且以date欄位為準來排序(order by date)。
  9. select `date` , `name` , `salary` from `money` order by `date` desc;
    正常來說,若是您使用「order by欄位名稱」的時候,沒指定用asc(小至大)或desc(大至小)來排,那MySQL會將資料自動從小排到大,也就是asc的排法,若是想從大排到小 怎麼辦?很簡單,加入desc就行了。
  10. select `name` , `salary` from `money` limit 0,5;
    用 limit來限制列出資料的筆數是很常見的用法,尤其在做資料分頁的時候更是常用!limit後面有兩個數字,很多人會誤以為是「limit 起點,終點」,其實,這是錯的!第一個數字代表的是「筆數起點」沒錯,但第二個數字是「列出筆數」!也就是說limit 0,5就是從第0筆資料開始讀,一次讀5筆的意思!

常和GROUP BY搭配使用的MySQL函數

  1. COUNT(expr):計算數目,COUNT(*)非常快,可以算出所有的資料有幾筆
  2. AVG(expr):計算GROUP的平均值
  3. MIN(expr):找出最小值
  4. MAX(expr):找出最大值
  5. SUM(expr):總和

常和 select 一起用的PHP的函數

  1. $row=mysql_fetch_array() 從資料庫取得的陣列,索引值可以是數字或字串(即欄位名稱)。
    $row[0] 或 $row["title"]
  2. $row=mysql_fetch_assoc() 從資料庫取得的陣列,索引值只能是字串(關聯索引)。
    $row[0]
  3. $row=mysql_fetch_row() 從資料庫取得的陣列,索引值只能是數字(數字索引)。
    $row["title"]

PHP入門講義

7-3 修改(更新)資料

更新資料庫的指令是update,通常,我們要修改某一筆資料的內容時,就是用update。我們來看看,update要如何使用! 

其他用法 

PHP入門講義

7-4 刪除資料

 刪除資料的指令是delete,其指令如下: 

其他用法 

PHP入門講義

7-5 重排流水號

SET @newid=0;
update 表格名稱 set `主鍵`= (SELECT @newid:=@newid+ 1);

PHP入門講義

8. 小強佈景

一、TBS小強佈景

  1. 讓PHP程式和畫面設計(即樣板)分開,我們就可以用一般網頁編輯器來設計樣板。
  2. 可以不用重複設計專案的每一頁畫面,因樣板可共用,節省開發時間。
  3. PHP樣板引擎(用來套用樣板的東西)很多,我們用的是小巧快速的「小強」TinyButStrong樣板引擎(http://www.tinybutstrong.com)
  4. 小強的簡體中文說明書:http://phpv.net/TBS_Manual.htm

二、免費佈景

  1. http://www.openwebdesign.org/
  2. http://www.freecsstemplates.org/
  3. http://www.oswt.co.uk/index.html
  4. http://www.freelayoutsworld.com/
  5. http://www.templateworld.com/free_templates.html

三、用網頁編輯器來修改製作樣板

  1. 簡單講,就是精簡之,並留下自己想要的部份即可。
  2. 建議使用工具

四、讓php檔案套用樣板

  1. 將tbs_us.zip複製到網頁目錄下,並解壓縮,我們要用的只有tbs_class.php。
  2. 程式中必須產生對應佈景標籤的變數,如「$content="xxx"」(即對應[var.content]),最後引入TBS佈景引擎檔案:
    include_once('tbs_class.php');
    $TBS =new clsTinyButStrong ;
    $TBS->LoadTemplate('theme.html',False) ;
    $TBS->Show() ;

PHP入門講義

9. 善用現有資源

一、分頁功能

下載分頁物件

二、所見即所得編輯器

  1. http://elrte.org/elrte-1.3.zip | elfinder-1.2.zip
  2. http://ckeditor.com/ckeditor_3.6.1.zip

三、小月曆

http://www.my97.net/dp/down.aspMy97DatePicker.rar

四、表單檢查

http://www.position-absolute.com/articles/jquery-form-validator-because-form-validation-is-a-mess/formValidator.2.2.zip

PHP入門講義

9-1 分頁物件用法

1.引入該物件

require_once "pagebar.php";

2.將以下語法,插入到 $sql 與 mysql_query() 之間。

    //PageBar(資料數, 每頁顯示幾筆資料, 最多顯示幾個頁數選項);
    mysql_query($sql);
    $total=mysql_affected_rows();

    $navbar = new PageBar($total, 20, 10);
    $mybar = $navbar->makeBar();
    $bar= "<p align='center'>{$mybar['left']}{$mybar['center']}{$mybar['right']}</p>";
    $sql.=$mybar['sql'];

3.「$bar」即分頁工具,將之擺至適當位置即可。

PHP入門講義

9-2 所見即所得編輯器 CKEditor 用法

方法一:

<script type='text/javascript' src='ckeditor/ckeditor.js'></script>
<textarea name='content'  class='ckeditor'>

方法二:

<script type='text/javascript' src='ckeditor/ckeditor.js'></script>
<textarea name='content' cols=30 rows=5 id='editor'>請輸入內容</textarea>
<script type='text/javascript'>
  CKEDITOR.replace('editor' , { skin : 'v2' , toolbar : 'Basic' } );
</script>

自行定義工具列:http://docs.cksource.com/CKEditor_3.x/Developers_Guide/Toolbar

 

例如(config,js):

CKEDITOR.editorConfig = function( config )
{
    config.toolbar = 'MyToolbar';
    config.toolbar_MyToolbar =
    [
       { name: 'clipboard', items : [ 'Undo','Redo' ] },
        { name: 'insert', items : [ 'Image','Flash','Table','HorizontalRule','Smiley','PageBreak' ] },
        { name: 'basicstyles', items : [ 'Bold','Italic','Strike','RemoveFormat' ] },
        { name: 'paragraph', items : [ 'NumberedList','BulletedList','Outdent','Indent'] },
        { name: 'links', items : [ 'Link','Unlink' ] },
        { name: 'styles', items : [ 'Styles','Format' ] },
        { name: 'tools', items : [ 'Font','FontSize' ] }
    ];
};

PHP入門講義

9-2-1 CKEditor 整合 elfinder 檔案管理

1. 解壓縮,將 elfinder-1.x 目錄改名為 elfinder,並複製到 htdocs 下。

2. 設定FCKEditor

      <textarea name='content' cols=30 rows=5 id='editor'>請輸入內容</textarea>
      <script type='text/javascript'>
          CKEDITOR.replace('editor',{skin : 'v2' , filebrowserBrowseUrl : 'elfinder.html'});
      </script>

3. 建立上傳目錄,如 htdocs/files

4. 製作 elfinder 專頁 elfinder.html

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
  <meta http-equiv="content-type" content="text/html; charset=UTF-8">
  <title></title>
  </head>
  <body>
  <div id='finder'></div>
  <!-- jQuery and jQuery UI -->
    <script src="elfinder/js/jquery-1.6.1.min.js" type="text/javascript" charset="utf-8"></script>
    <script src="elfinder/js/jquery-ui-1.8.13.custom.min.js" type="text/javascript" charset="utf-8"></script>
    <link rel="stylesheet" href="elfinder/css/smoothness/jquery-ui-1.8.13.custom.css" type="text/css" media="screen" charset="utf-8">
   
   
    <link rel="stylesheet" href="elfinder/css/elfinder.css" type="text/css" media="screen" title="no title" charset="utf-8">
    <script src="elfinder/js/elfinder.min.js" type="text/javascript" charset="utf-8"></script>
    <script src="elfinder/js/i18n/elfinder.zh_TW.js" type="text/javascript" charset="utf-8"></script>
   
   
    <script type='text/javascript'>
    $().ready(function() {

       var funcNum = window.location.search.replace(/^.*CKEditorFuncNum=(\d+).*$/, "$1");
       var langCode = window.location.search.replace(/^.*langCode=([a-z]{2}).*$/, "$1");

       $('#finder').elfinder({
          url : 'elfinder/connectors/php/connector.php',
          lang : langCode,
          editorCallback : function(url) {
             window.opener.CKEDITOR.tools.callFunction(funcNum, url);
             window.close();
          }
       })

    })
    </script>
  </body>
</html>

5. 修改 elfinder/connectors/php/connector.php,設定 31、32  行,設定為正確位置,如:

    'root'            => '../../../files',                       // path to root directory
    'URL'             => 'http://localhost/files/', // root directory URL

將 42 行的 mimeDetect 註解取消,如此才能看得到縮圖。

PHP入門講義

9-3 所見即所得編輯器 elRTE 用法

1.貼上以下語法,自行修改正確路徑。

<!-- jQuery and jQuery UI -->
    <script src="js/jquery-1.6.1.min.js" type="text/javascript" charset="utf-8"></script>
    <script src="js/jquery-ui-1.8.13.custom.min.js" type="text/javascript" charset="utf-8"></script>
    <link rel="stylesheet" href="css/smoothness/jquery-ui-1.8.13.custom.css" type="text/css" media="screen" charset="utf-8">

    <!-- elRTE -->
    <script src="js/elrte.min.js" type="text/javascript" charset="utf-8"></script>
    <link rel="stylesheet" href="css/elrte.min.css" type="text/css" media="screen" charset="utf-8">

    <!-- elRTE translation messages -->
    <script src="js/i18n/elrte.zh_TW.js" type="text/javascript" charset="utf-8"></script>

    <script type="text/javascript" charset="utf-8">
        $().ready(function() {
            var opts = {
                cssClass : 'el-rte',
                lang     : 'zh_TW',
                width    : 640,
                height   : 200,
                toolbar  : 'complete',
                cssfiles : ['css/elrte-inner.css']
            }
            $('#editor').elrte(opts);
        })
    </script>

2.在表單中的編輯框裡加上 id="editor" ,如:

<textarea id="editor"></textarea>

3.修改 doctype 為:

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">

 選項

Option Type Description
doctype String DocType of editor window (iframe). Default - <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
cssClass String CSS class for editor
cssfiles Array Array of css files which will be included in editor (iframe)
absoluteURLs Boolean Make image URLs absolute
allowSource Boolean Allow edit in HTML
lang String Interface language (requires inclusion of language file), default - English
styleWithCSS Boolean If true - text will be formated using span-tag with style attribute, else - semantic tags like strong, em and other
height Number Height of editor window in pixels
width Number Width of editor window in pixels
fmAllow Boolean Allow use of file manager
fmOpen Function(callback) Function which will be called to open file manager. Argument callback - function which editor passes to file manager on open. File manager must call this function with using URL of selected file as argument
toolbar String Toolbar to use

工具列

 

PHP入門講義

9-3-1 elrte 編輯器結合 elfinder進階檔案管理

1.把elfinder 中的目錄複製到 elrte中,並覆蓋之。

2.將以下語法貼到檔案中:

    <!-- elfinder -->
    <link rel="stylesheet" href="css/elfinder.css" type="text/css" media="screen" title="no title" charset="utf-8">
    <script src="js/elfinder.min.js" type="text/javascript" charset="utf-8"></script>
    <script src="js/i18n/elfinder.zh_TW.js" type="text/javascript" charset="utf-8"></script>

3.修改 elrte 的 js 設定:

    <script type="text/javascript" charset="utf-8">
        $().ready(function() {
            var opts = {
                cssClass : 'el-rte',
                lang     : 'zh_TW',
                width    : 640,
                height   : 200,
                toolbar  : 'complete',
                cssfiles : ['css/elrte-inner.css'],
                fmOpen : function(callback) {
                     $('<div id="myelfinder" />').elfinder({
                     url : 'connectors/php/connector.php',
                     lang : 'zh_TW',
                     dialog : { width : 900, modal : true, title : 'Files' }, // open in dialog window
                     closeOnEditorCallback : true, // close after file select
                     editorCallback : callback     // pass callback to file manager
                     })
                }

            }
            $('#editor').elrte(opts);
        })
    </script>

4.修改connectors/php/connector.php:(32行)

    'URL'             => 'http://localhost/files/', // root directory URL

PHP入門講義

9-4 My97DatePicker小月曆用法

  1. 將My97DatePicker整個目錄放入系統目錄下
  2. My97DatePicker目錄是一個整體,不可破壞裡面的目錄結構,也不可對裡面的文件改名,可以改目錄名
  3. My97DatePicker.htm 是必須文件,不可刪除
  4. 加入以下語法:
    <script language="javascript" type="text/javascript" src="My97DatePicker/WdatePicker.js"></script>
  5. 在input中加入:
    onClick="WdatePicker({dateFmt:'yyyy-MM-dd HH:mm:ss' })"
  6. 其他常用參數:
    (1) 語系:lang:'zh-tw'
    (2) 佈景:skin:'whyGreen'
    (3) 民國年:dateFmt:'民國yyy年MM月dd日'
    (4) 含時間:dateFmt:'yyyy-MM-dd HH:mm:ss'
    (5) 起始日期:startDate:'1980-05-01' 或 startDate:'%y-%M-%d %H:%m:%s'
    (6) 星期一維第一天:firstDayOfWeek:1
    (7) 最小日期:minDate:'2006-09-10' 或 minDate:'%y-%M-{%d+2} %H:%m:%s'
    (8) 最大日期:maxDate:'2008-12-20'
    (8) 週休禁止:disabledDays:[0,6]

PHP入門講義

9-5 formValidator 表單驗證

 

1.加入以下語法:

<link rel='stylesheet' href='css/validationEngine.jquery.css' type='text/css' media='screen' charset='utf-8' />

<link rel='stylesheet' href='css/template.css' type='text/css' media='screen' title='no title' charset='utf-8' />
<script src='js/jquery-1.6.min.js' type='text/javascript'></script><!--端視之前有無引入 jquery-->
<script src='js/languages/jquery.validationEngine-tw.js' type='text/javascript'></script>
<script src='js/jquery.validationEngine.js' type='text/javascript'></script>
<script type='text/javascript'>
$(document).ready(function() {
    $('#myform').validationEngine({
        inlineValidation: true,
        success :  false,
        failure : function() {}
    });
});
</script>

    (1) 提示的位置:「promptPosition: "topRight", 」選項有:topLeft, topRight, bottomLeft,  centerRight, bottomRight

    (2) 是否邊輸入邊檢查:「inlineValidation: true,」

2.表單要做的變化:記得在<form>中加入id="myform",要對應上面的$("#myform")。

在欄位中加入參數:<input name='id' type='text' id='id' class='validate[required , custom[onlyLetter] , length[0,10]]'>

 

 

4.單選鈕的寫法:<input name="sex" type="radio" value="男" class="validate[required] radio">

5.複選鈕的寫法:<input name="hobby" type="checkbox" id="hobby" value="琴" class="validate[minCheckbox[2]] checkbox">

PHP入門講義

10. 用PHP上傳檔案

  1. 若表單中有file元件,表單一定要加上:「enctype="multipart/form-data"」。
  2. 每上傳一張圖(假設file欄位名稱為pic),都會產生一組 $_FILES 超級全域變數:
    • (1) $_FILES['pic']['name'](多檔:$_FILES['pic']['name'][0]):上傳檔案原始名稱。
    • (2) $_FILES['pic']['type']:檔案的 MIME 類型,例如“image/gif”。
    • (3) $_FILES['pic']['size']:已上傳檔案的大小,單位為bytes。
    • (4) $_FILES['pic']['tmp_name']:檔案被上傳後的臨時檔案名。
    • (5) $_FILES['pic']['error']:和該檔案上傳相關的錯誤代碼。
  3. 上傳的步驟:送出上傳→圖會暫時放到tmp中→程式要搬移該檔到指定的位置。
  4. 搬移上傳檔方法:move_uploaded_file(暫存檔 , 新路徑檔名)

 讀出檔案會用到的函數:

  1. opendir():http://www.php.net/opendir
  2. preg_match():http://www.php.net/preg_match

 

PHP入門講義

11. 安裝BootStrap

官方網站:http://twitter.github.io/bootstrap/index.html

中文手冊:http://kkbruce.tw/

BootStrap 是一套CSS框架,您不懂CSS也沒關係,直接根據手冊說明,套用到網站上即可。

將下載的檔案解壓縮,並將解開的css、img、js 三個資料夾複製到程式的所在位置即可。

一個有套用Bootstrap的基本頁面:

    <!DOCTYPE html>
    <html>
    <head>
    <title>標題</title>
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="content-type" content="text/html; charset=utf-8">
    <!-- Bootstrap -->
    <link href="css/bootstrap.min.css" rel="stylesheet" media="screen">
    </head>
    <body>
    主內容
    <script src="http://code.jquery.com/jquery.js"></script>
    <script src="js/bootstrap.min.js"></script>
    </body>
    </html>

 

PHP入門講義

11-1 流動網格系統

流動網格系統可適用在任何裝置上!一樣分為12格

<div class="row-fluid">
    <div class="span4">左欄</div>
    <div class="span8">右欄</div>
</div>

<div class="row-fluid">
    <div class="span3">左欄</div>
    <div class="span6">中欄</div>
    <div class="span3">右欄</div>
</div>

 

PHP入門講義

21-1 index.php

<?php
  //連線資料庫
  link_db("localhost" , "root" , "12345" , "tad");
  
  //針對 op 變數進行整理
  $op = isset($_REQUEST['op'])?$_REQUEST['op']:"";
  $sn = isset($_REQUEST['sn'])?intval($_REQUEST['sn']):"";   //intval() 強制轉成數字
  
  //流程控制
  switch($op){
  
    //儲存榮譽榜資料
    case "insert":
      insert();
      header("location:index.php");
    break;
    
    //發布表單
    case "post_form":
      $main = post_form($sn);
    break;
    
    //刪除
    case "delete":
      delete($sn);
      header("location:index.php");
    break;
    
    //更新榮譽榜資料
    case "update":
      update($sn);
      header("location:index.php");
    break;
    
    //列出所有榮譽榜
    default:
      $main = list_all();
    break;
  }  
  
?>

<!DOCTYPE html>
<html>
  <head>
    <title>榮譽榜發布</title>
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="content-type" content="text/html; charset=utf-8">
    <!-- Bootstrap -->
    <link href="css/bootstrap.min.css" rel="stylesheet" media="screen">
  </head>
    
  <body>
    <div class="row-fluid">
    
      <div class="span3"></div>
      
      <div class="span6">
        <?php echo $main;?>
      </div>
      
      <div class="span3"></div>
      
    </div>
    
    

    <script src="http://code.jquery.com/jquery.js"></script>
    <script src="js/bootstrap.min.js"></script>
  </body>
</html>

<?php
  //連線資料庫
  function link_db($location="localhost" , $id="" ,$passwd="" , $db=""){
    $link = mysql_connect($location , $id , $passwd);
    if($link){
      mysql_query("SET NAMES 'utf8'");
      mysql_select_db($db);
      return $link;
    }else{
      die("連線失敗!");
    }
  }

  //新增到資料庫  
  function insert(){
  
    $award_winner = addslashes($_POST['award_winner']);
    $award_date = addslashes($_POST['award_date']);
    $award_kind = addslashes($_POST['award_kind']);
    $award_content = addslashes($_POST['award_content']);
    $award_enable = addslashes($_POST['award_enable']);
    
    $sql = "INSERT INTO `honor`(`award_winner`, `award_date`, `award_kind`, `award_content`, `award_enable`, `post_date`) VALUES ('{$award_winner}' , '{$award_date}' , '{$award_kind}' , '{$award_content}' , '{$award_enable}' , now())";
    
    mysql_query($sql) or die(mysql_error());
  
  }
  
  //更新到資料庫  
  function update($sn=""){
  
    $award_winner = addslashes($_POST['award_winner']);
    $award_date = addslashes($_POST['award_date']);
    $award_kind = addslashes($_POST['award_kind']);
    $award_content = addslashes($_POST['award_content']);
    $award_enable = addslashes($_POST['award_enable']);
    

    $sql = "UPDATE `honor` SET 
    `award_winner` = '{$award_winner}',
    `award_date` = '{$award_date}',
    `award_kind` = '{$award_kind}',
    `award_content` = '{$award_content}',
    `award_enable` = '{$award_enable}',
    `post_date`= now() 
    WHERE `sn`= '{$sn}'";
    
    mysql_query($sql) or die(mysql_error());
  
  }
  
  //列出所有內容
  function list_all(){
  
    $sql = "SELECT * FROM `honor` where `award_enable` = '1' order by `award_date` desc ";
    $result = mysql_query($sql) or die(mysql_error());
    
    
    $table_content = "";
    while($data = mysql_fetch_assoc($result)){
    
      //將換行轉為<br>
      $award_content=nl2br($data['award_content']);
    
      $table_content .= "
      <tr>
      <td>{$data['award_winner']}</td>
      <td>{$data['award_date']}</td>
      <td>{$award_content}</td>
      <td nowrap>
        <a href='index.php?op=delete&sn={$data['sn']}' class='btn btn-danger btn-mini'>刪除</a>
        <a href='index.php?op=post_form&sn={$data['sn']}' class='btn btn-warning btn-mini'>修改</a>
      </td>
     </tr>
     ";  
    }
  
    $main="
    <h1>
    <img src='img/gold.png'>榮譽榜
    <a href='index.php?op=post_form' class='btn btn-info'>發布</a>
    </h1>
    
    <table class='table table-striped table-bordered'>
    <tr>
      <th>獲獎者</th>
      <th>得獎日期</th>
      <th>事由</th>
      <th nowrap>功能</th>
    </tr>
    $table_content
    </table>
    
    ";
    
    return $main;
  }
  
  
  //發布表單
  function post_form($sn=""){
     
    $sql = "SELECT * FROM `honor` where `sn` = '{$sn}'";
    $result = mysql_query($sql) or die(mysql_error());
    $data = mysql_fetch_assoc($result);
    
    $date=empty($sn)?date("Y-m-d"):$data['award_date'];
    
    //還原下拉選單預設值
    $selected_0 = ($data['award_kind']== "校內") ? "selected" : "";
    $selected_1 = ($data['award_kind']== "校外") ? "selected" : "";
    
    //還原單選鈕預設值
    $award_enable0 = ($data['award_enable']!= "1") ? "checked" : "";
    $award_enable1 = ($data['award_enable']== "1") ? "checked" : "";
    
    $op = empty($sn)? "insert" : "update";
    
    $form="
    <h1 class='text-center'>榮譽榜發布</h1>
        
    <form action='index.php' method='post' class='form-horizontal'>
    <div class='well'>
      <div class='control-group'>
        <label class='control-label' for='award_winner'>得獎者名稱:</label>
        <div class='controls'>
          <input type='text' id='award_winner' name='award_winner' value='{$data['award_winner']}' class='span12' placeholder='請輸入得獎者名稱'>
        </div>
      </div>

      <div class='control-group'>
        <label class='control-label' for='award_date'>得獎日期:</label>
        <div class='controls'>
          <input type='text' id='award_date' name='award_date' value='{$date}' class='span12' placeholder='得獎日期格式:2013-07-09'>
        </div>
      </div>

      <div class='control-group'>
        <label class='control-label' for='award_kind'>類別:</label>
        <div class='controls'>
          <select name='award_kind' id='award_kind' class='span12'>
            <option value='校內' $selected_0>校內</option>
            <option value='校外' $selected_1>校外</option>
          </select>
        </div>
      </div>

      <div class='control-group'>
        <label class='control-label' for='award_content'>得獎事由:</label>
        <div class='controls'>
          <textarea name='award_content' id='award_content' rows='4' class='span12'>{$data['award_content']}</textarea>
        </div>
      </div>

      <div class='control-group'>
        <label class='control-label' for='award_enable'>是否發布:</label>
        <div class='controls'>

          <label class='radio'>
            <input type='radio' name='award_enable' id='award_enable1' value='1' {$award_enable1}>是,立即發布
          </label>

          <label class='radio'>
            <input type='radio' name='award_enable' id='award_enable0' value='0' {$award_enable0}>否,暫時隱藏
          </label>


          <input type='hidden' name='op' value='{$op}'>
          <input type='hidden' name='sn' value='{$sn}'>
          <a href='index.php' class='btn'>回上頁</a>
          <input type='submit' value='送出' class='btn btn-primary'>
        </div>
      </div>
    </div>
  </form>
  ";
    
    return $form;  
  }
  
  
  //刪除 
  function delete($sn=""){
      
    $sql = "DELETE FROM `honor` WHERE `sn` = '{$sn}'";
    
    mysql_query($sql) or die(mysql_error());
  
  }
?>