php 用户登录验证码的实现方法

 更新时间:2016年11月25日 16:38  点击:1413

  下面我们用Mysql数据库教程来存储用户的身份。我们需要从数据库中提取每个帐号的用户名和密码以便与$PHP_AUTH_USER和$PHP_AUTH_PW变量进行比较,判断用户的真实性。

首先,在MySql中建立一个存放用户信息的数据库

数据库名为XinXiKu ,表名为user;表定义如下:

View Code 1 create table user(
2 ID INT(4) NOT NULL AUTO_INCREMENT,
3 name VARCHAR(8) NOT NULL,
4 password CHAR(8) NOT NULL,
5  PRIMARY KEY(ID)
6 )


说明:

1、ID为一个序列号,不为零而且自动递增,为主键;

2、name为用户名,不能为空;

3、password为用户密码,不能为空;

以下是用户验证文件login.php教程

View Code  1 //判断用户名是否设置
 2 if(!isset($PHP_AUTH_USER))
 3 {
 4 header("WWW-Authenticate:Basic realm="身份验证功能"");
 5 header("HTTP/1.0 401 Unauthorized");
 6 echo "身份验证失败,您无权共享网络资源!";
 7 exit();
 8 }
 9 /*连接数据库*/
10 $db=mysql教程_connect("localhost","root","");
11 //选择数据库
12 mysql_select_db("XinXiKu",$db);
13 //查询用户是否存在
14 $result=mysql_query("SELECT * FROM user where name='$PHP_AUTH_USER' and password='$PHP_AUTH_PW'",$db);
15 if ($myrow = mysql_fetch_row($result))
16 {
17 //以下为身份验证成功后的相关操作
18 ...
19 }
20 else
21 {
22 //身份验证不成功,提示用户重新输入
23 header("WWW-Authenticate:Basic realm="身份验证功能"");
24 header("HTTP/1.0 401 Unauthorized");
25 echo "身份验证失败,您无权共享网络资源!";
26 exit();
27 }
28 ?>

程序说明:

在程序中,首先检查变量$PHP_AUTH_USER是否已经设置。如果没有设置,说明需要验证,脚本发出HTTP 401错误号头标,告诉客户端的浏览器需要进行身份验证,由客户端的浏览器弹出一个身份验证窗口,提示用户输入用户名和密码,输入完成后,连接数据库,查询该用用户名及密码是否正确,如果正确,允许登录进行相关操作,如果不正确,继续要求用户输入用户名和密码。

函数说明:

1、isset():用于确定某个变量是否已被赋值。根据变量值是否存在,返回true或false

2、header():用于发送特定的HTTP标头。注意,使用header()函数时,一定要在任何产生实际输出的HTML或PHP代码前面调用该函数。

3、mysql_connect():打开 MySQL 服务器连接。

4、mysql_db_query():送查询字符串 (query) 到 MySQL 数据库。

5、mysql_fetch_row():返回单列的各字段。

二、用session实现服务器验证

对于需要身份验证的页面,使用apache服务器验证是最好不过的了。但是,apache服务器验证的界面不够友好。而且,cgi模式的php,iis下的php,都不能使用apache服务器验证。这样,我们可以利用session在不同页面间保存用户身份,达到身份验证的目的。

在后端我们同样利用上面的Mysql数据库存放用户信息。

我们先编写一个用户登录界面,文件名为login.php,代码职下:

View Code 1 <form action="login1.php">
2 用户名:<input type="text" name="name"><br>
3 口 令:<input type="text" name="pass"><br>
4 <input type="submit" value="登录">
5 </form>

login1.php处理提交的表单,代码如下:
View Code  1 $db=mysql_connect("localhost","root","");
 2 mysql_select_db("XinXiKu",$db);
 3 $result=mysql_query("SELECT * FROM user where name='$name' and password='$pass'",$db);
 4 if ($myrow = mysql_fetch_row($result))
 5 {
 6 //注册用户
 7 session_start();
 8 session_register("user");
 9 $user=$myrow["user"];
10 // 身份验证成功,进行相关操作
11 ...
12 }
13 else
14 {
15 echo"身份验证失败,您无权共享网络资源!";
16 }
17 ?>


