php學習之留言板

菜lee發表於2019-02-16

前言

在對php語法有一定了解之後開始,這是第一個php練手專案,涵蓋的知識有

  • 公共部分的引用

  • 表單的提交

  • 請求的接收與響應

  • interface+implements的使用

  • 基於檔案的所處理的增刪改查

  • json的格式化與字串序列化

  • 專案地址message board
    ps:本文不詳細介紹知識點,只是大概描述下心得,閱讀者如果有心閱讀可以參看相關程式碼學習,由於本人前端出身,對前端相關姿勢也只是一筆帶過,但是會給出相應關鍵字或連結;

整體結構的介紹

  root
    │  addMess.php
    │  delMess.php
    │  index.php
    │  show.php
    │      
    ├─commom_view
    │      head.html
    │      
    ├─common
    │      lyfile.php
    │      
    ├─css
    │      bootstrap.min.css
    │      
    └─data
            liuyan.txt
            

php相關求情直接放在根目錄下,commom_view存放檢視相同部分,引入了bs的樣式檔案存放在css中,資料txt檔案存放在data資料夾下,common資料夾下存放data的liuyan.txt資料夾讀取相關方法;

編寫過程

公共部分

1. 首先編寫公共頭部包含標題,相關功能頁面連結,為了讓整體頁面好看一點引入了[bs3](http://www.bootcss.com/),然後在各個頁面通過```include (filepath)```的方式進行引入操作;

2. 對整體瞭解,lyfile需要實現的功能有:新增、刪除、展現,先寫介面方法addItem、delItem、getAll;

3. 編寫類LyFile實現介面中定義的三個方法(未真正編寫程式碼)在需要引入的頁面同樣通過 include 的方式進行引入。

首頁

1. 首頁就是一張表單,用做相關資訊的提交;

新增完成頁面

1. 表單提交後跳轉到addMess頁面,做的主要是提交資訊的儲存以及,當前所提交資訊的展示;

2. 用到addItem方法進行資料新增,具體請看[lyfile的編寫](#lyfile);

3. 頁面相關姿勢有:post請求引數的獲取:```$_POST[varitename]```,登入人IP獲取:```$_SERVER[`REMOTE_ADDR`]```、日期格式化:```date( string $format [, int $timestamp ] )```、陣列鍵值對初始化方式:```array(key=>value)```、字串拼接:"....{$varita}..."回車換行符不會打斷整體字串只以《"》為標識;

留言展示頁面

1. 檢視留言要做的是從資料檔案拿到相應的資料,然後通過迴圈進行渲染

2. 用到getAll()對資料進行提取,具體請看[lyfile的編寫](#lyfile);

3. 頁面相關姿勢有:foreach陣列迴圈便利、break跳出陣列迴圈

刪除留言

1. 在展示頁上,我們們對留言進行刪除,這裡沒有直接採用href跳鏈的通過get請求的形式進行,因為這裡需要做的只是刪除某條資料然後重新整理列表的區域性操作,不適合跳轉連結。

2. 用到delMess()對資料進行刪除,具體請看[lyfile的編寫](#lyfile);

3. 相關姿勢有:$.ajax傳送請求、es6字串模板、頁面元素內容賦值、php請求返回echo xxx;

..到這,整體結構就完成了。

<span id=”lyfile”>lyfile的編寫</span>

lyfile是我花的時間比較多的一塊,因此單獨拉出來講,前三段主要說個人對自己書寫方式的必要性;

interface的必要性

* 鍛鍊對專案所需要功能的整體把握能力;

* 實現者可以通過interface的描述對功能進行逐個實現,不受其他干擾;

* 呼叫者可以通過interface相關介紹,瞭解介面呼叫方式;

* interface雖然可以繼承,但他不是類。

使用類的必要性

* 提高複用性,自身呼叫相關引數採用$this->xxx進行呼叫,呼叫者通過例項化相關類,呼叫相關方法;

* 安全性,只有提供相關介面的方法才能進行呼叫,否則不能呼叫;

* 延展性,當需要新增新的介面時,之需要在內部再進行新增相應方法即可,不受其他介面影響;

內部變數

* file_path 因為所有的檔案都儲存在liuyan.txt檔案上,因此file_path就儲存該檔案的路徑

* 常量 ERRORCODE、SUCCCODE靜態標識錯誤和正確狀態,避免再程式碼中使用-1,0標識,提高程式碼可讀性

addItem

* 首先了解其要做的事:1、獲取資料,2、新增相應的id(為啥這麼幹將在delItem進行說明),3、再lyfile.txt寫入;

* 新增資料獲取是通過呼叫處傳過來的,在此不進行贅述;

* 新增id:這裡採用獲取最後一條留言的id值(不是索引值),在其基礎上+1以此來保持id的唯一性,具體功過程式碼來說明;

* 一條資料放在一行的形式進行儲存;

    public function addItem($write_data){
        //1.獲取最後一行資料的id並+1
        $lastId = $this->getLastId();
        $write_data["id"] = $lastId+1;
        //在檔案末尾寫入的方式開啟檔案
        $handle   = fopen($this->file_path,"a");
        //陣列轉字串
        $ly = $this->itemString($write_data);
        //字串寫入
        $str  = fwrite($handle,$ly);
        //關閉檔案
        fclose($handle);
    }
    //獲取最後一行的id
    private function getLastId(){
        //獲取所有檔案內容
        $lyData = $this->getAll();
        //計算行數
        $lyLen = count($lyData);
        //當沒有資料時,返回位置-1;
        if($lyLen == 0)return -1;
        //否則返回相應的id;
        return $lyData[$lyLen-1][`id`];
    }
    //獲取所有檔案的內容
    public function getAll(){
        //逐行讀取檔案,以陣列的形式返回,每一項為item字串;
        $all_item = file($this->file_path);
        //宣告返回的變數陣列
        $dataArr = array();
        //便利讀組的檔案字元陣列
        foreach($all_item as $item){
            //將字串轉化成陣列的形式(注意json_decode第二個引數,不加則返回的是一個物件),並加入到返回的變數陣列中。
            array_push($dataArr,json_decode($item,true));
        }
        return $dataArr;
    }
    //陣列轉化成字串並加入換行符,這裡不做贅述
    private function itemString($item_data){
        $item_str = json_encode($item_data);
        $item_str .="
";
        return $item_str;
    }

getAll

機智的同學早已發現,在上面已經實現了這個函式,那麼我們們就可以愉快的拿起來用了,不用再重複寫了。

delItem

這要乾的就是1、通過id找到相應的項,2、找到就刪除並返回成功碼,否則返回錯誤碼


    public function delItem($id){
        //獲取所有的資料
        $allLy = $this->getAll();
        //初始化要刪除的索引
        $delIndex = -1;
        
        //找到需要刪除的ID所對應的物件
        foreach($allLy as $curIndex =>$lyItem){
            //如果找到相應的id就對$delIndex進行賦值
            if($lyItem["id"] == $id){
                $delIndex = $curIndex;
                break;
            } 
        }
        
        //如果沒找到索引號,直接退出並返回錯誤碼(物件內常量的引用是self ::CONSTVAR)
        if($delIndex==-1)return self ::ERRORCODE;
        //刪除陣列中索引位置的元素;
        array_splice($allLy, $delIndex ,1);
        // 將新的陣列元素寫入到檔案中
        if($this->allWrite($allLy)==self ::SUCCCODE)return self ::SUCCCODE;
        //讀寫出現錯誤
        return self ::ERRORCODE;
    }

    //新的陣列元素寫入
    private function allWrite($allLy){
        //以覆蓋的方式寫入檔案
        $handle   = fopen($this->file_path,"w");
        //初始化寫入字串
        $writeStr = ``;
        foreach($allLy as $lyItem){
            //將item轉成字串,並進行連結。因為之前addItem定義過這個方法,因此再次得到複用
            $writeStr.=$this->itemString($lyItem);
        }
        //將字串寫入
        fwrite($handle,$writeStr);
        fclose($handle);
        //返回操作正確碼
        return self ::SUCCCODE;
    }

結束語

這裡主要對php大致的一些語法和操作進行。編碼的思路我認為應該是先整體規劃,再部分實現的一個過程。

相關文章