0

0

7、源代码

php中文网

php中文网

发布时间:2016-06-13 12:24:00

|

1186人浏览过

|

来源于php中文网

原创

一个简单的PHP在线书签系统

1、需求分析

   首先,需要识别每个用户。应该有验证机制。

其次,需要保存单个用户的书签。用户应该能够添加和删除书签。

再次,需要根据对他们的了解,向用户建议他们可能感兴趣的站点。


2、解决方案

2.1 系统流程图

2.2 PHPbookmark中的文件列表

文件名

描述

bookmarks.sql

创建PHPbookmark数据库SQL语句

login.php

包含系统登录表单的页面

register_form.php

系统中用户注册表单

register_new.php

处理新注册信息的脚本

forgot_form.php

用户忘记密码后需要填写的表单

forgot_passwd.php

重新设置遗忘密码的脚本

member.php

用户的主页面,包含该用户所有的当前书签

add_bm_form.php

添加书签的表单

add_bms.php

将书签真正添加到数据库中的脚本

delete_bms.php

从用户的书签列表中删除选定书签的脚本呢

recommend.php

基于用户以前的操作,推荐用户可能感兴趣的书签

change_passwd_form.php

用户修改密码时要填写的表单

change_passwd.php

修改数据库中用户密码的表单

logout.php

代码小浣熊
代码小浣熊

代码小浣熊是基于商汤大语言模型的软件智能研发助手,覆盖软件需求分析、架构设计、代码编写、软件测试等环节

下载

将用户注销的脚本

bookmark_fns.php

应用程序的包含文件集合

data_valid_fns.php

确认用户输入数据有效的函数

db_fns.php

连接数据库的函数

user_auth_fns.php

用户身份验证的函数

url_fns.php

增加和删除书签的函数

output_fns.php

HTML形式格式化输出的函数

bookmark.gif

PHPbookmarklogo图标



3、实现数据库

create database bookmarks;use bookmarks;create table user  (  username varchar(16) primary key,  passwd char(40) not null,  email varchar(100) not null);create table bookmark (  username varchar(16) not null,  bm_URL varchar(255) not null,  index (username),  index (bm_URL));grant select, insert, update, deleteon bookmarks.*to [email protected] identified by 'password';

4、实现基本的网站

4.1 login.php

<?php/** * @author switch * @copyright 2015 * 包含系统登录表单的页面 */    //require_once语句和require语句完全相同,唯一区别是PHP会检查该文件是否已经被包含过,如果是则不会再次包含。    require_once('bookmark_fns.php');   //应用程序的包含文件集合        do_html_header(''); //HTML标题        display_site_info();//HTML站点信息    display_login_form();//HTML登录信息        do_html_footer();   //HTML页脚?>

4.2 bookmark_fns.php

<?php/** * @author switch * @copyright 2015 * 应用程序的包含文件集合 */    //require_once语句和require语句完全相同,唯一区别是PHP会检查该文件是否已经被包含过,如果是则不会再次包含。    require_once('data_valid_fns.php'); //确认用户输入数据有效的函数    require_once('db_fns.php'); // 连接数据库的函数    require_once('user_auth_fns.php');  //用户身份验证的函数    require_once('output_fns.php'); //以HTML形式格式化输出的函数    require_once('url_fns.php');    //增加和删除书签的函数?>

5、实现用户身份验证

5.1 register_form.php

<?php/** * @author switch * @copyright 2015 * 系统中用户注册表单 */    //require_once语句和require语句完全相同,唯一区别是PHP会检查该文件是否已经被包含过,如果是则不会再次包含。    require_once('bookmark_fns.php');    do_html_header('User Registration');    //HTML标题        display_registeration_form();   //输出注册表单        do_html_footer();   //HTML页脚?>

5.2 register_new.php

