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,一经查实,立即删除!

相关文章

JAVA中数字格式异常,java - Java数字格式异常 - 堆栈内存溢出

当我遇到NumberFormatException时,我正在CodeChef平台上解决问题。首先,我使用Scanner处理输入,然后使用BufferedReader 。 但是他们都不起作用!这是我的代码:import java.io.*;import java.util.*;import java.text.*…

java excel 打勾,两种方法教你如何在excel文件中打勾

两种方法教你如何在excel文件中打勾方法一:通过复选框功能打勾本方法是通过Excel文件中的开发工具栏中的功能实现打勾的。有时候如果我们在Excel文件中找不到“开发工具”功能,这时我们可以通过“Excel选项”功能来进行设置。首先我们点击Excel文件左上角…

数字图像matlab心得,Matlab数字图像处理的学习建议

如果是软实力,学好数学才是王道!和机器学习和计算机视觉相关的数学(转载)(以下转自一位MIT牛人的空间文章,写得很实际:)作者:Dahua感觉数学似乎总是不够的。这些日子为了解决research中的一些问题,又在图书馆捧起了数学的教科书。…

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…

php 本站已运行了多少天,本站已运行了多少天”代码(js版+php版)

最初用的是js的脚本,代码如下:var urodz new Date(“4/15/2010″); //建站时间var now new Date();var ile now.getTime() – urodz.getTime();var dni Math.floor(ile / (1000 * 60 * 60 * 24));document.write(dni)后来发现,这个脚本对客…

php class类 教程,PHP类(Class)入门教程第2/2页

用正确的小汽车对象学习和熟悉类的概念很多书讲到类总喜欢拿小汽车来做例子,但是有些例子实在是又臭又烂误人子弟,骗人钱财,毁人前程,弱智低级到瞎编一个什么 set_color()函数来教人。实在是白白糟踏了好东西。今天在phpx.com又看…

php 控制器 模板,php学习笔记(一)php模板与控制器

/welcome/index.phpif(!isset($_REQUEST[fn])){include from.html.php;}else{$firstname $_REQUEST[fn];$lastname $_REQUEST[lastname];if($firstname 孙 and $lastname 哥){$aa 欢迎登陆,我的国王!;}else{$aa 欢迎登陆 .htmlspecialchars($first…

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

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

ocid oracle,Oracle数据库基础:新手推荐

Oracle数据库的主要特点(1.)支持多用户,大事务量的事务处理(2.)在保持数据库安全性和完整性方面性优越。(3.)支持分布式数据处理。将分布在不同物理位置的数据库用通信网连接起来,在分布式数据库管理系统的控制下,组成一个逻辑上统一的数据库…

oracle存储过程 取时间格式,Oracle存储过程获取YYYY-MM-DD的时间格式

环境:Oracle 10g,11g 问题重现:PL/SQL中命令窗口下,发现存储过程得到的时间格式不符合预期要求。 SQLgt; select sysdate fro环境:Oracle 10g,11g问题重现:PL/SQL中命令窗口下,发现存储过程得到的时间格式不…

oracle归档日志 delete obsolete 保留一次全备,DELETE OBSOLETE不删除归档日志以及归档的备份集...

今天遇到一个奇怪的事情,使用OBSOLETE不删除归档日志,而且也不删除过期的归档的BACKUP SET从delete obsolete的概念来看如下:The REPORT OBSOLETE and DELETE OBSOLETE commands work in two steps:For each datafile for which there are fu…

oracle 12 sqlplus 使用,oracle 12.2 sqlplus history

12.1开始使用sqlplus显示用户上次登录时间,12.2提供了一个记录历史sql的功能,类似于操作系统的history,根目录下的.history文件,不过功能比操作系统的history要强大,可以指定删除/运行/编辑历史记录里面的某一条SQL&am…

execl执行linux命令,使用execl运行Linux命令

我需要通过编写C语言程序列出当前目录中具有644权限的所有文件.我不能使用system()并且必须使用execl()才能使用系统调用.这是我在代码中使用的一行:execl("/usr/bin/find", "find . -maxdepth 1 -perm 644", (char *)NULL);问题是代码正在搜索…

Linux里面lvs的基础命令,Linux中使用ipvsadm配置LVS集群的基本方法

LVS集群有DR、TUN、NAT三种配置模式,可以对www服务、FTP服务、MAIL服务等做负载均衡,下面通过搭建www服务的负载均衡实例,讲述基于DR模式的LVS集群配置。一、 Director Server的配置  在Director Server上配置LVS负载均衡集群,有…

linux 内核 睡眠,linux内核对S3C2410睡眠模式的支持有哪些?

一、S3C2410支持4种供电模式(1)NORMAL MODE耗电最大、可以通过关闭具体控制器的时钟来节电(2)SLOW MODE在此模式下可以没有内部PLL,耗电情况依赖于外部时钟的频率(3)IDLE MODEFCLK被关断,主要由于CPU core节电。可以任何通过外部中断唤醒(4)Power_OFF MO…

linux c timeval 转化为标准时间,Linux_学习笔记_-_时钟_定时器

Linux 时钟_定时器1 时钟时钟这个东西,实际上是作为一种工具而存在,内核通过时钟来感知、管理时间。这里的时钟,更主要的还是软件上的概念,系统通过维护软件时钟来追踪时间1.1 几个概念1、时钟中断:由硬件产生的电信号…

linux 修改块大小,linux 查看及修改os系统块的大小

查看os系统块的大小[root]# /sbin/tune2fs -l /dev/sda1查看os系统页的大小[oracleskate-test ~]$ getconf PAGESIZE4096修改块的大小:创建文件系统时,可以指定块的大小。如果将来在你的文件系统中是一些比较大的文件的话,使用较大的块大小将得到较好的性…

linux的vim多选择,真的有(很多)linux大牛用vim写项目吗?

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼作为一名非程序员半吊子运维,很想问一个问题:真的有(很多)linux大牛用vim写项目吗?最近折腾自己的路由器,要在LEDE的luci框架里加个显示interface信息的模块。按照惯例ggl一下最后在s…

linux spi驱动分析 三,Linux下SPI驱动分析

/* 神奇的分割线 */626/*-------------------------------------------------------------------------*/627628/* Core methods for SPI master protocol drivers. Some of the629 * other core methods are currently defined as inline functions.630 */631632/**633 * spi_…

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

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