php+mysql+session登录实例程序代码

 更新时间:2016年11月25日 15:03  点击:1294
在php中我们要登录一般我们都是结合mysql session这两个结合实现的,下面我举一个例子来介绍php+mysql+session登录实例程序代码,有需要学习的朋友可参考。

实例

 代码如下 复制代码

<?php
// 为php和mysql剔除不安全html代码。
function safestrip($string){
   $string = strip_tags($string);
   $string = mysql_real_escape_string($string);
   return $string;
}
 
//登录信息显示函数
function messages() {
 $message = '';
 if($_SESSION['success'] != '') {
   $message = '<span id="message">'
   .$_SESSION['success'].'</span>';
   $_SESSION['success'] = '';
 }
 if($_SESSION['error'] != '') {
   $message = '<span id="message">'
   .$_SESSION['error'].'</span>';
   $_SESSION['error'] = '';
 }
 return $message;
}
 
// 用户登录函数
function login($username, $password){
 
//过滤用户输入的用户名和密码
$user = safestrip($username);
$pass = safestrip($password);
 
//将密码转换为md5格式
$pass = md5($pass);
 
 // 查询数据库中用户名和密码是否匹配
 $sql =
 mysql_query("SELECT * FROM user_table WHERE username = '$user'
 AND password = '$pass'")or die(mysql_error());
 
 //如果=1则表示认证成功
 if (mysql_num_rows($sql) == 1) {
 
             //开始记录在session中
             $_SESSION['authorized'] = true;
 
             // 重新加载页面
            $_SESSION['success'] = '登录成功';
            header('Location: ./index.php');
            exit;
 
 } else {
       // 登录失败记录在session中
       $_SESSION['error'] = '非常抱歉,您输入的用户名或密码有误';
 }
}
?>

原理很简单,用户提交用户名与密码然后我们经过安全处理,然后再到mysql去精确比较如果相同就登录成功了。

在php中我们要获取浏览器信息可以直接使用$userAgent = strtolower($_SERVER[\"HTTP_USER_AGENT\"]);然后再判断一下就可以判断用户浏览器版本或型号了,希望下面的实例对大家有所帮助。

下面笔者为各位介绍一款如何判断用户浏览器是不是IE6的php函数,如果是返回“真”,否则返回“假”。

 代码如下 复制代码

function isIE6() {
       $userAgent = strtolower($_SERVER["HTTP_USER_AGENT"]);
       //从HTTP_USER_AGENT字段中获取用户浏览器信息
       if (ereg("msie 6", $userAgent) || ereg("msie 5", $userAgent)) {
               return true;
       }
       return false;
}

完整点的实例

 代码如下 复制代码

function userBrowser(){ 
       $user_OSagent = $_SERVER['HTTP_USER_AGENT'];  
    
        if(strpos($user_OSagent,"Maxthon") && strpos($user_OSagent,"MSIE")) {  
           $visitor_browser ="Maxthon(Microsoft IE)";  
       }elseif(strpos($user_OSagent,"Maxthon 2.0")) {  
            $visitor_browser ="Maxthon 2.0";  
       }elseif(strpos($user_OSagent,"Maxthon")) {  
           $visitor_browser ="Maxthon";  
        }elseif(strpos($user_OSagent,"MSIE 9.0")) {  
           $visitor_browser ="MSIE 9.0";  
       }elseif(strpos($user_OSagent,"MSIE 8.0")) {  
            $visitor_browser ="MSIE 8.0";  
       }elseif(strpos($user_OSagent,"MSIE 7.0")) {  
            $visitor_browser ="MSIE 7.0";  
        }elseif(strpos($user_OSagent,"MSIE 6.0")) {  
           $visitor_browser ="MSIE 6.0";  
        } elseif(strpos($user_OSagent,"MSIE 5.5")) {  
            $visitor_browser ="MSIE 5.5";  
        } elseif(strpos($user_OSagent,"MSIE 5.0")) {  
            $visitor_browser ="MSIE 5.0";  
        } elseif(strpos($user_OSagent,"MSIE 4.01")) {  
          $visitor_browser ="MSIE 4.01";  
        }elseif(strpos($user_OSagent,"MSIE")) {  
           $visitor_browser ="MSIE 较高版本";  
      }elseif(strpos($user_OSagent,"NetCaptor")) {  
            $visitor_browser ="NetCaptor";  
        } elseif(strpos($user_OSagent,"Netscape")) {  
           $visitor_browser ="Netscape";  
      }elseif(strpos($user_OSagent,"Chrome")) {  
           $visitor_browser ="Chrome";  
        } elseif(strpos($user_OSagent,"Lynx")) {  
          $visitor_browser ="Lynx";  
       } elseif(strpos($user_OSagent,"Opera")) {  
           $visitor_browser ="Opera";  
        } elseif(strpos($user_OSagent,"Konqueror")) {  
            $visitor_browser ="Konqueror";  
        } elseif(strpos($user_OSagent,"Mozilla/5.0")) {  
            $visitor_browser ="Mozilla";  
        } elseif(strpos($user_OSagent,"Firefox")) {  
           $visitor_browser ="Firefox";  
       }elseif(strpos($user_OSagent,"U")) {  
            $visitor_browser ="Firefox";  
       } else {  
           $visitor_browser ="其它";  
        }  
           return $visitor_browser;  
       } 

PHP 可以自动进行内存管理,清除不再需要的对象。PHP使用了引用计数(reference counting)这种单纯的垃圾回收(garbage collection)机制。每个对象都内含一个引用计数器,每个reference连接到对象,计数器加1。当reference离开生存空间或被设为 NULL,计数器减1。当某个对象的引用计数器为零时,PHP知道你将不再需要使用这个对象,释放其所占的内存空间

php 5.3之前使用的垃圾回收机制是单纯的“引用计数”,也就是每个内存对象都分配一个计数器,当内存对象被变量引用时,计数器+1;当变量引用撤掉后,计数器-1;当计数器=0时,表明内存对象没有被使用,该内存对象则进行销毁,垃圾回收完成。

“引用计数”存在问题,就是当两个或多个对象互相引用形成环状后,内存对象的计数器则不会消减为0;这时候,这一组内存对象已经没用了,但是不能回收,从而导致内存泄露;

php5.3开始,使用了新的垃圾回收机制,在引用计数基础上,实现了一种复杂的算法,来检测内存对象中引用环的存在,以避免内存泄露。

 

php变量存在一个叫"zval"的变量容器中,"zval"变量容器包括含变量的类型和值,还包括额外的两个字节信息,分别是“is_ref”表示变量是否属于引用,“refcount”指向这个zval变量容器的变量个数。

如果你安装了xdebug,就可以用xdebug_debug_zval()显示“zval”的信息了。如下:

<?php
 $str = "www.111cn.net";
 xdebug_debug_zval('str');


结果:

str:

(refcount=1, is_ref=0),

string 'phpddt.com' (length=10)

只有当变量容器在”refcount“变成0时就被销毁.当你unset()一个变量时,想要的“zval”中refcount就会减1,再来说说前几天遇到的unset引用问题:

 

 代码如下 复制代码

<?php
 $a = "aaa";
 $b = & $a;
 unset($a);
 //echo $b; //这里依然会输出aaa,用xdebug_debug_zval打印你就知道为什么了
 xdebug_debug_zval("b");

 

结果:

b:

(refcount=1, is_ref=0),string 'aaa' (length=3)

继续说引用计数器问题,对于array和object符合类型情况又不一样了:

 

 代码如下 复制代码

<?php
 
 $arr = array( 'a' => 'aaa', 'b' => "bbb" );
 xdebug_debug_zval( 'arr' );
 $arr['aaa'] = $arr['a'];
 xdebug_debug_zval( 'arr' );
?>


结果:

arr:

(refcount=1, is_ref=0),

array

  'a' => (refcount=1, is_ref=0),string 'aaa' (length=3)

  'b' => (refcount=1, is_ref=0),string 'bbb' (length=3)

arr:

(refcount=1, is_ref=0),

array

  'a' => (refcount=2, is_ref=0),string 'aaa' (length=3)

  'b' => (refcount=1, is_ref=0),string 'bbb' (length=3)

  'aaa' => (refcount=2, is_ref=0),string 'aaa' (length=3)


可以看到看到原有的数组元素和新添加的数组元素关联到同一个"refcount"2的zval变量容器.这里我也只是起到抛砖引玉的作用。

上面我们只是简单的使用了unset,null,mysql_close,__destruct,xdebug_debug_zval 接着往下看


查看内存是否泄露

看是否有该释放的内存没有被释放,可以简单的通过 调用  memory_get_usage  函数查看内存使用情况来判断;memory_get_usage 函数返回的内存使用数据据说不是很准确,可以使用  php 的 xdebug 扩展来获得更准确翔实的内存使用情况。

 代码如下 复制代码

class A{
    private $b;
    function __construct(){
        $this->b = new B($this);
    }
    function __destruct(){
        //echo "A destructn";
    }
}

class B{
    private $a;
    function __construct($a){
        $this->a = $a;
    }
    function __destruct(){
        //echo "B descturctn";
    }
}

for($i=0;;$i++){
    $a = new A();
    if($i%1000 == 0){
        echo memory_get_usage()."n";
    }

}

}

上面就构造了一个会产生环状引用的例子;每次创建一个A对象的实例a,a就创建一个B对象的实例b,同时让b引用a ;这样,每个A对象永远被一个B引用,而每个B对象同时被一个对象A引用;引用环就这样产生了。

在php5.2的环境下执行这段代码,会发现内存使用在单调上涨,也没有A和B的析构函数被执行后输出的“A/B desctruct”信息;直到内存耗尽,输出“PHP Fatal error:  Allowed memory size of 134217728 bytes exhausted (tried to allocate 40 bytes)”。

在php5.3的环境下执行这段代码,则发现内存使用在上跳下窜,但是永远没有超过一个限额;程序也会输出大量的“A/B desctruct”,这说明析构函数被调用了。

我的同事的程序中,就存在这种引用的环路,而他的脚本,实在php5.2.3下执行的。simple_html_dom工具中,有两个类,分别是simple_html_dom和simple_html_dom_node,前者中有一个数组成员变量nodes,数组中每个元素都是一个simple_html_dom_node对象;而每个simple_html_dom_node对象都有一个成员变量dom,该dom的值就是前面的simple_html_dom对象——这样就形成了一个漂亮的引用环,导致了内存泄露。解决的办法也很简单,就是simple_html_dom对象在使用完毕时,主动调用其clear函数,清空其成员变量nodes,环就被打破了,内存泄露也就不会发生了。

 


3.其他:

1)垃圾回收的时机


Php中,引用计数为0,则内存立刻释放;也就是说,不存在环状引用的变量,离开变量的作用域,内存被立刻释放。

环状引用检测则是在满足一定条件下触发,所以在上面的例子中,会看到使用的内存有大幅度的波动;也可以通过 gc_collect_cycles 函数来主动进行环状引用检测。

2) &符号的影响