<?php/** * @author switch * @copyright 2015 * 处理新注册信息的脚本 */    //require_once语句和require语句完全相同,唯一区别是PHP会检查该文件是否已经被包含过,如果是则不会再次包含。    require_once('bookmark_fns.php');        //创建变量    $email = $_POST['email'];    $username = $_POST['username'];    $passwd = $_POST['passwd'];    $passwd2 = $_POST['passwd2'];    //开启会话    session_start();        try    {        //检查表单是否填写满        if(!filled_out($_POST))        {            throw new exception('You have not filled the form out correctly - please go back and try again.');        }                //检查邮件地址是否有效        if(!valid_email($email))        {            throw new exception('That is not a vald email address. Please go back try again.');        }                //检查两次输入密码是否相同        if($passwd != $passwd2)        {            throw new exception('The passwords you entered do not match - please go back try again.');        }                //检查密码长度是否合格        if((strlen($passwd) < 6) || (strlen($passwd) > 16))        {            throw new exception('Your password must be between 6 and 16 characters Please go back and try again.');        }                //尝试注册        register($username,$email,$passwd);                //注册会话变量        $_SESSION['valid_user'] = $username;                //提供成员页面链接        do_html_header('Registration successful');  //HTML标题        echo 'Your registration was successful.Go to the members page to start setting up your bookmarks!'; //输出URL        do_html_URL('member.php','Go to members page'); //HTML页脚        do_html_footer();   //HTML页脚    }    catch(exception $e)    {        do_html_header('Problem:');        echo $e->getMessage();        do_html_footer();        exit;    }?>

5.3 member.php

<?php/** * @author switch * @copyright 2015 * 用户的主页面,包含该用户所有的当前书签 */    //require_once语句和require语句完全相同,唯一区别是PHP会检查该文件是否已经被包含过,如果是则不会再次包含。    require_once('bookmark_fns.php');    session_start();        //创建变量    $username = @$_POST['username'];    $passwd = @$_POST['passwd'];        if($username && $passwd)    {        try        {            login($username,$passwd);            //如果该用户在数据库中,则注册会话变量            $_SESSION['valid_user'] = $username;        }        catch(exception $e)        {            //登录不成功            do_html_header('Problem:');            echo 'You could not be logged in. You must be logged in to view this page.';            do_html_URL('login.php','Login');            do_html_footer();            exit;        }    }        do_html_header('Home');    check_valid_user();        //获取用户的书签    if($url_array = get_user_urls($_SESSION['valid_user']))        display_user_urls($url_array);    //获取用户菜单选项    display_user_menu();    do_html_footer();?>

5.4 logout.php

<?php/** * @author switch * @copyright 2015 * 将用户注销的脚本 */    //require_once语句和require语句完全相同,唯一区别是PHP会检查该文件是否已经被包含过,如果是则不会再次包含。    require_once('bookmark_fns.php');    session_start();    $old_user = $_SESSION['valid_user'];        //注销会话变量    unset($_SESSION['valid_user']);    $result_dest = session_destroy();        do_html_header('Logging Out');        if(!empty($old_user))    {        if($result_dest)    //登出成功        {            echo 'Logged out.<br />';            do_html_URL('login.php','Login');        }        else    //不成功        {            echo 'Could not log you out.<br />';        }    }    else    {        echo 'You were not logged in, and so have not been logged ot.<br />';        do_html_URL('login.php','Login');    }    do_html_footer();?>

5.5 change_passwd.php

<?php/** * @author switch * @copyright 2015 * 修改数据库中用户密码的表单 */    //require_once语句和require语句完全相同,唯一区别是PHP会检查该文件是否已经被包含过,如果是则不会再次包含。    require_once('bookmark_fns.php');    session_start();    do_html_header('Changing password');        //创建变量    $old_passwd = $_POST['old_passwd'];    $new_passwd = $_POST['new_passwd'];    $new_passwd2 = $_POST['new_passwd2'];        try    {        check_valid_user();        if(!filled_out($_POST))            throw new exception('You have not filled out the form completely.Please try again.');                if($new_passwd != $new_passwd2)            throw new exception('Passwords entered were not the same. Not changed.');                    if((strlen($new_passwd) > 16) || (strlen($new_passwd) < 6))        {            throw new exception('New password must be between 6 and 16 characters. Try again.');        }                //尝试修改        change_password($_SESSION['valid_user'],$old_passwd,$new_passwd);        echo 'Password changed.';    }    catch(exception $e)    {        echo $e ->getMessage();    }    display_user_menu();    do_html_footer();?>

