本文所述留言板程序使用了无限级分类的原理,可以实现无限级留言与回复。留言列表gclist保留了留言层次空格,使留言--回复层次分明。分享给大家供大家参考。具体分析如下:
功能上,本程序可以实现无限级留言与回复,即对留言回复,对回复的留言回复。当然你也可以作有限制的控制,使其只对留言回复,关键是在模板代码中去掉回复的留言中的“回复该留言”即可。欢迎去拍砖!
程序效果如下图所示:
完整源码点击此处本站下载。
数据表:
-- Table structure for `wb_guestbook`
-- ----------------------------
DROP TABLE IF EXISTS `wb_guestbook`;
CREATE TABLE `eway_guestbook` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`pid` int(10) NOT NULL,
`email` varchar(50) NOT NULL,
`path` varchar(100) NOT NULL,
`username` varchar(30) NOT NULL,
`updatetime` int(10) NOT NULL,
`ip` varchar(15) NOT NULL,
`url` varchar(200) NOT NULL,
`inputtime` int(10) NOT NULL,
`content` text NOT NULL,
`verify` varchar(32) NOT NULL,
`isreply` tinyint(1) NOT NULL,
`status` tinyint(1) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=42 DEFAULT CHARSET=utf8;
代码:
// | WBlog
// +----------------------------------------------------------------------
// | Copyright (c) 2008 http://www.w3note.com All rights reserved.
// +----------------------------------------------------------------------
// | Author: 网菠萝果
// +----------------------------------------------------------------------
// $Id$
/**
+------------------------------------------------------------------------------
* @class 留言板控制器GuestbookAction.class.php
+------------------------------------------------------------------------------
*/
class GuestbookAction extends CommonAction {
public function index(){
$garr= D('Guestbook')->gclist("id,username,inputtime,pid,url,content,path,concat(path,'-',id) as bpath");
$this->assign('Gklist', $garr['list']);
$this->assign('page',$garr['page']);
$this->display();
}
// +----------------------------------------------------------------------
// | 添加留言
// +----------------------------------------------------------------------
public function add(){
$this->adddata('Guestbook');
}
// +----------------------------------------------------------------------
// | 网址跳转。如在表单url添加网址的话,点击会跳转到相关网站
// +----------------------------------------------------------------------
public function tourl(){
$this->gettourl('Guestbook');
}
}
?>
// +----------------------------------------------------------------------
// | WBlog
// +----------------------------------------------------------------------
// | Copyright (c) 2008 http://www.w3note.com All rights reserved.
// | Author: 网菠萝果
// +----------------------------------------------------------------------
// $Id$
/**
+------------------------------------------------------------------------------
* @function 留言板模型 类GuestbookModel.class.php
+------------------------------------------------------------------------------
*/
class GuestbookModel extends RelationModel{
// +----------------------------------------------------------------------
// | $_validate表单自动验证
// +----------------------------------------------------------------------
protected $_validate = array(
array('email','require','请填写您的邮箱!'),
array('email','email','邮箱格式错误!'),
);
// +----------------------------------------------------------------------
// | $_auto表单自动填充
// +----------------------------------------------------------------------
protected $_auto=array(
array('status','1'),
array('inputtime','time',1,'function'),
array('content','content',1,'callback'),
array('url','geturl',1,'callback'),
array ('inputtime','time',1,'function'),
array('path','path',3,'callback'),
array('username','getusername',3,'callback'),
);
// +----------------------------------------------------------------------
// | getusername()过滤用户名
// +----------------------------------------------------------------------
public function getusername(){
if (isset ($_POST['username'])) {
if(trim($_POST['username'])=='网菠萝果'){
return $data= ' ̄□ ̄';
}elseif(strlen($_POST['username']) >10){
return $data= msubstr($_POST['username'],0,5);
}else{
return $data= $_POST['username'];
}
}
}
// +----------------------------------------------------------------------
// | path()返回子类的path,父类的path的值为0
// +----------------------------------------------------------------------
public function path(){
$pid=isset($_POST['pid'])?(int)$_POST['pid']:0;
$id=$_POST['id'];
if($pid==0){
return 0;
}
$fat=$this->where(array('id' => $pid))->find();
$data=$fat['path'].'-'.$fat['id'];
return $data;
}
// +----------------------------------------------------------------------
// | content()过滤留言内容
// +----------------------------------------------------------------------
public function content() {
if (isset ($_POST['content']) && !empty ($_POST['content'])) {
$data =deleteHtmlTags($_POST['content']);
$data =safeHtml($data);
if (strlen($data) > 1000) {
$data = msubstr($data, 0, 500);
}
return $data;
}
}
// +----------------------------------------------------------------------
// | content()过滤URL
// +----------------------------------------------------------------------
public function geturl(){
if (isset ($_POST['url'])) {
$data = deleteHtmlTags($_POST['url']);
$data = safeHtml($data);
return $data=$data?$data:"";
}
}
// +----------------------------------------------------------------------
// |gclist($field,$where='',$pagesize=30)留言列表
// +----------------------------------------------------------------------
// |$field,字段
// +----------------------------------------------------------------------
// |$where查询条件,默认为空
// +----------------------------------------------------------------------
// |$pagesize分页记录,默认为30
// +----------------------------------------------------------------------
// |使用方法,看上面的控制器调用
// +----------------------------------------------------------------------
public function gclist($field,$where='',$pagesize=30) {
import("ORG.Util.Page");
$count = $this->field('id')->where($where)->count();
$P = new Page($count, $pagesize);
$list=$this->field($field)->where($where)->order('bpath,id')->limit($P->firstRow . ',' . $P->listRows)->select();
foreach ($list as $k => $v) {
$list[$k]['count'] = count(explode('-', $v['bpath']));
$list[$k]['tousername']=$this->where(array('id'=> $v['pid']))->getField('username');
$str = '';
if ($v['pid'] 0) {
for ($i = 0; $i $str .= ' ';
}
$str .= ' ';
}
$list[$k]['space'] = $str;
}
$P->setConfig('header', '篇');
$P->setConfig('prev', "«");
$P->setConfig('next', '»');
$P->setConfig('first', '|«');
$P->setConfig('last', '»|');
$page = $P->show();
$arr=array('page'=>$page,'list'=>$list);
return $arr;
}
}
?>
希望本文所述对大家的ThinkPHP框架程序设计有所帮助。

