PHP使用empty检查函数返回结果时报Fatal error: Can't use function return value in write context的问题

post by 朦朧中的罪惡 / 2010-3-2 17:18 Tuesday PHP

PHP开发时,当你使用empty检查一个函数返回的结果时会报错:Fatal error: Can't use function return value in write context

例如:

<?php
echo empty(strlen('be-evil.org'));

到PHP手册里面查看,在empty函数描述的地方有以下文字:

Note: empty() only checks variables as anything else will result in a parse error. In other words, the following will not work: empty(trim($name)).

empty() 只检测变量,检测任何非变量的东西都将导致解析错误!

因此,我们不能拿empty来直接检测函数返回的值,上面例子的解决方案如下:

<?php

$length = strlen('be-evil.org');

echo empty($length);

 

标签: php

评论(1) 引用(0) 浏览(42)

PHP函数strtotime理解笔记

post by 朦朧中的罪惡 / 2010-2-28 20:39 Sunday PHP

官方手册里面对strtotime的描述:

strtotime() 函数将任何英文文本的日期时间描述解析为 Unix 时间戳。

那么意味着这个函数可以把2010-02-28 18:31:33转换为1267353093这种格式

但是使用它转换时间戳的时候要注意的是服务器的date.timezone的配置,在函数说明中有这么一段话

该函数将使用 TZ 环境变量(如果有的话)来计算时间戳。自 PHP 5.1.0 起有更容易的方法来定义时区用于所有的日期/时间函数。此过程在 date_default_timezone_get()  函数页面中有说明。

上面的话可以这么理解:

如果date.timezone配置为空或者为UTC(格林威治时间),那么它就会直接把传入的时间直接转换为该时间的UNIX时间戳(相当于该时间识别为格林威治时间)

如果date.timezone配置了时区,例如Asia/Shanghai,那么这个函数就会将传入的时间认为是配置的时区的当地时间,然后根据该时区与UTC(格林威治时间)的时差来算格林威治时间的时间戳。

例如:

php.ini配置date.timezone为Asia/Shanghai;

我们传入:2010-02-28 18:31:33

函数转出的时间戳的实际时间为:

2010-02-28 10:31:33

因为Asia/Shanghai位于 +8区,那么函数会自动减去了8个钟头的时间来得到格林威治时间

参考程序测试代码:

<?php
echo '2010-02-28 00:00:00';
echo '<br>';
// 格林威治时间 0
date_default_timezone_set('UTC');
echo gmdate('Y-m-d H:i:s', strtotime('2010-02-28 00:00:00'));
echo '<br>';
// 中国上海时间 + 8
date_default_timezone_set('Asia/Shanghai');
echo gmdate('Y-m-d H:i:s', strtotime('2010-02-28 00:00:00'));
echo '<br>';
// 美国洛杉矶时间 - 8
date_default_timezone_set('America/Los_Angeles');
echo gmdate('Y-m-d H:i:s', strtotime('2010-02-28 00:00:00'));
echo '<br>';

输出:

2010-02-28 00:00:00
2010-02-28 00:00:00
2010-02-27 16:00:00
2010-02-28 08:00:00

标签: php 原创

评论(0) 引用(0) 浏览(27)

Windows7下使用IIS7与FastCGI模块配置PHP5.3.1运行环境图文记录

post by 朦朧中的罪惡 / 2010-2-28 20:04 Sunday 服务器配置

PHP5.3增加了很多新特性,是时候该好好体验一下了,本文使用了FastCGI模块来配置PHP5.3运行环境,虽然然与常规的配置方式有点区别,但是步骤更加简单方便。

1.下载PHP5.3程序代码

可以去PHP官方的下载站去下载http://windows.php.net/download/

注意使用IIS7的话需要下载VC9版本(VC9 X86)

http://windows.php.net/downloads/releases/php-5.3.1-Win32-VC9-x86.zip

2.解压缩代码压缩包并配置

解压缩后将文件夹中的php.ini-development修改为php.ini,然后用文本编辑器修改以下内容

extension_dir = "D:\PHP程序文件目录\ext"

去掉

extension=php_mysql.dll
extension=php_mysqli.dll

等扩展前面的分号注释,具体模块请根据自己的需要开启和关闭

date.timezone = "Asia/Shanghai"

上面这项是PHP5.3必须配置的项目,否则运行phpinfo时会出现Waring警告

CGI配置

fastcgi.impersonate = 1
fastcgi.logging = 0
cgi.fix_pathinfo = 1
cgi.force_redirect = 0

3.安装IIS7

进入控制面板 -  选择“程序

点击查看原图

然后再选择 “打开或关闭Windows功能

点击查看原图

选择”万维网服务

点击查看原图

注意请展开“应用程序开发功能”选中“CGI“这个选项

点击查看原图

选择完毕后点击”确定“即可完成安装过程

4.配置IIS7

进入”控制面板“ - "管理工具” - 选择"Internet信息服务(IIS)管理器"

