Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
03 - PHP II - OpenWebSchool
Search
openwebschool
August 14, 2012
Programming
2
390
03 - PHP II - OpenWebSchool
openwebschool
August 14, 2012
Tweet
Share
More Decks by openwebschool
See All by openwebschool
11 - CodeIgniter - OpenWebSchool
openwebschool
1
330
09 - Node.JS - OpenWebSchool
openwebschool
1
390
07 - Javascript - OpenWebSchool
openwebschool
3
340
08 - js frontend & jQuery - OpenWebSchool
openwebschool
3
280
05 - MySQL - OpenWebSchool
openwebschool
1
250
06 - PHP & MySQL - OpenWebSchool
openwebschool
1
270
04 - CSS - OpenWebSchool
openwebschool
4
350
01 - W3 intro - OpenWebSchool
openwebschool
3
240
02 - PHP I - OpenWebSchool
openwebschool
3
260
Other Decks in Programming
See All in Programming
Less waste, more joy, and a lot more green: How Quarkus makes Java better
hollycummins
0
100
.NET のための通信フレームワーク MagicOnion 入門 / Introduction to MagicOnion
mayuki
1
1.8k
Kaigi on Rails 2024 〜運営の裏側〜
krpk1900
1
260
Figma Dev Modeで変わる!Flutterの開発体験
watanave
0
150
Pinia Colada が実現するスマートな非同期処理
naokihaba
4
230
Click-free releases & the making of a CLI app
oheyadam
2
120
Compose 1.7のTextFieldはPOBox Plusで日本語変換できない
tomoya0x00
0
200
見せてあげますよ、「本物のLaravel批判」ってやつを。
77web
7
7.8k
「今のプロジェクトいろいろ大変なんですよ、app/services とかもあって……」/After Kaigi on Rails 2024 LT Night
junk0612
5
2.2k
TypeScript Graph でコードレビューの心理的障壁を乗り越える
ysk8hori
3
1.2k
とにかくAWS GameDay!AWSは世界の共通言語! / Anyway, AWS GameDay! AWS is the world's lingua franca!
seike460
PRO
1
910
카카오페이는 어떻게 수천만 결제를 처리할까? 우아한 결제 분산락 노하우
kakao
PRO
0
110
Featured
See All Featured
[RailsConf 2023 Opening Keynote] The Magic of Rails
eileencodes
28
9.1k
The Illustrated Children's Guide to Kubernetes
chrisshort
48
48k
Site-Speed That Sticks
csswizardry
0
33
Building Adaptive Systems
keathley
38
2.3k
A designer walks into a library…
pauljervisheath
204
24k
Gamification - CAS2011
davidbonilla
80
5k
Speed Design
sergeychernyshev
25
620
Fashionably flexible responsive web design (full day workshop)
malarkey
405
65k
How to Think Like a Performance Engineer
csswizardry
20
1.1k
ReactJS: Keep Simple. Everything can be a component!
pedronauck
665
120k
Navigating Team Friction
lara
183
14k
Bootstrapping a Software Product
garrettdimon
PRO
305
110k
Transcript
PHP - part II Ensky / 林宏昱
I/O in PHP Web server CGI HTTP Request stdin +
env stdout HTTP Response + BODY
I/O in PHP Input 部分呢, PHP 會把它轉為變數傳進來, 這我們之後會提 但 Output
呢,卻是直接 stdout 輸出 <?php echo “123”; ?>
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>”; 豈不是超麻煩 !
I/O in PHP 由於一直 echo 來 echo 去真的超麻煩 所以 PHP
使用 <?php ?> 這個符號 一旦用 <?php ?> 包起來的,就是 php 程式 沒有包起來,就直接輸出 stdout <?php echo $var; ?> 也可以用 <?=$var?> <body><p> 這裡不需要 echo</p></html>
I/O in PHP 印資料的時候呢,其實有個小技巧 <?php $users = ["Jalex", "ensky"]; ?>
<table> <?php foreach ($users as $row): ?> <tr><td><?=$row?></td></tr> <?php endforeach; ?> </table>
I/O in PHP <?php foreach ($a as $b): xxx endforeach;
等於 foreach ($a as $b) { xxx } if 也可以喔 ! if(): else if (): else: endif;
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
談了那麼多語言特性之後,我們終 於開始要進入正題了
表單(form)
Why Form? 表單用來幹嘛? • 提供你一個介面,把資料傳到 server 上,做 必要的處理 比方說登入的時候你會需要傳帳號、密碼 到
server 那邊,讓他驗證你的身分
表單的傳輸 • 一個普通的表單有兩種傳輸方式 – GET – POST • 有沒有似曾相識? GET
/index.php HTTP/1.1 Host: ensky.tw
表單的運作 - GET GET 的傳輸方式,就是把要傳輸的資料,加到 網址後面。 原網址 ?keyA=valueA&keyB=valueB 例如說我 google
中搜尋 ensky 會連到 https://www.google.com.tw/search?q=ensky 藉由把資料加在網址後面, 成功的讓 server 收到我要傳過去的資訊。
表單的運作 - GET GET /search?q=ensky HTTP/1.1 Host: www.google.com.tw server 收到這兩行就知道
他傳了一個 q 過來 q 的值是 ensky
表單的運作 - POST 和 GET 方法不同, POST 的傳輸方式,就是把要 傳輸的資料,加到 HTTP
Request BODY 中。 POST /auth/login HTTP/1.1 Host: comic.ensky.tw id=ensky&pw=ensky5566
表單的運作 - POST 而因為不會在網址上出現,所以和 GET 方法相 比,有幾個好處 • 不會被 web
log 記錄起來 • 不會被站在你後面的人看到網址 而也有一些壞處 • 分享網址無法分享資訊
表單的種類 不細談,請自己找 google HTML Form 請特別注意 label 標籤的使用方法
表單的種類 HTML5 多了很多有趣的 inputs 可以自己摸摸看
表單 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>
表單 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 ,其他一樣
None
Stateless – WWW recall again Web server CGI HTTP Request
stdin + env stdout HTTP Response + BODY
Stateless 你會發現,一來一往, 兩次 request 中間並不會有相關性 也就是說, server 那邊唯一的資訊, 就只有你傳過來的 URI
資訊。 這就叫做 Stateless (無狀態) 怎麼辦呢?
Stateless - solution 聰明的 HTTP 協定設計者,發明了一個叫 cookie 的 方式,藉由發送 HTTP
Request 的時候,加帶一串 key-value pair 來傳資料。 cookie 是 server 設的, server 決定你的 cookie 有什麼。 比如你登入之後, server 可能會請你把登入狀態存起來
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
Cookie - DEMO • 然後之後的 request 你的 browser 都會把資訊 傳過去
Request GET /comic_list HTTP/1.1 Host: comic.ensky.tw Cookie: id=ensky; valid=1 所以 server 就知道你的狀態囉!
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);
Cookie in PHP - Getting <?php // Print an individual
cookie echo $_COOKIE["TestCookie"]; print_r($_COOKIE);
Cookie’s problem 網路世界流傳著一個名言 「絕對不要相信使用者」 而我們知道, cookie 完全由使用者的瀏覽器傳 過來,因此使用者很可能竄改 cookie ,或甚至
有惡意程式盜取使用者的 cookie 來偽造登入。
Cookie’s Problem - Solution 如何解決 cookie 問題呢?
Cookie’s Problem - Solution 最簡單的方法呢,就是把 cookie 加密。 不告訴使用者加密的方法, 由 server
這邊逕行加密,導致使用者無法竄改資料。 http://stackoverflow.com/questions/1289061/best- way-to-use-php-to-encrypt-and-decrypt
而有一個機制,是把資料都存在 server 端, 而 client 端我們會產生一個隨機字串給他(鑰匙) server 端的資料對應到那把鑰匙, 藉由 client
給我們那把鑰匙, 我們就知道要拿哪一份資料給他。 而我們稱呼這套機制為 -- Session
Session in PHP <?php session_start(); // Setting $_SESSION[‘TestSession’] = ‘test’;
// Getting echo $_SESSION[‘TestSession’]; // print out all session print_r($_SESSION);
Session in PHP • session destroy $_SESSION = array(); session_destroy();
其他 session 操作、處理 http://www.php.net/manual/en/book.session.php
Cookie and session note set_cookie() 會做的事情 • 在 response header
裡面多加上 set-cookie 來 設定 cookie
Cookie and session note session_start() 會做的事情 1. 產生一組隨機的 key string
2. 在 response header 裡面 set-cookie: session_key=key; 3. 讓$_SESSION陣列的內容 mapping 到對應的地 方 ( 有可能是 file, database, memory…)
Cookie and session note 我們知道, HTTP Response header 一定在 response
body 之前送出。 因此,我們不能在set_cookie或者session_start 之前印出任何字串。 因為印字串代表送出 Response Body , php 就會 把 Response Header 先送出去,就來不及了 XD
OO in PHP 雖然說 PHP 是簡單的 script language ,設計上 是一頁一頁,跑完就結束的
script 。 但是等到你開始寫中型網站的時候,若架構 上亂寫一通,會產生很多問題。 因此, PHP 將 OO 的一些功能帶進來,給你規 劃架構的另外一個選擇。
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();
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’);
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’);
OO in PHP 還有很多功能、元素我都沒有介紹。 有些功能還滿重要的,比如說 :: 運算子、 static keyword 、
Overloading 、 Cloning 等等 但是因為再講下去會有點無聊,所以你回去之後 自己看 XD 。 ref: http://www.php.net/manual/en/language.oop5.php
換頁 in PHP 如果你想換頁,比如說登入失敗要回到上一頁,或者 登入成功要進入主要頁面 <?php header('location: index.php'); exit; 意思是請在
HTTP Response header 中加入 location: index.php 這行,然後結束程式 瀏覽器看到這行 HTTP header 就會換頁
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
Homework • 複習今天教的內容,把一些概念搞懂 – I/O – Form – Session 、
Cookie – OO – Useful function
Homework – on course • 實作題 III :登入介面 http://vm2.ensky.tw/~ensky/03/index.php 現場做之
SPEC : • 登入 • 帳號密碼寫死在 code 裡面 • 如果已經登入了還跑到登入頁面,會直接進內頁 • 如果還沒有登入卻想進內頁,會跑回登入畫面 • 要顯示錯誤型態(無帳號、密碼錯) • 登入後內頁要顯示是誰登入的 • 登出
Homework – on course • Useful function – session 相關
function – isset
Homework – home 回家做之 SPEC : • 註冊 – 使用
CSV 存使用者資料,不可使用資料庫 • 列出註冊者的帳號&密碼在首頁 • 現場做的所有 SPEC 都要維持住 • Userful Functions – fopen – fgetcsv – fputcsv – fclose