php 文章列表,ThinkPHP初学者:主页,获取一个文章列表

在之前的文章,已经实现了注册登录的功能,主要熟悉TP与HTML、JS交互,数据库的基本操作等。接下来就要登录到主页,熟悉一下列表的处理,以及数据库多表联查操作。为了简化模型,列表的字段仅有文章标题、简介、内容、封面图片、作者字段。

Session保持,从登录到主页

要想实现上述的功能,就需要先进入到首页,这里设计的是用户必须先登录才能进入到首页,因此需要使用Session来记录登录的状态。在TP中,使用Session格外简单。

创建一个session

session('name','value');

删除一个session

session('name',null);

删除所有session

session(null);

以上仅是最基本的使用方法,还有其他的一些用法可以查看文档。

所以,需要在登录成功时,把session创建好,进入主页后检查session是否存在,存在则继续,不存在就返回到登录。修改login方法:

public function login() {

//HTTP协议,传输json需要添加请求头

header('Content-Type:application/json; charset=utf-8');

...//校验

session('username', $user_name);

$return['code'] = 1;

$return['message'] = '登录成功';

echo json_encode($return);

}

然后在index.html里点击登录按钮时,加入以下跳转语句:

window.location.href = "{:U('Index/home')}";

为了测试这一点,先写一个简单的主页,仅仅输出一句话。然后创建home方法:

public function home() {

$username = session('username');

if (empty($username)) {

$this->redirect('Index/index');

} else {

$this->display();

}

}

这段逻辑是如果session为空,就跳转到登录页面,成功获取到session时才显示主页。跳转要用重定向redirect方法。

以上便实现了携带登录信息并跳转到主页的功能了,然而有一个细节问题是,当用户点击浏览器的返回按钮时,页面又回退到了之前的登录页面,很显然这不是我们希望的行为。我们希望用户点返回按钮时,如果已经登录了,依然停在主页。一般的做法是:进入登录页时请求数据,如果是已登录状态,就跳转到主页,这样点击返回按钮时,返回到了登录页,登录页又重新跳转到了主页,便实现了我们需要的功能。代码比较简单,节约篇幅就不粘贴了,可以在文末链接查看。

创建文章数据表,初始化一些测试数据

在数据库中加入以下这张表:

create table if not exists article(

id int unsigned auto_increment,

title varchar(50) not null,

descript text not null,

content text not null,

image_path varchar(100) not null,

author_id int unsigned not null,

create_time int unsigned not null default 0,

primary key (id)

)engine=InnoDB default charset=utf8;

其中author_id对应的是User表中对应作者的id。然后在项目的根目录创建一个upload文件夹,因为是练手,所以图片都直接放在项目里了,实际中当项目比较大时,文件都是专门放在另外的服务器的。然后找几张图片,命名后放在以下路径:

f92bdfa48528

image.png

接下来在数据库中插入几条数据,其中图片的路径写相对于根目录的路径,也就是/upload/home/image/xxx.jpg。示例如下:

insert into article (title,descript,content,image_path,author_id,create_time)

values ('重磅消息1','Python超过Java了1','Python超过Java了,在Github上排名第二,Java屈居第三。1','/upload/home/image/article1.jpg',1,0);

多表联查,显示在主页

如文章一开始所言,在页面上展示列表需要的字段有:文章标题、简介、封面图和作者信息。前几个字段都在article这张表中,而作者的信息是通过author_id字段关联到user表中的,所以想要获取作者的信息,就涉及到了联查。在MySQL中,使用join关键字进行联查。规则为:

... FROM table1 INNER|LEFT|RIGHT JOIN table2 ON condition

其中INNER表示取得两个表中存在连接匹配关系的记录,LEFT表示取得左表(table1)完全记录,即使右表(table2)并无对应匹配记录,RIGHT表示取得右表(table2)完全记录,即使左表(table1)并无匹配对应记录。

文字表述很是生硬,下面看如何利用这个规则来查询出我们需要的数据,因为article表和user表对我们一样重要,所以应该使用INNER模式:

select

article.title,

article.descript,

article.content,

article.image_path,

user.user_name

from

article

inner join

user

on

article.author_id=user.id;

以上语句就表示,找到一条article记录,根据它的author_id找到一条user记录,如果这个条件成立,就把它的结果合并成一条数据返回,数据只取我们select的字段。把数据库中所有的数据都找完之后就返回了一个列表,这个列表就是我们需要的。除此以外,如果两个表中有重复的字段时,还可以使用别名来区分,如这条语句使用别名就表示为:

select

a.title title,

a.descript descript,

a.content content,

a.image_path image_path,

u.user_name user_name

from

article a

inner join

user u

on

a.author_id=u.id;

也就是给article起别名为a,给user起别名为u,并给每个字段都起了别名,这样,如果a和u中如果有相同的字段,可以通过不同的命名使返回结果符合预期。

