SlideShare una empresa de Scribd logo
1 de 48
PHP - part II

Ensky / 林宏昱
I/O in PHP

           HTTP Request


HTTP       Web server     stdin + env
Response
+ BODY
             stdout         CGI
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,其他一樣
Stateless – WWW recall again

           HTTP Request


HTTP       Web server     stdin + env
Response
+ BODY
             stdout         CGI
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

Más contenido relacionado

La actualidad más candente

大话Php之性能
大话Php之性能大话Php之性能
大话Php之性能liqiang xu
 
cfm to php training
cfm to php training cfm to php training
cfm to php training Chonpin HSU
 
Phpconf 2011 introduction_to_codeigniter
Phpconf 2011 introduction_to_codeigniterPhpconf 2011 introduction_to_codeigniter
Phpconf 2011 introduction_to_codeigniterBo-Yi Wu
 
Internal php and gdb php core
Internal php and gdb php coreInternal php and gdb php core
Internal php and gdb php corealpha86
 
advanced introduction to codeigniter
advanced introduction to codeigniteradvanced introduction to codeigniter
advanced introduction to codeigniterBo-Yi Wu
 
第九章解答
第九章解答第九章解答
第九章解答jiannrong
 
Php设计模式介绍
Php设计模式介绍Php设计模式介绍
Php设计模式介绍cyf5513
 

La actualidad más candente (7)

大话Php之性能
大话Php之性能大话Php之性能
大话Php之性能
 
cfm to php training
cfm to php training cfm to php training
cfm to php training
 
Phpconf 2011 introduction_to_codeigniter
Phpconf 2011 introduction_to_codeigniterPhpconf 2011 introduction_to_codeigniter
Phpconf 2011 introduction_to_codeigniter
 
Internal php and gdb php core
Internal php and gdb php coreInternal php and gdb php core
Internal php and gdb php core
 
advanced introduction to codeigniter
advanced introduction to codeigniteradvanced introduction to codeigniter
advanced introduction to codeigniter
 
第九章解答
第九章解答第九章解答
第九章解答
 
Php设计模式介绍
Php设计模式介绍Php设计模式介绍
Php设计模式介绍
 

Destacado

2014 database - course 1 - www introduction
2014 database - course 1 - www introduction2014 database - course 1 - www introduction
2014 database - course 1 - www introductionHung-yu Lin
 
Google App Engine
Google App EngineGoogle App Engine
Google App EngineHung-yu Lin
 
2014 database - course 2 - php
2014 database - course 2 - php2014 database - course 2 - php
2014 database - course 2 - phpHung-yu Lin
 
OpenWebSchool - 11 - CodeIgniter
OpenWebSchool - 11 - CodeIgniterOpenWebSchool - 11 - CodeIgniter
OpenWebSchool - 11 - CodeIgniterHung-yu Lin
 
2014 database - course 3 - PHP and MySQL
2014 database - course 3 - PHP and MySQL2014 database - course 3 - PHP and MySQL
2014 database - course 3 - PHP and MySQLHung-yu Lin
 

Destacado (6)

2014 database - course 1 - www introduction
2014 database - course 1 - www introduction2014 database - course 1 - www introduction
2014 database - course 1 - www introduction
 
Google App Engine
Google App EngineGoogle App Engine
Google App Engine
 
Redis
RedisRedis
Redis
 
2014 database - course 2 - php
2014 database - course 2 - php2014 database - course 2 - php
2014 database - course 2 - php
 
OpenWebSchool - 11 - CodeIgniter
OpenWebSchool - 11 - CodeIgniterOpenWebSchool - 11 - CodeIgniter
OpenWebSchool - 11 - CodeIgniter
 
2014 database - course 3 - PHP and MySQL
2014 database - course 3 - PHP and MySQL2014 database - course 3 - PHP and MySQL
2014 database - course 3 - PHP and MySQL
 

Similar a OpenWebSchool - 03 - PHP Part II

富文本编辑器在互联网上的应用
富文本编辑器在互联网上的应用富文本编辑器在互联网上的应用
富文本编辑器在互联网上的应用luolonghao
 
Node Web开发实战
Node Web开发实战Node Web开发实战
Node Web开发实战fengmk2
 
Node Web开发实战
Node Web开发实战Node Web开发实战
Node Web开发实战fengmk2
 
第01讲 php环境搭配和
第01讲  php环境搭配和第01讲  php环境搭配和
第01讲 php环境搭配和cyfp
 
WEB 安全基础
WEB 安全基础WEB 安全基础
WEB 安全基础xki
 
PHP & AppServ
PHP & AppServPHP & AppServ
PHP & AppServHt Wang
 
CodeIgniter 2.0.X
CodeIgniter 2.0.XCodeIgniter 2.0.X
CodeIgniter 2.0.XBo-Yi Wu
 