5.6 forgot_paswd.php

<?php/** * @author switch * @copyright 2015 * 重新设置遗忘密码的脚本 */    //require_once语句和require语句完全相同,唯一区别是PHP会检查该文件是否已经被包含过,如果是则不会再次包含。    require_once('bookmark_fns.php');    do_html_header("Resetting password");        //创建变量    $username = $_POST['username'];        try    {        $passwd = reset_password($username);        notify_password($username,$passwd);        echo 'Your new password has been emailed to you.<br />';    }    catch(exception $e)    {        echo 'Your password could not be reset - please try again later.';    }    do_html_URL('login.php','Login');    do_html_footer();?>

6、实现书签的存储和检索

6.1 add_bms.php

<?php/** * @author switch * @copyright 2015 * 添加书签的表单 */    //require_once语句和require语句完全相同,唯一区别是PHP会检查该文件是否已经被包含过,如果是则不会再次包含。    require_once('bookmark_fns.php');    session_start();        //创建变量    $new_url = $_POST['new_url'];        do_html_header('Adding bookmarks');        try    {        check_valid_user(); //检查用户有效性        if(!filled_out($new_url))   //检查表单是否填写            throw new exception('Form not completely filled out.');        if(strstr($new_url,'http://') === false)            $new_url = 'http://'. $new_url;        if(!(@fopen($new_url,'r'))) //可以调用fopen()函数打开URL,如果能打开这个文件,则假定URL是有效的            throw new exception('Not a valid URL.');        add_bm($new_url);   //将URL添加到数据库中        echo 'Bookmark added.';        if($url_array = get_user_urls($_SESSION['valid_user']))            display_user_urls($url_array);    }    catch(exception $e)    {        echo $e ->getMessage();    }    display_user_menu();    do_html_footer();?>

6.2 delete_bms.php

<?php/** * @author switch * @copyright 2015 * 从用户的书签列表中删除选定书签的脚本呢 */    //require_once语句和require语句完全相同,唯一区别是PHP会检查该文件是否已经被包含过,如果是则不会再次包含。    require_once('bookmark_fns.php');    session_start();        //创建变量    $del_me = @$_POST['del_me'];    $valid_user = $_SESSION['valid_user'];        do_html_header('Deleting bookmarks');    check_valid_user();        if(!filled_out($del_me))    //    {        echo '<p>You have not chosen any bookmarks to delete.<br />Please try again.</p>';        display_user_menu();        do_html_footer();        exit;    }    else    {        if(count($del_me) > 0)        {            foreach($del_me as $url)            {                if(delete_bm($valid_user,$url))                {                    echo 'Deleted '. htmlspecialchars($url) .'.<br />';                }                else                {                    echo 'Could not delete '. htmlspecialchars($url) .'.<br />';                }            }        }        else        {            echo 'No bookmarks selected for deletion';        }    }    if($url_array = get_user_urls($valid_user))    {        display_user_urls($url_array);    }    display_user_menu();    do_html_footer();?>

6.3 recommend.php

<?php/** * @author switch * @copyright 2015 * 基于用户以前的操作,推荐用户可能感兴趣的书签 */    //require_once语句和require语句完全相同,唯一区别是PHP会检查该文件是否已经被包含过,如果是则不会再次包含。    require_once('bookmark_fns.php');    session_start();    do_html_header('Recommending URLs');    try    {        check_valid_user();        $urls = recommend_urls($_SESSION['valid_user']);        display_recommended_urls($urls);    }    catch(exception $e)    {        echo $e ->getMessage();    }    display_user_menu();    do_html_footer();?>

7、源代码

下载地址



版权声明:本文为博主原创文章,未经博主允许不得转载。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
batoto漫画官网入口与网页版访问指南
batoto漫画官网入口与网页版访问指南

本专题系统整理batoto漫画官方网站最新可用入口,涵盖最新官网地址、网页版登录页面及防走失访问方式说明,帮助用户快速找到batoto漫画官方平台,稳定在线阅读各类漫画内容。

127

2026.02.25