显式引用一个变量,会增加该内存的引用计数:

$a = "something";

$b = &$a;

此时unset($a), 但是仍有$b指向该内存区域的引用,内存不会释放。

3)unset函数的影响

unset只是断开一个变量到一块内存区域的连接,同时将该内存区域的引用计数-1;在上面的例子中,循环体内部,$a=new A(); unset($a);并不会将$a的引用计数减到零;

4)= null 操作的影响;

$a = null 是直接将$a 指向的数据结构置空,同时将其引用计数归0。

5)脚本执行结束的影响

脚本执行结束,该脚本中使用的所有内存都会被释放,不论是否有引用环。

利用php来验证日期格式我们可以使用checkdate()函数与正则表达式来验证,下面我一一给各位同学介绍了我在验证日期格式一些过程,最终得出最简单办法。

1.使用正则验证日期时间格式
主要使用ereg、preg_match等php函数。
有个非常简单的,

 代码如下 复制代码
$dateTime=”2010-6-4 00:00:00″;
if(preg_match(“/^d{4}-d{2}-d{2} d{2}:d{2}:d{2}$/s”,$dateTime))
{
echo “Yes”;
}else{
echo “No”;
}

可是这个正则只验证了数字,并未对边界值进行验证,并不全面,于是有人写了这个正则

 代码如下 复制代码