给聚划算后端开发的前端培训
给聚划算后端开发的前端培训给聚划算后端开发的前端培训
给聚划算后端开发的前端培训j5726
 
Class 20170126
Class 20170126Class 20170126
Class 20170126Ivan Wei
 
DevOpsDays Taipei 2018 - Puppet 古早味、新感受:改造老牌企業進入自動化時代
DevOpsDays Taipei 2018 - Puppet 古早味、新感受:改造老牌企業進入自動化時代DevOpsDays Taipei 2018 - Puppet 古早味、新感受:改造老牌企業進入自動化時代
DevOpsDays Taipei 2018 - Puppet 古早味、新感受:改造老牌企業進入自動化時代scott liao
 
Open Api&Sip
Open Api&SipOpen Api&Sip
Open Api&Sipcenwenchu
 
Exam 98-375 HTML5 Application Development Fundamentals
Exam 98-375 HTML5 Application Development FundamentalsExam 98-375 HTML5 Application Development Fundamentals
Exam 98-375 HTML5 Application Development FundamentalsChieh Lin
 
前端杂谈
前端杂谈前端杂谈
前端杂谈salinet
 
非常靠谱 Html 5
非常靠谱 Html 5 非常靠谱 Html 5
非常靠谱 Html 5 Tony Deng
 
Phalcon phpconftw2012
Phalcon phpconftw2012Phalcon phpconftw2012
Phalcon phpconftw2012Rack Lin
 
Phalcon the fastest php framework 阿土伯
Phalcon   the fastest php framework 阿土伯Phalcon   the fastest php framework 阿土伯
Phalcon the fastest php framework 阿土伯Hash Lin
 
01 产品基础知识培训
01 产品基础知识培训01 产品基础知识培训
01 产品基础知识培训jackieit
 
ColaPHP In Action
ColaPHP In ActionColaPHP In Action
ColaPHP In Actionfuchaoqun
 
Using google appengine_1027
Using google appengine_1027Using google appengine_1027
Using google appengine_1027Wei Sun
 

Similar a OpenWebSchool - 03 - PHP Part II (20)

富文本编辑器在互联网上的应用
富文本编辑器在互联网上的应用富文本编辑器在互联网上的应用
富文本编辑器在互联网上的应用
 
Node Web开发实战
Node Web开发实战Node Web开发实战
Node Web开发实战
 
Node Web开发实战
Node Web开发实战Node Web开发实战
Node Web开发实战
 
Php
PhpPhp
Php
 
第01讲 php环境搭配和
第01讲  php环境搭配和第01讲  php环境搭配和
第01讲 php环境搭配和
 
WEB 安全基础
WEB 安全基础WEB 安全基础
WEB 安全基础
 
PHP & AppServ
PHP & AppServPHP & AppServ
PHP & AppServ
 
CodeIgniter 2.0.X
CodeIgniter 2.0.XCodeIgniter 2.0.X
CodeIgniter 2.0.X
 
给聚划算后端开发的前端培训
给聚划算后端开发的前端培训给聚划算后端开发的前端培训
给聚划算后端开发的前端培训
 
Class 20170126
Class 20170126Class 20170126
Class 20170126
 
DevOpsDays Taipei 2018 - Puppet 古早味、新感受:改造老牌企業進入自動化時代
DevOpsDays Taipei 2018 - Puppet 古早味、新感受:改造老牌企業進入自動化時代DevOpsDays Taipei 2018 - Puppet 古早味、新感受:改造老牌企業進入自動化時代
DevOpsDays Taipei 2018 - Puppet 古早味、新感受:改造老牌企業進入自動化時代
 
Open Api&Sip
Open Api&SipOpen Api&Sip
Open Api&Sip
 
Exam 98-375 HTML5 Application Development Fundamentals
Exam 98-375 HTML5 Application Development FundamentalsExam 98-375 HTML5 Application Development Fundamentals
Exam 98-375 HTML5 Application Development Fundamentals
 
前端杂谈
前端杂谈前端杂谈
前端杂谈
 
非常靠谱 Html 5
非常靠谱 Html 5 非常靠谱 Html 5
非常靠谱 Html 5
 
Phalcon phpconftw2012
Phalcon phpconftw2012Phalcon phpconftw2012
Phalcon phpconftw2012
 
Phalcon the fastest php framework 阿土伯
Phalcon   the fastest php framework 阿土伯Phalcon   the fastest php framework 阿土伯
Phalcon the fastest php framework 阿土伯
 
01 产品基础知识培训
01 产品基础知识培训01 产品基础知识培训
01 产品基础知识培训
 
ColaPHP In Action
ColaPHP In ActionColaPHP In Action
ColaPHP In Action
 
Using google appengine_1027
Using google appengine_1027Using google appengine_1027
Using google appengine_1027
 

OpenWebSchool - 03 - PHP Part II