You are on page 1of 24

PHP 基礎概念整理 By 鴻榮

PHP 基礎概念整理 (By 鴻榮)


一、PHP 與 HTML 的不同
1. 副檔名為 html 的網頁會被 Web Server 直接送出,
副檔名為 php 的網頁會先經 PHP Engine 處理再送出。
2. 含 PHP 碼的網頁,具有迴圈處理的功能,純 HTML 碼的網頁則無。
3. 即使網頁內容含有 PHP 碼,在經處理之後,輸出到使用者面前的只剩下 HTML 碼,原始
內容不但可以受到保護(不被竊取),使用者使用何種瀏覽器也不會受到侷限。
4. PHP 是一種內嵌式的語言,它被嵌入 HTML 碼之中,彌補純 HTML 碼無法進行運算處理
的缺憾。
二、PHP 的四種寫法
要在 HTML 中加入 PHP,有以下四種做法:
<? echo "第一種方法!"; ?>

<?php echo "第二種方法!"; ?>

<script language="php">
 echo "第三種方法!";
</script>

<% echo "第四種方法!"; %>


三、PHP 的註解寫法
凡是用 // 開頭或是夾在 /* 和 */ 之間的文字都將視為註解。註解主要是用來提供程式說明,以
增加可讀性,在執行時會自動略過註解。
 <?
 // 這是單行註解
 /*
 這是多行註解
 這是多行註解
 這是多行註解
 */
 
/*
 這是巢狀註解,會引發錯誤
  /*
  這是巢狀註解,會引發錯誤
  */
 這是巢狀註解,會引發錯誤
 這是巢狀註解,會引發錯誤
 */
 ?>
四、資料型態
-1-
PHP 基礎概念整理 By 鴻榮
1.PHP 支援 integer, double, string, array, object 等五種資料型態
2.PHP 不須事先宣告變數的資料型態,PHP 會根據所給定的值來決定變數的資料型態
3.在 PHP 中有兩種指定字串的方法:雙引號(")、單引號(')。
A. 雙引號所包含的字串:
◎可以是一般文字字串,可以含有單引號。
◎如果含有變數的話,會以該變數的值代入。
◎允許以「\」代表跳脫(escape)字元,在雙引號中加入具有特殊用途的符號,如:
\n:換行(newline)、\t:跳位(Tab)、\\:反斜線(backslash)、
\$:錢字號(dollar sign)、\":雙引號(double-quote)
B. 單引號所包含的字串:
◎在單引號中的變數不會以變數值代入。
◎可以被 escape 的字元只有兩個:\' 與 \\。
4. 強迫將變數的型態轉換
<?php
$a = 10 ; //$a is a integer
//型態轉換方式一
$b = (double)$a ; //$b is a double  變數 = (新的資料型態)變數
//型態轉換方式二
$b = settype($a,string) ; //$b is a string  變數 = settype( 變數 , 新的資料型
態)
?>
※PHP 相關內建函數:gettype()、settype()、var_dump()
五、變數與常數
1. 超全域變數(預設變數)
陣列名稱 說明
$GLOBALS 目前程式碼範圍中有效的變數
$_SEVER 和 伺 服 器 相 關 的 變 數 ( 請 參 閱 phpinfo() 中 的 PHP
Variables)
$_ENV 環境變數(請參閱 phpinfo()中的 PHP Variables)
$_GET 利用 HTTP GET 方式傳回的變數
$_POST 利用 HTTP GET 方式傳回的變數
$_REQUES 讀取任何一種使用者輸入方式的變數
T
$_COOKIE 利用 HTTP GET 方式傳回的變數
$_SESSION 讀取已註冊的 SESSION 變數
$_FILE 上傳檔案時的變數

2. 區域變數
3. 預設常數
4. 自訂常數define(常數名稱,內容值);

-2-
PHP 基礎概念整理 By 鴻榮
六、流程判斷式與迴圈
1. IF 判斷
<?php
$yearsold=$_GET['years'];
echo "您的年齡為$yearsold<br>";
if ($yearsold >18) {
echo "您可以看限制級電影"."<br>";
} elseif($yearsold >12) {
echo "您可以看輔導級電影"."<br>";
} elseif($yearsold >6) {
echo "您可以看保護級電影"."<br>";
} else {
echo "您可以看普遍級電影"."<br>";
}
?>
2. Switch 判斷見第 7 頁
3. For 迴圈
<?php
for ($i=1;$i<=10;$i++) {
echo "i->".$i."<br>"."<hr>";
}
?>
4. While 迴圈
<?php
$i = 1;
while ($i<10) {
echo "i=".$i."<br>";
$i++;
}
echo "離開迴圈時 i=".$i."<br>";
?>
5. Do while 迴圈
<?php
$i = 1;
do {
echo "i=".$i."<br>";
$i++;
} while ($i<10);
echo "離開迴圈時 i=".$i."<br>";
?>

