雲端教學課程
2013 / 05 / 16
2013/05/30 (foreach開始)
PHP基礎教學
先到的同學先把WAMP、Google Chrome安裝起來。
簡報都在
PHP基礎語法
<html >
<head>
<title>無標題文件</title>
</head>
<body>
<p><?php echo "hollo world"; ?></p>
</body>
</html>
PHP基礎語法
如何用PHP產生XHTML ?
只要在 <?php ?>這區間內的都是PHP語法。
<html >
<head>...
</head>
<body>
<p>
<?php
echo "hollo world";
?>
</p>
<p>這邊是HTML</p>
<p>
<?php
echo "這邊裡面是PHP";
?> </p>
</body>
</html>
PHP基礎語法
如果看到有一本書全部用echo輸出HTML,
請把那本書直接丟了。

PHP基礎語法
為什麼不該用PHP直接輸出HTML ?
在必要時候,可以用PHP直接輸出HTML,
但這會影響到你程式碼的乾淨度。
FOR EXAMPLE :
<?php $value=123;?><font color="#0099CC" size="5"><?php echo $value;?></font>
跟
<?php $value=123;?><?php echo "<font color=\"#0099CC\" size=\"5\">$value</font>";?>
PHP基礎語法
PHP註解方式
<?php
//這是單行註解
echo "鬼才好厲害.";
/*
這是區塊註解
abc123
*/
?>
PHP基礎語法
變數宣告方式
PHP所有變數都是以$符號開始的。
雙引號跟單引號有差別。
FOR EXAMPLE :
<?php$value = 123;$string = "鬼才好厲害!";?> <p><?php echo $string; ?></p><p><?php echo "$string"; ?></p><p><?php echo '$string'; ?></p><p><?php echo $value; ?></p>
PHP基礎語法
字串處理
字串連接 : PHP的字串都是用 . 來連接的
<?php $txt1 = "Hello World!"; $txt2 = "1234";?><p><?php echo $txt1 . " " . $txt2;?></p>
計算字串長度
<p><?php echo strlen("Hello world!"); ?>
PHP基礎語法
運算符號
PHP的運算符號都跟C一樣,但要注意變數前都要加$。
<?php $i=0; $i++;?> <p><?php echo $i;?></p><?php $i=$i+100;?> <p><?php echo $i; ?></p>
PHP基礎語法
在PHP判斷式 elseif 跟 else if 是一樣的
但建議使用 elseif (中間沒空白)
<?php$i = 1;if($i != 1){echo "<p>鬼才好厲害</p>";}elseif($i == 1){echo "<p>鬼才還是好厲害</p>";}else{echo "<p>鬼才好厲害 * $i</p>";}?>
PHP基礎語法
但是有個更好的寫法,把HTML跟PHP分開。
<?php$i = 1;if($i != 1){?><p>鬼才好厲害</p><?php } elseif($i == 123){ ?><p>鬼才還是好厲害</p><?php } else{ ?><p>鬼才好厲害 * <?php echo "$i";?></p><?php } ?>
PHP基礎語法
編碼陣列 - Indexed
<?php$names = array("鬼才","Folio","你");?><p><?php echo $names[1] . " and " . $names[2] . " are ". $names[0] . "'s neighbors";?></p>
<?php $names[0] = "鬼才"; $names[1] = "Folio"; $names[2] = "你"; ?><p><?php echo $names[1] . " and " . $names[2] . " are ". $names[0] . "'s neighbors";?></p>
PHP基礎語法
關聯陣列 - Associative
<?php $peter['age'] = "32"; $peter['weight'] = "40"; $peter['height'] = "155"; ?><p><?php echo "Peter is " . $peter['age'] . " years old.";?></p>
PHP基礎語法
關聯陣列 - Associative
但有個更好的寫法
<?php$peter=array('age'=>'32','weight'=>'40','height'=>'155');?><p><?php echo "Peter is " . $peter['age'] . " years old.";?></p>
PHP基礎語法
多維陣列
<?php$country = array( "台中市"=>array( "北區", "中區", "南區" ), "彰化縣"=>array( "彰化市" ), "南投縣"=>array( "南投市", "埔里" ) );print_r($country);?>
PHP基礎語法
while迴圈
<?php$i=1; while($i<=5){ ?><p>鬼才好厲害 * <?php echo $i++; ?></p><?php } ?>
PHP基礎語法
for迴圈
<ul><?php for ($i=1; $i<=5; $i++){ ?><li>鬼才好厲害 * <?php echo $i; ?></li><?php } ?></ul>
練習 : 用FOR配合TABLE做出99乘法表
PHP基礎語法
foreach迴圈 (重要)
<?php$arr = array('鬼', '才', '好', '厲', '害', '^_<'); foreach ($arr as $item_index => $item) { echo 'Index: ' . $item_index . ',Value: ' . $item . '<br />'; } ?>
PHP基礎語法
函數
<?php function writeMyName() { echo "鬼才好厲害^_<"; } ?><p><?php echo "Hello world!";?></p><br /><p><?php writeMyName();?></p>
PHP基礎語法
函數(帶參數)
<?php function writeMyName($fname) { echo $fname . " 好厲害 ^_<. <br />"; } ?><p><?php echo "Hello world!";?></p><p><?php writeMyName("鬼才"); ?></p><p><?php writeMyName("Folio"); ?></p>
PHP基礎語法
函數 ( 帶參數 + 回傳值 )
<?php function add($x,$y) { $total = $x + $y; return $total; } ?><p><?php echo "1 + 16 = " . add(1,16); ?></p>
PHP基礎語法
include 和 require
兩者差別
- require 會產生錯誤,並停止程式
- include 只會產生警告,並繼續程式
<?php include 'header.php'; ?><?php require 'header.php'; ?>
傳遞變數
GET V.S. POST
兩者差別
- GET是透過URL傳遞資料;POST是透過表單。
- URL傳遞資料會有長度限制;POST則不會。
- GET使用者能從URL看到資料;POST則不會。
- GET會有快取問題;POST不會。
攔封包問題可以利用SSL去解決。
快取問題可以在最後面帶timestmp的方式解決。
傳遞變數
GET V.S. POST
使用時機
GET適合用在頁面切換(能上一頁);
POST適合用在不準返回的表單。
傳遞變數
GET
在網址列後面加參數,每個參數以&隔開,
除了英文數字,其他都要做url encode。
index.php?參數1=123&參數2=鬼才好厲害
PHP urlencode
echo urlencode("鬼才好厲害");//%E9%AC%BC%E6%89%8D%E5%A5%BD%E5%8E%B2%E5%AE%B3
傳遞變數
GET練習
把GET到的變數全列出來
<?phpprint_r($_GET);?>
傳遞變數
GET練習2
get2.php?v1=123&v2=456&v3=789
指定列出GET值
<p><?php echo $_GET['v1'];?></p><p><?php echo $_GET['v3'];?></p>
傳遞變數
GET練習3
判斷有沒傳值
<?phpif( isset( $_GET['v1']) ) {?><p>v1=<?php echo $_GET['v1'];?></p><?php}else{?><p>沒傳傳值</p><?php}?>
傳遞變數
GET練習4
用GET指定產生表格的行列數
FOR EXAMPLE :乘法表 : http://163.17.136.249/cloud/0530/teach01.php?r=1&c=5
傳遞變數
利用GET切換網頁
index.php?page=blog
<?phpif( isset( $_GET['page']){if($_GET['page']=='blog'){include('blog.php');}elseif($_GET['page']=='profile'){include('profile.php');}else{include('index.php');}}?>
傳遞變數
利用GET切換網頁
傳遞進來的參數都是"髒的"要先處理過。
錯誤示範
<?phpif( isset( $_GET['page'] ) ){require( $_GET['page'] );}?>
我可以用這漏洞隨意瀏覽你伺服器上的檔案。
index.php?page=..\..\..\bin\php\php5.3.13\php.ini傳遞變數
HTML 表單
- action = 要傳遞的網址 (必需)
- method = 傳遞的方式 (可選,預設GET)
- enctype = 編碼方式,
在處理檔案上傳時必需設定為multipart/form-data
<form action="url" method="post"> </form>
傳遞變數
HTML表單
我們先建一個檔案 test.php,放在c:/wamp/www/
作用是把GET、POST的變數全列出來
<p>GET : <?php print_r($_GET);?></p><p>POST : <?php print_r($_POST);?></p>
傳遞變數
HTML 表單
type=元件類型;name=變數名稱;value=數值。
-
text:
- password:
<form action="test.php" method="get"> <input type="text" name="user_name" /> <input type="password" name="user_password" /> </form>
傳遞變數
HTML表單
value = 按紐上的文字。
- submit
- reset
<form action="test.php" method="get"> <input type="text" name="user_name" /> <input type="password" name="user_password" /> <input type="submit" value="登入" /> <input type="reset" value="重填" /> </form>
傳遞變數
HTML表單
練習 :
-
把剛剛的表單改成用POST的型式,
傳遞資料給test.php。
- 把乘法表改成用POST的方式 [GET練習4]。
傳遞變數
HTML表單
複選框 type="checkbox"
name=變數名稱;value=數值;checked=是否勾選。
<form action="test.php" method="post"><input type="checkbox" name="A" value="A" checked="checked" /> <input type="checkbox" name="B" value="B" /> <input type="checkbox" name="C" value="C" /> <input type="checkbox" name="D" value="D" /><input type="submit" /> </form>
傳遞變數
HTML表單
複選框 type="checkbox"
傳送陣列
<form action="test.php" method="post"> <input type="checkbox" name="item[]" value="A" checked="checked" /> <input type="checkbox" name="item[]" value="B" /> <input type="checkbox" name="item[]" value="C" /> <input type="checkbox" name="item[]" value="D" /></form>
傳遞變數
HTML表單
單選框 type="radio"
name=群組名稱;value=傳送的數值。
男 女
男 女
<form action="test.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="girl" />其他 <br /> <input type="radio" name="other" value="1" />這是另一個單選框 <br /> <input type="radio" name="other" value="2" />這是另一個單選框2 </form>
傳遞變數
HTML表單
文字區塊 textarea
cols=寬度;rows=行數;name=變數名稱。
<form action="test.php" method="post"> <textarea rows="3" cols="20" name="message">預設訊息</textarea> <input type="submit" /> </form>
傳遞變數
HTML表單
下拉式選單 select
<form action="test.php" method="post"> <select name="select_name">.... </select> <input type="submit" /> </form>
傳遞變數
HTML表單
下拉式選單項目 - option
value="傳送的數值";selected="selected",預設選擇。
<form action="test.php" method="post"> <select name="select_name"> <option value="1">Android</option> <option value="2">UNITY3D</option> <option value="3">SHIVA3D</option> <option value="4">ANDROID(高階)</option> <option value="5" selected="selected">雲端</option> </select> <input type="submit" /> </form>
傳遞變數
HTML表單
下拉式選單項目群組 - optgroup
label = 群組名稱。
<form action="test.php" method="post"> <select name="cpu"> <optgroup label="INTEL"> <option value="i3">i3</option> <option value="i4">i4</option> <option value="i5">i5</option> </optgroup> <optgroup label="AMD"><option value="AM3+">AM3+</option> <option value="FM2">FM2</option> </optgroup> </select> <input type="submit" /> </form>
傳遞變數
HTML表單
隱藏欄位 type="hidden"
可以填入預設的參數跟數值,使用者通常不會去改他。
舉例 : Blog的文章回應
<form action="test.php" method="get"><input type="text" name="user_name" /> <textarea rows="3" cols="20" name="message">我要留言</textarea> <input type="hidden" name="id" value="123" /> <input type="submit" value="留言" /> <input type="reset" value="重填" /> </form>
傳遞變數
資訊安全
你確定 單選框、複選框、下拉式選單、、、,
真的只能傳送你指定的數值嗎?
示範:
從DEBUG視窗修改數值再傳送。
傳遞變數
資訊安全
你確定 別人填進來的文字 安全嗎?
示範:
XSS、CSRF攻擊。
當然還有 SQL Injection,講PHP資料庫連接時會示範。
傳遞變數
HTML表單
改善UI/UX
-
標籤 - label
-
提示輸入(HTML5) - placeholder
<input type="text" name="inputEmail" placeholder="這邊要輸入Email!!">
傳遞變數
HTML表單 - label用法
type="text"、type="password"、select、textarea
for屬性值=輸入框的ID
<form action="test.php" method="post"><label for="user_name">帳號</label> <input type="text" id="user_name" name="user_name" /> <label for="user_password">密碼</label> <input type="password" id="user_password" name="user_password" /> <input type="submit" value="登入" /></form>
傳遞變數
HTML表單 - label用法
check
<form action="test.php" method="post"> <label> <input type="checkbox" value="boy">男</label> <label> <input type="checkbox" value="girl">女</label> <input type="submit" /> </form>
傳遞變數
HTML表單 - label用法
radio
<form action="test.php" method="post"> <label>
<input type="radio" name="sex" value="boy" checked="checked" >
男
</label>
<label>
<input type="radio" name="sex" value="girl">
女
</label>
<input type="submit" />
</form>
傳遞變數
HTML表單 - 練習
建立一個活動回饋表單,內容要有以下(要使用label)。
- 留言者
- 電話(用密碼欄位)
- 有參加的活動名稱
- 最喜歡的活動名稱(下拉式選單)
- 性別(單選)
- 意見(文字區塊)
傳遞變數
HTML表單
按紐 button
type = button、reset、submit;
name=變數名稱;value=變數值。
裡面可以放HTML。
<button type="button"><h1>test</h1><img src="https://www.google.com.tw/images/srpr/logo4w.png" /></button>
傳遞變數
檔案上傳 type="file"
test.php 加一段程式碼 :
$_FILES:<?php print_r($_FILES) ?>
HTML
<form action="test.php" method="post" enctype="multipart/form-data"> <input name="file_upload" type="file" id="file_upload"> <input type="submit" name="Submit" value="確定上傳"> </form>
傳遞變數
PHP檔案上傳
上傳要記得確認身份、檔案類型,最好還要資料庫記錄。
<?php $base_path = ""; if(!empty($_FILES['file_upload']['name'])) { $upfile = $base_path . $_FILES['file_upload']['name'] ; if(copy($_FILES['file_upload']['tmp_name'],$upfile)){ echo "上傳成功"; }else{ echo "上傳失敗"; } } ?>
登入驗證
SESSION V.S. COOKIE
兩者差別
-
COOKIE存在客戶端;SESSION存在SERVER端。
- COOKIE可以直接看見;SESSION客戶端看不見。
- COOKIE可以偽造;SESSION全部由SERVER控制。
但是SESSION時機、用法設錯,一樣會產生漏洞。
EX : 學校查課表的SESSION時機就有設錯。
登入驗證
使用時機
SESSION
- 較敏感的資料,不能給使用者看或修改的。
- 記錄登入狀態、驗證碼答案、流程控制。
COOKIE
- 沒有敏感性、安全性的資料(提高UX及降低伺服器負擔)。
-
我們可以用帳號配合token來做登入驗證。
- 記錄一些客戶端的動作。EX : 佈景主題的設定。
登入驗證
COOKIE
設定cookie
//setcookie("變數名稱", "變數值", 存活時間);setcookie("times", $_COOKIE['times']+1, time()+3600);
讀取cookie值
<?php print_r($_COOKIE); ?>
刪除cookie值
setcookie("times", "", time()-3600);登入驗證
資訊安全
因為COOKIE是存在客戶端,
有安全性的資訊不要放在COOKIE裡,
有安全性的資訊要放SESSION。
示範 :
用DEBUG視窗刪除COOKIE
用JavaScript修改COOKIE
document.cookie="name=value; expires=date; path=path; domain=domain;secure";
登入驗證
COOKIE練習
-
第一次開網站時顯示 : 初次見面你好
- 第二次後 : 你已經光臨這網站N次
提示
可以用isset()來判斷有沒設定變數
範例
登入驗證
COOKIE練習題解答
<?php $welcome =""; if(isset($_COOKIE['times'])){ $welcome="你已經光臨這網站" . $_COOKIE['times'] ."次"; setcookie("times", $_COOKIE['times']+1, time()+3600); }else{ $welcome="初次見面你好^_<"; setcookie("times", 1, time()+3600); } ?><p><?php echo $welcome;?></p>
登入驗證
SESSION 原理
參考:
登入驗證
但是,SESSION還是基於COOKIE上的,
如果我們偽造一個假的COOKIE....
登入驗證
SESSION
啟用session
<?php session_start(); ?>設定session
<?php $_SESSION['user_id']=123; ?>讀取session
<?php echo $_SESSION['user_id']; ?>登入驗證
SESSION
刪除指定SEESION值
<?php unset($_SESSION['user_id']); ?>刪除全部SESSION值
<?php session_destroy(); ?>登入驗證
SESSION 應用 - 驗證碼
a.php
<?php session_start(); $_SESSION['token']=rand(100,80); ?><form action="b.php" method="post"> <label for="token" >驗證碼 : <?php echo $_SESSION['token']; ?></label> <input type="text" name="token" id="token" /> <input type="submit" /> </form>
登入驗證
SESSION應用 - 驗證碼
b.php
<?php session_start(); ?><?php if($_SESSION['token'] == $_POST['token']){ ?> <p>驗證碼正確</p> <?php }else{ ?> <p>驗證碼錯誤</p> <?php }?>
登入驗證
SESSION應用 + 套件使用
http://ppt.cc/XS3V
驗證碼
登入驗證
a.php
<form action="b.php" method="post"> <label for="token" >驗證碼<img src="securimage/securimage_show.php" alt="CAPTCHA Image"></label> <input type="text" name="token" id="token" /> <input type="submit" /> </form>
登入驗證
b.php
啟用SESSION
<?php
session_start();
?>驗證
<?php if($_SESSION['securimage_code_disp']['default']==$_POST['token']){ ?>
<p>驗證碼正確</p>
<?php }else{ ?>
<p>驗證碼錯誤</p>
<?php }?>連接資料庫
PHP基礎教學
By jackai
PHP基礎教學
- 5,638