以上是用MySQL命令行实现的查询,那么用TP该怎么写呢?首先别名使用alias方法,限定要查询的字段使用field,join则有对应的方法,名称也为join。所以以上语句使用TP的连贯操作如下:

$Article = M('Article');

$res = $Article

->alias('a')

->field('a.title title,a.descript descript,a.content content,a.image_path image_path,u.user_name user_name')

->join('inner join user u on a.author_id=u.id')

->select();

当使用的join为inner方式时,join方法中的“inner join”可以省略。

获取到数据后,需要把数据渲染到页面上,这里有两种方式可以选择。一种是已经很熟悉的Ajax,还有一种则是在HTML中嵌入php代码。因为更熟悉Ajax,这里先展示Ajax的写法。由于界面是列表,所以

等标签只能动态创建,我们使用jQuery完成这个功能类似如下:

$.each(list,function(index,value,array)){

$('container').append('{这里写要添加的div}');

}

套用一下,这里list就是我们的数组,$.each是jQuery里的foreach循环的写法,后边的index、value就表示位置和值。append方法就是往container中添加组件,把全部代码都写在参数里就好了,这里参数是字符串,所以引用变量要用+和字符串连接起来。例如:

'' +

value.user_name +

''

......

原理就是这样的,要看详细的代码,可以在文末链接找。

接下来实现第二种方案,就是在HTML中嵌入php代码。这种方式,就需要在调用display方法前,把数据从数据库中查询出来,然后通过assign方法绑定到页面上,然后在页面里的php代码就可以获取到数据的值。修改home方法:

public function home() {

$username = session('username');

if (empty($username)) {

$this->redirect('Index/index');

} else {

$Article = M('Article');

$res = $Article

->alias('a')

->field('a.title title,a.descript descript,a.content content,a.image_path image_path,u.user_name user_name')

->join('user u on a.author_id=u.id')

->select();

$this->assign('articles', $res);

$this->display();

}

}

以上代码使用assign把数据绑定到了页面上articles变量。接下来我们在html中使用这个变量。因为是数组,所以也需要遍历。

{$art.title}

......

可以看到,使用也是非常简单,只是使用变量时要使用php的规则,并且用花括号括起来。

在实际中,根据需要两种方式都可以选择,如果是前后端分离,肯定只能用第一种方式了,或者用别的框架实现,但php都只以接口的形式提供数据。

这样一个展示列表的页面就完成了,相关代码已经同步到github。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/506706.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

php js登录,php+js实现单点登录