Steam官网正版入口与注册登录指南_新手快速进入游戏平台方法
Steam官网正版入口与注册登录指南_新手快速进入游戏平台方法

本专题系统整理Steam官网最新可用入口,涵盖网页版登录地址、新用户注册流程、账号登录方法及官方游戏商店访问说明,帮助新手玩家快速进入Steam平台,完成注册登录并管理个人游戏库。

18

2026.02.25

TypeScript全栈项目架构与接口规范设计
TypeScript全栈项目架构与接口规范设计

本专题面向全栈开发者,系统讲解基于 TypeScript 构建前后端统一技术栈的工程化实践。内容涵盖项目分层设计、接口协议规范、类型共享机制、错误码体系设计、接口自动化生成与文档维护方案。通过完整项目示例,帮助开发者构建结构清晰、类型安全、易维护的现代全栈应用架构。

15

2026.02.25

Python数据处理流水线与ETL工程实战
Python数据处理流水线与ETL工程实战

本专题聚焦 Python 在数据工程场景下的实际应用,系统讲解 ETL 流程设计、数据抽取与清洗、批处理与增量处理方案,以及数据质量校验与异常处理机制。通过构建完整的数据处理流水线案例,帮助开发者掌握数据工程中的性能优化思路与工程化规范,为后续数据分析与机器学习提供稳定可靠的数据基础。

1

2026.02.25

Java领域驱动设计(DDD)与复杂业务建模实战
Java领域驱动设计(DDD)与复杂业务建模实战

本专题围绕 Java 在复杂业务系统中的建模与架构设计展开,深入讲解领域驱动设计(DDD)的核心思想与落地实践。内容涵盖领域划分、聚合根设计、限界上下文、领域事件、贫血模型与充血模型对比,并结合实际业务案例,讲解如何在 Spring 体系中实现可演进的领域模型架构,帮助开发者应对复杂业务带来的系统演化挑战。

1

2026.02.25

Golang 生态工具与框架:扩展开发能力
Golang 生态工具与框架:扩展开发能力

《Golang 生态工具与框架》系统梳理 Go 语言在实际工程中的主流工具链与框架选型思路,涵盖 Web 框架、RPC 通信、依赖管理、测试工具、代码生成与项目结构设计等内容。通过真实项目场景解析不同工具的适用边界与组合方式,帮助开发者构建高效、可维护的 Go 工程体系,并提升团队协作与交付效率。

18

2026.02.24

Golang 性能优化专题:提升应用效率
Golang 性能优化专题:提升应用效率

《Golang 性能优化专题》聚焦 Go 应用在高并发与大规模服务中的性能问题,从 profiling、内存分配、Goroutine 调度、GC 机制到 I/O 与锁竞争逐层分析。结合真实案例讲解定位瓶颈的方法与优化策略,帮助开发者建立系统化性能调优思维,在保证代码可维护性的同时显著提升服务吞吐与稳定性。

9

2026.02.24

Golang 面试题精选:高频问题与解答
Golang 面试题精选:高频问题与解答

Golang 面试题精选》系统整理企业常见 Go 技术面试问题,覆盖语言基础、并发模型、内存与调度机制、网络编程、工程实践与性能优化等核心知识点。每道题不仅给出答案,还拆解背后的设计原理与考察思路,帮助读者建立完整知识结构,在面试与实际开发中都能更从容应对复杂问题。

6

2026.02.24

Golang 运行与部署实战:从本地到云端
Golang 运行与部署实战:从本地到云端

《Golang 运行与部署实战》围绕 Go 应用从开发完成到稳定上线的完整流程展开,系统讲解编译构建、环境配置、日志与配置管理、容器化部署以及常见运维问题处理。结合真实项目场景,拆解自动化构建与持续部署思路,帮助开发者建立可靠的发布流程,提升服务稳定性与可维护性。

5

2026.02.24

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PHP课程
PHP课程

共137课时 | 12.5万人学习

JavaScript ES5基础线上课程教学
JavaScript ES5基础线上课程教学

共6课时 | 11.3万人学习

PHP新手语法线上课程教学
PHP新手语法线上课程教学

共13课时 | 0.9万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号