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();?>