Tutorial
Jigsaw[at]NTCUST
Introduction to PHP
HTML & PHP
<html>
<head>
<title>Document</title>
</head>
<body>
<p>
<?php
echo 'Hello, World!';
?>
</p>
</body>
</html>
PHP剖析引擎只剖析 <?php 到 ?> 之間的程式碼
而不包含在 <? php 到 ?> 之間的內容則會直接送出
檔案請儲存為 *.php(副檔名為php)
HTML & PHP
<html>
<head>
<title>Document</title>
</head>
<body>
<p>
<?php
echo 'Hello, World!';
?>
</p>
</body>
</html>
echo 為一個方法,用於輸出字串、數值、變數等等
PHP的每一行的末端都需加上分號,否則程式會出錯
String 字串
<html>
<head>
<title>字串</title>
</head>
<body>
<p>
<?php
echo 'Hello,' . ' ' . 'World' . '!';
?>
</p>
</body>
</html>
字串可以使用符號 " . "(點)來連接
(在JavaScript中則是使用 "+")
Arithmetic 四則運算
<html>
<head>
<title>四則運算</title>
</head>
<body>
<p><?php echo 43 + 82; ?></p>
<p><?php echo 75 - 37.5; ?></p>
<p><?php echo 16 * 16; ?></p>
<p><?php echo 88 / 22; ?></p>
<p><?php echo 9 mod 4; ?></p>
</body>
</html>
如上,與 JavaScript 一樣
Variables 變數
<html>
<head>
<title>變數</title>
</head>
<body>
<p>
<?php
$juice = 'Guava';
echo $juice;
?>
</p>
</body>
</html>
變數均以 $ 開頭,不分型別,不需宣告,區分大小寫
Comments 註解
<html>
<head>
<title>註解</title>
</head>
<body>
<p>
<?php
$dog = 'ling pig';
// 這是單行註解
# 這是單行註解
echo $dog;
/*
這是多行註解
*/
?>
</p>
</body>
</html>
註解有分單行及多行兩種
String 字串
<html>
<head>
<title>字串</title>
</head>
<body>
<?php
$name = 'Jigsaw';
?>
<p><?php echo 'Hi! ' . $name . '!'; ?></p>
<p><?php echo "Hi! $name!"; ?></p>
</body>
</html>
某些情況下可能需要字串夾雜變數做輸出,
實作上有兩種方式:一種是使用字串連接;
另外就是使用雙引號的字串可以直接插入變數。
Exercise 練習
實作一個混合Html與PHP的程式
宣告變數,並將變數與字串混合(連接或插入)後輸出。
CONTROL FLOW:
IF / ELSE /ELSEIF
Comparisons 比較
<html>
<head>
<title>數字比較</title>
</head>
<body>
<p>
<?php
echo 6 < 7;
?>
</p>
</body>
</html>
比較運算子會回傳 True 或 False
比較運算子:
- > 大於
- < 小於
- <= 小於等於
- >= 大於等於
- == 等於
- != 不等於
- === 完全等於(包含型別)
If statements If 判斷式
<?php
$age = 66;
if ($age < 18) {
echo '你不能開車,還不能考駕照!';
}
elseif ($age > 65) {
echo '你可以開車,但是很危險!';
}
else {
echo '你可以開車!';
}
?>
If 判斷式中為 True 才會執行區塊內的程式,
為 False則會判斷下一個 elseif 。
如果沒有 elseif,則直接執行else中的程式
Exercise 練習
實作一個混合Html與PHP的程式
需宣告變數並對變數做判斷,含有If , elseif及else
CONTROL FLOW:
Switch
Switch statements Switch 判斷式
<?php
switch (2) {
case 0:
echo 'The value is 0';
break;
case 1:
echo 'The value is 1';
break;
case 2:
echo 'The value is 2';
break;
default:
echo "The value isn't 0, 1 or 2";
}
switch()內帶入要判斷的變數,
case就是當變數為指定的值時就執行該程式
<?php
$myNum = 2;
switch ($myNum) {
case 1:
echo "1";
break;
case 2:
echo "2";
break;
case 3:
echo "3";
break;
default:
echo "None of the above";
}
Switch statements Switch 判斷式
<?php
if ($i == 1 ||
$i == 2 ||
$i == 3)
{
echo "$i 是介於 1 至 3的數字。";
}
switch 的 case 不加 break 會順著往下執行
<?php
$i = 2;
switch ($i) {
case 1:
case 2:
case 3:
echo "$i 是介於 1 至 3的數字。";
break;
}
Exercise 練習
實作一個混合Html與PHP的程式
需宣告變數並對變數做判斷,
並含有三個 case 以上的 switch。
Array in PHP
Array Syntax 陣列寫法(Indexed)
<?php
$array_b = ['Apple', 'Banana', 'Car'];
宣告一個陣列可使用 array()方法 或是 [](與JavaScript一樣),
前者較舊,後者為5.4.0之後新增的寫法。
<?php
$array = ['do', 're', 'mi'];
/*
** +-------+------+------+------+
** | value | "do" | "re" | "mi" |
** +-------+------+------+------+
** | key | 0 | 1 | 2 |
** +-------+------+------+------+
*/
echo $array[0];
// outputs "do"
取用變數也與JavaScrtip一樣,使用變數名稱再加上[key]即可。
要注意的是,第一個key為0,幾乎所有的程式語言都是如此
Array Syntax 陣列寫法(Indexed)
在 PHP 中使用 array_push() 函式增加元素至陣列
Adding Array Elements
新增陣列元素
<?php
$colors = ['red', 'blue', 'yellow'];
array_push($colors, 'green', 'white');
var_dump($colors);
/* array (size=5)
0 => string 'red' (length=3)
1 => string 'blue' (length=4)
2 => string 'yellow' (length=6)
3 => string 'green' (length=5)
4 => string 'white' (length=5)
*/
Modifying Array Elements
修改陣列元素
<?php
$myArray = ['red', 'blue', 'yellow'];
echo $myArray[1];
// outputs 'blue'
$myArray[1] = 'green';
echo $myArray[1];
// outputs 'green'
你可以直接將陣列重新賦值
Deleting Array Elements
刪除陣列元素
<?php
$myArray = ['red', 'blue', 'yellow'];
unset($myArray[2]);
var_dump($myArray);
?>
<?php
unset($myArray);
var_dump($myArray);
?>
<?php
$NTCUST = [
'資訊與流通學院' => [
'資訊工程系',
'資訊管理系',
'流通管理系'
],
'設計學院' => [
'商業設計系',
'多媒體設計系',
'室內設計系'
]
];
var_dump($NTCUST);
多維陣列就是陣列包了很多陣列
Multidimensional Arrays 多維陣列
<?php
$my = [
'name' => 'Evan',
'nickname' => 'Jigsaw',
'age' => 21,
];
echo $my['nickname'];
// outputs 'Jigsaw'
相似於 JavaScript 的 Object,
與 Indexed Array 不同的地方就是可以自訂 key 的值
Array Syntax 陣列寫法(Associative)
Exercise 練習
實作兩個混合Html與PHP的程式
- 宣告一個包含 Indexed 及 Associative 的二維陣列,並練習對該陣列新增、修改、刪除,最後使用 var_dump 輸出
- 試著對Associative array使用array_push,說明發生什麼事?
For Loop in PHP
<?php
for ($i = 0; $i < 10; $i++) {
echo $i;
}
// outputs 0123456789
和 JavaScript 的 For 寫法大致相同,
第一個參數為起始值,第二個為是否繼續執行的條件,
第三則為起始值變動的規律
'For' Loop Syntax For迴圈寫法
Exercise 練習
實作兩個混合Html與PHP的程式
- 利用for迴圈與Html的table做出九九乘法表
- 宣告一個包含 Indexed Array,元素至少要有五個。利用For迴圈將陣列的每個元素以 <p>{value}</p> 的方式印出
Tips:
<?php
$arr = [0, 1, 2, 3, 4];
echo count($arr);
// outputs 5
<!-- 3*2 Table -->
<table border="1">
<tbody>
<tr>
<td>1-1</td>
<td>1-2</td>
<td>1-3</td>
<tr>
<tr>
<td>2-1</td>
<td>2-2</td>
<td>2-3</td>
<tr>
</tbody>
</table>
<?php
$langs = [
'JavaScript',
'HTML/CSS',
'PHP',
'Python',
'Ruby'
];
foreach ($langs as $lang) {
echo "<li>$lang</li>";
}
foreach ($langs as $keys => $lang) {
echo "<li>$keys => $lang</li>";
}
在 PHP 中可以使用 Foreach 來對陣列進行迭代。
Loops + Arrays = ForEach
Exercise 練習
- 練習把剛才的練習用foreach的寫法在練習
- 試著把剛剛的foreach執行看看,
看看'as'以後的寫法所造成的影響
While Loop in PHP
<?php
$loopCond = true;
while($loopCond) {
echo '$loopCond = ' . $loopCond;
$loopCond = false
}
當While迴圈判斷式內的結果為True,就會執行區塊內的程式
要注意的是不要讓判斷式的結果永遠為True,否則程式會當掉
While Loop Syntax While迴圈寫法
<?php
$flipCount = 0;
do {
$flip = rand(0,1);
// rand()方法會產生兩個參數間的隨機整數
$flipCount ++;
if ($flip) {
echo '<p>H</p>';
}
else {
echo '<p>T</p>';
}
} while ($flip);
?>
<p><?php echo $flipCount; ?></p>
和While不同的是,先判斷與後判斷的差別
Do-while Syntax Do-while迴圈寫法
Exercise 練習
While很少用,不用練習
Functions in PHP
<?php
$name = 'Jigsaw Ye';
$length = strlen($name);
// 9
$partial = substr($name, 0, 6);
// 'Jigsaw'
$uppercase = strtoupper($name);
// 'JIGSAW YE'
$lowercase = strtolower($name);
// 'jigsaw ye'
String Functions 字串函式
-
strlen() 計算字串長度
-
substr() 切割字串,第一個參數為字串,
第二為開始位置,第三為幾個字 -
strtoupper() 轉換大寫
-
strtolower() 轉換小寫
<?php
strpos("emily", "e"); // 0
strpos("emily", "i"); // 2
strpos("emily", "ily"); // 2
strpos("emily", "zxc"); // false
if (strpos("david","h") === false) {
print "Sorry, no 'h' in 'david'";
}
// prints the "Sorry" message
strpos() 用於判斷第二參數是否包含在第一參數內,
如果有,就回傳相同的開始位置;
不包含則回傳false
String Functions 字串函式
<?php
$round = round(M_PI);
print $round;
// prints 3
$round_decimal = round(M_PI, 4);
print $round_decimal;
// prints 3.1416
round() 為四捨五入,會將第一個參數四捨五入,
第二個參數為指定精度(小數點後幾位)
Note: M_PI 為 PHP 內建的全域變數
Math Functions 數學函式
<?php
$array_a = [5, 3, 7, 1];
sort($array_a);
print join(", ", $array_a);
// prints "1, 3, 5, 7"
$array_b = [8, 2, 6 ,4];
rsort($array_b);
print join(":", $array_b);
// prints "8:6:4:2"
- sort() 為從小到大排序
- rsort() 則為由大到小排序(reverse sort)
- join() 第一個參數為插入得值,然後會將每個陣列元素之間插入第一個參數後回傳
- array_merge() 合併陣列(地雷很多)
Array Functions 陣列函式
<?php
$array_c = array_merge($array_a, $array_b);
var_dump($array_c);
// array (size=8)
// 0 => int 1
// 1 => int 3
// 2 => int 5
// 3 => int 7
// 4 => int 8
// 5 => int 6
// 6 => int 4
// 7 => int 2
Exercise 練習
實作一個混合Html與PHP的程式
請宣告一個空陣列,使用 for 迴圈與rand()函式把空陣列裡的元素增加至10個,並由小到大排序,最後將陣列按照以下格式印出
元素1|元素2|元素3|.....|元素10
<?php
function name(parameters) {
statement;
}
name(parameters);
// call function
利用關鍵字 function 宣告函式,接著是函式的名稱,
括號內為參數,大括號內為執行的程式
Function Syntax 函式語法
Exercise 練習
寫一支函式,印出你的名字
<?php
function returnSomething() {
return 'Whoisyourdaddy!';
}
echo returnSomething();
// outputs 'Whoisyourdaddy!'
Return 的意思就是指將在函式內傳回某個變數、陣列、字串...等等
The Return Keyword 關鍵字:回傳
<?php
function squareValue($number) {
echo $number * $number;
}
$num = 9;
squareValue($num);
// echos 81
呼叫函式時我們可以帶入參數,
只要在宣告函式時加入變數就可以了。
Parameters and Arguments 變數
Exercise 練習
實作一個混合Html與PHP的程式
-
宣告一個函式 aboutMe,需要能夠輸入兩個參數:名字與年齡,且函式則會回傳
Hello! My name is 名字參數, and I am 年齡參數 years old.
,最後請將回傳之結果印出。 - 試試看,如果在函式的 return 之後寫程式(echo 等等),會發生什麼事?那如果函式裡有兩個return,會發生什麼事?
Passing data to PHP
<?php
echo $_GET['name'];
// outputs jigsaw
var_dump($_GET);
// array (size=2)
// 'name' => string 'Jigsaw' (length=6)
// 'age' => string '21' (length=2)
- 由網址(Url)傳遞資料
- 有長度限制(Url)
- 較不安全
Passing data with $_GET
http://localhost/index.php?name=jigsaw&age=21
//http://localhost/index.php?{key}={value}&{key}={value}
<?php
if (isset($_GET['name'])):
?>
<p>Your name: <?php echo $_GET['name']; ?></p>
<?php
else:
?>
<p>You didn't type a name.</p>
<?php
endif:
?>
利用isset()函式判斷變數是否存在
Passing data with $_GET
null
函式補充
Exercise 練習
實作兩個混合Html與PHP的程式
- 練習透過Get傳遞資料並印出
- 練習透過Get傳遞行(Column)及列(Row),
建立對應的九九乘法表,
若缺少其一變數或未輸入則顯示相關訊息
// form.php
<form action="show.php" method="post">
<input type="text" name="name">
<button type="submit">send</button>
</form>
// action 將資料傳遞至 (required)
// method 傳遞的方式 (optional,default GET)
// enctype 上傳檔案時需設定為 multipart/form-data
Passing data with $_POST
// show.php
<?php
echo $_POST['name'];
- 一般由表單(From)傳遞資料
- 沒有有長度限制
- 較安全
// show.php
<h2>$_GET:</h2>
<p><?php var_dump($_GET); ?></p>
<hr>
<h2>$_POST:</h2>
<p><?php var_dump($_POST); ?></p>
在資料夾中建立 show.php 以供接收資料並輸出用
Form 表單
<form action="./show.php" method="get">
<input type="text" name="user_name">
<input type="password" name="user_password">
<button type="submit">Login</button>
<button type="reset">Reset</button>
</form>
- input 輸入
- type 類型
- name 變數名稱
- value 預設內容
- placeholder 提示字
- text 單行文字
- password 密碼
- submit 送出
- reset 重填
Form 表單
Exercise 練習
- 將前一頁的form修改成用post的方式傳遞,
並練習Placeholder跟value 屬性
<form action="./show.php" method="post">
<input type="checkbox" name="A" value="A" checked>
<input type="checkbox" name="B" value="B">
<input type="checkbox" name="C" value="C">
<input type="checkbox" name="D" value="D">
<button type="submit">Send</button>
</form>
- value 變數的值
- checked 預設勾選
checkbox 複選框
<form action="./show.php" method="post">
<input type="checkbox" name="items[]" value="A" checked>
<input type="checkbox" name="items[]" value="B">
<input type="checkbox" name="items[]" value="C">
<input type="checkbox" name="items[]" value="D">
<button type="submit">Send</button>
</form>
- 傳遞的變數為陣列
checkbox 複選框
<form action="./show.php" method="post">
<input type="radio" name="sex" value="boy">男
<br>
<input type="radio" name="sex" value="girl">女
<br>
<input type="radio" name="sex" value="other">其他
<br>
<button type="submit">Send</button>
</form>
- raido 單選框
Form 表單
<form action="./show.php" method="post">
<textarea rows="5" cols="20" name="message">Default message</textarea>
<button type="submit">Send</button>
</form>
- textarea 多行文字
- rows 輸入框高
- cols 輸入框寬
Form 表單
<form action="./show.php" method="post">
<select name="Macbook">
<optgroup label="New">
<option value="new_12">MacBook 12 吋</option>
</optgroup>
<optgroup label="Air">
<option value="air_11">MacBook Air 11 吋</option>
<option value="ari_13">MacBook Air 13 吋</option>
</optgroup>
<optgroup label="Pro">
<option value="pro_13">MacBook Pro 13 吋</option>
<option value="pro_13_retina">MacBook Pro 13 吋 配備 Retina 顯示器</option>
<option value="pro_15_retina">MacBook Pro 15 吋 配備 Retina 顯示器</option>
</optgroup>
</select>
<button type="submit">Send</button>
</form>
- optgroup 項目群組
- label 群組名稱
Form 表單
<form action="./show.php" method="post">
<label for="usernamefield">Username</label>
<input type="text" id="usernamefield" name="username">
<label for="passwordfield">Password</label>
<input type="password" id="passwordfield" name="userpassword">
<button type="submit">Login</button>
</form>
- for 綁定欄位的id
- id 須加在input上
Label 輸入欄位名稱
<form action="./show.php" method="post">
<label>
<input type="checkbox" name="agree" value="true">
我已滿18歲
</label>
<button type="submit">繼續觀看</button>
</form>
直接用Label將checkbox包起來
Label 輸入欄位名稱
<form action="./show.php" method="post">
<label>
<input type="radio" name="sex" value="boy" checked>Boy
</label>
<label>
<input type="radio" name="sex" value="girl">Girl
</label>
<label>
<input type="radio" name="sex" value="girl">Other
</label>
<button type="submit">Send</button>
</form>
直接用Label將Radio包起來
Label 輸入欄位名稱
Exercise 練習
實作一個Html表單及PHP接收端程式
- 建立一個申請帳號的表單,須使用Label
- 欄位包含
- Email(email)
- 密碼(password)
- 暱稱(text)
- 職業(select)
- 性別(radio)
- 條款(textarea, 唯讀 tip:readonly)
- 同意條款(check)
- 送出(Submit)
- 重置(Reset)
<form action="./show.php" method="post" enctype="multipart/form-data">
<label for="filefield">File Name:</label>
<input id="filefield" type="file" name="file">
<button type="submit">Upload</button>
</form>
上傳檔案表單
File upload 檔案上傳
Session & Cookie
<?php
setcookie("times", $_COOKIE['times']+1, time()+3600, '/', 'localhost', true, true);
//setcookie(name, value, expire, path, domain, secure, httponly)
var_dump($_COOKIE);
setcookie("times", "", time() - 3600);
- Cookie儲存在瀏覽器,可以直接看見資料及修改
- 一般用在沒有隱密性的資料:訪客狀態紀錄購物車...等
Cookie
Exercise 練習
- 第一次開網站時顯示 : 初次見面你好
- 第二次後 : 你已經光臨這網站N次
<?php
session_start();
$_SESSION['username'] = 'Jigsaw';
// set session key and value
echo $_SESSION['username'];
// outputs 'Jigsaw'
unset($_SESSION['user_id']);
// delete session
session_destroy();
// delete all session
- Session會將值存在伺服器,sessionid存在瀏覽器,發送請求到伺服器後會拿瀏覽器上的sessionid取用對應的session值
- 一般用在隱密性的資料:登入狀態,使用者名稱...等
Session
// index.php
<?php
session_start();
$_SESSION['token']=rand(0,100);
?>
<form action="auth.php" method="post">
<label for="token" >驗證碼: <?=$_SESSION['token']?></label>
<input type="text" name="token" id="token">
<button type="submit">Auth</button>
</form>
Session
// auth.php
<?php
session_start();
if ($_SESSION['token'] == $_POST['token']):
?>
<p>驗證碼正確</p>
<?php
else:
?>
<p>驗證碼錯誤</p>
<?php
endif;
?>
new PHP Tutorial
By jigsawye
new PHP Tutorial
- 1,639