这里需要说明的是,用户可以使用在后续的操作中用**http://domainname/next.php?user=用户名 **来绕过身份验证。所以,后续的操作应先检查变量是否注册:已注册,则进行相应操作,否则视为非法登录。相关代码如下:
View Code  1 session_start();
 

2 if (!session_is_registered("user"))
 3 {
 4 echo "身份验证失败,属于非法登录!";
 5 }
 6 else
 7 {
 8 //成功登录进行相关操作
 9 ...
10 }
11 ?>

sql update记录更新详细实例

语法:

[ WITH <common_table_expression> [...n] ]
UPDATE
    [ TOP (expression) [ PERCENT ] ]
    { { table_alias | <object> | rowset_function_limited
         [ WITH ( <Table_Hint_Limited> [ ...n ] ) ]
      }
      | @table_variable   
    }
    SET
        { column_name= { expression | DEFAULT | NULL }
          | { udt_column_name.{ { property_name= expression
                                | field_name=expression }
                                | method_name(argument [ ,...n ] )
                              }
            }
          | column_name { .WRITE (expression,@Offset,@Length) }
          | @variable=expression
          | @variable= column=expression
          | column_name { += | -= | *= | /= | %= | &= | ^= | |= } expression
          | @variable { += | -= | *= | /= | %= | &= | ^= | |= } expression
          | @variable=column { += | -= | *= | /= | %= | &= | ^= | |= } expression
        } [ ,...n ]

    [ <OUTPUT Clause> ]
    [ FROM { <table_source> } [ ,...n ] ]
    [ WHERE { <search_condition>
            | { [ CURRENT OF
                  { { [ GLOBAL ] cursor_name }
                      | cursor_variable_name
                  }
                ]
              }
            }
    ]
    [ OPTION ( <query_hint> [ ,...n ] ) ]
[ ; ]

<object> ::=
{
    [ server_name . database_name . schema_name .
    | database_name .[ schema_name ] .
    | schema_name .
    ]
    table_or_view_name}

实例 php教程

<?php
   mysql教程_connect("mysql153.secureserver.net","java2s","password");
   mysql_select_db("java2s");

   $query = "UPDATE Employee SET salary = '39.99' ";
   $result = mysql_query($query);
   echo "There were ".mysql_affected_rows()." product(s) affected. ";

?>


利用update 更新数据

<?php

   mysql_connect("mysql153.secureserver.net","java2s","password");
   mysql_select_db("java2s");

   $rowID = "0001";
   $name = "Kate";
   $price = "12";

      $query = "UPDATE Employee SET name='$name', price='$price' WHERE ID='$rowID'";
      $result = mysql_query($query);

      if ($result)
         echo "<p>The developer has been successfully updated.</p>";
      else
         echo "<p>There was a problem updating the developer.</p>";

 

?>

这篇教程对初学者会有帮助的,我们讲了数据库教程连接并且利用mysql教程_query,mysql_num_rows,mysql_fetch_row三个函数把记录读取并输出。

<html>
<head>
<title>Selecting Data</title>
</head>
<body>
<?php教程
$user = "root";
$pass = "";
$db = "mydatabase";
$link = mysql_connect( "localhost", $user, $pass );
if ( ! $link ) {
  die( "Couldn't connect to MySQL: ".mysql_error() );
}

mysql_select_db( $db, $link ) or die ( "Couldn't open $db: ".mysql_error() );

$result = mysql_query( "SELECT * FROM domains where sex='F'" );
$num_rows = mysql_num_rows( $result );

print "<p>$num_rows www.111cn.net women have added data to the table</p>n";

print "<table>";
while ( $a_row = mysql_fetch_row( $result ) ) {
  print "<tr>";
  foreach ( $a_row as $field ) {
    print "<td>".strips教程lashes($field)."</td>";
  }
  print "</tr>";
}
print "</table>";
mysql_close( $link );
?>
</body>
</html>

下面我们要讲到二种用户登录方法一种是利用window验证加数据库教程密码验证实现登录,后者是利用cookie记录用户信息进行登录,有需要的朋友可以试下。

