第 4 章 PHP 基本語法.

Slides:



Advertisements
Similar presentations
白玉苦瓜 余光中.
Advertisements

課程名稱:程式設計 授課老師:________
第4章 條件判斷與迴圈 Java 2 程式設計入門與應用.
迴圈 迴圈基本觀念 while迴圈 do 迴圈 for迴圈 巢狀迴圈 迴圈設計注意事項 其他控制指令 迴圈與選擇的組合.
C#程序设计案例教程 第3章 程 序 结 构.
P303 HTML/DHTML/CSS/JavaScript 專業HTML網頁設計 陳錦輝.
第4章 JavaScript脚本语言基础 4.1 JavaScript简介 4.2 JavaScript语法基础
第3章 JavaScript语言基础.
14 JavaScript语言基础 JavaScript是一种轻量级、解释型的Web开发语言。所谓轻量级,就是语言的体系结构不是很庞杂,例如,没有C、Java等语言中的类、内存管理、系统管理等高深的知识范畴;所谓解释型,就是语言在浏览器或服务器等环境中直接被解释执行,不需要对源代码进行编译操作。
第 5 章 流程控制 (一): 條件分支.
Chapter 4 流程控制.
第二章 JAVA语言基础.
新世代計算機概論 第14章 程式語言.
Ch07 PHP程式基礎 網頁程式設計.
PHP程式設計 二、HTML & PHP基本語法 建國科技大學 資訊管理學系 饒瑞佶.
【PHP程式設計】 實作一:計算BMI.
第四章 網頁表單與資料傳遞.
2.1 基本資料型別 2.2 變數 2.3 運算式與運算子 2.4 輸出與輸入資料 2.5 資料型別轉換 2.6 實例
課程名稱:程式設計 授課老師:________
Visual Basic 6.0 學習範本 第三章 基本資料型態.
物件導向程式設計 (Object-Oriented rogramming)
第二章 C# 基础知识.
C++Primer 3rd edition 中文版 Chap 5
PHP 5 入門基礎 第一個PHP 程式 PHP 資料型態.
第3章 變數、資料型別與運算子.
第3章 語法入門 第一個Java程式 文字模式下與程式互動 資料、運算 流程控制.
C 程式設計— 控制敘述 台大資訊工程學系 資訊系統訓練班.
Cookie 存取Cookie Cookie有效時間 Session 存取Session session 函數
1 巨集 2 資料型態 3 物件、屬性、方法與事件 4 陳述式與副函式 5 其他注意事項 6 範例
ASP动态网页设计实用教程 主讲教师: 开课单位:.
PHP+MySQL互動式網頁程式設計班 檔案上傳程式設計 講師:林業峻 CSIE, NTU 7 / 3, 2010.
檔案上傳 所謂檔案上傳,就是將檔案由客戶端的主機,藉 由瀏覽器傳送到伺服器的資料夾上。
第4章 程序控制结构与算法基础.
計算機程式 廖文淵 Department of Computer Science and Engineering
第3章 變數、常數與資料型態 3-1 C語言的識別字 3-2 變數的宣告與初值 3-3 指定敘述 3-4 C語言的資料型態
條件判斷指令 -if 指令 -switch 指令 迴圈指令 - for 迴圈 - while迴圈 - break、continue 指令
PHP 程式流程控制結構.
第3章 變數、資料型別與運算子 3-1 變數與資料型別的基礎 3-2 變數的命名與宣告 3-3 資料型別 3-4 運算式與運算子
變數命名 保留字(Reserved Word)
電腦解題─流程圖簡介 臺北市立大同高中 蔡志敏老師.
本章中將會更詳細地考慮有關重複的概念,並且會 介紹for和do…while等兩種用來控制重複的敘述 式。 也將會介紹switch多重選擇敘述式。 我們會討論直接和迅速離開某種控制敘述式的 break敘述式,以及用來跳過重複敘述式本體剩餘 部份的continue敘述式。 本章會討論用來組合控制條件的邏輯運算子,最後.
2019/1/17 Java语言程序设计-程序流程 教师:段鹏飞.
Cookie 存取Cookie Cookie有效時間 Session 存取Session session 函數
PHP 變數、常數與運算子 變數 常數 運算子
進階 WWW 程式設計 -- PHP 語言結構 靜宜大學資訊管理學系 蔡奇偉副教授 2003
第三章 C# 基础知识.
江西财经大学信息管理学院 《数据库应用》课程组2007
第3章 Java語法的JSP程式 3-1 Java語言的基礎 3-2 JSP程式的基本架構 3-3 Java的變數與資料型態
PHP编程基础与实例教程 PHP Fundamentals & Practices
Ch09 在網頁之間傳遞資訊 網頁程式設計.
Ch04 VB.NET的流程控制 網頁程式設計.
第六章 迴圈與陣列.
Chapter 2 基本語法.
第3章 PHP表达式.
第二章、第三章错题分析.
第二章 Java基本语法 讲师:复凡.
第3章 JavaScript基本语句.
第二章 Java语法基础.
第6章 PHP的数据采集.
目标 流程控制 字符串处理 C# 的类和对象 C# 访问修饰符 C# 构造函数和析构函数.
第二章 Java基本语法 讲师:复凡.
PHP程式設計 五、程式流程控制結構 建國科技大學 資訊管理學系 饒瑞佶.
第1章 数据结构基础概论 本章主要介绍以下内容 数据结构研究的主要内容 数据结构中涉及的基本概念 算法的概念、描述方法以及评价标准.
本章主題 C++的程式結構 資料型態與宣告 算術運算 簡易的輸入輸出指令 程式編譯(Compile)的過程與原理.
第2章 Java语言基础.
第6章 PHP基本語法介紹.
PHP5與MySQL5 入門學習指南 凱文瑞克 著 第 12 章 迴圈指令.
C#快速導讀 流程控制.
表单页面 表单是用户利用浏览器对Web站点网络数据库进行查询的一种界面,用户利用表单可以输入信息或选择选项等,然后将这些信息提交给服务器进行处理。通过表单,既可以将浏览器的信息发送到Internet服务器上,同时表单也可以使用户与站点的浏览者交互或从浏览者那里收集信息。它是网页的设计者和使用者相互交流的工具。表单对象包括文本域(单行、多行、密码)、列表、菜单、复选框、单选框、按钮等。
第5章 新增課程與課程管理.
Presentation transcript:

