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>

變數均以 $ 開頭,不分型別,區分大小寫

Short Tag

<html>

  <head>
    <title>Short Tag</title>
  </head>

  <body>

    <?php
      $platform = 'PS4';
    ?>

    <p>平台:<?=$platform?></p>
    <p><?='The order'?> <?=1886?></p>

  </body>
</html>

除了用Echo的方式輸出之外,

也可以使用 <?={something}?> 的 Short Tag 來輸出

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><?='Hi! ' . $name . '!'?></p>

    <p><?="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中的程式

If statements If 判斷式

<html>
    <head>
        <title>If判斷式</title>
    </head>
    <body>
        <?php
            $age = 66;
            if ($age < 18) {
        ?>
                <h1>你不能開車,還不能考駕照!</h1>
        <?php
            }
            elseif ($age > 65) {
        ?>
                <h2>你可以開車,但是很危險!</h2>
        <?php
            }
            else {
        ?>
                <p>你可以開車!</p>
        <?php
            }
        ?>
    </body>
</html>

實作上一定會將PHP與HTML分隔開,

所以會改寫成左方寫法。

 

但這樣程式會變得很不易讀

If statements If 判斷式

<html>
    <head>
        <title>If判斷式</title>
    </head>
    <body>
        <?php
            $age = 66;
            if ($age < 18):
        ?>
                <h1>你不能開車,還不能考駕照!</h1>
        <?php
            elseif ($age > 65):
        ?>
                <h2>你可以開車,但是很危險!</h2>
        <?php
            else:
        ?>
                <p>你可以開車!</p>
        <?php
            endif;
        ?>
    </body>
</html>

可以改寫成if():及endif;形式

使程式易讀

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;
}

Switch statements Switch 判斷式

跟 if 一樣可以改寫成switch: 與 endswitch;

<?php

$i = 2;

switch ($i):
    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";
endswitch;

Exercise 練習

實作一個混合Html與PHP的程式

 

需宣告變數並對變數做判斷,

並含有三個 case 以上的 switch。

Array in PHP

Array Syntax 陣列寫法(Indexed)

<?php

    $array_a = array('Apple', 'Banana', 'Car');

    $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">
    <tbode>
        <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>
    </tbode>
</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

<?php

    for ():

    endfor;


    foreach ():

    endforeach;

和 If 一樣,可以使用 Endfor 及 Endforeach。

Endfor and Endforeach

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

    require('./hello.php');

    require_once('./hello.php');

    include('./hello.php');

    include_once('./hello.php');
  • require() 會拋出錯誤,並終止程式
  • include() 會拋出錯誤,但會繼續執行程式
  • require_once()及include_once()亦同,
    但加載過的檔案不會重複載入

include & require

<?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: <?=$_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),
    建立對應的九九乘法表,
    若缺少其一變數或未輸入則顯示相關訊息
<?php

    if (isset($_GET['page'])) {

        switch ($_GET['page']) {

            case 'about':
                require_once('./static_page/about.php');
                break;

            case 'contact':
                require_once('./static_page/contact.php');
                break;

            default:
                header("Location: ./");
        }

    }
    else {
        require_once('./static_page/home.php');
    }

header('Location: $location')可用於轉址

Switching page with $_GET

// 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 檔案上傳

<?php

if (isset($_FILES['file'])) {

    $file = $_FILES['file'];

    if ($file['error'] > 0) {
        echo 'Error: ' . $file['error'];
    }
    else {
        echo '檔案名稱: ' . $file['name'] . '<br>';
        echo '檔案類型: ' . $file['type'] . '<br>';
        echo '檔案大小: ' . ($file['size'] / 1024) . ' Kb<br>';
        echo '暫存名稱: ' . $file['tmp_name'] . '<br>';
    
        function exist($file) {
        	return file_exists('./upload/' . $file['name']);
        }
    
        if (exist($file)) {
            $message = '檔案已經存在,請勿重覆上傳相同檔案';
        }
        else {
            move_uploaded_file($file['tmp_name'], './upload/' . $file['name']);
            $message = exist($file) ? 'Upload success!' : 'Upload fail!';
        }
    }
}
else {
	$message = '沒有上傳檔案';
}

echo $message;

PHP端接收檔案程式

File upload 檔案上傳

Exercise 練習

實作一個檔案上傳程式

  • 只能上傳jepg圖檔
  • 檔案大小不得超過1M
  • 需儲存為亂數名稱的檔案

 

Tips:

<?php

    echo substr(str_shuffle(MD5(microtime())), 0, 10);
    // 產生10個字元的亂數字串

    // jpg的type為 'image/jpeg'

Exercise 練習

實作兩個混合Html與PHP的程式

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

Exercise 練習

實作一個混合Html與PHP的登入程式

 

  • 檔案包含index.php, login.php, logout.php
  • index.php: 若有登入就顯示帳號及登出連結,
    否則顯示登入表單提供使用者登入
  • login.php: 接受index.php的登入表單,驗證帳號密碼,
    正確就將帳號寫入session,否則顯示登入失敗,
  • logout.php: 提供使用者登出,並提供返回前一頁的連結
  • login.php 及 logout.php 須提供返回前一頁的連結

PHP Tutorial

By jigsawye

PHP Tutorial

  • 1,668