-3-
PHP 基礎概念整理 By 鴻榮
6. 與陣列搭配的 foreach 迴圈
A. 設定陣列初始值
一個一個設定 ※ 完全沒設定索引值從 0 開始,否則續接前一索引值
<?php
$chinese[1] = 80;
$chinese[3] = 60;
$chinese[] = 90;
$chinese[6] = 50;
$chinese[] = 70;
for ($a=0; $a<=8; $a++)
echo "座號".$a."同學的成績為:".$chinese[$a]."<br>" ;
$a["Jan"] = "1 月";
$a["Feb"] = "2 月";
$a["Mar"] = "3 月";
echo $a["Mar"]."<hr>";
?>
利用 array()設定
<?php
$chinese = array ( 80,60,90,50,70);
for ($a=0; $a<5; $a++)
echo "$chinese[$a] <br>" ;
$math=array(
1=>80, 3=>60,
6=>90, 8=>50,
9=>70
);
for ($a=0;$a<=10;$a++)
echo "座號".$a."同學的成績為:".$math[$a]."<br>" ;
$chinese=array(
1=>80,3=>60,
90, 8=>50,
70
);
for ($a=0;$a<=10;$a++)
echo "座號".$a."同學的成績為:".$chinese[$a]."<br>" ;
$a=array(
"Jan" => "一月", "Feb" => "二月", "Mar" => "三月"
);
echo $a["Mar"]."<br>";
?>

-4-
PHP 基礎概念整理 By 鴻榮
B. 用 foreach 輸出陣列
<?php
//第一種形式:foreach(陣列名稱 as 變數名稱) 只取內容值
$chinese[1] = 80;
$chinese[3] = 60;
$chinese[] = 90;
$chinese[14] = 50;
$chinese[] = 70;
foreach ($chinese as $value1)
echo $value1."<br>";
//第二種形式:foreach(陣列名稱 as 索引值 =>變數名稱)同時取索引值及內容值
$chinese[1] = 80;
$chinese[3] = 60;
$chinese[] = 90;
$chinese[14] = 50;
$chinese[] = 70;
foreach ($chinese as $key1 =>$value1)
echo "座號".$key1."同學的成績為:".$value1."<br>" ;
?>
7. Break、continue 與 exit 敘述
<?php
for ($i=1;$i<=10;$i++){
if ($i==5) {
echo "迴圈停止<br>";
break; //exit;和 continue;替換後觀察一下結果
}
echo "i->".$i."<br>";
}
echo "結束執行";
?>

-5-
PHP 基礎概念整理 By 鴻榮
七、POST 與 GET 差異
1. 表單傳遞資訊的兩種方式。
2. 表單語法:
/* A.php */
<Form name = "Form Name" action = "B.php" method = "GET| POST">
<input type="text" name="a1" value="ok2">
<input type="hidden" name="a2" value="ok1">
<input type="submit" name="ok" value="送出">
</Form>
3. 接收表單參數:
A. 若 method="GET"
URL 的變化b.php?a1=ok2&a2=ok1&ok=%B0e%A5X
/* B.php */
if (isset($_GET["ok"])){
echo $_GET["a1"]."<br>";
echo $_GET["a2"];
}
B. 若 method="POST"
URL 的變化b.php
/* B.php */
if (isset($_POST["ok"])){
echo $_POST["a1"]."<br>";
echo $_POST["a2"];
}

八、SESSION 與 COOKIE
1. 網頁執行時如需身份驗證,入口會先以表單驗證使用者所輸入的帳號和密碼,但不論用
GET 變數還是 POST 變數來存放資訊,只能保存在接收端的單一頁面裡;
若還有很多網頁要用一組帳號、密碼來驗證時,該如何?
2. 利用 SESSION 和 COOKIE 跨越許多網頁做驗證身份或保存變數的工作。
3. SESSION
概念:SESSION 變數是利用一組陣列變數來存放資訊。
函數:
函數名稱 說明
session_start() 在網頁啟動 session
session_id() 每個 session 的唯一的編號
session_register() PHP6 不再支援
session_unregiste PHP6 不再支援
r ()
session_unset() 釋放所有變數
session_destroy() 將已登記的 session id 註銷

