雲端教學課程


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判斷式 elseifelse if  是一樣的
但建議使用 elseif   (中間沒空白)
   <?php
   $i = 1;   if($i != 1){    echo "<p>鬼才好厲害</p>";   }   elseif($i == 1){    echo "<p>鬼才還是好厲害</p>";   }   else{    echo "<p>鬼才好厲害 * $i</p>";   }?>

PHP基礎語法

但是有個更好的寫法,把HTMLPHP分開。

 <?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

兩者差別

  1. GET是透過URL傳遞資料;POST是透過表單。
  2. URL傳遞資料會有長度限制;POST則不會。
  3. GET使用者能從URL看到資料;POST則不會。
  4. 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到的變數全列出來
 <?php print_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

判斷有沒傳值
 <?php if( isset( $_GET['v1']) ) {?>  <p>v1=<?php echo $_GET['v1'];?></p><?php }else{?>  <p>沒傳傳值</p><?php }?>

傳遞變數

GET練習4

用GET指定產生表格的行列數


傳遞變數

利用GET切換網頁
index.php?page=blog
 <?php if( isset( $_GET['page']){   if($_GET['page']=='blog'){     include('blog.php');
   }   elseif($_GET['page']=='profile'){     include('profile.php');
   }   else{     include('index.php');   } }?>

傳遞變數

利用GET切換網頁
傳遞進來的參數都是"髒的"要先處理過。

錯誤示範
 <?php   if( 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表單


練習 : 

  1. 把剛剛的表單改成用POST的型式,
    傳遞資料給test.php。


  2. 把乘法表改成用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

name=變數名稱;size=可見數目。

 <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)

  1. 留言者
  2. 電話(用密碼欄位)
  3. 有參加的活動名稱
  4. 最喜歡的活動名稱(下拉式選單)
  5. 性別(單選)
  6. 意見(文字區塊)

傳遞變數

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