点击查看原图

选择左侧的网站 - Default Web Site, 再双击右侧的“处理程序映射

点击查看原图

进入管理页面后再选择右侧菜单的“添加模块映射

点击查看原图

然后详细内容按照下图填写,注意可执行路径内容请根据自己机器上php-cgi的路径选择

点击查看原图

这时在IIS默认根目录新建一个文件phpinfo.php,输入

<?php

phpinfo();

保存并使用浏览器访问 http://localhost/phpinfo.php

点击查看原图

如果一切正常则会像上图一样显示,恭喜,配置成功完成!

如果在配置和使用时出现疑难问题,可以参考我先前的文章

IIS7配置PHP5.3问题解决笔记

另外再附上官方的配置指南

http://cn.php.net/manual/en/install.windows.iis7.php

标签: php 环境配置

评论(0) 引用(0) 浏览(61)

PHP使用Session和全局变量开启时候出现waring提示的分析

post by 朦朧中的罪惡 / 2010-2-23 19:38 Tuesday 疑难杂症

这个问题估计很少人会遇到,但是总有人会那么凑巧的给碰上

PHP在运行时出现一个Waring,内容为

Warning: Unknown: Your script possibly relies on a session side-effect which existed until PHP 4.2.3. Please be advised that the session extension does not consider global variables as a source of data, unless register_globals is enabled. You can disable this functionality and this warning by setting session.bug_compat_42 or session.bug_compat_warn to off, respectively. in Unknown on line 0.

如何触发这个Waring呢?首先php配置register_globals必须为Off

代码如下

<?php
session_start();
$test = 'be-evil' ;
$_SESSION['test'] = null;

在register_globals为On的情况下,$test可能是由其他全局变量转换来的例如$_GET,$_POST;

但是在register_globals为Off的情况下,这里是创建了一个全局变量 test 切值为 null,解释器会认为你忘记全局变量关闭了,然后想修改全局变量$test的值...然后就会冒出这个善意的提醒了


解决办法:

在PHP.ini中设定bug_compat_42或bug_compat_warn为Off即可

或者避免全局变量与Session变量名称同名

相关资料:

PHP Session的一个警告

PHP手册Session评论中一个网友提到的这个问题

 

 

 

标签: php

评论(2) 引用(0) 浏览(53)

php函数unserialize数据返回false问题分析

post by 朦朧中的罪惡 / 2010-2-1 15:22 Monday PHP

unserialize的这个问题是由一个emlog论坛用户在使用时报错而发现的

问题表现情况如下:

emlog缓存 的保存方式是将php的数据对象(数组)序列化(serialize)后以文件的形式存放,读取缓存的时候直接反序列化(unserialize)缓存字 符串即可读取数据,关于序列化和反序列化的原理请看我先前的文章《php函数 serialize()与unserialize()不完全研究》
 

我从用户那里取到的缓存的序列化数据为:

a:1: {s:8:"kl_album";a:4:{s:5:"title";s:12:"精彩瞬 间";s:3:"url";s:41:"http://www.kaisay.cn/?plugin=kl_album";s:8:"is_blank";s:7:"_parent";s:4:"hide";s:1:"n";}}

咋 一看了解序列化的人都会说,这个数据很正常啊,没什么问题呢。可是直接把这段字符串进行unserialize,返回的值却是个False;

代 码

var_dump(unserialize('a:1:{s:8:"kl_album";a:4: {s:5:"title";s:12:"精彩瞬间";s:3:"url";s:41:"http://www.kaisay.cn /?plugin=kl_album";s:8:"is_blank";s:7:"_parent";s:4:"hide";s:1:"n";}}'));
 

点击查看原图

运行结果

点击查看原图

阅读全文>>

标签: php 原创

评论(0) 引用(0) 浏览(223)

php使用MySql函数导致Apache(iis)崩溃的问题

post by 朦朧中的罪惡 / 2009-9-22 20:59 Tuesday 疑难杂症

这个问题是在Windows下配置PHP环境时发生的。

具体的表现是php运行正常,但是只要一调用MySql的相关函数,Apache就会崩溃掉。

环境配置方式:

php以模块的方式运行在Apache下。自定义php.ini路径

phpinfo()显示mysql库加载成功

崩溃后在Windows的错误日志中会留下以下内容:

错误应用程序 httpd.exe,版本 2.2.11.0,错误模块 php5ts.dll,版本 5.2.10.10,错误地址 0x0000ac6a。

上google查了很久也不知道是怎么回事,国外也有人遇到同样的问题,但是没有解决方法,后来无意中看到phpinfo中MySql库的版本居然是5.1.30,这才想到原因,分析如下:

我在安装MySql的时候在配置设定时把MySql的Bin目录放到了系统环境变量Path中。而Bin目录中正好有一个libmysql.dll的库。

而php在加载mysql库的时候会搜索系统环境变量Path每一个目录寻找libmysql.dll,由于mysql的bin目录也在其中,那么php就先把mysql的libmysql.dll加载了。所以就会由于库的兼容问题导致mysql的函数无法运行。

