雲端教學課程

PHP Login

先下載上次最後的檔案同步一下 :
http://ppt.cc/tAXY


先到的同學先把WAMP、Navicat 安裝起來。
http://163.17.136.249/wamp.html

Navicat 在 2804-01 / 2804-03 / 2804-08 / 

網路上很多範例都有漏洞

php登入範例login.php
http://wordpress.bestdaylong.com/blog/archives/777
PHP Login Page Example.
http://www.9lessons.info/2009/09/php-login-page-example.html
 記得外部進來的資料都要先處理過。
 入侵示範 : 
 帳號admin, 密碼 ' or ''=',藍色部份是從外部進來的資料。

原理 : select * from `member` 
where `username`='admin' and `password`='' or '' = '

先來個簡單的範例

PHP部份
<?php
session_start(); //開始SESSION
$user_name = 'kai'; //預設帳號
$user_password = sha1('123456'); //預設密碼
$message = ''; //訊息

if(isset($_POST['user_name']) && isset($_POST['user_password'])){
  //判斷帳密是否正確
  if($_POST['user_name'] == $user_name
    && sha1($_POST['user_password']) == $user_password ){    
    $_SESSION['user_name']=$user_name;
    $message = '登入成功!'; 
  }else{
    $message = '帳密有誤!';
  }}elseif(isset($_GET['action'])){
  unset($_SESSION['user_name']);
}
?>

先來個簡單的範例

HTML部份
<p><?php echo $message;?></p>

<?php if( isset($_SESSION['user_name']) ){ ?>
<p>你已經登入了!</p>
<p><a href="?action=logout">我要登出</a></p>
<?php }elseif( isset($_GET['action']) ){?>
<p>登出成功</p>
<p><a href="index.php">回到登入頁面</a></p><?php }else{?>
<!--登入表單--><form action="index.php" method="post">
  <label for="user_name">帳號</label>
  <input type="text" id="user_name" name="user_name" />
  <label for="user_password">密碼</label>
  <input type="password" id="user_password" name="user_password" />
  <input type="submit" value="登入" />
  <input type="reset" />
</form><?php }?>

畫面、流程先規劃再想程式


規劃出來的 View


  1. 會員登入 ( member_login.php )
  2. 會員登出 ( member_logout.php )
  3. 會員註冊 ( member_register.php )
  4. ...

會員登入

view\member_login.php
<form action="" method="post">
  <label for="user_name">帳號</label>
  <input type="text" id="user_name" name="user_name" />
  <label for="user_password">密碼</label>
  <input type="password" id="user_password" name="user_password" />
  <input type="submit" value="登入" />
  <input type="reset" />
</form>

會員登出

view\member_logout.php
<p>登出成功!</p>
<p><a href="?action=list">回留言版</a></p>
<p><a href="?action=list">重新登入</a></p>

會員註冊

view\member_register.php
<form action="" method="post">
  <label for="user_name">帳號</label>
  <input type="text" id="user_name" name="user_name" />
  <label for="user_password">密碼</label>
  <input type="password" id="user_password" name="user_password" />
  <label for="user_password2">確認密碼</label>
  <input type="password" id="user_password2" name="user_password2" />
  <input type="submit" value="註冊" />
  <input type="reset" />
</form>

開始寫會員model

model\member.php
建立member物件。
<?php
class member{
	
	function __construct( PDO $db){
		$this->db = $db;
	}
}
記得修改 config.php,加一行session_start();
<?php
session_start();

登入

model\member.php
<?php
class member{
  ...    
  function login( $member ,$password){
    $db = $this->db;
    $stmt = $db->prepare("SELECT * FROM `member` WHERE " . 
                 "`member` = :member " . 
                 "AND `password` = :password");
    $stmt->execute(array(
                 ':member' => $member,
                 ':password' => sha1($password)
                 ));    if( $stmt->rowCount() == 1 ){//是否有符合的資料
      $user = $stmt->fetchAll(PDO::FETCH_ASSOC);
      $_SESSION['user'] = $user[0];//把會員資料寫進SESSION裡
      return true;//登入成功
    }else{
      return false;//登入失敗
    }	
  }
}

登出

model\member.php
<?php
class member{
  ...   
  function logout(){
    session_destroy();
    return true;
  }
}

