资讯专栏INFORMATION COLUMN

php学习之留言板

biaoxiaoduan / 1566人阅读

摘要:用到对数据进行删除,具体请看的编写相关姿势有发送请求字符串模板页面元素内容赋值请求返回到这,整体结构就完成了。

前言

在对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;

..到这,整体结构就完成了。

lyfile的编写

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大致的一些语法和操作进行。编码的思路我认为应该是先整体规划,再部分实现的一个过程。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/22834.html

相关文章

  • laravel习之nginx配置站点

    摘要:前言设置项目的域名站点的时候,需要对做一些对应的重写配置,用来做相关路由,否则会报。 前言 设置laravel项目的域名站点的时候,需要对nginx做一些对应的重写rewrite配置,用来做相关路由,否则会报404。 nginx.conf配置 server { listen 80; server_name xxx.com; #域名 root /data/www...

    frank_fun 评论0 收藏0
  • laravel习之nginx配置站点

    摘要:前言设置项目的域名站点的时候,需要对做一些对应的重写配置,用来做相关路由,否则会报。 前言 设置laravel项目的域名站点的时候,需要对nginx做一些对应的重写rewrite配置,用来做相关路由,否则会报404。 nginx.conf配置 server { listen 80; server_name xxx.com; #域名 root /data/www...

    Jaden 评论0 收藏0
  • Java 容器习之 HashMap

    摘要:底层的数据结构就是数组链表红黑树,红黑树是在中加进来的。负载因子哈希表中的填满程度。 前言 把 Java 容器的学习笔记放到 github 里了,还在更新~其他的目前不打算抽出来作为文章写,感觉挖的还不够深,等对某些东西理解的更深了再写文章吧Java 容器目录如下: Java 容器 一、概述 二、源码学习 1. Map 1.1 HashMap 1.2 LinkedHashM...

    Alex 评论0 收藏0
  • nginx习之——rewrite

    摘要:当前请求在指令中指定的值。请求主机头字段,否则为服务器名称。客户端信息客户端信息这个变量可以限制连接速率。已经经过验证的用户名。请求使用的协议,通常是或。请求到达服务器的端口号。包含请求参数的原始,不包含主机名,如。 rewrite配置在server{}、location{}、if{}段中 ,对Url中除去域名和参数的字符串起作用 一、语法:rewrite regex replacem...

    Lavender 评论0 收藏0
  • java 习之 main方法

    摘要:之所以不行是应为,变量方法何值还不确定,在没有实例的内存中运行的时候会报错但是非静态方法或者函数是可以调用静态方法和静态变量的,因为值或结果已经固定。 1.main main方法 java 类的主方法,相当于php类文件的index方法。默认执行。 java的main方法 必须声明为 public static void main(String [] args) 其中static是静态...

    banana_pi 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<