regex = “^((d{2}(([02468][048])|([13579][26]))[-/s]?((((0?[13578]
)|(1[02]))[-/s]?((0?[1-9])|([1-2][0-9])|(3[01])))|(((0?[4
69])|(11))[-/s]?((0?[1-9])|([1-2][0-9])|(30)))|(0?2[-/
s]?((0?[1-9])|([1-2][0-9])))))|(d{2}(([02468][1235679])|([1
3579][01345789]))[-/s]?((((0?[13578])|(1[02]))[-/s]?((
0?[1-9])|([1-2][0-9])|(3[01])))|(((0?[469])|(11))[-/s]?((
0?[1-9])|([1-2][0-9])|(30)))|(0?2[-/s]?((0?[1-9])|(1[0-9]
)|(2[0-8])))))) “; //日期部分
regex += “(s(((0?[0-9])|([1-2][0-3])):([0-5]?[0-9])((s)|(:([0-5]?[0-9])))))?$”; //时间部分

丫的这简直就是神的作品。
于是我不得不放弃使用正则来验证时间格式合法性。

2.对时间字符串进行拆解分别验证日期时间格式。
主要用到checkdate等php函数。
这个方法很不错,验证也准确,可是代码写起来麻烦,需要将日期和时间分别拆解,日期使用checkdate($k[1],$k[2],$k[0])验证,时间又需要拆解逐个检查。