註冊

model\member.php
<?php
class member{
  ...   
  function register( $member ,$password){
    $db = $this->db;
    $stmt = 	$db->prepare("INSERT INTO `member`" . 
              "(`member`,`password`,`create_date`)" . 
              "VALUES ( :member , :password , NOW() )");
    $stmt->execute(array(
                 ':member' => $member,
                 ':password' => sha1($password)
                 ));    if( $stmt->rowCount() == 1 ){//是否有符合的資料
      return true;//註冊成功
    }else{
      return false;//註冊失敗
    }	
  }
}   

修改 '主要' Controller

index.php?model=模組名稱&action=模組內頁

  1. 建立一個controller資料夾。
  2. 在裡面建一個空白PHP檔名叫message.php。
  3. 把屬於message的controller移進去。
  4. 修改index.php再測試 ?model=message&action=list
<?php
require 'config.php';
$model = array(
          'message',
          'member'
          );
if( in_array( $_GET['model'] , $model) ){
  require 'model/' . $_GET['model'] . '.php' ;
  require 'controller/' . $_GET['model'] . '.php' ;
}

開始寫controller

controller\member.php
index.php?model=member&action=error_page
沒帶action參數或是參數錯誤直接顯示錯誤頁面
<?php
if( isset( $_GET['action'] ) ){
  $member = new member($db);
  switch($_GET['action']){
    default :
      require 'view/error.php';
  }
}else{
  require 'view/error.php';
}	

controller - 會員登入

  • index.php?model=member&action=login - 登入畫面
  • index.php?model=member&action=login_post - 處理登入
case 'login':
  require 'view/member_login.php';
  break;		
case 'login_post':
  if(  isset($_POST['user_name']) 
    && isset($_POST['user_password']) ){    if( $member->login($_POST['user_name'] ,
                $_POST['user_password']) ){
      header("Location: ?model=message&action=list");
    }else{
      header("Location: ?model=member&action=login&error=1");
    }
  }
  else{
    header("Location: ?model=member&action=login&error=2");
  }
  break;			

controller - 會員登出

index.php?model=member&action=logout

使用$member的登出方法後,把登出成功畫面引入。
case 'logout' :
  $member->logout();
  require 'view/member_logout.php';
  break;			

controller - 會員註冊

  • index.php?model=member&action=register - 註冊畫面
  • index.php?model=member&action=register_post - 處理
case 'register' :
  require 'view/member_register.php';
  break;
case 'register_post' :
 if( isset($_POST['user_name'])
  && isset($_POST['user_password'])
  && isset($_POST['user_password2']) ){
   if( $_POST['user_password'] != $_POST['user_password2']){
    header("Location: ?model=member&action=register&error=1");   }elseif( $member->register($_POST['user_name'] ,
                    $_POST['user_password']) ){
    header("Location: ?model=message&action=list");
   }else{
    header("Location: ?model=member&action=register&error=2");
   }
  }
  else{
    header("Location: ?model=member&action=register&error=3");
  }
  break;

修改view,讓流程串起來

view\member_login.php
<!--加入註冊連結-->
<p><a href="?model=member&action=register">註冊</a></p>
<!--指定POST到member的login_post位置--> <form action="?model=member&action=login_post" method="post">
view\member_logout.php
<p>登出成功!</p>
<p><a href="?model=message&action=list">回留言版</a></p>
<p><a href="?model=member&action=login">回登入頁</a></p>
view\member_register.php
<form action="?model=member&action=register_post" method="post">

修改留言版的view

view/message_list.php
<?php if(isset($_SESSION['user'])){?>

<p>歡迎<?php echo $_SESSION['user']['member'];?>登入!<a href="?model=member&action=login">[登出]</a></p>

<?php }else{?>

<p><a href="?model=member&action=login">[登入]</a></p>

<?php }?>

回家作業



  1. 把會員登入跟留言版串起來,有登入才能留言。
  2. 每個會員獨立的留言版 ( URL再帶一個參數)。
  3. 會員個人檔案畫面。
  4. 研究無名小站的發文、貼相片流程。
  5. 試著寫發文、回應、相簿。


發文、回應、相簿寫完後會開始CSS切版、CSS教學。
Made with Slides.com