第 4 章 PHP 基本語法

本章重點 4 - 1 資料型別與變數 4 - 2 陣列 4 - 3 使用常數 4 - 4 運算子與運算式 4 - 5 流程控制 4 - 6 表單資料傳遞

本章重點 4 - 7 重要內建變數 4 - 8 實戰演練 - 陽春登入及歡迎網頁 4 - 9 實戰演練 - 兒童加減計算機 4 - 10 實戰演練 - 飲料訂購表單

PHP 基本語法 上一章介紹了如何撰寫 PHP 網頁, 本章要更進一步介紹 PHP 語法, 包括資料型別、運算子、運算式、流程控制等。

4 - 1 資料型別與變數 撰寫程式免不了要使用變數來存放資料。 在 C / C++、Java 這類程式語言, 使用變數前必須先宣告 (Declare) 變數所屬的資料型別 (Data Type)。 但 PHP 與這些程式語言不同, 使用變數時不必宣告變數的資料型別, 需用到變數時, 直接寫出即可。

變數名稱 PHP 的變數名稱均是以 $ 符號開頭, 之後再接變數的名稱。 變數名稱第 1 個字必須是英文字母或底線符號 _, 之後則可使用任何文數字。 但要特別注意, 變數名稱在 PHP 中有區分大小寫, PHP 指令則不分大小寫。 例如 echo 也可寫成 ECHO, 功能都相同, 但 $var 和 $VAR 則是兩個不同的變數。

資料型別 PHP 的變數可存放下列幾種類型的資料: 布林值 (boolean) 整數 (integer) 浮點數 (float, floating-point) 字串 (string) 陣列 (array) 物件 (object) 資源 (resource) 空值 (null)

