[ Content | Sidebar ]

Archives for php

梦幻的php分页类~

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

主要特点:

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

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

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

$pager = new Pager; 
$pager->count = count($data['contacts']);
$pager->count_per_page = 20;
$pager->param = 'p';
$pager->template = <<<EOF
{start}-{end},共{count}<br />
{first}<a href="{first_url}">首页</a>|{/first}
{pre}<a href="{pre_url}">上一页</a>|{/pre}
{next}<a href="{next_url}">下一页</a>|{/next}
{last}<a href="{last_url}">末页</a>{/last}
EOF;
//对数组进行分页
foreach($pager->slice($data['contacts']) as $contact):
//...
Copy Code 

功能比较全的测试代码

$pager = new Pager; 
$pager->count = 200; 
$pager->count_per_page = 20;
$pager->param = 'p';
$pager->template = <<<EOF
{first}<a href="{first_url}">首页</a>{/first}
{pre}<a href="{pre_url}">上一页</a>{/pre}
<ul>
{pages4}<li><a {current}style="color:red;"{/current} href="{page_url}">{page_num}</a></li>{/pages4}
</ul>
{next}<a href="{next_url}">下一页</a>{/next}
{last}<a href="{last_url}">末页</a>{/last}
{start}-{end}/{count}
<select onchange="window.location.href=this.value;">
{pages}<option {current}selected=selected{/current} value="{page_url}">{page_num}</a>{/pages}
</select>
EOF;
//这里使用sql获取数据
echo $p->get_sql('select * from xxx where xxx {limit}');
Copy Code 

代码: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()
    #测试代码....
Copy Code 

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

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

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

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

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

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

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

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

———–
post by gmail~

last_insert_id脑残?

//前面插入操作省略...
$rt = mysql_insert_id();
var_dump($rt);
$rt = $this->DB->query("select last_insert_id() from yl_contact");
var_dump($rt);
//结果
//
//int(10000672)
//int(15476)
Copy Code 

10000672这个结果是准确的,15476是索引总量,也就是说这个表里的自增字段有一段是空的,但是有影响吗?

为什么mysql_insert_id()这个函数这么靠普呢? 因为它直接返回了上次插入返回结果里的insert_id

my_ulonglong STDCALL mysql_insert_id(MYSQL *mysql)
{
    return mysql->last_used_con->insert_id;
}
Copy Code 

还是没弄明白为什么,求解~

———–
post by gmail~

php2wsdl

搞webservice最痛苦的莫过于提供wsdl,前两天找到一个叫”PHP WSDL Generator”的工具,可以根据注释生成wsdl,刚开始写了一个测试类还行,后来发现问题多多,文件里有require一类引用外部文件时会出问题,写同样的注释有的函数可以正确的生成,有的函数却不行。这种深不可测的东西不用也罢,自己写了一个。虽然功能弱点,但是不会无厘头。

下载:http://code-of-emptyhua.googlecode.com/svn/trunk/php2wsdl.py

命令行的话这样:

#参数依次为 命名空间 提供服务的PHP的类名 soap访问地址 本地的PHP文件 生成wsd的保存地址
php2wsdl.py "Ox-Service" "SomeClass" "http://test.com/soapserver.php" ./SomeClass.php ./service.wsdl
Copy Code 

图简单,这个脚本生成的wsdl会把array类型当成anyType,实际用的时候没有什么问题~

—————————————————————————
另:
打包上传比较麻烦,以后就用google code传东西了,也比较好管理
跟上面一块传的还有一段汉字转拼音的python脚本:http://code-of-emptyhua.googlecode.com/svn/trunk/hz2py,写这个脚本因为最近想注个好点的com域名,但是差来查去都被注册,难道好记点的域名真的光了吗。。于是从一个分词字典里生成了一个快5万个域名的txt,跑了一个whois脚本,最后结果没有注册只有不到300个,而且基本都是多音字。。只能叹生不逢时~