session-Thinkphp框架下验证码问题

问题描述

Thinkphp框架下验证码问题

public function myses(){
import("ORG.Util.Date");
$Setime=session('time');
$Date=new Date;
if($Setime!=NULL){
$diff=$Date->dateDiff("$Setime","s");
if($diff>=10){//判断是否过期
$Setime=$Date->dateAdd($number = 10, $interval = "s");//设置过期时间
session('time',$Setime);//将过期时间存在session里面
session('rand',rand(11111,99999));
echo session('rand');
echo 1111;//session存在,但是时间超过3分钟,重新生成验证码
}
else{
echo $diff;echo "
";
echo session('time'); echo "
";
echo session('rand'); echo "
";

echo 2222;//3分钟内再次获取输出该标示
}
}
else {
$Setime=$Date->dateAdd($number = 10, $interval = "s");//设置过期时间
session('time',$Setime);//将过期时间存在session里面
session('rand',rand(11111,99999));
echo session('rand'); echo "
";
echo session('time'); echo "
";
echo 3333;//session值没有被设置,生成新的验证码
}
}


逻辑应该没有错误,不知道是哪个用法不对,由于对session不熟悉,想这样通过在session中存一个过期时间,如果过期则重新生成。1、帮忙把以上代码改通,2、有更好实现该功能的方法也可以

解决方案

终于找到问题了
1、对session理解不够,
2、上面代码中的问题是:
条件if($Setime!=NULL),其中$Settime是通过dateAdd得来的,是一个**Date对象**

所有if不会判空,但是作为$diff=$Date->dateDiff("$Setime","s"); dateDiff返回的是**字符串**
在代码中应该 session('time',$Setime->format());//将过期时间存在session里面

完整修改后的代码应该是:
function myses(){
import("ORG.Util.Date");
$Setime=session('time');
$Date=new Date;
if($Setime!=NULL){
$diff=$Date->dateDiff("$Setime","s");
if($diff<=0){//判断是否过期
$Setime=$Date->dateAdd($number = 60, $interval = "s");//设置过期时间
session('time',$Setime->format());//将过期时间存在session里面
session('rand',rand(11111,99999));
return session('rand');//session存在,但是时间超过1分钟,重新生成验证码
}
else{
return session('rand');//1分钟内再次获取输
}
}
else {
$Setime=$Date->dateAdd($number = 60, $interval = "s");//设置过期时间
session('time',$Setime->format());//将过期时间存在session里面
session('rand',rand(11111,99999));
return session('rand');//session值没有被设置,生成新的验证码
}
}


解决方案二:

ThinkPHP的验证码问题

解决方案三:

阿罗一群破坏某嘻嘻全心全意

解决方案四:

PHP Session过期时间设定

PHP中主要通过设置session.gc_maxlifetime来设定Session的生存周期。例如:
<?php
ini_set('session.gc_maxlifetime', 3600); //设置时间
ini_get('session.gc_maxlifetime');//得到ini中设定值
?>

封装好的函数,供参考:
<?php
function start_session($expire = 0)
{
if ($expire == 0) {
$expire = ini_get('session.gc_maxlifetime');
} else {
ini_set('session.gc_maxlifetime', $expire);
}

if (empty($_COOKIE['PHPSESSID'])) {
    session_set_cookie_params($expire);
    session_start();
} else {
    session_start();
    setcookie('PHPSESSID', session_id(), time() + $expire);
}

}
?>

使用方法:
加入start_session(600);//600秒以后过期。

解决方案五:

PHP Session过期时间设定

PHP中主要通过设置session.gc_maxlifetime来设定Session的生存周期。例如:
<?php
ini_set('session.gc_maxlifetime', 3600); //设置时间
ini_get('session.gc_maxlifetime');//得到ini中设定值
?>

封装好的函数,供参考:
<?php
function start_session($expire = 0)
{
if ($expire == 0) {
$expire = ini_get('session.gc_maxlifetime');
} else {
ini_set('session.gc_maxlifetime', $expire);
}

if (empty($_COOKIE['PHPSESSID'])) {
    session_set_cookie_params($expire);
    session_start();
} else {
    session_start();
    setcookie('PHPSESSID', session_id(), time() + $expire);
}

}
?>

使用方法:
加入start_session(600);//600秒以后过期。

时间: 2024-08-03 19:53:11

session-Thinkphp框架下验证码问题的相关文章

thinkphp框架下实现登录、注册、找回密码功能_php技巧

