實戰發文系統(註冊)

  • 0
CI 建置 2實戰發文系統(註冊) by TonyQ @ iT
摘要
1) view: application/views/register.php
2) create db
3) 自動讀入 db 設定
4) 更新 application/views/register.php
5) 針對 /user/registering 修正
6) 新增 model
7) 修改 controller
8) 實作 insert
9) 後續問題
------------------------------------------------------------------------
1) view: application/views/register.php
code https://gist.github.com/3879719

2) create db
2.1) wamp 中、以 phpmyadmin 下 SQL 指令
CREATE TABLE `user` (  
 `UserID` bigint(20) NOT NULL AUTO_INCREMENT,  
 `Account` varchar(100) NOT NULL,  
 `Password` varchar(100) NOT NULL,  
 PRIMARY KEY (`UserID`)  
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;  
 
CREATE TABLE `article` (  
 `ArticleID` bigint(20) NOT NULL AUTO_INCREMENT,  
 `Author` bigint(20) NOT NULL,  
 `Title` varchar(200) NOT NULL,  
 `Content` text NOT NULL,  
 `Views` bigint(20) NOT NULL,  
 PRIMARY KEY (`ArticleID`)  
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;  

2.2) 至 /application/config/database.php 修改相對應的值
$db['default']['hostname'] = 'localhost';  
$db['default']['username'] = 'root';  
$db['default']['password'] = '1234';  
$db['default']['database'] = 'CITestdb';  

3) 自動讀入 db 設定
/application/config/autoload.php
修改 $autoload['libraries'] = array(); 
 -> $autoload['libraries'] = array('database');

不然會有錯誤像是: Fatal error: Call to a member function select() on a non-object


4) 更新 application/views/register.php
code https://gist.github.com/3879847
新增送出表單
<form action="<?=site_url("/user/registering")?>" method="post"  >
site_url 跟 base_url 有點像,但是他是包含到 index.php 的部份,所以 site_url("/user/registering") 實際上是 http://localhost/CITest/index.php/user/registering 的意思。

5) 針對 /user/registering 修正
applicaiton/controllers/user.php, 新增
public function registering() {  
        $account = $this->input->post("account");  
        $password= $this->input->post("password");  
        $passwordrt= $this->input->post("passwordrt");  
    }  

6) 新增 model
application/models/usermodel.php
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');  
class UserModel extends CI_Model {  
   function __construct() {  
       parent::__construct();  
   }  

   function insert($account,$password) {
        $this->db->insert("user",   
           Array(  
           "account" =>  $account,  
           "password" => $password  
        ));  
   
}  

7) 修改 controller
applicaiton/controllers/user.php
function registering() 新增

$this->load->model("UserModel");  
    $this->UserModel->insert($account,$password); //完成新增動作  

    如果沒有先載入 UserModel 的話,$this->UserModel 是不會存在的

------------------------------------------------------------------------------------------


8) 實作 insert
application/models/usermodel.php
定義這個 Model 具有 insert 這個函式,其中有 $account / $password 這兩個參數,而我們會負責將這兩個資料插入 user 資料表。
$this->db 是 CI 幫 Model 內建的變數,負責專門處理資料庫操作,在 CI 裡面他稱之為 Active Record。CI 的 Active Record 透過 insert 這樣的指令,讓使用者能確實指定他希望用哪些欄位輸入哪些資料,而 Active Record 就會確保當使用者輸入惡意字元時,能夠正確被進行 escape 處理,而不會造成安全性問題。
操作樣板:$this->db->insert("資料表名稱",欄位與資料)

9) 後續問題
1.如果密碼或帳號是空白,應該告知使用者密碼或帳號不得為空白。
如果 retype password 與 password 欄位資料不一致,應該告知使用者確認密碼並不正確。告知時應顯示表單,請使用者繼續填寫。

2.新增資料時如果這個帳號已經存在,應該視為錯誤,告知使用者此帳號已存在,並請使用者重新選擇帳號。

3.如果新增正常時,應該告訴使用者他已註冊成功,並提示到登入頁面。


1-1. 
public function registering(){
    $account = $this->input->post("account");
    $password= $this->input->post("password");
    $passwordrt= $this->input->post("passwordrt");
   
    if( trim($password) =="" || trim($account) =="" ){
        $this->load->view('register',Array(
            "errorMessage" => "Account or Password shouldn't be empty,please check!" ,
            "account" => $account
        ));
        return false;
    }

    if( $password != $passwordrt ){
        //如果不一致,我們讀取 register view,
        //但將 $account 跟錯誤訊息帶入作為處理
        $this->load->view('register',Array(
            "errorMessage" => "Password doesn't match re-type password,please check yout input!" ,
            "account" => $account
        ));
        return false;
    }

    $this->load->model("UserModel");
    $this->UserModel->insert(trim($account),trim($password)); //完成新增動作
}

因為我們要重新產生 view 並且要有錯誤訊息,所以需要透過變數告訴 view 要產生什麼訊息,所以我們一定是透過一個指明 key-value 的 Array 進行變數傳遞。

1-2. 修改 view 作為對應顯示
application/views/register.php
code https://gist.github.com/3884988

重點1) 如果有錯誤訊息的話,就顯示錯誤訊息,alert-error 是 bootstrap 用來顯示錯誤訊息的標籤。
<?php  if (isset($errorMessage)){?>
    <div class="alert alert-error">
        <?=$errorMessage?>
    </div>
<?php }?>

重點2) 保存 account,避免使用者重新輸入欄位
<?php if(isset($account)){ ?>
    <input type="text" name="account"
        value="<?=htmlspecialchars($account)?>" />
<?php }else{ ?>
    <input type="text" name="account" />
<?php } ?>

htmlspecialchars: 特別為 $account 的內容進行 html 字元過濾


2-1. application/models/usermodel.php
code https://gist.github.com/3885055

function checkUserExist($account){
    $this->db->select("COUNT(*) AS users");
    $this->db->from("user");
    $this->db->where("account", $account);
    $query = $this->db->get();

    return $query->row()->users > 0 ;
}

// = "select count(*) from user where account = '".$account."';"
$this->db->select 決定選擇欄位
$this->db->from 決定存取資料表
$this->db->where 決定存取條件
$this->db->get() 負責執行查詢,並將查詢結果回傳。
$query->row() 則是將查詢資料的第一筆取出,
在這裡我們透過第一筆資料的 users 資料判斷他是不是存在。

2-2. 整合回 application/controller/user.php 裡
code https://gist.github.com/3885073


3-1. 在 user/registering 最後加上完成的 view
$this->load->view('register_success',Array(
        "account" => $account
));

3-2. application/views/register_success.php


沒有留言 :

張貼留言