一个简单的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

PHPbookmark的logo图标

 

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 bm_user@localhost 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!'; //输出URLdo_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、源代码

下载地址

已标记关键词 清除标记
相关推荐
【为什么还需要学习C++?】 你是否接触很多语言,但从来没有了解过编程语言的本质? 你是否想成为一名资深开发人员,想开发别人做不了的高性能程序? 你是否经常想要窥探大型企业级开发工程的思路,但苦于没有基础只能望洋兴叹?   那么C++就是你个人能力提升,职业之路进阶的不二之选。 【课程特色】 1.课程共19大章节,239课时内容,涵盖数据结构、函数、类、指针、标准库全部知识体系。 2.带你从知识与思想的层面从0构建C++知识框架,分析大型项目实践思路,为你打下坚实的基础。 3.李宁老师结合4大国外顶级C++著作的精华为大家推出的《征服C++11》课程。 【学完后我将达到什么水平?】 1.对C++的各个知识能够熟练配置、开发、部署; 2.吊打一切关于C++的笔试面试题; 3.面向物联网的“嵌入式”和面向大型化的“分布式”开发,掌握职业钥匙,把握行业先机。 【面向人群】 1.希望一站式快速入门的C++初学者; 2.希望快速学习 C++、掌握编程要义、修炼内功的开发者; 3.有志于挑战更高级的开发项目,成为资深开发的工程师。 【课程设计】 本课程包含3大模块 基础篇 本篇主要讲解c++的基础概念,包含数据类型、运算符等基本语法,数组、指针、字符串等基本词法,循环、函数、类等基本句法等。 进阶篇 本篇主要讲解编程中常用的一些技能,包含类的高级技术、类的继承、编译链接和命名空间等。 提升篇: 本篇可以帮助学员更加高效的进行c++开发,其中包含类型转换、文件操作、异常处理、代码重用等内容。
©️2020 CSDN 皮肤主题: 深蓝海洋 设计师:CSDN官方博客 返回首页