<?php教程
   function authenticate_user() {
      header('WWW-Authenticate: Basic realm="Secret Stash"');
      header("HTTP/1.0 401 Unauthorized");
      exit;
   }

   if (! isset($_SERVER['PHP_AUTH_USER'])) {
      authenticate_user();
   } else {
      mysql教程_pconnect("localhost","authenticator","secret") or die("Can't connect to database server!");
      mysql_select_db("java2s") or die("Can't select authentication database!");

      $query = "SELECT username, ps教程wd FROM user WHERE username='$_SERVER[PHP_AUTH_USER]' AND pswd=MD5('$_SERVER[PHP_AUTH_PW]')";

      $result = mysql_query($query);

      // If nothing was found, reprompt the user for the login www.111cn.net information.
      if (mysql_num_rows($result) == 0) {
         authenticate_user();
      }
   }
?>

利用cookie登录方法

<html>
  <head>
  <title>Enter Password</title>
  </head>
  <body>
  <form name="forml" method="POST" action="CookieBasedPasswordLogin.php">
    <table>
      <tr>
       <td colspan="2" >
         <div align="center"><b>Please Specify the Password</b></div>
       </td>
     </tr>
   <tr>>
     <td>
       <div align="right">Customer ID</div>
     </td>
     <td>
       <input type="text" name="username">
     </td>
   </tr>
   <tr>
     <td>
       <div align="right">Password</div>
     </td>
     <td>
       <input type="password" name="password">
     </td>
   </tr>
   <tr>
     <td colspan="2">
       <center>
         <input type="submit" name="Submit" value="Login">
       </center>
     </td>
    </tr>
   </table>
  </form>
  </body>
  </html>
 
 
 
 
<!-- CookieBasedPasswordLogin.php
<?php
    $now = getdate();
    $storetime= $now["weekday"] . " " . $now["month"] ." " . $now["year"] ;
    $storetime.=" Time : ";

    if ($now["hours"] < 10) {
      $storetime.= "0" . $now["hours"];
    } else {
      $storetime.= $now["hours"];
    }
 
    $storetime.= ":";
    if ($now["minutes"]<10) {
      $storetime.= "0" . $now["minutes"];
    } else {
      $storetime.= $now["minutes"];
    }
   
    $storetime.= ": ";
    if ($now["seconds"] <10) {
      $storetime.= "0" . $now["seconds"];
    } else {
      $storetime.= $now["seconds"];
    }
    if (isset($data)) {
       $counter=++$data[l];
        setcookie("data[0]",$storetime,time() + (60*60*24));
        setcookie("data[l]", $counter,time() + (60*60*24)); setcookie("data[2]",$username,time() + (60*60*24));
        echo "<b><center>Hi " . $data[2] . " ! !</center></b><br>n";
        echo "<b><center>Last Login Time :" .$data[0] . "</center></b><br>n";
        echo "<b><center>Current Date :" .$storetime. "</center></b><br>n";
        echo "<b><center>Page View Count :" . $data[l]. "</center></b><br>n";
        echo "<b><center>You have successfully logged in!</center></b>";
        echo ("<b><contor>You can access this area without entering a password for the next 24 hours!</center></b>");
   } else {
    if (isset($username) && isset($password)) {
     if ($password=="superpass") {
          $counter=0;
          setcookie("data[0]",$storetime,time() + (60*60*24));
          setcookie("data[l]",$counter,time() + (60*60*24));
          setcookie("data[2]",$username,time() + (60*60*24));
          $url="Location: cookieimp.php";
          header($url);
     }else{
          echo "<hl><center>INVALID PASSWORD!!!</center></hl>";
     }
    }
  }
  ?>
 
 

什么是存储例程?
 存储例程是存储在数据库教程服务器中的一组sql语句,通过在查询中调用一个指定的名称来执

行这些sql语句命令。
为什么要使用存储过程?
 我们都知道应用程序分为两种,一种是基于web,一种是基于桌面,他们都和数据库进行交

互来完成数据的存取工作。假设现在有一种应用程序包含了这两种,现在要修改其中的一个

查询sql语句,那么我们可能要同时修改他们中对应的查询sql语句,当我们的应用程序很庞

大很复杂的时候问题就出现这,不易维护!另外把sql查询语句放在我们的web程序或桌面中

