文章分类 » php

PHP中直接读取zip中的指定文件

碉堡。。不愧是世界上最好的语言,只需要一个函数:

file_get_contents('zip://test.zip#test.txt');

来自:http://stackoverflow.com/questions/10420112/how-to-read-a-single-file-inside-a-zip-archive

让PHP”WYSIWYG”起来~~

最近因为配置问题搞的我有点烦了。。,开发时我本地搭一个开发环境,测试时qa自己会搭一个测试环境,部署之前pe也会自己搭一个测试环境。因为环境之间的差异,多次造成程序不能按照预期运行。所以也学习开源软件,在所有项目的loader里做一下环境判断。我觉得真的有必要学习下css搞个reset.php啥的(TODO)。。。

最多的问题出在PHP不能“所见即所得”,传參被“智能”的过滤或覆盖

//默认应该是没有配置filter,但是哪位大神配置了特殊字符过滤,导致json串被转义
if (ini_get('filter.default') !== 'unsafe_raw') die('please disable filter.default in php.ini!');
//不解释,这个选项无论如何都应该干掉
if (get_magic_quotes_gpc()) die('please disable magic_quotes_gpc in php.ini!');

//php 5.3开始默认配置REQUEST里不再包含 COOKIE,但是测试环境配了个php 5.2
//导致POST参数被COOKIE同名参数覆盖。。。

if (ini_get('request_order') !== 'GP') {
    foreach($_COOKIE as $k=>$v) {
        if (isset($_GET[$k])) {
            $_REQUEST[$k] = $_GET[$k];
        }

        if (isset($_POST[$k])) {
            $_REQUEST[$k] = $_POST[$k];
        }

        if (!isset($_POST[$k]) && !isset($_GET[$k])) {
            unset($_REQUEST[$k]);
        }
    }
}

梦幻的php分页类~

以后发代码都会放到bookmark里,feed里不会看到了。
这次写了一个比较梦幻的分页类,简单,但是很好用。。

主要特点:

  • 支持模板
  • 支持sql和数组两种数据源

不适合:
没有对大量数据的分页做优化,所以不适用于变态分页.

简单举个例子,下面是一个对数组分页的例子

$pager = new Pager; 
$pager->count = count($data['contacts']);
$pager->count_per_page = 20;
$pager->param = 'p';
$pager->template = <<
{first}首页|{/first}
{pre}上一页|{/pre}
{next}下一页|{/next}
{last}末页{/last}
EOF;
//对数组进行分页
foreach($pager->slice($data['contacts']) as $contact):
//...

功能比较全的测试代码

$pager = new Pager; 
$pager->count = 200; 
$pager->count_per_page = 20;
$pager->param = 'p';
$pager->template = <<首页{/first}
{pre}上一页{/pre}

{next}下一页{/next}
{last}末页{/last}
{start}-{end}/{count}

EOF;
//这里使用sql获取数据
echo $p->get_sql('select * from xxx where xxx {limit}');

代码:http://code-of-emptyhua.googlecode.com/svn/trunk/phplib/pager.class.php

———–
post by gmail~

日历的重复事件预测

本周开发一个web行事历,遇到一个比较繁琐的问题,就是重复事件。比如我创建了一个每周1,3,5重复的事件,当点击2012年的某月的日历时,需要显示这个事件会在哪几天发生。我又偷懒的去google找PHP源码,这回真的没有…,于是按照正常的想法实现了一个,不知道有没有更好的实现~
简述如下:
恩,问题描述出来就是找出特定规则的重复事件E在日期DA和日期DB之间会发生的日期,那么俺先粗略的在日期DA之前找一个事件E会发生日期DC然后从DC开始严格按照重复规则遍历,找出所有事件发生日期。

源代码:
http://code-of-emptyhua.googlecode.com/svn/trunk/phplib/calutil.class.php

———–
post by gmail~

vim里快速调试PHP

恩,python中一般会把调试代码跟普通代码混在一块

class xx:
#    .....
if __name__ == '__main__':
    testxx = xx()
    #测试代码....

这个__name__ == ‘__main__’判断此文件是否被直接执行,而不是被其他文件import,所以在vim中调试时可以直接输入:!python % 执行当前正在编辑的文件,调试代码便会执行并输出结果

php也可以这么加调试代码,php中是这么实现的

class xx {
// ......
}
//确定当前被执行的文件就是自己,而不是被其他php文件包含
if (realpath($_SERVER['SCRIPT_FILENAME']) == __FILE__)
{
    $testxx = new xx;
    //测试代码....
}

如果仅限在命令行运行测试代码就再加个条件

if (php_sapi_name() == 'cli' && realpath($_SERVER['SCRIPT_FILENAME']) == __FILE__)

为了更速度,vim配置里添加了一个快捷键F5

"php和python调试快捷键
au FileType php map  :call DebugRun('php')
au FileType php imap  :call DebugRun('php')
au FileType python map  :call DebugRun('python')
au FileType python imap  :call DebugRun('python')
function DebugRun(cmd)
    :w
    execute '!' . a:cmd . ' %'
endfunction

OK,写完调试代码按下F5立刻有结果。

———–
post by gmail~