PHP类型提示提升代码质量和可读性。1)标量类型提示:自PHP7.0起,允许在函数参数中指定基本数据类型,如int、float等。2)返回类型提示:确保函数返回值类型的一致性。3)联合类型提示:自PHP8.0起,允许在函数参数或返回值中指定多个类型。4)可空类型提示:允许包含null值,处理可能返回空值的函数。

PHP中使用clone关键字创建对象副本,并通过\_\_clone魔法方法定制克隆行为。1.使用clone关键字进行浅拷贝,克隆对象的属性但不克隆对象属性内的对象。2.通过\_\_clone方法可以深拷贝嵌套对象,避免浅拷贝问题。3.注意避免克隆中的循环引用和性能问题,优化克隆操作以提高效率。

PHP适用于Web开发和内容管理系统,Python适合数据科学、机器学习和自动化脚本。1.PHP在构建快速、可扩展的网站和应用程序方面表现出色,常用于WordPress等CMS。2.Python在数据科学和机器学习领域表现卓越,拥有丰富的库如NumPy和TensorFlow。

HTTP缓存头的关键玩家包括Cache-Control、ETag和Last-Modified。1.Cache-Control用于控制缓存策略,示例:Cache-Control:max-age=3600,public。2.ETag通过唯一标识符验证资源变化,示例:ETag:"686897696a7c876b7e"。3.Last-Modified指示资源最后修改时间,示例:Last-Modified:Wed,21Oct201507:28:00GMT。

在PHP中,应使用password_hash和password_verify函数实现安全的密码哈希处理,不应使用MD5或SHA1。1)password_hash生成包含盐值的哈希,增强安全性。2)password_verify验证密码,通过比较哈希值确保安全。3)MD5和SHA1易受攻击且缺乏盐值,不适合现代密码安全。

PHP是一种服务器端脚本语言,用于动态网页开发和服务器端应用程序。1.PHP是一种解释型语言,无需编译,适合快速开发。2.PHP代码嵌入HTML中,易于网页开发。3.PHP处理服务器端逻辑,生成HTML输出,支持用户交互和数据处理。4.PHP可与数据库交互,处理表单提交,执行服务器端任务。

PHP在过去几十年中塑造了网络,并将继续在Web开发中扮演重要角色。1)PHP起源于1994年,因其易用性和与MySQL的无缝集成成为开发者首选。2)其核心功能包括生成动态内容和与数据库的集成,使得网站能够实时更新和个性化展示。3)PHP的广泛应用和生态系统推动了其长期影响,但也面临版本更新和安全性挑战。4)近年来的性能改进,如PHP7的发布,使其能与现代语言竞争。5)未来,PHP需应对容器化、微服务等新挑战,但其灵活性和活跃社区使其具备适应能力。

PHP的核心优势包括易于学习、强大的web开发支持、丰富的库和框架、高性能和可扩展性、跨平台兼容性以及成本效益高。1)易于学习和使用,适合初学者;2)与web服务器集成好,支持多种数据库;3)拥有如Laravel等强大框架;4)通过优化可实现高性能;5)支持多种操作系统;6)开源,降低开发成本。


热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

适用于 Eclipse 的 SAP NetWeaver 服务器适配器
将Eclipse与SAP NetWeaver应用服务器集成。

安全考试浏览器
Safe Exam Browser是一个安全的浏览器环境,用于安全地进行在线考试。该软件将任何计算机变成一个安全的工作站。它控制对任何实用工具的访问,并防止学生使用未经授权的资源。

Atom编辑器mac版下载
最流行的的开源编辑器

Dreamweaver CS6
视觉化网页开发工具

Dreamweaver Mac版
视觉化网页开发工具