其实可以综合了上述两种方法来使用,操作也方便得多。
1.首先使用正则验证是否为“2011-11-07 12:30:55”这种格式。

 代码如下 复制代码
preg_match(“/^d{4}-d{2}-d{2} d{2}:d{2}:d{2}$/s”,$dateTime)

就可以了
2.然后使用strtotime()函数判断验证,传入日期字符串即可。
strtotime()函数默认返回指定日期时间字符串对应的UNIX时间戳。
strtotime()函数有个特点,就是如果传入日期字符串格式错误的话会返回false,而且支持各种的日期格式,非常方便。

随机抽取一些元素这个功能实现方法很简单,只要使用array_rand与range就可以实现了,如果随便抽取一个元素就直接使用mt_rand然后长成随机数长度不超过数组长度即可。

下面我先给大家提供几种方法,供大家参考。


方法-:

 代码如下 复制代码

$arr = range(1,10,1);
   
$newarr = array_rand($arr,6);    //随机获取6个数组中的键
   
$newArr = array_flip($newarr);   //键与值互换
   
$arr3 = array_diff_key($arr,$newArr); //取键相同的
   
$arr1 = array_diff_key($arr,$arr3);  //取键相同的
   
print_r($arr1);

结果: Array ( [0] => 1 [1] => 2 [2] => 3 [3] => 4 [5] => 6 [9] => 10 )

方法二:

 代码如下 复制代码

$arr = range(1,10,1);
   
$newarr = array_rand($arr,6);    //随机获取6个数组中的键
   
$ArrNew = array();
   
foreach($newarr as $k=>$v)

   $ArrNew[$v] = $arr[$v];    
}
   
print_r($ArrNew);

结果:Array ( [1] => 2 [2] => 3 [3] => 4 [4] => 5 [6] => 7 [7] => 8 )

方法三:这种方法没有保留键名,供大家参考一下.

 代码如下 复制代码

$arr = range(1,10,1);
  
shuffle($arr);   //打乱数组
  
$newarr = array_splice($arr,0,6);
  
print_r($newarr);

结果:Array ( [0] => 7 [1] => 4 [2] => 2 [3] => 10 [4] => 9 [5] => 6 )

[!--infotagslink--]

