Upgrade to Pro — share decks privately, control downloads, hide ads and more …

03 - PHP II - OpenWebSchool

03 - PHP II - OpenWebSchool

openwebschool

August 14, 2012
Tweet

More Decks by openwebschool

Other Decks in Programming

Transcript

  1. I/O in PHP Web server CGI HTTP Request stdin +

    env stdout HTTP Response + BODY
  2. I/O in PHP echo “<html>”; echo “<head>”; echo “<meta charset=‘utf-8’>”;

    echo “<title>test page</title>”; echo “</head>”; echo “<body><p> 這頁沒有東西 </p></body>”; echo “</html>”; 豈不是超麻煩 !
  3. I/O in PHP 由於一直 echo 來 echo 去真的超麻煩 所以 PHP

    使用 <?php ?> 這個符號 一旦用 <?php ?> 包起來的,就是 php 程式 沒有包起來,就直接輸出 stdout <?php echo $var; ?> 也可以用 <?=$var?> <body><p> 這裡不需要 echo</p></html>
  4. I/O in PHP 印資料的時候呢,其實有個小技巧 <?php $users = ["Jalex", "ensky"]; ?>

    <table> <?php foreach ($users as $row): ?> <tr><td><?=$row?></td></tr> <?php endforeach; ?> </table>
  5. I/O in PHP <?php foreach ($a as $b): xxx endforeach;

    等於 foreach ($a as $b) { xxx } if 也可以喔 ! if(): else if (): else: endif;
  6. I/O in PHP 既然有 stdout 的輸出,當然也有 stdin 的輸入。 ref: http://php.net/manual/en/features.commandline.io-streams.php

    因此,你大可以用 PHP 做任何運算 況且, PHP 的資料結構比 C 寫起來好用太多 XD 還有一堆網路相關的 socket 函式, 寫 Network Programming 作業也很方便 :P
  7. 表單的運作 - GET GET 的傳輸方式,就是把要傳輸的資料,加到 網址後面。 原網址 ?keyA=valueA&keyB=valueB 例如說我 google

    中搜尋 ensky 會連到 https://www.google.com.tw/search?q=ensky 藉由把資料加在網址後面, 成功的讓 server 收到我要傳過去的資訊。
  8. 表單的運作 - POST 和 GET 方法不同, POST 的傳輸方式,就是把要 傳輸的資料,加到 HTTP

    Request BODY 中。 POST /auth/login HTTP/1.1 Host: comic.ensky.tw id=ensky&pw=ensky5566
  9. 表單的運作 - POST 而因為不會在網址上出現,所以和 GET 方法相 比,有幾個好處 • 不會被 web

    log 記錄起來 • 不會被站在你後面的人看到網址 而也有一些壞處 • 分享網址無法分享資訊
  10. 表單 in PHP 一個基本的 html 登入表單 // index.php <form action="login.php"

    method="post"> <input type="text" name="username"> <input type="password" name="pw"> <button type="submit"> 登入 </button> </form>
  11. 表單 in PHP browser 看到 form action="login.php" , 他就會發一個 POST

    HTTP Request 到 login.php 那頁去, 於是 PHP 就可以收到 web server parse 好的資料。 <?php $_POST['username'] = ' 剛剛打的 username'; $_POST['pw'] = ' 剛剛打的密碼 '; 而 GET Method 的話則是 $_GET ,其他一樣
  12. Stateless – WWW recall again Web server CGI HTTP Request

    stdin + env stdout HTTP Response + BODY
  13. Stateless - solution 聰明的 HTTP 協定設計者,發明了一個叫 cookie 的 方式,藉由發送 HTTP

    Request 的時候,加帶一串 key-value pair 來傳資料。 cookie 是 server 設的, server 決定你的 cookie 有什麼。 比如你登入之後, server 可能會請你把登入狀態存起來
  14. Cookie - Demo • 舉例:你登入之後, server 請你把狀態存下來。 Request POST /auth/login

    HTTP/1.1 Host: comic.ensky.tw id=ensky&pw=ensky5566 Response HTTP/1.1 200 OK Date: Thu, 09 Aug 2012 15:35:46 GMT Set-Cookie: id=ensky; valid=1
  15. Cookie - DEMO • 然後之後的 request 你的 browser 都會把資訊 傳過去

    Request GET /comic_list HTTP/1.1 Host: comic.ensky.tw Cookie: id=ensky; valid=1 所以 server 就知道你的狀態囉!
  16. Cookie in PHP - Setting <?php $value = 'something from

    somewhere'; setcookie("TestCookie", $value); setcookie("TestCookie", $value, time()+3600); /* expire in 1 hour */ setcookie("TestCookie", $value, time()+3600, "/ ~rasmus/", "example.com", 1);
  17. Cookie in PHP - Getting <?php // Print an individual

    cookie echo $_COOKIE["TestCookie"]; print_r($_COOKIE);
  18. Cookie’s Problem - Solution 最簡單的方法呢,就是把 cookie 加密。 不告訴使用者加密的方法, 由 server

    這邊逕行加密,導致使用者無法竄改資料。 http://stackoverflow.com/questions/1289061/best- way-to-use-php-to-encrypt-and-decrypt
  19. Session in PHP <?php session_start(); // Setting $_SESSION[‘TestSession’] = ‘test’;

    // Getting echo $_SESSION[‘TestSession’]; // print out all session print_r($_SESSION);
  20. Session in PHP • session destroy $_SESSION = array(); session_destroy();

    其他 session 操作、處理 http://www.php.net/manual/en/book.session.php
  21. Cookie and session note session_start() 會做的事情 1. 產生一組隨機的 key string

    2. 在 response header 裡面 set-cookie: session_key=key; 3. 讓$_SESSION陣列的內容 mapping 到對應的地 方 ( 有可能是 file, database, memory…)
  22. Cookie and session note 我們知道, HTTP Response header 一定在 response

    body 之前送出。 因此,我們不能在set_cookie或者session_start 之前印出任何字串。 因為印字串代表送出 Response Body , php 就會 把 Response Header 先送出去,就來不及了 XD
  23. OO in PHP 雖然說 PHP 是簡單的 script language ,設計上 是一頁一頁,跑完就結束的

    script 。 但是等到你開始寫中型網站的時候,若架構 上亂寫一通,會產生很多問題。 因此, PHP 將 OO 的一些功能帶進來,給你規 劃架構的另外一個選擇。
  24. OO in PHP - basic <?php class SimpleClass { //

    property declaration public $var = 'a default value'; // method declaration public function displayVar() { echo $this->var; } } $instance = new SimpleClass; $instance->displayVar();
  25. OO in PHP – ctor / dtor <?php class CtorTestClass

    { function __construct ($msg = ‘’) { echo “constructed, msg = $msg.”; } function __destruct () { echo ‘destructed.’; } } $instance = new CtorTestClass; $instance1 = new CtorTestClass(‘haha’);
  26. OO in PHP – inheritance <?php class Animal { public

    $name; function __construct ($name) { $this->name = $name; } } class Cat extends animal { public function meow () { echo $this->name . ‘: meow’; } } $cat = new Cat(‘useless’);
  27. OO in PHP 還有很多功能、元素我都沒有介紹。 有些功能還滿重要的,比如說 :: 運算子、 static keyword 、

    Overloading 、 Cloning 等等 但是因為再講下去會有點無聊,所以你回去之後 自己看 XD 。 ref: http://www.php.net/manual/en/language.oop5.php
  28. 換頁 in PHP 如果你想換頁,比如說登入失敗要回到上一頁,或者 登入成功要進入主要頁面 <?php header('location: index.php'); exit; 意思是請在

    HTTP Response header 中加入 location: index.php 這行,然後結束程式 瀏覽器看到這行 HTTP header 就會換頁
  29. PHP Useful Funcs PHP 有超多很好用的 functions ,這也是很多人 愛他的原因。 這邊列舉了一些我個人很常用的 function

    群, 請自己回去看。 Strings: http://www.php.net/manual/en/book.strings.php Filesystem: http://www.php.net/manual/en/book.filesystem.php Arrays: http://www.php.net/manual/en/book.array.php Variable handling: http://www.php.net/manual/en/book.var.php
  30. Homework – on course • 實作題 III :登入介面 http://vm2.ensky.tw/~ensky/03/index.php 現場做之

    SPEC : • 登入 • 帳號密碼寫死在 code 裡面 • 如果已經登入了還跑到登入頁面,會直接進內頁 • 如果還沒有登入卻想進內頁,會跑回登入畫面 • 要顯示錯誤型態(無帳號、密碼錯) • 登入後內頁要顯示是誰登入的 • 登出
  31. Homework – home 回家做之 SPEC : • 註冊 – 使用

    CSV 存使用者資料,不可使用資料庫 • 列出註冊者的帳號&密碼在首頁 • 現場做的所有 SPEC 都要維持住 • Userful Functions – fopen – fgetcsv – fputcsv – fclose