-6-
PHP 基礎概念整理 By 鴻榮
4. COOKIE
概念:cookies 是一種伺服器端程式用來將資料儲存在使用者端的技術。在使用者端利用文
字檔存放資訊。(較不安全,故不常用)
函數:setcookie("cookie 變數名稱","cookie 內容","保存期限","路徑","網域","安全");
5. SESSION 與 COOKIE 的不同
session 與 cookie 不同的地方在於,cookie 的資訊是儲存在使用者端 (client),但是
session 則是儲存在伺服器端 (server)。
6. SESSION 的使用
session 的使用必須經過啟動、註冊的程序,底下以步驟方式說明 session 的使用方法:
(1) 初始化 session:
session_start();
(2) 註冊 session:
session_register("userID"); $userID="usera";
所謂的註冊 session 意思就是將變數的值保存到 session 裡。但上述 PHP6 不再支援,
才改用變數指派的方式來註冊 session 變數,如下:
$_SESSION["userID"]="usera";
(3) 清除 session:
session_destroy();
當 我 們 不 再 使 用 session 時 , 可 以 呼 叫 session_destroy() 將 所 有 已 註 冊 的
session 清除。
<?php
function show(){
echo "session_id = ".session_id()."<br>";
if (isset($_SESSION['A'])){echo "A = ".$_SESSION['A']."<br>";}
if (isset($_SESSION['B'])){ echo "B = ".$_SESSION['B']."<br>"; }
if (isset($_SESSION['C'])){ echo "C = ".$_SESSION['C']; }
echo "<p>";
}
session_start();
$_SESSION['A']=10;
$_SESSION['B']=20;
$_SESSION['C']=30;
echo "session 變數產生並給值<br>";
show();
echo "取消所有 session 變數<br>";
session_unset();
show();
echo "銷毀 session<br>";
session_destroy();
show();
?>
-7-
PHP 基礎概念整理 By 鴻榮

九、引用檔案
1. 目的:避免重複開發或撰寫相同的程式或版面語法。
2. require( ) 、 require_once( ) 、 include( ) 、 include_once( )
3. require( ) 適合用來引入靜態的內容(如版權宣告)
include( ) 則適合用來引入動態的程式碼(程式內容會依其他程式碼而變動)。
4. 在「主」檔案中,使用 require 或 include 將某個「客」檔案引用進來之後,路徑關係一律都
以「主」檔案為主。
檔名 路徑 內容
master.php / <?
usr/local/apache/htdocs/php require("../guest.inc");?>
/
guest.inc /usr/local/apache/htdocs/ <img src="PHOTO.JPG">
PHOTO.JPG /usr/local/apache/htdocs/
 master.php 與 PHOTO.JPG 不在同一路徑下,所以該圖是無法顯示的

十、自定函數
1. 基本語法:
  function myFunction( [$arg_1, $arg_2, ...] ) {
global $val;
  statements;
  ......
  return $something;
  }

定義函式有幾個要點:
◎需有「function」的字樣。
◎需幫函式取名如:「myFunction」。
◎函式名稱必須由英文字母、數字和底線(_)組成,不能以數字當開頭。
◎函式名稱不區分大小寫(和變數不同)。
◎函式的參數超過一個以逗號分隔。
◎函式可以不帶有參數。
◎函式本體(大括號內的敘述語句)。
◎在 PHP3 時函式的定義必須放在第一次使用(呼叫)到之前,但 PHP4 已經沒有這個
限制。
2. 全域變數及區域變數:
在函式中定義的變數其作用範圍預設是只有在該函式中,是屬於區域性,
也無法使用函式外的變數,若要使用的話有二種方式。
使用關鍵字 global 宣告。
使用 global 變數陣列 $GLOBAL[]。
3. 回傳值:回傳值可以是數值、字串、陣列、物件等任何型態的資料。
註:自訂函式前請先確定沒有內建的函式(內建函式通常有最佳化)
-8-
PHP 基礎概念整理 By 鴻榮
4. 函數回傳值可以一個或多個,若多個回傳值利用 array 回傳,並利用 list()來接受這些回傳
值。

5. 自定函數有四種模式
A. 沒有傳入值、傳回值重覆出現的非運算資料
<?php
function copyright() {
echo "網頁內容與圖片均屬版權所有,不得盜用";
}
copyright();
?>