相关文章

  • PHP session_start()很慢问题分析与解决办法

    本文章来给各位同学介绍一下关于PHP session_start()很慢问题分析与解决办法,希望碰到此问题的同学可进入参考。 最近在做东西的时候发现一个问题 有一个接口挂...2016-11-25
  • php中登录后跳转回原来要访问的页面实例

    在很多网站用户先访问一个要登录的页面,但当时没有登录后来登录了,等待用户登录成功之后肯定希望返回到上次访问的页面,下面我就来给大家介绍登录后跳转回原来要访问的页...2016-11-25
  • 不打开网页直接查看网站的源代码

      有一种方法,可以不打开网站而直接查看到这个网站的源代码..   这样可以有效地防止误入恶意网站...   在浏览器地址栏输入:   view-source:http://...2016-09-20
  • php 调用goolge地图代码

    <?php require('path.inc.php'); header('content-Type: text/html; charset=utf-8'); $borough_id = intval($_GET['id']); if(!$borough_id){ echo ' ...2016-11-25
  • JS基于Mootools实现的个性菜单效果代码

    本文实例讲述了JS基于Mootools实现的个性菜单效果代码。分享给大家供大家参考,具体如下:这里演示基于Mootools做的带动画的垂直型菜单,是一个初学者写的,用来学习Mootools的使用有帮助,下载时请注意要将外部引用的mootools...2015-10-23
  • php中用curl模拟登录discuz以及模拟发帖

    本文章完美的利用了php的curl功能实现模拟登录discuz以及模拟发帖,本教程供参考学习哦。 代码如下 复制代码 <?php $discuz_url = &lsquo;ht...2016-11-25
  • JS+CSS实现分类动态选择及移动功能效果代码

    本文实例讲述了JS+CSS实现分类动态选择及移动功能效果代码。分享给大家供大家参考,具体如下:这是一个类似选项卡功能的选择插件,与普通的TAb区别是加入了动画效果,多用于商品类网站,用作商品分类功能,不过其它网站也可以用,...2015-10-21
  • JS实现自定义简单网页软键盘效果代码

    本文实例讲述了JS实现自定义简单网页软键盘效果。分享给大家供大家参考,具体如下:这是一款自定义的简单点的网页软键盘,没有使用任何控件,仅是为了练习JavaScript编写水平,安全性方面没有过多考虑,有顾虑的可以不用,目的是学...2015-11-08
  • php 取除连续空格与换行代码

    php 取除连续空格与换行代码,这些我们都用到str_replace与正则函数 第一种: $content=str_replace("n","",$content); echo $content; 第二种: $content=preg_replac...2016-11-25
  • php简单用户登陆程序代码

    php简单用户登陆程序代码 这些教程很对初学者来讲是很有用的哦,这款就下面这一点点代码了哦。 <center> <p>&nbsp;</p> <p>&nbsp;</p> <form name="form1...2016-11-25
  • PHP实现清除wordpress里恶意代码

    公司一些wordpress网站由于下载的插件存在恶意代码,导致整个服务器所有网站PHP文件都存在恶意代码,就写了个简单的脚本清除。恶意代码示例...2015-10-23
  • JS实现双击屏幕滚动效果代码

    本文实例讲述了JS实现双击屏幕滚动效果代码。分享给大家供大家参考,具体如下:这里演示双击滚屏效果代码的实现方法,不知道有觉得有用处的没,现在网上还有很多还在用这个特效的呢,代码分享给大家吧。运行效果截图如下:在线演...2015-10-30
  • js识别uc浏览器的代码

    其实挺简单的就是if(navigator.userAgent.indexOf('UCBrowser') > -1) {alert("uc浏览器");}else{//不是uc浏览器执行的操作}如果想测试某个浏览器的特征可以通过如下方法获取JS获取浏览器信息 浏览器代码名称:navigator...2015-11-08
  • JS日期加减,日期运算代码

    一、日期减去天数等于第二个日期function cc(dd,dadd){//可以加上错误处理var a = new Date(dd)a = a.valueOf()a = a - dadd * 24 * 60 * 60 * 1000a = new Date(a)alert(a.getFullYear() + "年" + (a.getMonth() +...2015-11-08
  • PHP开发微信支付的代码分享

    微信支付,即便交了保证金,你还是处理测试阶段,不能正式发布。必须到你通过程序测试提交订单、发货通知等数据到微信的系统中,才能申请发布。然后,因为在微信中是通过JS方式调用API,必须在微信后台设置支付授权目录,而且要到...2014-05-31
  • Ruby on Rails实现最基本的用户注册和登录功能的教程

    这里我们主要以has_secure_password的用户密码验证功能为中心,来讲解Ruby on Rails实现最基本的用户注册和登录功能的教程,需要的朋友可以参考下...2020-06-30
  • PHP常用的小程序代码段

    本文实例讲述了PHP常用的小程序代码段。分享给大家供大家参考,具体如下:1.计算两个时间的相差几天$startdate=strtotime("2009-12-09");$enddate=strtotime("2009-12-05");上面的php时间日期函数strtotime已经把字符串...2015-11-24
  • PHP分布式框架如何使用Memcache同步SESSION教程

    本教程主要讲解PHP项目如何用实现memcache分布式,配置使用memcache存储session数据,以及memcache的SESSION数据如何同步。 至于Memcache的安装配置,我们就不讲了,以前...2016-11-25
  • php怎么用拼音 简单的php中文转拼音的实现代码

    小编分享了一段简单的php中文转拼音的实现代码,代码简单易懂,适合初学php的同学参考学习。 代码如下 复制代码 <?phpfunction Pinyin($_String...2017-07-06
  • PHP中SSO Cookie登录分析和实现

    什么是SSO?单点登录SSO(Single Sign-On)是身份管理中的一部分。SSO的一种较为通俗的定义是:SSO是指访问同一服务器不同应用中的受保护资源的同一用户,只需要登录一次,即通过一个应用中的安全验证后,再访问其他应用中的受保护...2015-11-08