phpjs实现单点登录2020年08月14日 00:45:23阅读数:110登录信息表DROP TABLE IF EXISTS fly_admin_login_info;CREATE TABLE fly_admin_login_info (id int(11) unsigned NOT NULL AUTO_INCREMENT,admin_id int(11) unsigned DEFAULT NULL,email varchar(80) DEFAULT…

android jni java调用c,Android与JNI(一) ---- Java调用C 静态调用

第一、通过eclipse新建一个工程名为HelloJni的android工程,并编译。第二、右键工程-->Android Tools --> Add Native Support,出现如下界面,名字默认就可以了,点击finish。第三、我们在MainActivity类中加入要调用的native代码public n…

c语言程序综合实习学生成绩,C语言程序设计综合实习报告

课题一:用指针优化学生成绩排名一、目的1.熟悉变量的指针和指向变量的的指针变量的概念和使用2.熟悉数组的指针和指向数组的的指针变量的概念和使用3. 掌握冒泡法或选择法排序的算法4. 掌握函数的定义、调用、声明,以及参数的两种…

c语言求最多啤酒数,C语言,算法、动态规划:有一个箱子的容量为v(正整数,0=v=20000),同时有n个物品(0n=30),...

满意答案24k纯真爱l2013.11.07采纳率:42% 等级:12已帮助:9552人#include#define N 30int xiangzi(int n ,int V ,int a[]) //楼主后面的Vo数组必须放进递归函数里面或定义成全局数组 另外h[n]什么情况??{int minv,t,mV;if(n0){if(a[n]&l…

c语言休眠函数useconds类型,带你了解C语言中的Sleep函数(附代码)

Sleep函数:功 能: 执行挂起一段时间用 法:unsigned sleep(unsigned seconds);注意:在VC中使用带上头文件#include ,在Linux下,gcc编译器中,使用的头文件因gcc版本的不同而不同#include 在VC中,Sleep中的第一个英文字符为大写的"S" ,在linux下不要大写&…

android 环绕布局,Android自定义View实现圆形环绕效果

之前项目中需要实现一个四周环绕中心圆形头像的效果,感觉还是自定义比较方便,于是就自己封装了一个控件去实现。先贴张图显示最终效果。首先自定义一个View继承自LinearLayout,通过动态添加childView的方式将子控件添加到View中。思路是先添加中间圆形头…

android 高德地图 sh1,百度、高德地图获取发布版(Release)SHA1

一、简介:在百度、高德地图开发中,申请key的时候,要两个版本的sha1值。一个是开发版(debug),一个是发布版(release)。debug版本的sha1比较好获取,网上资料一堆,这里引用一下,就不再重复写了。最…

html前台检验特殊字符正则,【Qt编程】html特殊字符及正则表达式

1、html特殊字符的显示我们知道html语言和C语言一样也有一些特殊字符,它们是不能正常显示的,必须经过转义,在网上可以查到如何显示这些字符,如下图所示:上图给了最常用的特殊字符的显示,下面我们来实验一下…

html 变量类型强制转换,html、js前台数据传到后台,spring复杂类型转换

html、js前台数据传到后台,spring复杂类型转换如果我有两个变量,变量名不一样,处理的规则也不一样,但是他们都是Date.class 类型, 这可怎么破。比如:InitBinderpublic void bindingPreparation(WebDataBind…

html盒模型中border的写法,HTML+css盒子模型案例(圆,半圆等)“border-radius” 简单易上手...

很多小伙伴在前端学习的时候,发现盒子模型默认为正方形。如何把盒子变成想要的模型呢? 首先我们来看一下默认的情况----.box{width: 100px;height: 100px;background-color: rgb(116, 51, 51);box-shadow:0 10px 10px red;text-align: center;position:a…

希捷银河声音大_每日观影之银河守门员( )

#银河守门员Вратарь Галактики#真心不错的科幻大片…尤其这剧情故事实在是俄国电影的一个很有突破性的亮点…基本可以说全方面凸显了俄罗斯的国情…比如高大上的部分完全不输欧美甚至有所超越领先都是要拯救世界而且还很壮烈拼搏的样子…然而百姓生活却显得很窘…

bat循环执行带参数_wxappUnpacker的bingo.bat脚本逐行解读

点击上方“蓝字”关注我们之前发过一篇文章小程序反编译工具在windows系统下的调用脚本提到了Windows平台下的脚本,但是对脚本没有做详细说明。本文就是针对脚本做的讲解。对批处理感兴趣的可以了解下。不会基础也没关系。下面我们进入正题。脚本解读第1行&#xff…

定值保险计算举例_保险公司的“开门红”又要来了!理财险真的值得买吗?

临近年末,各家保险公司都开始备战2020年的“开门红”。对于保险公司来说,“开门红全年红”,只要开门红的任务完成得好,那么今年大半年的保费就不用担心了,因此保险公司们对于这一战都十分重视。如果说“双11”、“双12…

html中post语句,html中post乱码的解决方法

html中post乱码的解决方法发布时间:2021-05-27 11:29:00来源:亿速云阅读:91作者:小新这篇文章主要介绍html中post乱码的解决方法,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要…

泸州田家炳中学2021高考成绩查询,2021年泸州中考线出来了吗

中考是人们升高中的必经之路,它虽然没有高考那样振奋人心,但是对于当时的人来说也算是一场最正规的考试。首先,不可否认的是中考是很重要的。虽然它不能对高考有着直接影响,但是却有着间接影响。在每年的六份左右出来。中考是很重…

django返回指定html文件,Django返回HTML文件的实现方法

前面我们简单的了解Django的一些工作原理,其中关于页面展示的内容,也全部都是视图(Views)返回的内容,那么我们也知道前端包括很多内容。如:HTML,CSS,JavaScript等以及各种插件,才具备完全的页面…

计算机网络纠错码,计算机网络:纠错

本文概述当数据从发送方发送到接收方时, 纠错码用于检测和纠正错误。纠错可以通过两种方式处理:向后纠错:发现错误后, 接收方会请求发送方重新传输整个数据单元。前向纠错:在这种情况下, 接收器使用纠错码自动纠正错误。单个附加位可以检测到…

扭矩大好还是马力大好_翡翠手镯圈口到底是买大好,还是买小好?行家告诉你...

现在的女性多数人都喜欢购买翡翠手镯、翡翠手链、翡翠戒面等,尤其对翡翠手镯不仅能表现出女性的知性优美,还对身体有一定的好处。翡翠手镯是翡翠价值中除了翡翠戒面外最高的二等翡翠。因为翡翠手镯除了那种开口式的镶嵌翡翠手镯其他的都是闭口的&#xf…

启动失败代码2_菲斯曼燃气壁挂炉故障代码大全及解决方法

菲斯曼燃气壁挂炉型号菲斯曼燃气壁挂炉故障代码大全及解决方法以:06故障代码:系统压力过低。设备的反映: 燃气器锁定。措施:检查系统水压,必要时补充加注供暖水。 0A故障代码:燃气压力过低。设备的反映: 燃气器锁定。措…

用html5交换两个变量的值,Python判断两个对象相等的原理 python交换两个变量的值为什么不用中间变量...

python语言设计一个类代表花,其中含2个对象属性,2class flower: def __init__ (self, name, shape): self.name name self.shape shape def showname (self): print(self.name) def showshape(self): print(self.shape)if __name__ __main__: f1flower("baihe",&q…