给产品经理及UI的PHP教程丨文章管理系统
【文章摘要】创建文章和创建栏目的功能大同小异,大家可能觉得已经知道怎么插入数据了,创建文章无非就是多加几个字段而已。不过大家不要忘了,我们需要把文章发布到之前创建好的对应栏目里去,这就要带出来关联数据的相关知识了。另外会讲解排序方式ASC和DESC。
相关推荐
写给产品经理及UI设计师的PHP教程丨文章管理系统-创建栏目(1)
写给产品经理及UI的PHP教程丨文章管理系统-创建栏目(2)
写给PM及UI的PHP教程丨文章管理系统-后台界面框架设计
写给产品经理及UI的PHP教程丨文章管理系统-栏目列表
写给产品经理及UI的PHP教程丨文章管理系统-修改&删除栏目
给产品经理及UI的PHP教程丨文章管理系统-创建文章(关联数据)
文章列表除了在列表里要显示栏目名称以外在功能上与栏目列表几乎是一样的。
相信通过已学到的知识,一些聪明的同学已经能想到办法实现这个功能了。
不知道大家想到的办法是不是先通过while循环出文章列表,获得栏目id之后再在循环中通过栏目id查询出栏目名称?
完全没错!通过这样的方法完全可以实现出来,不过如果这么实现的话每循环一次都要查询一次数据库,从性能上考虑的话真的是下下策。访问人数少的时候还好,一旦人数变多了对数据库的访问压力是非常巨大的。
为了更有效的提升效率,我们可以把所有的栏目数据以数组的形式存储在一个变量中。但是每一条数据是一个数组,如何把多个数组存储在一个变量里了?
这时候我们就要用到多维数组的概念了。
多维数组
多维数组指的是包含一个或多个数组的数组。也就是说在数组里可以再放数组进去。
我们先来看一个典型的二维数组案例:
我们都知道array();函数用于创建数组,在上方代码中我们用array();创建了数组,并且在array();里面又包含了多个array();进去。我们可以通过这样的形式创建多个层级的数组。
数组创建好之后通过print_r();打印了该数组,HTML标签pre用于格式化显示打印结果。运行之后可以看到如下结果。
该二位数组中的值我们可以通过如下形式调用。
这个应该不难理解,我们知道可以通过变量+KEY的形式获得数组中的指定值,那在这里第一个括号里的就是第一层数组的KEY,第二个括号里的自然就是第二层数组的KEY。
但是通过以上形式创建数组,默认的KEY都是从0开始的,不太方便管理。我们也可以通过如下方法,指定KEY来创建:
在第一行我们先声明变量$cat_array为一个数组,这时候该变量是一个空数组。然后在第2、3行里通过变量名+KEY的形式为该数组中的自定义KEY创建了子数组。array(“cat_name”=>”娱乐”);形式之前有讲到过,也是定义KEY来创建数组的一种形式。
创建成功之后我们就可以通过如下方法调用了。
现在大家基本上可以猜到下一步要做的事情了,我们只需要把栏目表category的数据转换成上面这种形式的数组并赋值到一个变量里,就可以通过该变量方便调用了。
打开article_list.php页面,代码改成如下:
注意:以上代码均为同一页面内的代码,笔者为了方便查看把HTML部分和PHP部分区分开来了而已。
同样我们也可以发现,不同以往,这次笔者把PHP部分和HTML部分拆开来了,没有像以前那样全都写在ECHO语句里。同上,在一个页面内<?php到?>的格式是可以出现无数次的,我们可以根据自己的习惯拆分开来写以方便阅读。
另外第三段中的while语句中的echo部分与之前有所区别。之前是把所有的HTML代码和变量部分全都放在了一个引号内。但这次并没有那么做,反而用了很多个引号,并且把变量都放到了引号外面,中间有符号“.”(点)来隔开。
看下面两段代码:
其实这两段代码是一样的,在PHP中符号“.”是一个连接符。
通过echo来输出变量的时候是不需要在前后加引号或者单引号的,单引号更不可。如果在变量前后加单引号的话,单引号内的变量就不会被理解成是变量,而会被当作字符串,变量前面的美元符号“$”也会被当作一个普通的符号输出出来。双引号中的变量是会被解析成变量的。
在这里我之所以没有在变量前后加引号也有特殊原因,$cat_array[$j[cat_id]][cat_name]这段前后加上引号的话无法被正确的解析。记住,当用变量作为KEY的时候是不可以使用引号的。
而且通过上面的这种格式抒写的话代码阅读起来也方便很多,可以在编辑器中很清晰的看到变量在哪里,
代码分析:
先声明变量$cat_array为一个变量,通过循环获得数组赋值到变量$r,并把做为数组的变量$r赋值到数组变量$cat_array的不同key里,key里采用了$r[cat_id]来保证每一个key值可以对应其子数组中的cat_id值。
通过SELECT * FROM语句获得文章的结果集,并以创建时间add_time为基准降序DESC排序。最终结果中可以看到最新发布的文章在最上面。
再通过while循环语句循环输出文章列表,其中通过$cat_array[$j[cat_id]][cat_name]调用了二维数组$cat_array中对应cat_id的值。
PS:在文章列表的循环语句里我没有使用$r而改用了$j,这是因为$r在上面已经使用过一次,在下面就不能再重复使用了。当然$j可以随便起名,如$blabla~~~~
在HTML元素td里面通过属性width来定义了宽度,宽度值为数字(不带单位),其单位是像素,其中没有定义宽的单元格会自动适应宽度。在表格中只要为第一行单元格设置宽度即可让其他行中的单元格与第一行保持一致。
运行之后可以看到如下结果:
在这节课程中笔者选择了用二维数组形式来解决显示栏目名称的功能。并不是因为这是最完美的方法,而是为了带出多维数组这个知识点才这么做的。
PS:其实菜鸟技术有限,根本不知道什么是最完美的方法,囧~~~~,反正俺知道这么做起码比反复查询数据库来的好多了。
留个作业:
试着创建一个三维数组,并通过echo输出对应的值~