# PHP 標籤與程式碼

<?php
PHP 程式內容
?>

PHP 只會執行 <?php?> 所框住的內容。

# echo

用來顯示文字訊息

echo '文字訊息';

'" 框住的內容會被當作是字串。
請留意每行程式的最後,都會有一個分號 (😉。

  • 有多個敘述並列時,將由上至下依序執行。
<?php
echo Welcome;
?>

未定義常數 Welcome,錯誤發生於 C:\xampp\htdocs\php\chapter3\welcome-error.php 第 2 行

# print

用來顯示文字訊息

print '文字訊息';

echo 和 print 都可用來顯示文字訊息。

  • 通常認為 echo 的處理速度較快 (執行到顯示出訊息所需的時間較短)。
  • echo 具有將多個字串、數值連接起來顯示的功能。

HTML 區塊: 用於顯示固定不變的內容。
PHP 區塊: 用於顯示會因情況而變動的內容。

<?php echo '歡迎光臨'; ?>

可以化簡為

<?= '歡迎光臨'; ?>

# require

在 PHP 中,要載入並執行放在其他檔案中的程式,必須使用 require 敘述。

require '檔案名稱';
  • 可將程式中重複使用的內容存為獨立檔案,再用 require 載入他。
  • 節省反覆輸入重複內容的時間,讓程式看起來更簡潔。
  • 要修改共通使用的部分時,不需在多支程式裡分別修改,只要修改單一檔案的內容即可。
user-input.php
<?php require '../header.php'; ?>
<p>請輸入姓名:</p>
<form action="user-output.php" method="post">
  <!-- post v.s. get -->
  <input type="text" name="user"> 
  <!-- user 是用在 PHP 中接收的 REQUEST 參數名 -->
  <input type="submit" value="確定">
</form>
<?php require '../footer.php'; ?>

# request

取得表單回傳的參數 (字串)

$_REQUEST['REQUEST參數名']
user-output.php
<?php require '../header.php'; ?>
<?php
echo '午安,', $_REQUEST['user'], '您好。';
?>
<?php require '../footer.php'; ?>

# 優化程式

避免出現 REQUEST 參數名 未被定義 (Undefined) 的情形,可以用以下寫法。

<?php require '../header.php'; ?>
<?php
if (isset($_REQUEST['user'])) {
    echo '午安,', $_REQUEST['user'], '您好。';
}
?>
<?php require '../footer.php'; ?>

避免出現 輸入內容含有 HTML,並被執行 的情形,可以用以下寫法。

<?php require '../header.php'; ?>
<?php
if (isset($_REQUEST['user'])) {
	echo '午安,', htmlspecialchars($_REQUEST['user']), '您好。';
}
?>
<?php require '../footer.php'; ?>

# 算符 (或稱運算子 Operator)

進行計算的處理即稱為「運算」

算符作用
**平方
++ --加 1、減 1
!邏輯 (反值)
* / %乘法、除法、餘數
+ - .加法、減法、字串相連
< <= > >=比較 (小於、小於等於、大於、大於等於)
== !=比較 (等於、不等於)
&&邏輯 (AND)
||邏輯 (OR)
=指派

算符有優先順序之分

# 變數

是用來存放資料的機制

  1. 變數名稱的前面必須加上錢字號 ($)。
  2. 開頭第 1 個字必須為英文字母或底線 (_)。
  3. 除了第 1 個字之外,其他可用英文字母、數字、底線隨意組成。
  4. 英文字母的大小寫視為不同文字。

預先定義好的變數

自行定義的變數名稱不可與這些 PHP 預先定義的變數名稱相同

變數名稱功能
$_REQUESTHTTP 的所有 REQUEST 參數 (無論是以 GET 或 POST 方式傳送)
$_GETHTTP 以 GET 方式傳送的 REQUEST 參數
$_POSTHTTP 以 POST 方式傳送的 REQUEST 參數
$_FILES上傳檔案的資料
$_SESSIONSession
$_COOKIECookie

# 指派

「=」被稱為指派算符,可將他右邊的值寫入左邊的變數。

變數=

# 變數之間的指派

變數A=變數B

# 常數

一開始指派了常數的值之後,就不能再對值做變更。

const 常數名=

# 陣列 (Array)

陣列內區分為多個區塊,用來存放多個資料值,這些區塊稱為陣列的元素
為了區隔個別元素,必須使用 索引 (index) 來存取。

陣列=[A,B,C, ...];
陣列=[
A, 
B, 
C, 
    ...
];
陣列=[索引A =>A,索引B =>B,索引C =>C,...];
陣列=[
    索引A =>A, 
    索引B =>B, 
    索引C =>C, 
    ...
];

# 新增元素

陣列[]=新元素;

# 流程控制

核取方塊

check-input.php
<?php require '../header.php'; ?>
<form action="check-output.php" method="post">
  <p><input type="checkbox" name="mail">訂閱特賣情報電子報</p>
  <p><input type="submit" value="確定"></p>
</form>
<?php require '../footer.php'; ?>

check-output.php
<?php require '../header.php'; ?>
<?php
if (isset($_REQUEST['mail'])) {
	echo '已訂閱特賣情報電子報。';
} else {
	echo '未訂閱特賣情報電子報。';
}
?>
<?php require '../footer.php'; ?>

# if

if 判斷式是 PHP 中用於條件分歧的語法之一。

if(條件){
  條件成立時進行的處理;
}

以真偽值代入 if 判斷式

if(條件){
  條件為 TRUE 時執行的處理;
}

# if-else

在條件成立時與條件不成立時,分別執行對應的處理。

if(條件){
  條件成立時進行的處理;
} else{
  條件不成立時進行的處理;
}

以真偽值代入 if-else 判斷式

if(條件){
  條件為 TRUE 時執行的處理;
} else{
  條件為 FALSE 時執行的處理;
}

# isset

檢查變數是否宣告, NULL 是用來表示變數內為空值的特殊值。
若變數中已代入值且其值不為 NULL 時,則回傳 TRUE

isset(變數)

if 判斷式中使用 REQUEST 參數

if(isset(REQUEST 參數中的變數)){
  變數已宣告時要執行的處理;
}

if-else 判斷式中使用 REQUEST 參數

if(isset(REQUEST 參數中的變數)){
  變數已宣告時要執行的處理;
} else{
  變數未宣告時要執行的處理;
}

# 條件運算式

if 判斷式和 if-else 判斷式的條件中,也可使用運算式。

常數 + 算符 (運算子) + 常數

if 判斷式的條件中使用運算式

if(運算式){
  當運算結果條件為 TRUE 時執行的處理;
}

if-else 判斷式的條件中使用運算式

if(運算式){
  當運算結果條件為 TRUE 時執行的處理;
} else{
  當運算結果條件為 FALSE 時執行的處理;
}

省略大括號 {}
if 判斷式的 {} 中只有 1 行程式時,可省略 {}
但若 {} 有多行程式,則不可省略。

if(運算式) 當運算結果條件為 TRUE 時執行的處理;
if(運算式) 當運算結果條件為 TRUE 時執行的處理; else 當運算結果條件為 FALSE 時執行的處理;

單選紐

radio-input.php
<?php require '../header.php'; ?>
請選擇餐點:
<form action="radio-output.php" method="post">
  <p><input type="radio" name="meal" value="日式套餐" checked>日式套餐</p>
  <p><input type="radio" name="meal" value="西式套餐">西式套餐</p>
  <p><input type="radio" name="meal" value="中式套餐">中式套餐</p>
  <p><input type="submit" value="確定"></p>
</form>
<?php require '../footer.php'; ?>

radio-output.php
<?php require '../header.php'; ?>
<?php
switch ($_REQUEST['meal']) {
case '日式套餐':
	echo '烤魚、燉菜、味噌湯、白飯、水果';
	break;
case '西式套餐':
	echo '果汁、水波蛋、薯餅、麵包、咖啡';
	break;
case '中式套餐':
	echo '春捲、煎餃、蛋花湯、炒飯、杏仁豆腐';
	break;
}
echo '將稍候送達';
?>
<?php require '../footer.php'; ?>

# switch

依照不同的輸入訊息顯示出不同訊息的程式,是常見將程式流程分成多段,再依使用者所選內容執行對應的流程。

switch (運算式) {
caseA:
	運算結果為 A 時應執行的處理;
	break;
caseB:
	運算結果為 B 時應執行的處理;
	break;
caseC:
	運算結果為 C 時應執行的處理;
	break;
...
}
  • 在 case 敘述的最後必須寫上 break 敘述,用來表示處理程序結果,跳出 switch 判斷式的區塊。請記得加上 break 敘述。

下拉式選單

select-input.php
<?php require '../header.php'; ?>
<p>請選擇座位類型:</p>
<form action="select-output.php" method="post">
  <select name="seat">
  <option value="自由席">自由席</option>
  <option value="指定席">指定席</option>
  <option value="商務車廂">商務車廂</option>
  </select>
  <p><input type="submit" value="確定"></p>
</form>
<?php require '../footer.php'; ?>

select-output.php
<?php require '../header.php'; ?>
<?php
switch ($_REQUEST['seat']) {
case '指定席':
	echo '需加付120元補票。';
	break;
case '商務車廂':
	echo '需加付250元補票。';
	break;
default:
	echo '不需補票。';
	break;
}
?>
<?php require '../footer.php'; ?>

# default

以上皆非可以使用 default 敘述撰寫。

switch (條件運算式) {
caseA:
	運算結果為 A 時應執行的處理;
	break;
caseB:
	運算結果為 B 時應執行的處理;
	break;
default:
	運算結果與所有 case 的值都不符合時應執行的處理;
	break;
...
}

下拉式選單

select-for-input.php
<?php require '../header.php'; ?>
<p>請選擇訂購數量:</p>
<form action="select-for-output.php" method="post">
  <select name="count">
  <option value="0">0</option>
  <option value="1">1</option>
  <option value="2">2</option>
  <option value="3">3</option>
  <option value="4">4</option>
  <option value="5">5</option>
  <option value="6">6</option>
  <option value="7">7</option>
  <option value="8">8</option>
  <option value="9">9</option>
  </select>
  <p><input type="submit" value="確定"></p>
</form>
<?php require '../footer.php'; ?>
select-for-input2.php
<?php require '../header.php'; ?>
<p>請選擇訂購數量:</p>
<form action="select-for-output.php" method="post">
  <select name="count">
    
  <?php
  for ($i=0; $i<10; $i++) {
  	echo '<option value="', $i, '">', $i, '</option>';
  }
  ?>
  </select>
  <p><input type="submit" value="確定"></p>
</form>
<?php require '../footer.php'; ?>

select-for-output.php
<?php require '../header.php'; ?>
<?php
echo $_REQUEST['count'], '個商品放入購物車。';
?>
<?php require '../footer.php'; ?>

# for

用來進行重複處理的語法之一。

for(開始處理; 條件式; 更新處理){
  重複執行的處理;
}

# 比較算符

演算子讀法判斷結果為 TRUE 的情況
<小於左邊值小於右邊
>大於左邊值大於右邊
<=小於等於左邊值小於等於右邊 (左邊值在右邊以下)
>=大於等於左邊值大於等於右邊 (左邊值在右邊以上)
==相等左右相等
!=不相等 (! 為否定之意)左右不相等

# while

用來進行重複處理的語法之一。

while(條件式){
  重複執行的處理;
}
  • for 迴圈與他最大的差異,在於 while 迴圈沒有開始處理更新處理
開始處理
while(條件式){
  重複執行的處理;
  更新處理
}

# foreach

foreach(陣列 as 變數){
  使用變數進行的處理;
}
foreach($question as $item){
  echo '<option value="', $item, '">', $item, '</option>';
}
foreach(陣列 as 索引鍵的變數 => 值的變數){
  以索引鍵與值進行的處理;
}
foreach($store as $key => $value){
  echo '<option value="', $value, '">', $key, '</option>';
}

# 使用函式

# 呼叫函式

函式(傳入參數)
函式(傳入參數1, 傳入參數2, ...)

# 設定時區

date_default_timezone_set(地區)

# 顯示日期時間

date 函式執行時,會先取得現在的日期時間,再依指定的格式將它當做字串回傳。

date(格式)
文字說明
Y年。4 位數
m月。2 位數,無十位數時自動補 0
d日。2 位數,無十位數時自動補 0
H小時。2 位數,無十位數時自動補 0。24 小時制
i分。2 位數,無十位數時自動補 0
s秒。2 位數,無十位數時自動補 0

# rand 函式

用來隨機產生一組數值,如果未傳入任何參數,則會回傳 0 以上,亂數最大值以下的亂數回來。

rand()

亂數最大值會依執行環境不同而有差異,利用 gettrandmax 函式就能取得最大值。

gettrandmax()
rand(最小值, 最大值)

# preg_match 函式

利用常規表達式檢查資料格式。

preg_match(模板, 輸入字串)

當傳入參數中指定的模板與輸入字串的格式相符,則 preg_match 函式會回傳「1」、「TRUE」; 若格式不符,則回傳「0」、「FALSE」。

preg_match('/^[0-9]{7}$/', $postcode)
  • ^ : 句首
  • [0-9] :0 ~ 9 的數字 1 個
  • {7} : 符合前項格式的文字 7 個
  • $ : 句尾
  • - : 連字號
  • (?=.*[a-z]) : 包含小寫英文字母 (a ~ z)
  • (?=.*[A-Z]) : 包含大寫英文字母 (A ~ Z)
  • (?=.*[0-9]) : 包含數字 (0 ~ 9)
  • [a-zA-Z0-9] : 小寫英文字母、大寫英文字母、數字各 1 個
  • {8,} : 符合前項格式的文字 8 個以上

首先是「.」與「*」,「.」代表任意 1 字;「*」則代表它前面的文字重複 0 次以上。
兩者合一的「.*」,表示任意文字重複 0 次以上。

8 個字母 (包含) 以上,包含至少一個大寫字母、一個小寫字母、一個數字,正則表達式的含義如下:

$pattern = '/^(?=.*[0-9])(?=.*[a-z])(?=.*[A-Z])[a-zA-Z\d]{8,}$/';
  • ^ 匹配字符串的開始位置
  • (?=.*[0-9]) 至少包含一個數字
  • (?=.*[a-z]) 至少包含一個小寫字母
  • (?=.*[A-Z]) 至少包含一個大寫字母
  • [a-zA-Z0-9]{8,} 由大小寫字母和數字組成的字符串,長度至少為 8 個字符
  • $ 匹配字符串的結束位置

# 將半形轉換成全形

mb_convert_kana(字串, 類型代碼)
mb_convert_kana($_REQUEST['name'], 'R') // R 的代碼就表示將半形轉換成全形
類型代碼意義
r全形英文字母轉換成半形
R半形英文字母轉換成全形
n全形數字轉換成半形
N半形數字轉換成全形
a全形英數字轉換成半形
A半形英數字轉換成全形
s全形空格轉換成半形
S半形空格轉換成全形

檔案讀寫

board-input.php
<?php require '../header.php'; ?>
<p>請輸入留言內容。</p>
<form action="board-output.php" method="post">
  <input type="text" name="message">
  <input type="submit" value="送出">
</form>
<?php require '../footer.php'; ?>

board-output.php
<?php require '../header.php'; ?>
<?php
$file='board.txt';
if (file_exists($file)) {
	$board=json_decode(file_get_contents($file));
}
$board[]=$_REQUEST['message'];
file_put_contents($file, json_encode($board));
foreach ($board as $message) {
	echo '<p>', $message, '</p><hr>';
}
?>
<?php require '../footer.php'; ?>

# 檔案存取

  1. 從檔案讀出所有留言清單
  2. 將新留言加入留言清單
  3. 將所有留言寫入檔案
  4. 顯示留言一覽

要與留言內容儲存到檔案,必須使用 JSON 格式。JSON 為 JSON JavaScript Object Notation 的縮寫。

JSON 是緣自於程式語言 JavaScript 的標記方式,除了 JavaScript,亦被運用在多種不同的程式語言。
在 PHP 中使用 JSON 的優點是可輕易地從檔案讀取、寫入字串與陣列等資料結構。

# 讀取檔案

指定的檔案 (資料夾) 存在時,會回傳 TRUE;若檔案 (資料夾) 不存在則回傳 FALSE。

file_exists(檔案名稱)

讀取檔案

file_get_contents(檔案名稱)

由於讀取檔案是以 JSON 格式儲存,必須先轉換成 PHP 可用的格式,此時使用可以用來進行 JSON 編碼的 json_decode 函式。

json_decode(字串)
$board=json_decode(file_get_contents($file))

將陣列轉換成 JSON 格式

json_encode()

寫入檔案

file_put_contents(檔案名稱, 字串)

若要新增檔案不存在,則會新增一個檔案。

檔案上傳

upload-input.php
<?php require '../header.php'; ?>
<p>請選擇要上傳的檔案。</p>
<form action="upload-output.php" method="post" enctype="multipart/form-data">
  <p><input type="file" name="file"></p>
  <p><input type="submit" value="開始上傳"></p>
</form>
<?php require '../footer.php'; ?>

upload-output.php
<?php require '../header.php'; ?>
<?php
if (is_uploaded_file($_FILES['file']['tmp_name'])) {
	if (!file_exists('upload')) {
		mkdir('upload');
	}
	$file='upload/'.basename($_FILES['file']['name']);
	if (move_uploaded_file($_FILES['file']['tmp_name'], $file)) {
		echo $file, '上傳成功。';
		echo '<p><img src="', $file, '"></p>';
	} else {
		echo '上傳失敗。';
	}
} else {
	echo '請選擇檔案。';
}
?>
<?php require '../footer.php'; ?>

# 取得暫存檔的檔名

$_FILES['檔案選擇按鈕的名稱']['tmp_name']
  • tmp_name : 取得暫存檔檔名
  • name : 取得原檔名

# 檢查是否是輸入畫面所上傳的檔案

is_uploaded_file(檔案名稱)

# 建立資料夾

mkdir(資料夾名稱)

# 只抽取出檔案名

basename(路徑)

# 儲存暫存檔

將上傳後產生的暫存檔移動到儲存上傳檔的位置。

move_uploaded_file(暫存檔的檔名, 儲存用的檔名)

# 時間戳

# 時間參數

參數說明範例
Y年,四位元數字“1999″
y年,二位元數字“99″
m月份,若不足二位元則在前面補零“01″ 至 “12″
n月份“1″ 至 “12″
F月份,英文全名“January"
M月份,三個英文字母“Jan"
d幾日,若不足二位元則前面補零“01″ 至 “31″
j幾日,二位元數字“1″ 至 “31″
S字尾加英文序數,二個英文字母“th","nd"
w星期幾,數字型“0″ (星期日) 至 “6″ (星期六)
l星期幾,英文全名“Friday"
D星期幾,三個英文字母“Fri"
A上下午“AM"或是 “PM"
a上下午“am"或是 “pm"
h12 小時制的小時,若不足二位元則前面補零“01″ 至 “12″
g12 小時制的小時“1″ 至 12″
H24 小時制的小時,若不足二位元則前面補零“00″ 至 “23″
G24 小時制的小時“0″ 至 “23″
i分鐘“00″ 至 “59″
s“00″ 至 “59″
v毫秒 (PHP 7.0.0 以後)“654″
u微秒,000000 (PHP 5.2.2 以後,DateTime::format () 才支援)“654321″
z一年中的第幾天“0″ 至 “365″
W一年中的第幾週“42″
t該月份的天數“28″ 至 “31″
U總秒數 (1970-01-01 00:00:00 開始計算)可參考 time () 函數