B. 有傳入值,但沒傳回值
<?php
function week($dateweek) {
switch($dateweek)
{
case 0:
echo "今天是週日,放假嚕~"."<br>";
break;
case 1:
echo "今天是週一,今天要上課~"."<br>";
break;
case 2:
echo "今天是週二,還是要上課~"."<br>";
break;
case 3:
echo "今天是週三,今天要補習~"."<br>";
break;
case 4:
echo "今天是週四,剩下兩天上課~"."<br>";
break;
case 5:
echo "今天是週五,下課就可以 Happy~"."<br>";
break;
case 6:
echo "今天是週六,睡飽飽看電影~"."<br>";
break;
}
}
ini_set("date.timezone","Asia/Taipei");
-9-
PHP 基礎概念整理 By 鴻榮
week(date(w));
?>

C. 有傳入值,亦有傳回值
<?php
function checknum($class1,$class2,$class3) {
$average1=($class1+$class2+$class3)/3;
return $average1;
}
?>

D. 多個傳回值透過陣列傳值
<?php
function checknum($class1,$class2,$class3)
{
$average1=($class1+$class2+$class3)/3;
echo "傳回各科成績與平均成績"."<br>";
return array($class1,$class2,$class3,$average1);
}
$class1a=$_POST['class1'];
$class2a=$_POST['class2'];
$class3a=$_POST['class3'];
list($a,$b,$c,$d)=checknum($class1a,$class2a,$class3a);
echo "接收多個訊息如下"."<br>";
echo "國文成績:".$a."<br>";
echo "英文成績:".$b."<br>";
echo "數學成績:".$c."<br>";
echo "平均成績:".$d."<br>";
?>

- 10 -
PHP 基礎概念整理 By 鴻榮
十一、HTTP 標頭處理HEADER() 轉址功能最常用
PHP 的 header()可以送出 html 文件的標頭資訊,透過送出的標頭資訊來達到以下目的。
1. 執行轉址(Location) url 參數(絕對位址) ※
2. 更新(Refresh)秒數;url 參數(絕對位址)
3. 指定資料類型(Content-type)MIME 資料類型
4. 保留期限(Expires)

十二、常用的內建函式

trim 取得部份字串清除字串首尾的空格(空白字元)
語法:trim ( string str [, string charlist])

strlen 取得字串長度
語法:strlen ( string str)

is_null、isset、empty
$var= NULL "" 0 "0" 1
strlen($var) 0 0 1 1 1
is_null($var) TRUE FALSE FALSE FALSE FALSE
$var == "" TRUE TRUE TRUE FALSE FALSE
!$var TRUE TRUE TRUE TRUE FALSE

if( isset($_POST[myField]) && $_POST[myField] != "" ) {


Do my PHP code
}
上段程式,同義於下段程式
if( !empty($_POST[myField]) ) {
Do my PHP code
}

※判斷輸入是否為空值的方式:
$user = trim($_POST["user"]);
1. if( empty($user) )
2. if( strlen($user) )
3. if( $usr == "" )
不管你是否輸入,isset($user)都為 true,因為$user 這個變量已經存在。

empty($x) 等於 !isset($x) || !$x


!empty($x) 等於 isset($x) && $x

substr 取得部份字串

- 11 -
PHP 基礎概念整理 By 鴻榮
語法:substr ( string string, int start [, int length])
將字串 string 的第 start 位元起的字串取出 length 個字元; 若 start 為負數,則從字串尾端算起。
若可省略的參數 length 存在,但為負數,則表示取到倒數第 length 個字元。

substr_replace 替換字串的某部分為所指定的其他字串
語法:substr_replace ( mixed $string , string $replacement , int $start [, int $length ] )
<?php
$id = 'R123456789';
echo substr($id,0,6). '<br>'; // 從字串第 0 個位置開始載取 6 位數的字串
echo substr_replace($id,"****" ,6); // 從字串第 6 個位置開始取代為****
?>

R12345
R12345****

sprintf 格式化字串輸出
語法:sprintf ( string $format [, mixed $args [, mixed $... ]] )
<?php
$s = 'monkey';
$t = 'many monkeys';
sprintf("[%s]\n", $s); // 標準輸出
sprintf("[%10s]\n", $s); // 右邊對齊,不足 10 位以空白填補
sprintf("[%-10s]\n", $s); // 左邊對齊,不足 10 位以空白填補
sprintf("[%010s]\n", $s); // 右邊對齊,不足 10 位以'0'填補
sprintf("[%'#10s]\n", $s); // 右邊對齊,不足 10 位以'#'填補
sprintf("[%10.10s]\n", $t); // 左邊對齊,超過 10 位,只截取前 10 位顯示
?>