本文实例为大家分享了thinkphp框架下使用ajax表单提交的登录.注册.找密码的实现方法,以及注册后的用户需后台审核. user表的字段为id.num.password.name.email.addtime.status 具体代码如下 <?php namespace Home\Controller; use Think\Controller; class LoginController extends Controller { //处理登录 public function signin(){

thinkphp框架下404页面设置 仅三步_php技巧

404页面即系统在找不到请求的操作方法和找不到请求的控制器名称时的一种报错行为的优化. 在很多网站中都会有使用404页面的时候,在ThinkPHP框架中该如何设置呢,接下来我介绍其中一种方法,具体内容如下 第一步:在thinkphp框架中的Home/Comtroller中建一个EmptyController.class.php,其代码如下: <?php namespace HomeController; use ThinkController; class EmptyController ext

thinkphp-Thinkphp框架下,验证码问题

问题描述 Thinkphp框架下,验证码问题 public function myses(){ import("ORG.Util.Date"); $Setime=session('time'); $Date=new Date; if($Setime!=NULL){ $diff=$Date->dateDiff("$Setime","s"); if($diff>=10){//判断是否过期 $Setime=$Date->dateAdd

老生常谈php中传统验证与thinkphp框架(必看篇)

PHP(超文本预处理器)可用于小型网站的搭建,当用户需要注册登录是,需要与后台数据库进行匹配合格才能注册和登录,传统的方式步骤繁多,需要先连接数据库再用sql语句进行插入. <?php header("Content-type: text/html; charset=utf-8"); $conn =mysqli_connect("localhost","root",""); if (!$conn){ echo "

ThinkPHP框架实现session跨域问题的解决方法_php实例

ThinkPHP的session跨域问题很多开发者都遇到过! 其实不管是ThinkPHP还是php本身,在解决session跨域问题的时候都需要设置session.cookie_domain. 在ThinkPHP里,需要修改配置文件conf/config.php 在第一行加上: ini_set('session.cookie_domain', ".domain.com");//跨域访问Session 经过总结,针对session跨域这一问题的解决方法主要有以下几种: 第一种情况:如果你

thinkphp 模板系统-thinkphp框架+模板 html中的{abc:$Think.session.uname}定义是什么意思?

问题描述 thinkphp框架+模板 html中的{abc:$Think.session.uname}定义是什么意思? 在html模板的html中有以下定义: {abc:$Think.session.uname} {}大括号中的abc能修改吗?在哪里定义的?

ThinkPHP框架自定义SESSION处理例子(1/3)

使用ThinkPHP的同志应该都知道,在ThinkPHP中,可以使用数据库来处理SESSION.具体的实现过程如下: ThinkPHP自定义SESSION驱动之数据库存储 在ThinkPHP中,SESSION相关的数据库驱动已经给了,如果你下载的是ThinkPHP完整包的话,你应该在ThinkPHP目录下看到Extend目录,在此目录下,你应该会看到Driver/Session/SessionDb.class.php文件.这个就是ThinkPHP中数据库处理SESSION的驱动. 要在Think

ThinkPHP框架入门知识

 ThinkPHP 是一个免费开源的,快速.简单的面向对象的 轻量级PHP开发框架 ,创立于2006年初,遵循Apache2开源协议发布,是为了敏捷WEB应用开发和简化企业应用开发而诞生的.ThinkPHP从诞生以来一直秉承简洁 实用的设计原则,在保持出色的性能和至简的代码的同时,也注重易用性.并且拥有众多的原创功能和特性,在社区团队的积极参与下,在易用性.扩展性和性能方 面不断优化和改进,已经成长为国内最领先和最具影响力的WEB应用开发框架,众多的典型案例确保可以稳定用于商业以及门户级的开发.

PHP框架 ThinkPHP框架入门知识

ThinkPHP 是一个免费开源的,快速.简单的面向对象的 轻量级PHP开发框架 ,创立于2006年初,遵循Apache2开源协议发布,是为了敏捷WEB应用开发和简化企业应用开发而诞生的.ThinkPHP从诞生以来一直秉承简洁 实用的设计原则,在保持出色的性能和至简的代码的同时,也注重易用性.并且拥有众多的原创功能和特性,在社区团队的积极参与下,在易用性.扩展性和性能方 面不断优化和改进,已经成长为国内最领先和最具影响力的WEB应用开发框架,众多的典型案例确保可以稳定用于商业以及门户级的开发.