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
340
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
360
01 - W3 intro - OpenWebSchool
openwebschool
3
240
02 - PHP I - OpenWebSchool
openwebschool
3
270
Other Decks in Programming
See All in Programming
GoとPHPのインターフェイスの違い
shimabox
2
170
Linux && Docker 研修/Linux && Docker training
forrep
24
4.5k
個人アプリを2年ぶりにアプデしたから褒めて / I just updated my personal app, praise me!
lovee
0
340
SwiftUIで単方向アーキテクチャを導入して得られた成果
takuyaosawa
0
270
Honoとフロントエンドの 型安全性について
yodaka
5
330
Honoをフロントエンドで使う 3つのやり方
yusukebe
7
3.1k
密集、ドキュメントのコロケーション with AWS Lambda
satoshi256kbyte
0
190
Amazon Bedrock Multi Agentsを試してきた
tm2
1
280
ソフトウェアエンジニアの成長
masuda220
PRO
10
920
DevinとCursorから学ぶAIエージェントメモリーの設計とMoatの考え方
itarutomy
1
670
最近のVS Codeで気になるニュース 2025/01
74th
1
260
お前もAI鬼にならないか?👹Bolt & Cursor & Supabase & Vercelで人間をやめるぞ、ジョジョー!👺
taishiyade
5
3.9k
Featured
See All Featured
Building Better People: How to give real-time feedback that sticks.
wjessup
366
19k
Bash Introduction
62gerente
610
210k
Faster Mobile Websites
deanohume
306
31k
実際に使うSQLの書き方 徹底解説 / pgcon21j-tutorial
soudai
174
51k
The Illustrated Children's Guide to Kubernetes
chrisshort
48
49k
The Cost Of JavaScript in 2023
addyosmani
47
7.3k
Build The Right Thing And Hit Your Dates
maggiecrowley
34
2.5k
Scaling GitHub
holman
459
140k
Typedesign – Prime Four
hannesfritz
40
2.5k
The Psychology of Web Performance [Beyond Tellerrand 2023]
tammyeverts
45
2.3k
KATA
mclloyd
29
14k
The Web Performance Landscape in 2024 [PerfNow 2024]
tammyeverts
4
410
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