資料型別 其中陣列與物件分別會在 4-2 節與第 13 章介紹。 而資源型別的變數, 通常是使用某些特定功能 (例如查詢資料庫、讀取檔案) 所傳回的代表該項資源的相關變數, 在後續各章有用到時會適時說明。

資料型別 本節只介紹另外 5 種資料類型:

浮點數的精確度 在此我們要提醒讀者, 電腦的浮點數無法精確表示真實世界的小數數值, 因此應避免做比較兩個浮點數是否相等之類的動作。 由於電腦使用二進位的運算, 因此表示小數時, 是用 1/2、1/4、1/8... 的數字來表示我們所要存放的數值, 因此很多時候只能『逼近』我們所要的數值, 而非『相等』。

浮點數的精確度 以 0.1 這個簡單的數字為例, 存在電腦中也只是『近似 0.1』的值, 在一般運算後輸出, 由於浮點數小數點後十多位的 4 捨 5 入處理, 所以看起來都是正確的。 但如果反複使用, 近似值與 0.1 間微小的差距, 就逐漸被放大, 出現不精確的結果。 舉例來說, 在 PHP 中將 0.1 相加七萬次, 不會得到整數 7000, 而是 7000.00000001。

PHP 的字串表示法 在 PHP 中, 字串可使用下列 3 種表示法: 以下分別說明這幾種用法及其差異。 使用單引號 ('):適用於一般性的字串。 使用雙引號 ("):適用於需表示含特殊符號或變數內含值的字串。 使用 heredoc 表示法:適用於多行的字串。 以下分別說明這幾種用法及其差異。

單引號表示法 單引號表示法是最單純的字串表示法, 只是要表示普通、簡短的文字字串時, 都可使用單引號來括住字串, 就像前面範例的應用一樣。 如果字串中也含有單引號, 就必須加上一個反斜線 (\), 這樣 PHP 才不會誤將字串內的單引號當成代表字串『結束』的單引號。 加上反斜線的表示法稱為跳脫序列 (Escape Sequence), 表示反斜線後面符號, 要跳出原本在 PHP 中的意思。

單引號表示法 而如果要輸出反斜線本身, 則需將反斜線連寫兩次:

雙引號表示法 使用雙引號 (") 表示字串的方式, 與使用單引號相似, 直接在字串前後用雙引號括住字串即可。 雙引號字串可使用的跳脫序列較多, 除了 \\ 與 \' 之外, 還有下列幾個。

雙引號表示法 在雙引號字串使用單引號就不需使用跳脫序列了, 直接寫出即可。

雙引號表示法 例如: 使用雙引號字串與單引號字串的最大差異, 就是 PHP 會解譯雙引號字串中的變數名稱。

雙引號表示法 執行結果:

雙引號表示法 程式分別建立了 2 個變數, 其中 $str 變數存放的是字串 "我有", 而 $money 存的則是數值 100。 由執行結果可發現, PHP 輸出雙引號字串時, 會將其中的變數名稱替換成變數值。 所以:『"$str $money 元"』中的 $str、$money 分別被換成 "我有" 和 "100", 因此最後輸出時就變成『我有 100 元』了。 但 PHP 不會處理單引號字串中的變數名稱, 所以第 2 個 echo 指令就依原樣輸出。

使用 heredoc 表示多行的字串 PHP 還有一種用以表示多行字串的 heredoc 表示法。 其語法是在字串開頭加上 <<< 符號及一個用以代表此字串結束的『自訂名稱』, 並在字串結尾的下一行也用『自訂名稱』表示字串結束:

使用 heredoc 表示多行的字串 請特別注意, 字串結尾的『自訂名稱』, 一定要放在該行行首, 前後均不可有空白或註解, 否則 PHP 會產生錯誤訊息。 由以下實例即可瞭解其用法:

使用 heredoc 表示多行的字串 執行結果:

使用 heredoc 表示多行的字串 heredoc 表示法優點在於:變數名稱可以被 PHP 代換為變數值, 而且可以直接使用單引號、雙引號、反斜線等符號, 不需使用跳脫序列。 上面 $page 變數如果改用一般方式設定的話, 必須使用下面比較繁雜的格式:

4 - 2 陣列 使用前述資料型別的變數, 雖可很方便的儲存各式資料, 但因一個變數只能放一筆資料, 所以不適合處理大批資料。 例如要用變數記錄 100 個學生的成績, 以前面介紹的方式就要設定 100 個變數, 不但寫起很費工夫, 也很容易出錯。 在處理大量資料時, 使用陣列來代替多個變數較為方便。

陣列

一維陣列 以索引的方式建立陣列 建立陣列的語法如下: 如果未指定索引值, 會自動從 0 開始, 而後面的元素索引則會自動接著前一個元素索引按順序編號。 若要指定索引編號, 亦可不按順序指定。

一維陣列

一維陣列 除了使用數字做為索引外, 您也可以使用『字串』當索引, 同樣以學生分數陣列為例, 我們可用學生的名字來當成索引: 不管是數字索引或字串索引的陣列, 其用法都相同。

一維陣列 以 array() 函式建立一維陣列 唯一不同之處在於:若要在雙引號字串中, 使用字串索引的陣列元素, 需額外加上大括號 {}, PHP 才能正常解譯並代換其值: 以 array() 函式建立一維陣列 以一個個設定元素值的方式來建立陣列, 仍然非常不便, 因此 PHP 提供一個建立陣列的函式 array()。其語法如下:

一維陣列 如果使用數字索引時, 可以不設索引值 (自動從 0 開始算), 也可以自行指定數字或字串做為索引, 或只指定第 1 個索引值 (後面的依序遞增)。 例如:

二維陣列與多維陣列 在前面介紹中, 我們用一維陣列 $student 就可以記錄一個班級中同學的成績, 但是若有多個班級的學生成績要記錄, 就必須用到二維陣列。 下圖是一個學生成績的二維陣列示意圖, 其中, 第 1 個索引表示第 n 班, 第 2 個索引是學生編號。

二維陣列與多維陣列 二維陣列其實可以看成多個一維陣列的組合。

二維陣列與多維陣列 例如上圖共有兩個一維陣列:$student[0]、$student[1], 而 $student[0] 的第 3 個元素便是 $student[0][2]。 所以建立二維陣列時, 可以使用兩層的 array() 函式來建立:

二維陣列與多維陣列 按照此語法, 上面學生成績二維陣列可用如下的方式來建立: 除了使用 array 直接建立二維陣列以外, 您也可以先建立好一維陣列, 然後再放進另一個陣列中:

二維陣列與多維陣列 三維、四維...等多維陣列的建立方法與二維陣列類似, 將多個二維陣列組合起來, 便成為三維陣列, 四維陣列亦同。 例如:3 年 2 班 1 號同學的三維陣列名稱就是 $student[3][2][1];6 年 4 班 2 號同學的數學成績的四維陣列名稱可以是 $student[6][4][2][math], 依此類推。

4 - 3 使用常數 常數 (Constant) 的特點是『定義之後, 其值就不能變更』。 雖然在大部份的場合, 使用變數即可解決我們的問題。 但有些時候, 為避免不小心改到不應更改的變數值;或者想用文字代替特定的資料或數值, 讓程式讀起來更容易理解, 此時就可使用常數。

定義常數 定義常數時必須使用 define() 函式, 其語法如下: 常數的命名規則和變數類似, 只不過常數不需以 $ 符號為開頭, 且習慣上都會全部使用大寫英文來命名。

定義常數 常數的值一經定義後, 就不能再修改。 以下就是一個簡單的常數應用範例:

內建常數 為了方便程式撰寫, PHP 也提供許多內建的常數 (又稱為 "Magic constants")。

內建常數

內建常數 舉例來說, 前面的範例示範了定義圓周率常數, 然而在 PHP 中其實已定義了一個圓周率常數 M_PI (= 3.14159265359), 所以上述範例可直接取用:

4 - 4 運算子與運算式 認識運算式與運算子 寫程式不可或缺的一部份, 就是對資料進行各種處理的運算式 (Expression), 而運算式則是由運算子 (Operator) 與運算元 (Operand) 所構成。 其中, 運算子代表的是運算的種類 (或者說運算符號), 而運算元則是要運算的資料。 舉例來說: 上面的例子就是一個運算式, 其中『+』是運算子, 代表要進行加法運算, 而 $x 與 $y 則是參與加法運算的運算元。

運算子與運算式 算術運算子 在 PHP 中運算子可分為許多種, 我們先從一般人最熟悉的算術運算子開始介紹。

運算子與運算式 遞增 / 遞減運算子 承襲 C 語言的風格, PHP 也提供遞增 / 遞減運算元, 請參考下表:

運算子與運算式 例如: 串連運算子 串連運算子『.』會將字串進行串連, 組合為單一字串。例如:

運算子與運算式 比較運算子 比較運算子會比較兩邊的運算元, 然後將結果以布林值傳回:

運算子與運算式 邏輯運算子 邏輯運算子會取兩邊的布林值, 進行邏輯上的交集、聯集、互斥與否定運算, 然後將結果以布林值傳回。

運算子與運算式 各邏輯運算子的使用方法如下:

運算子與運算式 以下是邏輯運算的真值表:

== 和 === 以及 != 和 !== 的不同 關於 ==、!= 和 ===、!== 的差異要再特別說明一下! PHP 在必要時會自動做資料型別轉換, 以便進行處理, 舉例來說, 我們可以將整數、浮點數與『含數字』的字串做算術運算:

== 和 === 以及 != 和 !== 的不同 在 23 + $str 這個運算式中, $str 變數所存的字串 '100' 會自動被轉換成數字 100, 再與 23 相加得到 123。 而做 $money - 23 時, 則會取 $money 字串開頭的 99 來參與計算。 為了方便我們進行『值』的比較, 所以在使用 ==、!= 運算子時, PHP 也會視情況轉換運算元的資料型別, 以便進行比較, 所以會有如下的比較結果。

== 和 === 以及 != 和 !== 的不同 至於 != 和 !== 的差別也相同, 即前者不會比較資料型別, 但後者則會比較資料型別是否不同。

邏輯運算中的型別轉換 如果我們在邏輯運算使用數值、字串、變數或陣列時 (例如在流程控制中判斷變數是否為空值), 視情況 PHP 會將這些變數做型別轉換再進行比較。 此時各資料型別的變數會依如下的原則進行轉換: 就整數、浮點數而言, 當其值為 0 即會視為 false、其它數值都算是 true。

邏輯運算中的型別轉換 舉例來說, 若建立一個陣列 "$arr = array ('0', 1);" 則: 當字串為 '0'、空字串 (沒有內容的字串 ''), 即會被視為 false;其它字串都算是 true。 NULL、空陣列一律都是 false;有含元素的陣列則為 true。 舉例來說, 若建立一個陣列 "$arr = array ('0', 1);" 則:

運算子與運算式 指定運算子及複合運算子 指定運算子 (=) 我們已用過多次, 簡單的說, 其功能就是將右邊的運算元指定給左邊的運算元, 且必要時會改變變數的資料型別: 指定運算子也可與算術運算子、部分邏輯運算子及串連運算子結合成『複合運算子』。

運算子與運算式 運算子優先順序 當一個運算式內有多個運算時, 會依照下面的優先順序來決定運算的先後。

運算子與運算式

運算子與運算式 如果運算子的優先順序相同, 則依照其在運算式中的位置, 由左至右依序運算, 只有指定及複合運算子, 是由右往左。 此外, 可以使用小括號 () 來改變優先順序, 小括號 () 內的運算式會優先處理。

4 - 5 流程控制 條件控制 迴圈 If / else if / elseif / else switch while for break 與 continue fore ach

條件控制 條件控制就是依據某項條件, 來判斷程式要用執行那一個流程, 在 PHP 中可使用 if / else 和 switch 兩種條件控制指令。 其中 if / else 還可以延伸為 if / elseif / else 用法。 if / else:if / else 的功用, 在於決定是否要執行某段程式。其語法如下:

條件控制 其中 else 的部份, 若不需要可省略。 舉例來說, 要用 if 判斷買飲料時是否額外要求加珍珠、若要加珍珠要再收 5 元, 則可寫成: 以上是只針對條件運算式為 true 作處理的例子。

條件控制 如果 true 和 false 都要處理, 就需加上 else, 並在其大括號中加入 false 狀況要執行的程式片段。 例如依據氣溫判斷要穿什麼衣服, 用程式可寫成:

條件控制 如果要執行的指令只有一個, 則大括號可省略, 例如: if / elseif / else:如果在 else 下還要做條件判斷, 可使用 elseif 指令, 例如:

條件控制 我們可串接多個 elseif 以便依各種狀況做不同處理, 例如依考試分數判斷成績等第: switch:switch 類似於一連串的 if / elseif 結構。

條件控制 但在 if / elseif 結構中, 每個括弧中都可放不同的條件運算式;然而使用 switch 時就好比只針對一個值做比對。

條件控制 當 $i 的值等於某個 case 後的『條件值』時, 就會執行該段程式;如果都找不到符合的, 則會執行 default 段落的程式。 若找不到符合者便不執行任何程式, 則可省略 default 的部份。

條件控制 例如:

迴圈 迴圈 (Loop) 結構讓我們可處理重複性的工作, 迴圈的語法可分為 while、for、foreach 三種。 while:while 迴圈的結構很簡單, 語法如下: 當條件運算式為 true 時, 就會重複執行大括號中的程式碼。 while 迴圈還有一種用法, 適用於迴圈『至少要執行一次』的情況, 其語法如下。

迴圈 for:for 迴圈的語法比 while 複雜一點, 其語法如下:

迴圈 其中初始運算式只有第 1 次進入 for 迴圈之前會被執行;而條件運算式則和 while 一樣, 是用以判斷是否要繼續執行大括號的內容。 至於控制運算式則是每一輪迴圈執行結束後都會執行的。 例如前面輸出 1〜100 之間所有 3 的倍數、並計算總和的例子, 用 for 迴圈處理可寫成:

迴圈 break 與 continue:break 和 continue 都是迴圈內的跳躍指令, 表示可以忽略指令後方的程式。

迴圈 break 指令預設只能跳出一層迴圈, 因此如果要跳出多層的巢狀迴圈, 可在 break 後加上數字表示要跳出幾層的迴圈: fore ach:當需要針對陣列中每一個元素進行處理時, 我們可以使用 for 迴圈來取出元素。

迴圈 但為了讓這樣的工作更有效率, PHP 提供了另一個 foreach 迴圈, 可以更加方便地處理陣列。 foreach 會依序從 $arr 陣列中取得各元素值, 然後放在 $value 變數中。

迴圈 陣列中有多少個元素, foreach 迴圈就會執行幾次, 所以每一輪的迴圈中, $value 都代表不同的陣列元素。

迴圈 執行結果:

迴圈 上面 foreach 迴圈如果改用 for 迴圈來設計, 其程式碼如下: 兩相比較後可以看到, for 迴圈必須先取得陣列長度來定義迴圈, 然後迴圈內必須逐一使用索引數字存取各元素, 使用上不若 foreach 迴圈方便易用。

迴圈 foreach 迴圈的另一個用法, 則適合於在迴圈中需同時用到元素索引和元素值的場合, 其語法如下: $k、$v 都是自訂的變數名稱, foreach 會依序從 $arr 陣列中取得各元素的索引與值, 然後索引值放在 $k 變數, 元素值放在 $v 變數中。 所以在每一輪圈中, $k 就代表某個元素的索引, 而 $v 則是對應的元素值。

4 - 6 表單資料傳遞 在網頁程式中, 經常會需要讓使用者輸入、選擇相關項目, 然後由程式讀取並且進行處理。 前面 2-3 節已經說明如何建立可讓使用者輸入資料的表單, 本節將為您介紹如何在程式中, 讀取並且處理這些資料。

取得表單資料的方法 若要以 PHP 程式讀取使用者在表單中輸入的資料, 需在建立表單時, 將 <form> 標籤的 action 屬性指向 PHP 網頁。 如此使用者送出表單時, 瀏覽器就會將表單中輸入的資料送給該 PHP 網頁。 為方便我們存取這些資料, PHP 會將這些資料依 <form> 標籤的 method 屬性設定, 存於不同的內建變數 (內建變數都是陣列的形式) 中。

取得表單資料的方法 設為 method = "GET" 時, 在程式中可透過內建變數 $_GET 陣列取得表單資料。 設定 method = “POST” 時, 可透過內建變數 $_POST 陣列取得表單資料。

輸入資料應先檢查後再使用 程式直接將取得的資料用 echo 輸出, 其實這是不妥當的程式設計方式。 因為網頁放在網路上, 無法得知誰會來瀏覽、會輸入什麼樣的資料, 因此所有經由表單取得的資料, 都要先檢查其內容再使用。 一些原則像是: 檢查輸入資料的字元:例如是詢問年齡的欄位, 就要檢查是否輸入數字以外的資料。 檢查資料的長度:除非是用來張貼文章的欄位, 一般要讓使用者輸入的資料通常都只需幾個字

輸入資料應先檢查後再使用 從下一章開始會介紹 PHP 的各種相關函式, 讀者即可利用這些函式來檢查及處理使用者輸入的內容。 所以可依欄位的屬性, 檢查使用者是否輸入過多的資料, 因為過多的資料即意謂可能有駭客輸入了額外的資料, 試圖破解網站的安全漏洞等。 處理資料格式:有時程式需將資料顯示在網頁中或寫入資料庫, 為避免使用者惡意輸入不當資料, 使程式執行有不當的結果, 就需適切地處理資料再使用。 從下一章開始會介紹 PHP 的各種相關函式, 讀者即可利用這些函式來檢查及處理使用者輸入的內容。

取得表單中複選欄位的資料 2-18 頁曾經提到, 如果是『可以複選』的欄位, 像是可多選的固定選單 (<select multiple...>), 或是名稱相同的多選鈕 (<input type = "checkbox"..>), 其表單資料的傳送格式如下:

取得表單中複選欄位的資料 此時 PHP 內部將表單資料放進 $_GET 陣列時的步驟如下: 因為名稱相同, 後面的資料會覆蓋前面的資料, 所以我們讀取 $_GET['learning'] 時, 只能取得最後一筆欄位值。 為了解決這個問題, 在建立表單時, 可以將欄位名稱設定為陣列的形式。

取得表單中複選欄位的資料 或是 如此送出的表單資料, 以及與 PHP 內部將資料放進 $_GET 陣列的步驟如下。

取得表單中複選欄位的資料 所以我們就可以透過二維陣列 $_GET['learning'][0]、$_GET ['learning'][1]... 來讀取所有被選擇的項目了。

另一種取得表單資料的方法 - 設定 register_globals 除了使用 $_GET、$_POST 存取表單資料外, 如果將 php.ini 檔內的 register_globals 項目設定為 on, PHP 還可以直接以表單欄位做為變數名稱, 來取得該欄位的資料。 例如前面 Ch04-11.php 使用 $_POST['username'] 取得 username 欄位的欄位值。 如果開啟 register_globals 設定, 便可以直接使用 $username 讀取 username 欄位的值。

另一種取得表單資料的方法 - 設定 register_globals 我們無法精確地分清楚哪些是程式內部設定的變數, 哪些變數是外部來的資料, 甚至, 外部資料還有可能修改內部的變數值! 假設一個開啟 register_globals 的網站如下運作。

另一種取得表單資料的方法 - 設定 register_globals

另一種取得表單資料的方法 - 設定 register_globals 若上面檔案放置於 http://php.flag.com.tw/ 網站, 依照原本的設計, 使用者應該連線 http://php.flag.com.tw/a.php, 然後 a.php 才會引用並執行 b.php。 而 $config 變數在 a.php 中已經定義, 因此 b.php 並未先建立與設定其值, 便直接使用該變數。 include() 除了引用並執行本地伺服器的 PHP 檔案以外, 還可以引用遠端伺服器的 PHP 檔案。

另一種取得表單資料的方法 - 設定 register_globals 所以可能會有人特意不連線 a.php, 而以下面的方式直接連線 b.php: 使用上面方式連線後, b.php 就會依照惡意者給予的資料, 引入並執行遠端伺服器上的惡意程式。 所以為了安全起見, 建議不要啟用 register_globals 功能。

另一種取得表單資料的方法 - 設定 register_globals PHP 4.2.0 版之後, 也基於安全考量, 預設關閉 register_globals;而未來的 PHP6 也將完全取消此功能。 要查看網站的設定為何, 可使用 3-1 節介紹的 phpinfo() 輸出網站所有設定值。

關閉 register_globals 設定 由於 PHP 是在 4.2.0 之後, 才將 register_globals 預設為 off, 但在此之前, PHP 的使用已非常廣泛, 許多網頁都是以 register_globals = on 為前題而設計的。 因此目前仍有些提供網站空間服務的業者, 基於相容性需求, 會讓 register_globals 的設定為 on。

關閉 register_globals 設定 如果您所使用的網站空間服務, 也是使用『register_globals = on』的設定, 可透過 Apache 伺服器所提供的 .htaccess 檔修改個人網站的設定。 請在自己的網站目錄中放置名為 .htaccess 的檔案, 內容如下: 如此即可在您的網站下關閉 register_globals 設定。

小心 register_globals 開啟的環境 雖然我們撰寫與測試程式時都不啟用 register_globals 功能, 但是許多主機為了相容性, 管理者都會開啟 register_globals, 而且系統可能關閉 .htaccess 的權限, 無法自行關閉 register_globals。 所以最保險的方法是撰寫 PHP 程式時, 也要考慮如果程式被拿到開啟 register_globals 的主機執行時, 可能會遇到的危險, 例如上頁例子便是一個不良的程式寫作示範。

小心 register_globals 開啟的環境 為了避免內部變數被外部資料污染, 建議儘量不要在可能產生危險的指令 (如引入、開檔、存取資料庫等), 使用其他檔案定義的變數。 如果必須這麼做, 也應該先過濾或檢查變數值, 才能避免 register_globals 所造成的影響。

4 - 7 重要內建變數 PHP 除了有內建的常數外, 也有一組內建變數(Predefined Variables), 這些內建變數都是以字串為索引的陣列, 是程式一開始執行時即存在的。 不需事先定義, PHP 會自動將與程式相關的資料存於其中供我們取用。 上一節介紹的 $_GET、$_POST 便是內建變數, PHP 另外還有幾個實用的內建變數 (也都是陣列), 我們可以使用 phpinfo() 函式來取得內建變數的資訊。

重要內建變數

重要內建變數 後面章節中, 我們會於實際使用時, 分別為您介紹常用的內建變數。本節將先說明 $_SERVER 的功用。 例如剛才設計表單時, 我們會將 action 屬性指向處理表單的 PHP 程式, 但將檔名寫在 HTML 標籤中有個缺點:如果日後修改了檔案名稱, 我們也必須修改標籤中的屬性。

重要內建變數 如果希望不管怎樣修改檔名, 程式都不用修改, 就可善用 $_SERVER 內建變數。 $_SERVER 內建變數中有一個元素索引是 'PHP_SELF', 其元素值即為代表 PHP 程式本身的路徑。 因此如果表單要由本身來處理, 就可用 $_SERVER['PHP_SELF'] 的值當成表單 action 的屬性值。

重要內建變數 $_SERVER 陣列中的元素很多, 此處就不詳列, 請參考 PHP 官方網站上的文件說明 (http://tw.php.net/manual/tw/reserved.variables.php#reserved.variables.server)。