[monkey]
[ monkey]
[monkey ]
[0000monkey]
[####monkey]
[many monke]

nl2br 將換行字元「\n」轉成 <br>


語法:nl2br ( string string)
將換行字元「\n」轉成 <br>

explode 切開字串
- 12 -
PHP 基礎概念整理 By 鴻榮
語法:explode (string separator, string string) ;
傳回一個字串的陣列,以參數 separator 為界線將參數 string 切開,最後一個元素將會包含
string 全部剩餘的部份
<?php
// Example 1
$pizza = "piece1 piece2 piece3 piece4 piece5 piece6";
$pieces = explode(" ", $pizza);
echo $pieces[0]; // piece1
echo $pieces[1]; // piece2

// Example 2
$data = "foo:*:1023:1000::/home/foo:/bin/sh";
list($user, $pass, $uid, $gid, $gecos, $home, $shell) = explode(":", $data);
echo $user; // foo
echo $pass; // *
?>

round 取四拾五入比較 ceil(無條件進位)、floor(無條件捨去)


語法: round(double val );

date 將本地的時間/日期格式化
語法:string date(string format [,int timestamp])
<?php
//年月日格式化輸出今天日期
date_default_timezone_set('Asia/Taipei');
echo date('Y-m-j')."<br>";
echo date('y-n-j')."<br>";
echo date('Y-M-j')."<br>";
echo date('Y-m-d')."<br>";
echo date('Y-F-j')."<br>";
//時分秒格式化輸出現在時間
echo date('g:i:s a')."<br>";
echo date('h:i:s A')."<br>";
echo date('G:i:s')."<br>";
echo date('H:i:s')."<br>";
?>

getdate 取得日期/時間資訊
語法:array getdate(int timestamp)

mktime 取得日期的 UNIX 時間戳記設定時間用


- 13 -
PHP 基礎概念整理 By 鴻榮
語法:int mktime (int hour, int minute, int second, int month, int day, int year) ;
口訣:時分秒月日年
<?php
$day1 = mktime(0, 0, 0, 1, 1, 1970);
echo $day1."<br>";
echo date('Y-m-j',$day1) ."<br>";
$day2 = mktime(0, 0, 0, 1, 28, 2010);
echo $day2."<br>";
echo date('Y-m-j',$day2) ."<br>";
date_default_timezone_set('Asia/Taipei');
echo "2010 年 10 月 10 日是週幾呢?是".date ("l", mktime(0,0,0,10,10,2010));
$tomorrow = mktime (0,0,0,date("m") ,date("d")+1,date("Y"));
$lastmonth = mktime (0,0,0,date("m")-1,date("d"), date("Y"));
$nextyear = mktime (0,0,0,date("m"), date("d"), date("Y")+1);
echo "<br>明天是:".date("Y-m-j",$tomorrow);
echo "<br>上個月是:".date("Y-m-j",$lastmonth);
echo "<br>明年是:".date("Y-m-j",$nextyear);
?>

md5 MD5 加密函式


crypt CRYPT 加密函式
用於密碼加密,較常用 md5
<?php
$db_conn = mysql_connect("host", "db_user", "db_pass");
mysql_select_db("db_name", $db_conn);
mysql_query("insert into users values ('$username', '".md5($password)."')");
?>
<?php
$db_conn = mysql_connect("host", "db_user", "db_pass");
mysql_select_db("db_name", $db_conn);
$str="select * from users where `username`='$username' and
`password`='".md5($password)."'";
$sql = mysql_query($str);
if (mysql_num_rows($sql) > 0) {
// 用戶名稱及密碼正確
} else {
// 用戶名稱及密碼錯誤
exit();
}
?>

- 14 -
PHP 基礎概念整理 By 鴻榮
count 計算陣列個數
<?php
$a[0] = 1;
$a[1] = 3;
$a[2] = 5;
$result = count($a);
// $result == 3
$b[0] = 7;
$b[5] = 9;
$b[10] = 11;
$result = count($b);
// $result == 3
?>

in_array 判斷值是否在陣列中
<?php
$os = array("Mac", "NT", "Irix", "Linux");
if (in_array("Irix", $os)) {
echo "Got Irix";
}
if (in_array("mac", $os)) {
echo "Got mac";
}
?>

- 15 -
PHP 基礎概念整理 By 鴻榮
十三、PHP 與 MySQL 資料庫連結
<?php
$link = mysql_pconnect("localhost", "learn", "learn123") or die("無法與 MySQL 建立連
線");
mysql_select_db("std") or die("無法選擇 std 資料庫");
//查詢並讀出資料
$myquery = "select * from std";
$result = mysql_query($myquery) or die("查詢 Query 錯誤");
while($row = mysql_fetch_array($result)){
echo $row["name"],$row["city"],$row["stdnum"],$row["address"] ;
echo "<br>";
}
//新增
$myquery = "insert std (name,city,stdnum,address) values("柯念珍","新竹
縣","s20001","竹北市華興街 129 號");
mysql_query($myquery) or die("新增 Query 錯誤");
//修改
$myquery = "update std set name = "陳念惠",city = "桃園縣" where id = '10'";
mysql_query($myquery) or die("編修 Query 錯誤");
//刪除
$myquery = "delete from std where id = '10'";
mysql_query($myquery) or die("刪除 Query 錯誤");
?>

mysql_pconnect()、mysql_select_db()、mysql_query()、mysql_fetch_array()、mysql_fetch_
rows()、mysql_num_rows()

十四、開發程式注意事項
1. 避免重複開發相同功能的程式利用自定函數、引用檔案來達到目的。
例:function.php
2. 欲連結資料庫時,我們必須設定其主機位址、連接埠、帳號、密碼與資料庫名稱等資料,為了
避免日後維護上的困難,我們最好將這些設定獨立出來,而不要一一寫在每支程式之中。
例:config.php、conn.php
3. 設計 UTF-8 網頁時,為了避免瀏覽器瀏覽出現亂碼碼或空白頁,請您確認以下三步驟:
A. 確認網頁文件編碼為 UTF-8
B. 確 認 網 頁 有 加 上 <meta http-equiv="Content-Type" content="text/html;
charset=UTF-8">
C. 確認<meta>標籤在<title>標籤之上(或之前)。
4. 表單送出後的資料稽核動作。

十五、參考教學網址
- 16 -
PHP 基礎概念整理 By 鴻榮
http://tino.loxa.edu.tw/php/
http://chensh.loxa.edu.tw/php/

十六、PHP 安全性基本防範
※XSS 防範
XSS 是 Cross Site Scripting 的縮寫,意思是跨網站指令碼攻擊,也有人叫做跨網站攻擊或跨網頁
攻擊。
避免使用 cookie
把 GET 變數 echo 出來時,利用 htmlspecialchars 函式輔助輸出
$_SERVER["PHP_SELF"]變數的輸出,亦利用 htmlspecialchars 函式輔助輸出
<form action="<?php echo htmlspecialchars($_SERVER['PHP_SELF'], ENT_QUOTES);
?>" method="post">
<div align="center">
<span class="style1">
歡迎光臨 德瑞購物廣場
</span>
</div>
<p>
訪客 : <?php echo htmlspecialchars($_GET["user"], ENT_QUOTES); ?>
</p>
<p>
<input type="submit" name="send" id="send" value="送出" />
</p>
</form>
※SQL Injection 防範
SQL 植入攻擊俗稱「資料隱碼」,是利用在用戶端的網頁中輸入額外的資料,讓 SQL 查詢產生意料之
外的結果,因此必須針對表單所傳遞出來的變數做一些把關的動作。

針對數字變數使用 intval 函數
<?php
$query = "delete from postmessage where id=" . intval($_POST["id"]);
?>

針對字串變數使用 addslashes 函數
<?php
if (!get_magic_quotes_gpc()) {
// magic_quotes_gpc 為 Off
$query = "select * from member where username='" .
addslashes($_POST["username"]) .
"' and password='" . addslashes($_POST["password"]) . "'";
} else {
- 17 -
PHP 基礎概念整理 By 鴻榮
// magic_quotes_gpc 為 On
$query = "select * from member where username='" . $_POST["username"] .
"' and password='" . $_POST["password"] . "'";
}
?>

十七、檔案上傳
※資料夾及檔案的管理
1. PHP 提供了一個「__FILE__」常數儲存目前網頁的路徑資訊。
2. 檔名及路徑之相關函式basename()、dirname()
<?php
echo "檔案絕對路徑:".__FILE__."<br>";
echo "檔名:".basename(__FILE__)."<br>";
echo "檔名去除副檔名:".basename(__FILE__, '.php')."<br>";
echo "路徑:".dirname(__FILE__)."<br>";
echo "上一層路徑:".dirname(dirname(__FILE__))."<br>";
?>
3. 檔 名 及 路 徑 之 偵 測 函 式
is_file()、is_dir()、is_readable()、is_writeable()、is_executable()、is_uploaded_file
()、getcwd()
<?php
$filename=__FILE__;
if(is_file($filename))
{ echo "檔案存在:"."$filename<br>";}
else
{ echo "檔案不存在"."<br>";}
if(is_dir(dirname(__FILE__)))
{ echo "資料夾存在:".dirname(__FILE__)."<br>";}
else
{ echo "資料夾不存在"."<br>";}
if (is_readable($filename))
{ echo '檔案可讀'."<br>";}
else is_readable()、is_writeable()及
{ echo '檔案不可讀'."<br>";} is_executable()三個函數判斷資料夾或檔案是
if (is_writeable($filename)) 否具有讀取、寫入與執行的權限。
Windows 環境預設是可讀、可寫、不可執行。
{ echo '檔案可寫'."<br>";} Linux 環境則要依照各別資料夾或檔案的設定
else 而定。
{ echo '檔案不可寫'."<br>";}
if (is_executable($filename))
{ echo '檔案可執行'."<br>";}
else
- 18 -
PHP 基礎概念整理 By 鴻榮
{ echo '檔案不可執行'."<br>";}
if (is_uploaded_file($filename))
{ echo '經由表單上傳'."<br>";}
else
{ echo '不經由表單上傳'."<br>";}
echo getcwd();
?>
4. 資料夾的建立、更名與刪除

建立資料夾:mkdir()
<?php
if(mkdir("./dir", 0700))
echo "成功建立資料夾"."<br>";
else
echo "建立資料夾失敗"."<br>";
?>

刪除空資料夾:rmdir()
<?php
if(is_dir("./dir")){
if(rmdir("./dir"))
echo "成功刪除資料夾"."<br>";
else
echo "刪除資料夾失敗"."<br>";
}else{
echo "找不到資料夾";
}
?>

刪除非空資料夾:要先刪內容檔案,搭配 unlink()以及 glob()


<?php
$dir="./dir2/";
$files = glob( $dir.'*');
foreach( $files as $file ){
echo $file."<br>";
if(@unlink( $file )) {
echo "刪除檔案".$file."成功\<br>";
}else{
echo "刪除檔案".$file."失敗<br>";
}
}
- 19 -
PHP 基礎概念整理 By 鴻榮
if(@rmdir($dir))
echo "刪除資料夾",$dir,"成功\";
else
echo "刪除資料夾",$dir,"失敗";
?>

資料夾更名
<?php
$dir="./dir/";
$newdir="./ndir/";
if(is_dir($dir)){
if(@rename($dir,$newdir))
echo "修改資料夾",$dir,"成功\<br>";
else
echo "修改資料夾",$dir,"失敗<br>";
if(is_dir($newdir)){
echo "新資料夾存在<br>";
}else{
echo "新資料夾不存在<br>";
}
}
?>

※檔案上傳
1. PHP 設定檔 php.ini 的確認
file_uploads = On
upload_tmp_dir = "/tmp" win 平台….「upload_tmp_dir = "C:\temp"」
upload_max_filesize = 15M

2. 檔案上傳表單設計HTML 表單設計
A. 表單必須以 POST 的方式傳送
B. 表 單 傳 送 時 資 料 實 作 編 碼 才 可 送 出 , 所 以 <form> 標 籤 內 要 加 入 「 enctype =
"multipart/form-data"」的屬性才可送出資料
C. 負責傳送資料的<input>必須設定「type = "file"」的屬性,才可瀏覽 client 端的檔案。
D. 新增一個隱藏欄位「name = "MAX_FILE_SIZE"」,為做為上傳檔案大小的限制,單
位為 bytes。

<form action="upload.php" method="post" enctype="multipart/form-data">


- 20 -
PHP 基礎概念整理 By 鴻榮
<input type="hidden" name="MAX_FILE_SIZE" value="10000000">
選擇檔案:<input name="userfile" type="file">
<input type="submit" value="送出">
</form>

3. 上傳與接收的動作PHP 程式:$_FILES 陣列,搭配 move_uploaded_file()函式


<?php
$uploaddir="./upload/";
$tmpfile=$_FILES["userfile"]["tmp_name"];
$file2=$_FILES["userfile"]["name"];
// move_uploaded_file(暫存檔名,目的檔名)
// is_uploaded_file(檔名)用於判斷是否有上傳
if(move_uploaded_file($tmpfile,$uploaddir.$file2))
{
echo "上傳成功<br>";
echo "檔案名稱:".$_FILES["userfile"]["name"]."<br>";
echo "檔案類型:".$_FILES["userfile"]["type"]."<br>";
echo "檔案大小:".$_FILES["userfile"]["size"]."<br>";
} else {
echo "上傳失敗!<br> ";
switch ($_FILES["userfile"]["error"]) {
case 1:
echo "失敗原因:大小超過 php.ini 內設定 upload_max_filesize"."<br>";
break;
case 2:
echo "失敗原因:大小超過表單設定 MAX_FILE_SIZE"."<br>";
break;
case 3:
echo "失敗原因:上傳不完整"."<br>";
break;
case 4:
echo "失敗原因:沒有檔案上傳"."<br>";
break;
case 6:
echo "失敗原因:暫存資料夾不存在"."<br>";
break;
case 7:
echo "失敗原因:上傳檔案無法寫入"."<br>";
break;
- 21 -
PHP 基礎概念整理 By 鴻榮
case 8:
echo "失敗原因:上傳停止"."<br>";
break;
}
}
?>

$_FILES[]陣列形式變數 說明
$_FILES["userfile"] Server 端暫存檔名
["tmp_name"]
$_FILES["userfile"] 檔案正式名稱
["name"]
$_FILES["userfile"]["type"] 檔案資料型態
$_FILES["userfile"]["size"] 檔案大小,單位為 bytes
$_FILES['userfile']['error'] 檔案上傳時錯誤代碼(0 正常;1~8 錯
誤)

錯誤代碼 系統參數 說明
0 UPLOAD_ERR_OK
1 UPLOAD_ERR_INI_SIZE 大小超過 php.ini 內設定 upload_max_filesize
2 UPLOAD_ERR_FORM_SI 大小超過表單設定 MAX_FILE_SIZE
ZE
3 UPLOAD_ERR_PARTIAL 上傳不完整
4 UPLOAD_ERR_NO_FILE 沒有檔案上傳
6 UPLOAD_ERR_NO_TMP 暫存資料夾不存在
_DIR
7 UPLOAD_ERR_CANT_W 上傳檔案無法寫入
RITE
8 UPLOAD_ERR__EXTENS 上傳停止
ION

4. 中文檔名處理 mb_convert_encoding(變數,原編碼,新編碼)
<?php mb_convert_encoding($_FILES["fileupload"]["name"],"big5","utf8"); ?
>

5. 多檔上傳多維陣列(陣列裡有陣列)達到目標
<form action="upload4.php" method="post" enctype="multipart/form-
data">
檔案一:<input type="file" name="fileupload[]" ><br>
檔案二:<input type="file" name="fileupload[]" ><br>
檔案三:<input type="file" name="fileupload[]" ><br>
<input type="submit" value="送出">
</form>
<?php
$uploaddir='./upload/';

- 22 -
PHP 基礎概念整理 By 鴻榮
$i=count($_FILES["fileupload"]["name"]);
for ($j=0;$j<$i;$j++){
$tmpfile=$_FILES["fileupload"]["tmp_name"][$j];
$file2=mb_convert_encoding($_FILES["fileupload"]["name"]
[$j],"big5","utf8");
if(move_uploaded_file($tmpfile,$uploaddir.$file2)){
echo " 上 傳 成 功 <br>"." 檔 案 名 稱 : ".$_FILES["fileupload"]["name"]
[$j]."<br>";
}else{
echo $_FILES["fileupload"]["tmp_name"][$j]."上傳失敗!<br />";
}
}
?>

- 23 -
PHP 基礎概念整理 By 鴻榮
有用的 PHP 手冊使用方式

最有用的項目是「函數參考」

函數參考內最常用到的類別
類別 上述出現的函式
Array Functions array、list、count、in_array
Date and Time Functions date、mktime、getdate、time
Filesystem Functions basename、dirname、glob、mkdir、rmdir、rename、unlink、mo
ve_uploaded_file、is_dir、is_executable、is_file、is_link、is_rea
dable、is_uploaded_file、is_writable、is_writeable
HTTP Functions header、setcookie
Multi-Byte String mb_convert_encoding
Functions
MySQL Functions mysql_connect、mysql_pconnect、mysql_select_db、mysql_q
uery、mysql_fetch_array、mysql_fetch_rows、mysql_num_ro
ws
PHP get_magic_quotes_gpc
Options&Information
Session Handling session_destroy、session_id、session_start、session_unset
Functions
String Functions addslashes、crypt、echo、explode、htmlspecialchars、md5、nl
2br、sprintf、strlen、substr_replace、substr、trim
Variable Functions empty、intval、settype、unset、isset、is_null、is_array、is_bool、
is_int、is_string、is_float

- 24 -