php中session常见问题分析
1. 错误提示
引用
代码如下 | 复制代码 |
Warning: Cannot send session cookie - headers already sent |
分析及解决办法
这一类问题,的原因是你在程序中使用session_start()时,之前已经有实际的html内容输出了。或许你说,我没有啊,我只不过是echo或 print一条消息了。很抱歉,你的echo或print语句所产生的输出,就是实际的html内容输出。解决此类问题的办法是,将你的 session_start()调到程序的第一行。
2. 错误提示
引用
代码如下 | 复制代码 |
Warning: open(F:/689\php\sessiondata\sess_66a39376b873f4daecf239891edc98b5, O_RDWR) failed |
分析及解决方法
出现这样的错误语句一般是因为你的php.ini中关于session.save_path一项没有设置好,解决的方法是将session.save_path和session.cookie_path 设置置为
引用
代码如下 | 复制代码 |
session_save_path = c:\temp |
然后在c:\目录下建立一个temp目录,即可
3. 错误提示
引用
代码如下 | 复制代码 |
Warning: Trying to destroy uninitialized session in |
分析及解决方法
出类这样的提示,一般情况都是你直接调session_destroy()函数造成的。很多的朋友认为session_destroy()函数可以独立的运行,其实不然。解决的方法是在你调session_destroy()函数之前,要用session_start()开启session的功能。
4.问题:怎么获得当前session的id值呢?
最简单的方法是:
echo SID;
你会发现的。
5. 问题:我的程序,在调用header函数之前没有任何的输出,虽然我include了一个config.php文件,但在config.php文件中也没有任何的输出,为什么session还是会报出与问题1同样的错误呢,是不是因为我在header之前用了session_start()的缘故呢?
答: 或许你确实认真的检查了你的php程序,在引用header()之前确实也没有任何的输出,并且在你的include文件中也没有任何的输出!但是你是否用光标键在? >这个PHP代码结束语句后移动检查呢?那么你会发现在? >这个后面,有一个空行或几个空格,你删除了这几个空行或空格,那么问题就解决了。
注:此问题,会出PHP4.1.2中,更高版本,没有测试过。
6.问:用session做登录主页面后,其它页面怎么用session限制登录
答:最简单的方法是
代码如下 | 复制代码 |
session_start(); if(!session_registered('login') ││ $login != true) { echo "你没有登陆"; exit; } session_start(); if(!session_registered('login') ││ $login != true) { echo "你没有登陆"; exit; } |
7.问题:我用session_register()注册了session变量,可是当我用header或用javs script的重定向语句,那么在一下页面中,我却访问不到session所注册的变量值。请问如何解决?
问题的程序片段:
代码如下 | 复制代码 |
<?php session_start(); $ok = 'love you'; session_register('ok'); header("location : next.php"); ? > <?php session_start(); $ok = 'love you'; session_register('ok'); header("location : next.php"); ? > |
next.php
代码如下 | 复制代码 |
<?php |
解决的方法:
当你用header函数或window.location这样的功能后,你上一个页面所注册的session变量,就会容易的丢失,关于这个问题的原因,至今仍没有一个详细的回答。
不过有解决的方法。如下所示
代码如下 | 复制代码 |
|
在跳转到下一页面的时候,将session的当前id做为一个参数,传到后一个页面。
8.session如何传数组
代码如下 | 复制代码 |
session_register('data');
|
方法是先注册后赋值
9.问题:我是不是可以用像$HTTP_GET_VARS['**']方式来访问session值呢?
回答:可以,你可以使用如下global数组来访问session,以加强网页的安全性
$HTTP_SESSION_VARS
$_SESSION
例程:
代码如下 | 复制代码 |
<?php echo $HTTP_SESSION_VARS['username']; |
请参照此例程修改符合您自己的程序。
问题10: session_unregister() 和 session_destroy() 有何区别?
session_unregister ()函数主要作用是注消当前的一个session变量。不过要注意的是,如果你用$HTTP_SESSION_VARS或$_SESSION在当前页面中引用过session变量,那么你可能需要和unset()配合 来注消session变量。
而session_destroy()是清除当前的session环境。意思就是说,当你用session_destroy()函数后,那么你就不可能再用session_is_registered ()来检测session的变量了。但是需要注意的是他不能清除global中的session或使用了session cookie的中的session.所以在用session_destroy之前,最好不要用$HTTP_SESSION_VARS $_SESSION来访问session.
例程:
代码如下 | 复制代码 |
if(isset($_COOKIE[session_name()])) { session_start(); session_destroy(); unset($_COOKIE[session_name()]); } |
解决办法
函数 set_magic_quotes_runtime() 在php5.3以后的版本可用
代码如下 | 复制代码 |
ini_set(“magic_quotes_runtime”, 0) |
来替换了,方法简单吧。
其实在php中比较两个日期有很多方法,我最常用的就是把日期利用strtotime函数把它转换成数字,然后进行加减了,下面看实例。代码如下 | 复制代码 |
<?php // 将日期化成数组,以便制作时间戳 // 制作时间戳 // 日期比较 // 输出结果 |
方法二
代码如下 | 复制代码 |
<?php // 用php自带函数strtotime对日期进行时间戳格式化 // 日期比较 // 输出结果 |
功能 |
说明 |
实例 |
checkdate($month, $date, $year) |
如果应用的值构成一个有效日期,则该函数返回为真。例如,对于错误日期2005年2月31日,此函数返回为假。 在日期用于计算或保存在数据库中之前,可用此函数检查日期并使日期生效。 |
<?php // returns false echo checkdate(2,30,2005) ? "valid" : "invalid";
// returns true echo checkdate(4,6,2010) ? "valid" : "invalid"; ?> |
getdate($ts) |
在没有自变量的情况下,该函数以结合数组的方式返回当前日期与时间。数组中的每个元素代表日期/时间值中的一个特定组成部分。可向函数提交可选的时间标签自变量,以获得与时间标签对应的日期/时间值。 应用此函数来获得一系列离散的,容易分离的日期/时间值。 |
<?php // returns timestamp for 13:15:23 7-Jun-2006 echo mktime(13,15,23,6,7,2006); ?> |
mktime($hour, $minute, $second, $month, $day, $year) |
此函数的作用与getdate()的作用相反:它由一系列的日期与时间值生成一个UNIX时间标签(GMT时间1970年1月1日到现在消逝的秒数)。不用自变量时,它生成当前时间的UNIX时间标签。 用此函数获得即时时间的UNIX时间标签。这种时间标签通常用于许多数据库与程序语言中。 |
<?php // returns timestamp for 13:15:23 7-Jun-2006 echo mktime(13,15,23,6,7,2006); ?> |
date($format, $ts) |
此函数将UNIX时间标签格式化成一个可人为阅读的日期字符串。它是PHP日期/时间API中功能最为强大的函数,可用在一系列的修正值中,将整数时间标签转变为所需的字符串格式。
为显示格式化时间或日期时,应用此函数。 |
<?php // format current date // returns "13-Sep-2005 01:16 PM" echo date("d-M-Y h:i A", mktime ()); ?> |
strtotime ($str) |
此函数将可人为阅读的英文日期/时间字符串转换成UNIX时间标签。 应用此函数将非标准化的日期/时间字符串转换成标准、兼容的UNIX时间标签。 |
<?php // returns 13-Sep-05 echo date("d-M-y", strtotime("today"));
// returns 14-Sep-05 echo date("d-M-y", strtotime("tomorrow"));
// returns 16-Sep-05 echo date("d-M-y", strtotime("today +3 days")); ?> |
strftime ($format, $ts) |
如前面的setlocale()函数定义的那样,此函数将UNIX时间标签格式化成适用于当前环境的日期字符串。 应用此函数建立与当前环境兼容的日期字符串。 |
<?php // set locale to France (on Windows) setlocale(LC_TIME, "fra_fra");
// format month/day names // as per locale setting // returns "septembre" and "mardi" echo strftime("Month: %B "); echo strftime("Day: %A "); ?> |
microtime() |
此函数返回GMT时间1970年1月1日到现在所消逝的秒数与微秒数。 在基准特定的代码块,准确测量它的执行时间时应用此函数。 |
<?php // get starting value $start = microtime();
// run some code for ($x=0; $x<1000; $x++) { ???$null = $x * $x; }
// get ending value $end = microtime();
// calculate time taken for code execution echo "Elapsed time: " . ($end -
$start) ." sec"; ?> |
gmmktime ($hour, $minute, $second, $month, $day, $year) |
此函数由一系列用GMT时间表示的日期与时间值生成一个UNIX时间标签。不用自变量时,它生成一个当前GMT即时时间的UNIX时间标签。 用此函数来获得GMT即时时间的UNIX时间标签。 |
<?php // returns timestamp for 12:25:23 9-Jul-2006 echo gmmktime (12,25,23,7,9,2006); ?> |
gmdate ($format, $ts) |
此函数将UNIX时间标签格式化成可人为阅读的日期字符串。此日期字符串以GMT(非当地时间)表示。 用GMT表示时间标签时应用此函数。 |
<?php // format current date into GMT // returns "13-Sep-2005 08:32 AM" echo gmdate("d-M-Y h:i A", mktime()); ?> |
date_default_ timezone_set ($tz)and date_default_ timezone_get() |
此函数此后所有的日期/时间函数调用设定并恢复默认的时区。 注:此函数仅在PHP 5.1+中有效。 此函数是一个方便的捷径,可为以后的时间操作设定时区。 |
<?php // set timezone to UTC date_default_timezone_set ('UTC'); ?> |
本文章收藏了关于PHP命令行模式提示”没有找到php_mbstring.dll,文件无法启动”多种解决办法,有需要的朋友可以参考一下。
解决方法:
在php.ini文件中将 extension=php_mbstring.dll 移动到 extension=php_exif.dll 之前即可.
原因就是exif要调用mbstring, 所以mbstring必须在前面.
php_exif.dll,EXIF 函数库,需要 php_mbstring.dll。
并且在 php.ini 中,php_exif.dll 必须在 php_mbstring.dll之后加载。
如果上面方法无效可参考方法二
没有找到php_mbstring.dll,文件无法启动,
解决方法:
在php.ini中默认的是extension_dir = "./"。然而扩展dll在ext目录下面,所以修改成extension_dir = "ext/"即可。
如果系统中没php_mbstring.dll文件可以下载
安装方法如下
把你的下载的php_mbstring.dll复制到
C:/Windows/System/System32
C:/Windows/System
C:/Windows
这里是系统目录哦,你安装在那个盘就是那个盘
本站创建文章转载注明来源 http://www.111cn.net/phper/php.html
本文章分析了在php中正则表达式对中文的支持问题,一般情况下我们可会能简单利用我上面的正则来验证中文,后面我分析了关于兼容gb2312,utf-8和表达式 ^[\\x7f-\\xff]+$ 可以完全搞定中文不兼容的问题。代码如下 | 复制代码 |
$str = '中华人民共和国123456789abcdefg'; |
运行一下上面这段代码,看会有什么提示信息?
Warning: preg_match(): Compilation failed: PCRE does not support L, l, N, P, p, U, u, or X at offset 3 in F:wwwrootphptest.php on line 2
原来,PHP正则表达式中不支持下列 Perl 转义序列:L, l, N, P, p, U, u, or X
在 UTF-8 模式下,允许用“x{...}”,花括号中的内容是表示十六进制数字的字符串。
原来的十六进制转义序列 xhh 如果其值大于 127 的话则匹配了一个双字节 UTF-8 字符。
所以,
可以这样来解决
代码如下 | 复制代码 |
preg_match("/^[x80-xff_a-zA-Z0-9]{3,15}$",$strName);
|
匹配 内码汉字
按照他提供的方式进行测试,代码如下:
代码如下 | 复制代码 |
$str = "php编程"; |
发现这次依然对是否为中文判断失常。不过,既然x表示的十六进制数据,为什么和js里边提供的范围x4e00-x9fa5不一样呢?于是我就换成了下边的代码:
代码如下 | 复制代码 |
$str = "php编程"; if (preg_match("/^[x4e00-x9fa5]+$/u",$str)) { print("该字符串全部是中文"); } else { print("该字符串不全部是中文"); } |
本来以为铁定成功了的事情,没想到,warning又一次产生了:
Warning: preg_match() [function.preg-match]: Compilation failed: invalid UTF-8 string at offset 6 in test.php on line 3
看来又有错误的表达方式了,于是对照了一下那篇文章的表达方式,给“4e00”和“9fa5”两边分别用"{"和“}”包起来,跑了一遍,发现真的准确了:
代码如下 | 复制代码 |
$str = "php编程"; |
知道了php中utf-8编码下用正则表达式匹配汉字的最终正确表达式——/^[x{4e00}-x{9fa5}]+$/u,
最后总结出
代码如下 | 复制代码 |
//if (preg_match(“/^[".chr(0xa1)."-".chr(0xff)."]+$/”, $str)) { //只能在GB2312情况下使用 |
双字节字符编码范围
1. GBK (GB2312/GB18030)
x00-xff GBK双字节编码范围
x20-x7f ASCII
xa1-xff 中文 gb2312
x80-xff 中文 gbk
2. UTF-8 (Unicode)
u4e00-u9fa5 (中文)
x3130-x318F (韩文
xAC00-xD7A3 (韩文)
u0800-u4e00 (日文)
相关文章
PHP session_start()很慢问题分析与解决办法
本文章来给各位同学介绍一下关于PHP session_start()很慢问题分析与解决办法,希望碰到此问题的同学可进入参考。 最近在做东西的时候发现一个问题 有一个接口挂...2016-11-25- 1,utf8_bin跟utf8_general_ci的区别 ci是 case insensitive, 即 "大小写不敏感", a 和 A 会在字符判断中会被当做一样的; bin 是二进制, a 和 A 会别区别对待. 例如你运行: SELECT * FROM table WHERE txt = 'a'...2013-10-04
PHP分布式框架如何使用Memcache同步SESSION教程
本教程主要讲解PHP项目如何用实现memcache分布式,配置使用memcache存储session数据,以及memcache的SESSION数据如何同步。 至于Memcache的安装配置,我们就不讲了,以前...2016-11-25- 因此,正确的原子操作是真正被执行过的。是物理执行。在当前事务中确实能看到插入的记录。最后只不过删除了。但是AUTO_INCREMENT不会应删除而改变值。1、为什么auto_increament没有回滚?因为innodb的auto_increament的...2014-05-31
- 这篇文章主要介绍了C#中的session用法 ,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下...2020-06-25
Python3使用Selenium获取session和token方法详解
这篇文章主要介绍了Python3使用Selenium获取session和token方法详解,需要的朋友可以参考下...2021-02-17- 索引并不是时时都会生效的,比如以下几种情况,将导致索引失效: 1.如果条件中有or,即使其中有条件带索引也不会使用(这也是为什么尽量少用or的原因) 注意:要想使用or,又想让索引生效,只能将or条件中的每个列都加上索引 ...2014-06-07
- session和cookie是网站浏览中较为常见的两个概念,也是比较难以辨析的两个概念,但它们在点击流及基于用户浏览行为的网站分析中却相当关键。基于网上一些文章和资料的参阅,及作者个人的应用体会,对这两个概念做一个简单的阐述...2013-09-11
- 本文主要讲述了利用Python网络爬虫对指定京东商城中指定商品下的用户评论进行爬取,对数据预处理操作后进行文本情感分析,感兴趣的朋友可以了解下...2021-05-28
- session在php中是一个非常重要的东西,像我们用户登录一般都使用到session这个东西,相对于cookie来说session 要安全很多,同时我们购物车经常使用session来做临时的记录保存哦。使用session保存页面登录信息1、数据库连接...2015-10-21
- Underscore 是一个 JavaScript 工具库,它提供了一整套函数式编程的实用功能,但是没有扩展任何 JavaScript 内置对象。这篇文章主要介绍了underscore源码分析相关知识,感兴趣的朋友一起学习吧...2016-01-02
- 这篇文章主要介绍了Vue使用axios引起的后台session不同操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-08-14
Fatal error: Cannot redeclare class 原因分析与解决办法
我使用的都是php __autoload状态自动加载类的,今天好好的程序不知道怎么在运行时提示Fatal error: Cannot redeclare class 了,看是重复定义了类,下面我来分析一下解决办...2016-11-25- Google是这样介绍PageRank的: Google 出类拔萃的地方在于专注开发“完美的搜索引擎”,联合创始人拉里·佩奇将这种搜索引擎定义为可“确解用户...2017-07-06
- 2015年7月29日0点起,Windows 10推送全面开启,Windows7、Windows8.1用户可以免费升级到Windows 10,用户也可以通过系统升级到Windows10,在这过程中,用户会遇到这样那样的问题,下面小编总结了windows 10 安装和使用中5个常见问题,需要的朋友可以参考下...2016-01-27
- PHP的session功能,一直为许多的初学者为难。就连有些老手,有时都被搞得莫名其妙。本文,将这些问题,做一个简单的汇总,以便大家查阅。 1. 错误提示 引用 代...2016-11-25
- 要设置php生存有效时间我们可以利用session_set_cookie_params函数或修改php.ini文件哦,下面小编来介绍一下。 第一种方法:session_set_cookie_params 函数原型 voi...2016-11-25
jsp使用sessionScope获取session案例详解
这篇文章主要介绍了jsp使用sessionScope获取session案例详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下...2021-08-29- 这篇文章主要介绍了C#实现简单获取及设置Session类,涉及C#针对session的设置及获取的技巧,具有一定参考借鉴价值,需要的朋友可以参考下...2020-06-25
- 文章简单的分析了在php文件包含时inlcude的一个漏洞分析,下面希望对大家有点用处哦。 基本的文件包含漏洞: 代码如下 复制代码 <?php include...2016-11-25