search
HomeBackend DevelopmentPHP TutorialPHP bookmark system case

PHP bookmark system case

Jun 05, 2018 pm 02:45 PM
php

This article mainly introduces the case of PHP bookmark system. Interested friends can refer to it. I hope it will be helpful to everyone.

1. Requirements analysis

First, each user needs to be identified. There should be a verification mechanism.
Secondly, you need to save a single user's bookmarks. Users should be able to add and delete bookmarks.
Again, it is necessary to recommend sites to users that may be of interest to them based on what is known about them.

2. Solution2.1 System flow chart

##2.2 File list in PHPbookmark

3. Implement database

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, delete 
on bookmarks.* 
to bm_user@localhost identified by 'password';

4. Implement basic website4.1 login.php

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

4.2 bookmark_fns.php

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

5. Implement user authentication5.1 register_form.php

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

5.2 register_new.php

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

5.3 member.php

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

5.4 logout.php

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

5.5 change_passwd.php

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

5.6 forgot_paswd.php

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

6. Implement bookmark storage and retrieval6.1 add_bms.php

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

6.2 delete_bms.php

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

6.3 recommend.php

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

Summary: That’s it The entire content of the article is hoped to be helpful to everyone's study.

Related recommendations:

Examples of access methods for class attributes and class static variables in PHP

php cookie working principle and detailed explanation of examples

PHP uses socket to simulate POST method

The above is the detailed content of PHP bookmark system case. For more information, please follow other related articles on the PHP Chinese website!

Statement
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
PHP Dependency Injection Container: A Quick StartPHP Dependency Injection Container: A Quick StartMay 13, 2025 am 12:11 AM

APHPDependencyInjectionContainerisatoolthatmanagesclassdependencies,enhancingcodemodularity,testability,andmaintainability.Itactsasacentralhubforcreatingandinjectingdependencies,thusreducingtightcouplingandeasingunittesting.

Dependency Injection vs. Service Locator in PHPDependency Injection vs. Service Locator in PHPMay 13, 2025 am 12:10 AM

Select DependencyInjection (DI) for large applications, ServiceLocator is suitable for small projects or prototypes. 1) DI improves the testability and modularity of the code through constructor injection. 2) ServiceLocator obtains services through center registration, which is convenient but may lead to an increase in code coupling.

PHP performance optimization strategies.PHP performance optimization strategies.May 13, 2025 am 12:06 AM

PHPapplicationscanbeoptimizedforspeedandefficiencyby:1)enablingopcacheinphp.ini,2)usingpreparedstatementswithPDOfordatabasequeries,3)replacingloopswitharray_filterandarray_mapfordataprocessing,4)configuringNginxasareverseproxy,5)implementingcachingwi

PHP Email Validation: Ensuring Emails Are Sent CorrectlyPHP Email Validation: Ensuring Emails Are Sent CorrectlyMay 13, 2025 am 12:06 AM

PHPemailvalidationinvolvesthreesteps:1)Formatvalidationusingregularexpressionstochecktheemailformat;2)DNSvalidationtoensurethedomainhasavalidMXrecord;3)SMTPvalidation,themostthoroughmethod,whichchecksifthemailboxexistsbyconnectingtotheSMTPserver.Impl

How to make PHP applications fasterHow to make PHP applications fasterMay 12, 2025 am 12:12 AM

TomakePHPapplicationsfaster,followthesesteps:1)UseOpcodeCachinglikeOPcachetostoreprecompiledscriptbytecode.2)MinimizeDatabaseQueriesbyusingquerycachingandefficientindexing.3)LeveragePHP7 Featuresforbettercodeefficiency.4)ImplementCachingStrategiessuc

PHP Performance Optimization Checklist: Improve Speed NowPHP Performance Optimization Checklist: Improve Speed NowMay 12, 2025 am 12:07 AM

ToimprovePHPapplicationspeed,followthesesteps:1)EnableopcodecachingwithAPCutoreducescriptexecutiontime.2)ImplementdatabasequerycachingusingPDOtominimizedatabasehits.3)UseHTTP/2tomultiplexrequestsandreduceconnectionoverhead.4)Limitsessionusagebyclosin

PHP Dependency Injection: Improve Code TestabilityPHP Dependency Injection: Improve Code TestabilityMay 12, 2025 am 12:03 AM

Dependency injection (DI) significantly improves the testability of PHP code by explicitly transitive dependencies. 1) DI decoupling classes and specific implementations make testing and maintenance more flexible. 2) Among the three types, the constructor injects explicit expression dependencies to keep the state consistent. 3) Use DI containers to manage complex dependencies to improve code quality and development efficiency.

PHP Performance Optimization: Database Query OptimizationPHP Performance Optimization: Database Query OptimizationMay 12, 2025 am 12:02 AM

DatabasequeryoptimizationinPHPinvolvesseveralstrategiestoenhanceperformance.1)Selectonlynecessarycolumnstoreducedatatransfer.2)Useindexingtospeedupdataretrieval.3)Implementquerycachingtostoreresultsoffrequentqueries.4)Utilizepreparedstatementsforeffi

See all articles

Hot AI Tools

Undresser.AI Undress

Undresser.AI Undress

AI-powered app for creating realistic nude photos

AI Clothes Remover

AI Clothes Remover

Online AI tool for removing clothes from photos.

Undress AI Tool

Undress AI Tool

Undress images for free

Clothoff.io

Clothoff.io

AI clothes remover

Video Face Swap

Video Face Swap

Swap faces in any video effortlessly with our completely free AI face swap tool!

Hot Article

Hot Tools

SublimeText3 Mac version

SublimeText3 Mac version

God-level code editing software (SublimeText3)

Dreamweaver CS6

Dreamweaver CS6

Visual web development tools

WebStorm Mac version

WebStorm Mac version

Useful JavaScript development tools

PhpStorm Mac version

PhpStorm Mac version

The latest (2018.2.1) professional PHP integrated development tool

mPDF

mPDF

mPDF is a PHP library that can generate PDF files from UTF-8 encoded HTML. The original author, Ian Back, wrote mPDF to output PDF files "on the fly" from his website and handle different languages. It is slower than original scripts like HTML2FPDF and produces larger files when using Unicode fonts, but supports CSS styles etc. and has a lot of enhancements. Supports almost all languages, including RTL (Arabic and Hebrew) and CJK (Chinese, Japanese and Korean). Supports nested block-level elements (such as P, DIV),