很容易遭到sql注入的破坏。而存储例程正好可以帮我们解决这些问题。
存储过程(stored procedure)、存储例程(store routine)、存储函数区别
 Mysql存储例程实际包含了存储过程和存储函数,它们被统称为存储例程。
 其中存储过程主要完成在获取记录或插入记录或更新记录或删除记录,即完成select

insert delete update等的工作。而存储函数只完成查询的工作,可接受输入参数并返回一

个结果。

创建存储过程、存储函数

 create procedure 存储过程名(参数)
  存储过程体

 create function 存储函数名(参数)
  存储函数体
假设现在有一个数据库omcmc中的表db_info 表结构如下:

SET FOREIGN_KEY_CHECKS=0;
-- ----------------------------
-- Table structure for db_news
-- ----------------------------
DROP TABLE IF EXISTS `db_news`;
CREATE TABLE `db_news` (
  `id` int(10) NOT NULL auto_increment,
  `title` varchar(200) NOT NULL,
  `editor` varchar(20) default NULL,
  `origin` varchar(20) default NULL,
  `tags` varchar(200) default NULL,
  `content` text NOT NULL,
  `hits` int(10) default '0',
  `ip` varchar(15) NOT NULL,
  `time` int(10) NOT NULL,
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=2 DEFAULT CHARSET=latin1;

-- ----------------------------
-- Records
-- ----------------------------
INSERT INTO `db_news` VALUES ('1', First App', 'xqbar.com', 'xqbar.com', 'omcmc',

'detail。。', '100', '127.0.0.1', '1215051225');

使用上面的表我们创建一个简单的存储过程
create procedure select_news()
select title,hits from db_news;

在终端运行并调用
 
从上面的截图我们看到如何调用我们的存储过程

调用存储过程
call 存储过程名();

以上我们创建了一个简单的存储过程,当然我们的应用程序不可能使用这么简单的存储过程

,我们需要的是能给存储过程传递参数,以返回给我们所需要的结果数据。下面就了解下存

储过程的参数。
存储过程的参数
通常存储过程接受用户的参数,返回结果给调用用户。
mysql教程规定对于存储过程的参数要求其每个参数都必须声明其参数名,数据类型以及该参数是

输入参数还是用于返回信息还是两者兼有,对于存储函数php教程只支持输入参数。
声明参数时规定要使用关键字IN,OUT,INOUT。
其中:
 IN:用于输入参数
 OUT:用于返回参数
 INOUT:用于向存储过程传递参数值,如果该值改变则返回
另外规定对于声名为OUT,INOUT的参数当我们调用存储过程时需要在参数名前加@,以确保参

数在过程外调用,下面我们修改上面的存储过程以传递信息编号给存储过程select_news,返

回对应的信息标题给我们查看。

drop procedure if exists select_news;
create procedure select_news(IN id int,OUT title varchar(200))
select db_news.title from db_news where db_news.id=id;

在终端运行并调用
 
注意调用格式
call select_news(1,@title);
其中1是我们要传入的信息编号,title是要返回的对应信息编号标题,由于是OUT所以再调用

时要在其前加@在过程外调用。(见下例)
drop procedure if exists getNum;
create procedure getNum(OUT num int)
select 100 into num;

call getNum(@num);
select @num;
截图:


 

php存储例程、存储过程进阶学习之二
接着上篇文章,再调用有返回值时上个例子我们可以使用以下的方法调用存储过程:
select @返回参数;
我们现在使用这个方法来调用上面我们创建的select_news,来看看
 
有人会疑问为什么返回的title是null,而不是像call select_news(1,@title)一样返回的是

我们数据库编号对应的数据First App,这是由于我们的存储过程体并没有给title返回参数返

回值。

下面我们来看看存储函数
仍然以db_news表为例说明,不过我们在这个存储函数中我们加入其他一些关于存储例程的知

识来引入我们这次要谈及的学习对象。

drop function if exists count_news;
delimiter //
create function count_news(hits int) returns int
comment '根据传入的点击次数统计超过此点击数的信息数目'
begin
   declare total_news int;
   declare hits_num int default 0;
   if hits>=0 then
      set hits_num=hits;
      select count(id) into total_news from db_news where db_news.hits>hits_num;
  else
     set total_news=0;
   end if;
   return total_news;
end;
//
delimiter ;


 


在上面的存储函数中我们使用到了存储例程变量的声明、设置其值、判断语句、存储函数特

有的返回值类型及存储例程如何描述(comment).

与存储过程返回参数不同的是存储函数在定义时没用直接声明哪个变量是返回参数,而只是

使用了returns声明了返回参数所属的数据类型,返回参数是在函数体中使用return返回要返

回的数据变量的形式来表示的。这就需要注意的是:
存储函数只支持输入参数,并且输入参数前没有IN或INOUT.

返回上面的存储函数,我们来解释下代码含义:
drop function if exists count_news;
如果存在存储函数count_news则删除该存储函数,与存储过程一样我们可以使用下面的语句

删除存储过程或函数
drop procedure|function [if exists] 存储过程名|存储函数名;
delimiter //
使用delimiter更改mysql默认使用分号(;)使用新的结束符号来结束当前语句,使用

delimiter后原先默认的分号(;)结束语句符号不再起作用,直到重新恢复声明结束符后。
create function count_news(hits int) returns int
注意存储函数的参数只有输入参数并且前不再声明IN或INOUT,返回只需声明要返回的数据类


comment '根据传入的点击次数统计超过此点击数的信息数目'
使用comment 来描述该存储过程或存储函数的功能信息。使用格式为 comment '描述字符串

'
begin
   使用begin限定一个处理模块
declare total_news int;
声明变量 格式 declare 变量名 数据类型 [default 默认值]
   declare hits_num int default 0;
声明变量 格式 declare 变量名 数据类型 [default 默认值]
   if hits>=0 then
      set hits_num=hits;
      使用set 给变量赋值
select count(id) into total_news from db_news where db_news.hits>hits_num;
sql语句可以使用into给变量赋值
   else
     set total_news=0;
   end if;
   上面是一个判断语句,注意格式为if-else-end if 或者 if –else if-else-end if
注意分号(;)
   return total_news;
   使用return 返回存储函数要返回的值,注意该值只能是一个值。
end;
//
delimiter ;
综合一下我们上面的概念知识:
1. 存储函数的参数与存储过程有何不同。
2. 在存储例程中如何更改mysql的默认结束符号。
3. 在存储例程中如何描述功能信息。
4. 声明、设置变量。
5. begin-end语句块。
6. 条件判断if-else if-else-end if 或if-else-end if 或者if-end if

[!--infotagslink--]

相关文章

  • php抓取网站图片并保存的实现方法

    php如何实现抓取网页图片,相较于手动的粘贴复制,使用小程序要方便快捷多了,喜欢编程的人总会喜欢制作一些简单有用的小软件,最近就参考了网上一个php抓取图片代码,封装了一个php远程抓取图片的类,测试了一下,效果还不错分享...2015-10-30
  • mysql 批量更新与批量更新多条记录的不同值实现方法

    批量更新mysql更新语句很简单,更新一条数据的某个字段,一般这样写:复制代码 代码如下:UPDATE mytable SET myfield = 'value' WHERE other_field = 'other_value';如果更新同一字段为同一个值,mysql也很简单,修改下where即...2013-10-04
  • PHP 验证码不显示只有一个小红叉的解决方法

    最近想自学PHP ,做了个验证码,但不知道怎么搞的,总出现一个如下图的小红叉,但验证码就是显示不出来,原因如下 未修改之前,出现如下错误; (1)修改步骤如下,原因如下,原因是apache权限没开, (2)点击打开php.int., 搜索extension=ph...2013-10-04
  • EXCEL数据上传到SQL SERVER中的简单实现方法

    EXCEL数据上传到SQL SERVER中的方法需要注意到三点!注意点一:要把EXCEL数据上传到SQL SERVER中必须提前把EXCEL传到服务器上.做法: 在ASP.NET环境中,添加一个FileUpload上传控件后台代码的E.X: 复制代码 代码如下: if...2013-09-23
  • jQuery Real Person验证码插件防止表单自动提交

    本文介绍的jQuery插件有点特殊,防自动提交表单的验证工具,就是我们经常用到的验证码工具,先给大家看看效果。效果图如下: 使用说明 需要使用jQuery库文件和Real Person库文件 同时需要自定义验证码显示的CSS样式 使用实例...2015-11-08
  • JS实现随机生成验证码

    这篇文章主要为大家详细介绍了JS实现随机生成验证码,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2021-09-06
  • vue实现用户登录切换

    这篇文章主要为大家详细介绍了vue实现用户登录切换,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2021-04-22
  • Jquery插件实现点击获取验证码后60秒内禁止重新获取

    通过jquery.cookie.js插件可以快速实现“点击获取验证码后60秒内禁止重新获取(防刷新)”的功能效果图:先到官网(http://plugins.jquery.com/cookie/)下载cookie插件,放到相应文件夹,代码如下:复制代码 代码如下: <!DOCTYPE ht...2015-03-15
  • php实现点击可刷新验证码

    验证码类文件 CreateImg.class.php <&#63;php class ValidationCode { private $width,$height,$codenum; public $checkcode; //产生的验证码 private $checkimage; //验证码图片 private $disturbColor = ''; /...2015-11-08
  • 基于JavaScript实现验证码功能

    这篇文章主要介绍了基于JavaScript实现验证码功能的相关资料...2017-04-03
  • PHP翻页跳转功能实现方法

    我们都知道用php+mysql在web 页实现数据库资料全部显示是非常简单而有趣的,数据库资料很少的情况下页面显示还是让人满意的,但是当数据库资料非常多的情况下,页面的显示情况将会变的非常糟糕,下面就来介绍一下如何实现当...2015-11-08
  • 单击按钮发送验证码,出现倒计时的简单实例

    下面小编就为大家带来一篇单击按钮发送验证码,出现倒计时的简单实例。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧 代码...2017-07-06
  • Bootstrap中文本框的宽度变窄并且加入一副验证码图片的实现方法

    这篇文章主要介绍了Bootstrap中文本框的宽度变窄并且加入一副验证码图片的实现方法的相关资料,非常不错,具有参考借鉴价值,需要的朋友可以参考下...2016-06-24
  • PHP验证码生成与验证例子

    验证码是一个现在WEB2.0中常见的一个功能了,像注册、登录又或者是留言页面,都需要注册码来验证当前操作者的合法性,我们会看到有些网站没有验证码,但那是更高级的验证了,...2016-11-25
  • 基于Pytorch版yolov5的滑块验证码破解思路详解

    这篇文章主要介绍了基于Pytorch版yolov5的滑块验证码破解思路详解,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2021-02-25
  • 网页自动调用国内双核浏览器的极速模式的实现方法

    由于国内好几个浏览器都是双核浏览器(蛋痛,做一个浏览器壳就说国产,而且使用率高),有时打开网页会出现不兼容模式,在极速模式下是好的,现在我们来用代码实现网页自动调用国内...2016-09-20
  • jQuery实现发送验证码控制按钮禁用功能

    最近接到新需求,需要实现一个点击发送验证码之后,按钮禁用,在5秒之后取消禁用,看似需求很简单,实现起来还真的好好动动脑筋,下面小编把jquery控制按钮禁用核心代码分享给大家,需要的朋友参考下吧...2021-07-24
  • 工信部的ICP备案网站登录时验证码一直输入不正确怎么回事

    工信部的ICP备案网站登录时验证码一直输入不正确怎么回事,为了防止一些机器采集人工信部对于查询验证做得识别度极低,所以许多的朋友都会发现输入验证码一直有问题了,那...2016-10-10
  • PHP中如何使用session实现保存用户登录信息

    session在php中是一个非常重要的东西,像我们用户登录一般都使用到session这个东西,相对于cookie来说session 要安全很多,同时我们购物车经常使用session来做临时的记录保存哦。使用session保存页面登录信息1、数据库连接...2015-10-21
  • 简单php cookie用户登录实例

    cookie 的用途之一是存储用户在特定网站上的密码和 id。另外,也用于存储起始页的首选项。在提供个人化查看的网站上,将要求阁下的网络浏览器利用阁下计算机硬驱上的少量...2016-11-25