美文网首页技术文程序员
PHP之用户验证和标签推荐的简单使用

PHP之用户验证和标签推荐的简单使用

作者: 老马的春天 | 来源:发表于2016-10-29 17:21 被阅读223次

    PHP之用户验证和标签推荐的简单使用

    本篇主要是讲解一些最简单的验证知识

    效果图

    bookmark_fns.php

    <?php
    require_once('output_fns.php');
    require_once('db_fns.php');
    require_once('data_valid_fns.php');
    require_once('url_fns.php');
    require_once('user_auth_fns.php');
    ?>
    

    data_valid_fns.php

    <?php
    
    // Test that each variable has a value
    function filled_out($form_vars) {
        foreach ($form_vars as $key => $value) {
            if ((!isset($key)) || ($value == '')) {
                return false;
            } 
        } 
         return true;
    }
    
    // Valid email
    function valid_email($address) {
        if (ereg('^[a-zA-Z0-9_\.\-]+@[a-zA-Z0-9\-]+\.[a-zA-Z0-9\-\.]+$', $address)) {
            return true;
        }else {
            return false;
        }
    }
    ?>
    

    db_fns.php

    <?php
    
    //Conncet to db 
    function db_connect() {
        $db = new mysqli('127.0.0.1', 'bm_user', 'password', 'bookmarks');
        if (!$db) {
           throw new Exception("Could not connect to database server", 1);
           
        }else {
            return $db;
        }
    }
    ?>
    

    user_auth_fns.php

    <?php
    require_once('db_fns.php');
    
    // register 
    function register($username, $email, $password) {
    
        $conn = db_connect();
    
        $results = $conn -> query("select * from user where username = '".$username."'");
        if (!$results) {
            throw new Exception("Could not execute query", 1);
        }
    
        if ($results -> num_rows > 0) {
            throw new Exception("That username is taken - go back and choose another one.", 1);
        } 
    
        $results = $conn -> query("insert into user values ('".$username."', sha1('".$email."'), '".$password."')");
        if (!$results) {
            throw new Exception('Could not register you in database - please try again later.');
        }
        return true;
    }
    
    // Log in 
    function login($username, $password) {
        $conn = db_connect();
        $results = $conn -> query("select * from user where username = '".$username."' and passwd = sha1('".$password."')");
    
       if (!$results) {
            throw new Exception('Could not log you in.');
        }
    
        if ($results -> num_rows > 0) {
            return true;
        }else {
            throw new Exception('Could not log you in.');
        }
    }
    
    // Check valid user 
    function check_valid_user() {
        if (isset($_SESSION['valid_user'])) {
            echo "Logged in as ".$_SESSION['valid_user'].".<br />";
        }else {
            do_html_header('Problem:');
            echo "You are not logged in.<br />";
            do_html_url('login.php', 'Login');
            do_html_foot();
            exit;
        }
    }
    
    // change password 
    function change_password($username, $old_password, $new_password) {
        login($username, $old_password);
        $conn = db_connect();
    
        $result = $conn -> query("update user set passwd = sha1('".$new_password."') where username = '".$username."'");
    
        if (!$result) {
        throw new Exception('Password could not be changed.');
      } else {
        return true;  // changed successfully
      }
    }
    
    function get_random_word($min_length, $max_length) {
    // grab a random word from dictionary between the two lengths
    // and return it
    
       // generate a random word
      $word = '';
      // remember to change this path to suit your system
      $dictionary = '/usr/dict/words';  // the ispell dictionary
      $fp = @fopen($dictionary, 'r');
      if(!$fp) {
        return false;
      }
      $size = filesize($dictionary);
    
      // go to a random location in dictionary
      $rand_location = rand(0, $size);
      fseek($fp, $rand_location);
    
      // get the next whole word of the right length in the file
      while ((strlen($word) < $min_length) || (strlen($word)>$max_length) || (strstr($word, "'"))) {
         if (feof($fp)) {
            fseek($fp, 0);        // if at end, go to start
         }
         $word = fgets($fp, 80);  // skip first word as it could be partial
         $word = fgets($fp, 80);  // the potential password
      }
      $word = trim($word); // trim the trailing \n from fgets
      return $word;
    }
    
    function reset_password($username) {
    // set password for username to a random value
    // return the new password or false on failure
      // get a random dictionary word b/w 6 and 13 chars in length
      $new_password = get_random_word(6, 13);
    
      if($new_password == false) {
        throw new Exception('Could not generate new password.');
      }
    
      // add a number  between 0 and 999 to it
      // to make it a slightly better password
      $rand_number = rand(0, 999);
      $new_password .= $rand_number;
    
      // set user's password to this in database or return false
      $conn = db_connect();
      $result = $conn->query("update user
                              set passwd = sha1('".$new_password."')
                              where username = '".$username."'");
      if (!$result) {
        throw new Exception('Could not change password.');  // not changed
      } else {
        return $new_password;  // changed successfully
      }
    }
    
    function notify_password($username, $password) {
    // notify the user that their password has been changed
    
        $conn = db_connect();
        $result = $conn->query("select email from user
                                where username='".$username."'");
        if (!$result) {
          throw new Exception('Could not find email address.');
        } else if ($result->num_rows == 0) {
          throw new Exception('Could not find email address.');
          // username not in db
        } else {
          $row = $result->fetch_object();
          $email = $row->email;
          $from = "From: support@phpbookmark \r\n";
          $mesg = "Your PHPBookmark password has been changed to ".$password."\r\n"
                  ."Please change it next time you log in.\r\n";
    
          if (mail($email, 'PHPBookmark login information', $mesg, $from)) {
            return true;
          } else {
            throw new Exception('Could not send email.');
          }
        }
    }
    
    ?>
    

    url_fns.php

    <?php
    require_once('db_fns.php');
    
    // Get user urls
    function get_user_urls($username) {
        $conn = db_connect();
        $results = $conn -> query("select bm_URL 
                                    from bookmark 
                                    where username = '" . $username . "'");
                                
        if (!$results) {
            return false;
        }
    
        $url_array = array();
        for ($i = 1;$row = $results -> fetch_row();++$i) {
            $url_array[$i] = $row[0];
        }
        return $url_array;
    }
    
    // Add url to db
    function add_bm($new_url) {
        echo "Attempting to add ".htmlspecialchars($new_url)."<br />";
    
        $valid_user = $_SESSION['valid_user'];
        $conn = db_connect();
        $results = $conn -> query(" select * from bookmark 
                                    where username = '".$valid_user."' 
                                    and bm_URL = '".$new_url."'");
    
        if ($results && ($results -> num_rows > 0)) {
            throw new Exception("Bookmark already exists.", 1);   
        }
    
        $insert_result = $conn -> query("insert into bookmark values ('".$valid_user."', '".addslashes($new_url)."')");
    
        if (!$insert_result) {
            throw new Exception("Bookmark could not be inserted.", 1);   
        }
        return true;
    }
    
    // Delete url 
    function delete_bm($user, $url) {
        $conn = db_connect();
        $results = $conn -> query(" delete from bookmark 
                                    where username = '".$user."' 
                                    and bm_URL = '".$url."'");
        if (!$results) {
            throw new Exception("Bookmark could not be deleted.", 1);   
        }
        return true;                            
    }
    
    function recommend_urls($valid_user, $popularity = 1) {
        $conn = db_connect();
    
        //  $query = "select bm_URL
        //         from bookmark
        //         where username in
        //          (select distinct(b2.username)
        //         from bookmark b1, bookmark b2
        //      where b1.username='".$valid_user."'
        //            and b1.username != b2.username
        //            and b1.bm_URL = b2.bm_URL)
        //            and bm_URL not in
        //         (select bm_URL
        //             from bookmark
        //             where username='".$valid_user."')
        //                group by bm_url
        //                having count(bm_url)>".$popularity;
    $query = "select bm_URL
                from bookmark
                where username in
                (select distinct(b2.username)
                from bookmark b1, bookmark b2
                where b1.username='".$valid_user."'
                   and b1.username != b2.username
                   and b1.bm_URL = b2.bm_URL)
                   and bm_URL not in
                   (select bm_URL
                       from bookmark
                       where username='".$valid_user."')
                       group by bm_url
                       having count(bm_url)>".$popularity;
    
        if (!($result = $conn->query($query))) {
         throw new Exception('Could not find any bookmarks to recommend.');
      }
    
      if ($result->num_rows==0) {
         throw new Exception('Could not find any bookmarks to recommend.');
      }
    
      $urls = array();
      // build an array of the relevant urls
      for ($count=0; $row = $result->fetch_object(); $count++) {
          
         $urls[$count] = $row->bm_URL;
      }
    
      return $urls;
    }
    
    
    ?>
    

    output_fns.php

    <?php
    
    function do_html_header($title) {
      // print an HTML header
    ?>
      <html>
      <head>
        <title><?php echo $title;?></title>
        <style>
          body { font-family: Arial, Helvetica, sans-serif; font-size: 13px }
          li, td { font-family: Arial, Helvetica, sans-serif; font-size: 13px }
          hr { color: #3333cc; width=300; text-align=left}
          a { color: #000000 }
        </style>
      </head>
      <body>
      <img src="005.png" alt="PHPbookmark logo" border="0"
           align="left" valign="bottom" height="55" width="57" />
      <h1>PHPbookmark</h1>
      <hr />
    <?php
      if($title) {
        do_html_heading($title);
      }
    }
    
    function do_html_footer() {
      // print an HTML footer
    ?>
      </body>
      </html>
    <?php
    }
    
    function do_html_heading($heading) {
      // print heading
    ?>
      <h2><?php echo $heading;?></h2>
    <?php
    }
    
    function do_html_URL($url, $name) {
      // output URL as link and br
    ?>
      <br /><a href="<?php echo $url;?>"><?php echo $name;?></a><br />
    <?php
    }
    
    function display_site_info() {
      // display some marketing info
    ?>
      <ul>
      <li>Store your bookmarks online with us!</li>
      <li>See what other users use!</li>
      <li>Share your favorite links with others!</li>
      </ul>
    <?php
    }
    
    function display_login_form() {
    ?>
      <p><a href="register_form.php">Not a member?</a></p>
      <form method="post" action="member.php">
      <table bgcolor="#cccccc">
       <tr>
         <td colspan="2">Members log in here:</td>
       <tr>
         <td>Username:</td>
         <td><input type="text" name="username"/></td></tr>
       <tr>
         <td>Password:</td>
         <td><input type="password" name="passwd"/></td></tr>
       <tr>
         <td colspan="2" align="center">
         <input type="submit" value="Log in"/></td></tr>
       <tr>
         <td colspan="2"><a href="forgot_form.php">Forgot your password?</a></td>
       </tr>
     </table></form>
    <?php
    }
    
    function display_registration_form() {
    ?>
     <form method="post" action="register_new.php">
     <table bgcolor="#cccccc">
       <tr>
         <td>Email address:</td>
         <td><input type="text" name="email" size="30" maxlength="100"/></td></tr>
       <tr>
         <td>Preferred username <br />(max 16 chars):</td>
         <td valign="top"><input type="text" name="username"
             size="16" maxlength="16"/></td></tr>
       <tr>
         <td>Password <br />(between 6 and 16 chars):</td>
         <td valign="top"><input type="password" name="passwd"
             size="16" maxlength="16"/></td></tr>
       <tr>
         <td>Confirm password:</td>
         <td><input type="password" name="passwd2" size="16" maxlength="16"/></td></tr>
       <tr>
         <td colspan=2 align="center">
         <input type="submit" value="Register"></td></tr>
     </table></form>
    <?php
    
    }
    
    function display_user_urls($url_array) {
      // display the table of URLs
    
      // set global variable, so we can test later if this is on the page
      global $bm_table;
      $bm_table = true;
    ?>
      <br />
      <form name="bm_table" action="delete_bms.php" method="post">
      <table width="300" cellpadding="2" cellspacing="0">
      <?php
      $color = "#cccccc";
      echo "<tr bgcolor=\"".$color."\"><td><strong>Bookmark</strong></td>";
      echo "<td><strong>Delete?</strong></td></tr>";
      if ((is_array($url_array)) && (count($url_array) > 0)) {
        foreach ($url_array as $url)  {
          if ($color == "#cccccc") {
            $color = "#ffffff";
          } else {
            $color = "#cccccc";
          }
          //remember to call htmlspecialchars() when we are displaying user data
          echo "<tr bgcolor=\"".$color."\"><td><a href=\"".$url."\">".htmlspecialchars($url)."</a></td>
                <td><input type=\"checkbox\" name=\"del_me[]\"
                    value=\"".$url."\"/></td>
                </tr>";
        }
      } else {
        echo "<tr><td>No bookmarks on record</td></tr>";
      }
    ?>
      </table>
      </form>
    <?php
    }
    
    function display_user_menu() {
      // display the menu options on this page
    ?>
    <hr />
    <a href="member.php">Home</a> &nbsp;|&nbsp;
    <a href="add_bm_form.php">Add BM</a> &nbsp;|&nbsp;
    <?php
      // only offer the delete option if bookmark table is on this page
      global $bm_table;
      if ($bm_table == true) {
        echo "<a href=\"#\" onClick=\"bm_table.submit();\">Delete BM</a> &nbsp;|&nbsp;";
      } else {
        echo "<span style=\"color: #cccccc\">Delete BM</span> &nbsp;|&nbsp;";
      }
    ?>
    <a href="change_passwd_form.php">Change password</a>
    <br />
    <a href="recommend.php">Recommend URLs to me</a> &nbsp;|&nbsp;
    <a href="logout.php">Logout</a>
    <hr />
    
    <?php
    }
    
    function display_add_bm_form() {
      // display the form for people to ener a new bookmark in
    ?>
    <form name="bm_table" action="add_bms.php" method="post">
    <table width="250" cellpadding="2" cellspacing="0" bgcolor="#cccccc">
    <tr><td>New BM:</td>
    <td><input type="text" name="new_url" value="http://"
         size="30" maxlength="255"/></td></tr>
    <tr><td colspan="2" align="center">
        <input type="submit" value="Add bookmark"/></td></tr>
    </table>
    </form>
    <?php
    }
    
    function display_password_form() {
      // display html change password form
    ?>
       <br />
       <form action="change_passwd.php" method="post">
       <table width="250" cellpadding="2" cellspacing="0" bgcolor="#cccccc">
       <tr><td>Old password:</td>
           <td><input type="password" name="old_passwd"
                size="16" maxlength="16"/></td>
       </tr>
       <tr><td>New password:</td>
           <td><input type="password" name="new_passwd"
                size="16" maxlength="16"/></td>
       </tr>
       <tr><td>Repeat new password:</td>
           <td><input type="password" name="new_passwd2"
                size="16" maxlength="16"/></td>
       </tr>
       <tr><td colspan="2" align="center">
           <input type="submit" value="Change password"/>
       </td></tr>
       </table>
       <br />
    <?php
    }
    
    function display_forgot_form() {
      // display HTML form to reset and email password
    ?>
       <br />
       <form action="forgot_passwd.php" method="post">
       <table width="250" cellpadding="2" cellspacing="0" bgcolor="#cccccc">
       <tr><td>Enter your username</td>
           <td><input type="text" name="username" size="16" maxlength="16"/></td>
       </tr>
       <tr><td colspan=2 align="center">
           <input type="submit" value="Change password"/>
       </td></tr>
       </table>
       <br />
    <?php
    }
    
    function display_recommended_urls($url_array) {
      // similar output to display_user_urls
      // instead of displaying the users bookmarks, display recomendation
    ?>
      <br />
      <table width="300" cellpadding="2" cellspacing="0">
    <?php
      $color = "#cccccc";
      echo "<tr bgcolor=\"".$color."\">
            <td><strong>Recommendations</strong></td></tr>";
      if ((is_array($url_array)) && (count($url_array)>0)) {
        foreach ($url_array as $url) {
          if ($color == "#cccccc") {
            $color = "#ffffff";
          } else {
            $color = "#cccccc";
          }
          echo "<tr bgcolor=\"".$color."\">
                <td><a href=\"".$url."\">".htmlspecialchars($url)."</a></td></tr>";
        }
      } else {
        echo "<tr><td>No recommendations for you today.</td></tr>";
      }
    ?>
      </table>
    <?php
    }
    
    ?>
    

    login.php

    <?php
    require_once('bookmark_fns.php');
    
    do_html_header('');
    display_site_info();
    display_login_form();
    do_html_footer();
    
    
    ?>
    

    logout.php

    <?php
    
    require_once('bookmark_fns.php');
    
    // start session
    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 are not logged in ,so have not been logged out.<br />';
        do_html_url('login.php', 'Login');
    }
    
    do_html_footer();
    ?>
    

    register_form.php

    <?php
    require_once('bookmark_fns.php');

    do_html_header('User Registration');
    
    display_registration_form();
    
    do_html_footer();
    
    ?>
    

    register_new.php

    <?php
    require_once('bookmark_fns.php');
    
    // vars
    $email = $_POST['email'];
    $username = $_POST['username'];
    $passwd = $_POST['passwd'];
    $passwd2 = $_POST['passwd2'];
    
    // start session
    session_start();
    
    // valid data 
    try {
    
        if (!filled_out($_POST)) {
            throw new Exception("You have not filled the form out correctly - please go back and try again.", 1);
        }
    
        if (!valid_email($email)) {                     
            throw new Exception("That is not a valid email address - please go back and try again.", 1);
        }
    
        if ($passwd != $passwd2) {                      
            throw new Exception("The passwords you entered do not match - please go back and try again.", 1);
        }
    
        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.", 1);
        }
    
        register($username, $passwd, $email);
    
        $_SESSION['valid_user'] = $username;
    
        do_html_header('Rigistration successful');
    
        do_html_url('member.php', 'Go to members page');
    
        do_html_footer();
    
        
    } catch (Exception $e) {
        
        do_html_header('Problem: ');
        echo $e -> getMessage();
        do_html_footer();
        exit();
    }
    
    ?>
    

    forgot_form.php

    <?php
     require_once('bookmark_fns.php');
     do_html_header('Reset password');
     
     display_forgot_form();
    
     do_html_footer();
    ?>
    

    forgot_passwd.php

    <?php
     require_once('bookmark_fns.php');
     do_html_header('Resetting password');
    
     $username = $_POST['username'];
     try {
         // get random password 
         $password = reset_password($username);
         notify_password($username, $password);
         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();
    ?>
    

    change_passwd_form.php

    <?php
     require_once('bookmark_fns.php');
     session_start();
     do_html_header('Change password');
     check_valid_user();
     
     display_password_form();
    
     display_user_menu(); 
     do_html_footer();
    ?>
    

    change_passed.php

    <?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 the form out correctly - please go back and try again.", 1);
        }
    
        if ($new_passwd != $new_passwd2) {                      
            throw new Exception("The passwords you entered do not match - please go back and try again.", 1);
        }
    
        if ((strlen($new_passwd) < 6) || (strlen($new_passwd) > 16)) {                      
            throw new Exception("Your password must be between 6 and 16 characters - please go back and try again.", 1);
        }
    
        change_password($_SESSION['valid_user'], $old_passwd, $new_passwd2);
        echo 'Password changed.';
    
     }catch(Exception $e) {
         echo $e -> getMessage();
     }
    
     display_user_menu(); 
     do_html_footer();
    ?>
    

    add_bm_form.php

    <?php
    // include function files for this application
    require_once('bookmark_fns.php');
    session_start();
    
    // start output html
    do_html_header('Add Bookmarks');
    
    check_valid_user();
    display_add_bm_form();
    
    display_user_menu();
    do_html_footer();
    
    ?>
    

    add_bms.php

    <?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($_POST)) {
            throw new Exception('Form not completely filled out.');
        } 
    
        if (strstr($new_url, 'http://') === false) {
            $new_url = 'http://'.$new_url;
        } 
    
        // check url is valid
        if (!@fopen($new_url, 'r')) {
            throw new Exception('Not a valid URL.');
        } 
        add_bm($new_url);
        echo "Bookmark added";
    
        if ($mks = get_user_urls($_SESSION['valid_user'])) {
            display_user_urls($mks);
        }
    }catch(Exception $e) {
        echo $e -> getMessage();
    }
    
     display_user_menu();
     do_html_footer();
    ?>
    

    delete_bms.php

    <?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($_POST)) {
        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 deleted ".htmlspecialchars($url)."<br />";
                }
            }
        }else {
            echo "No bookmarks selected for deletion.";
        }
    }
    
    if ($mks = get_user_urls($_SESSION['valid_user'])) {
            display_user_urls($mks);
    }
     display_user_menu();
     do_html_footer();
    ?>
    

    recommend.php

    <?php
     require_once('bookmark_fns.php');
    
    session_start();
    
    do_html_header('Recommending URLS');
    try {
        check_valid_user();
        $urls = recommend_urls($_SESSION['valid_user'], 1);
        display_recommended_urls($urls);
    }catch(Exception $e) {
        echo $e -> getMessage();
    }
    
     display_user_menu();
     do_html_footer();
    ?>
    

    member.php

    <?php
    require_once('bookmark_fns.php');
    
    session_start();
    
    @$username = $_POST['username'];
    @$passwd = $_POST['passwd'];
    
    if ($username && $passwd) {
     
    try {
        // Log in 
        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();
    
    
    ?>
    

    上边所有的源文件的下载地址

    https://pan.baidu.com/s/1o7R678Y

    相关文章

      网友评论

        本文标题:PHP之用户验证和标签推荐的简单使用

        本文链接:https://www.haomeiwen.com/subject/scsyuttx.html