解决方案:

1.将mysql的bin目录从系统环境变量Path中移出或将libmysql.dll从MySql的bin目录中移出。

2.重起系统

标签: apache php 原创 环境配置

评论(1) 引用(0) 浏览(757)

php在iis5下使用setcookie + header('Location')导致cookie失效的bug

post by 朦朧中的罪惡 / 2009-9-5 19:51 Saturday 疑难杂症

那多记忆 2009-9-4 21:49:10
今天遇到一个奇怪的问题 emlog在一个 iis5 php4.4.6 的环境下,登录的时候我们是先写cookie 然后 header location到首页,但是在这个环境下只要有 header location 服务器就不发送cookie了。。去掉header location 就ok

我上网查找了一下,这是iis5的一个bug,其他服务器和II7没有这个问题

下面是我查到相关资料
微软官方对于这个bug的说明
http://support.microsoft.com/kb/q176113/
另外在php在线手册的评论中也有一位网友发现了这个问题
http://cn.php.net/manual/en/function.setcookie.php#50957

评论内容(原文 + 翻译):
setcookie + header Location + IIS 5 = Trouble

It took me a long time to figure out what was causing a missing cookie in one system while it worked perfectly in another...
这个让我用了很长的时间去查出cookie在一个系统上丢失却在其他系统上正常原因

See this one: http://support.microsoft.com/kb/q176113/

In short, this WILL NEVER WORK IN IIS 5:
简单的说,下面的代码不能在iis5上成功运行
<?php
header
("Pragma: no-cache");
header('Location: http://www.example.com/');
setcookie('AA','1',0,'/');
setcookie('BB','2',time() + 24 * 3600,'/');
?>

You will ONLY get the Location Header, everything else will be "cut out" by IIS 5 CGI implementation.
你只能得到
Location Header,其他的东西全部都在iis5的CGI执行中被剪掉了
Solutions:
解决方案
1- Migrate to Apache/IIS6/Whatever
迁移到Apche IIS6 或者其他的平台上
2- Use a Non Parsed Header Script (nph-*.php)
使用不处理头部的脚本文件
3- Try with header('Refresh: 0; $URL');
尝试发送这样的头来实现页面跳转
header('Refresh: 0; $URL');

I hope this helps somebody not to spend hours knocking his/her head.

我希望这些能帮助某些人不用浪费很多时间来敲头(笑)

标签: php 原创

评论(2) 引用(0) 浏览(706)

php仿银行电子口令卡生成程序

post by 朦朧中的罪惡 / 2009-9-4 19:08 Friday PHP

用php写了一个银行口令卡生成程序,可以生成类似银行口令卡的图片或者表格。

工商银行的电子口令卡

 

我自己的(每次刷新就会重新生成一个图片):

在线演示DEMO:

生成html表格

生成png图片

背景图片可自行替换,数字的范围,表格行数格数全部可调,参见附件源代码。

本程序无版权,可随意传播

附件下载:
card.zip 14.02KB

标签: php 原创

评论(1) 引用(0) 浏览(563)

PHP实现各种排序算法

post by 朦朧中的罪惡 / 2009-8-26 15:25 Wednesday PHP

php实现冒泡排序、交换法排序、选择法排序、插入法排序、快速排序的程序实现。

源码 函数 + 注释

阅读全文>>

附件下载:
sort.zip 1.09KB

标签: php 算法

评论(0) 引用(0) 浏览(440)

一个很囧的PHP SESSION 失效的问题

post by 朦朧中的罪惡 / 2009-8-13 18:44 Thursday 疑难杂症

今天emlog群里面有用户说有个博客不能留言,正确填写了验证码之后emlog提示验证码失效.要到网址自己尝试了一下,果然如此.

emlog的验证码程序验证逻辑是绝对没有问题的,那么导致这个情况的只可能是该服务器PHP的Session出现了问题.

首先检查该服务器的环境,http抓包显示是 IIS 6.0 + PHP 5.2.0 RC4

点击查看原图

看到PHP 5.2.0 RC,我首先考虑是不是这个版本的PHP存在Bug.去PHP官网查询后发现该版本不存在Session的Bug.

既然不是PHP的问题那么再检查Cookie的状态.

用FireBug查看该站点的Cookie信息,看到PHP的Session所属的Cookie存在并且有值.没有问题.

这时我看到了该Cookie的Path属性,当场就囧掉了...

点击查看原图

为啥囧,Cookie的Path居然被设为了C:\Windows\temp.

很显然这个服务器的管理员把php.ini中的Session配置属性session.cookie_pathsession.save_path给了弄混了,把php临时文件的路径赋给了session.cookie_path,而这样的结果就是Cookie失效导致PHP无法获得SessionID.验证码自然就成了摆设了...

 

标签: php 原创

评论(2) 引用(0) 浏览(1070)