首页 - 标签 - 登陆 | emlog - 我们的动漫

基于Zend Framework的分页类

2008-7-10 21:41 Thursday
作者:朦朧中的罪惡 | 标签: php 原创 Zend Framework

刚学Zend Framework 感叹其强大的同时却发现其在Web开发中常用到的如分页,上传,字符串处理等等却没有实现,今天小试牛刀,给Zend Framework扩展了一个分页类。

核心编写思路:

     本分页类未采用常见的将HTML代码生成封装在类中的做法,而是基于Zend框架的MVC的思想,只在类中封装了处理分页所必需的数据的逻辑,而具体的分页信息显示逻辑则交予视图完成,将业务逻辑与显示逻辑分离,这样在开发灵活性上可以提高很多。

本例基于Zend Framework  1.5.2 编写,未将类整合到Zend Framework中,将本文件放置于INCLUDE_PATH/Util/下即可。本类只能在控制器下的方法中使用,实例化时需要传入控制器的request对象。

类核心代码:Page.php

阅读全文>>

Eclipse+php插件+Xdebug搭建PHP完美开发/调试环境指南

2008-6-18 13:06 Wednesday
作者:朦朧中的罪惡 | 标签: php 享受编程

最近要开始使用Zend框架开发中型应用系统了,由于采用完全面向对象的框架思路开发程序,不光开发思想,先前的Editplus+Dreamweaver编辑器组合显然不能满足我的要求了。我的新环境初步定为Eclipse+PDT插件+Xdebug+Apache

先前一直对dotNET、Java的IDE的代码自动嗅探、代码提示、程序断点调试等等自动化功能羡慕不已,而自己写PHP只能靠着echo、var_dump()来调试程序,能不能让PHP也实现断点调试呢?先前在Eclipse的PHP插件中发现了Debug的选项,说明调试功能应该是可行的,但是不知道是怎么个配置法,跑上google查找资料发现没有一个完整的介绍配置文档,我只能将获得的信息拼接起来后来测试。

结果是:完美实现PHP断点调试!

阅读全文>>

Discuz!编辑器附件添加原理不完全研究

2008-6-13 13:39 Friday
作者:朦朧中的罪惡 | 标签: JavaScript php 原创 Discuz!

Discuz!在6.0版的时候推出了自己的编辑器,除了它常用的编辑功能之外有一个很有特色的功能就是附件无上传插入.

用这个这个功能人都会发现在编辑时只要在本地选择了文件附件无需上传即可将它插入到帖子内容中,图文并排在第一次发贴的时候就可以实现,而不像一些传统程序必须上传了附件才可以插入到编辑器中.

作为开发者的我对这个功能实现的方式非常感兴趣,花了一点时间来研读了一下Discuz!编辑器此功能的代码.

本文分析的Discuz!版本为6.0,涉及的javascript和php文件包括

include/javascript/post_attach.js

include/javascript/post_editor.js

include/javascript/bbcode.js

include/newthread.inc.php

代码版权归康盛创想公司所有

阅读全文>>

php函数serialize()与unserialize()不完全研究

2008-6-9 11:28 Monday
作者:朦朧中的罪惡 | 标签: php 原创

serialize()和unserialize()在php手册上的解释是:

serialize — Generates a storable representation of a value

serialize — 产生一个可存储的值的表示

unserialize — Creates a PHP value from a stored representation

unserialize — 从已存储的表示中创建 PHP 的值

很显然,"a stored representation"的解释翻译成了一个可存储的值后依然很让人非常费解它的意思。

如果语言已经无法表述清楚,那么我们可以以一个具体的PHP的例子来学习这两个函数的用途

阅读全文>>

PHP启动Gzip报handler 'ob_gzhandler' cannot be used twice错误解决

2008-6-6 0:18 Friday
作者:朦朧中的罪惡 | 标签: php 原创

今日在调试emlog新版自动开启Gzip压缩功能时PHP提示了一个警告(waring):

Warning: ob_start() [ref.outcontrol]: output handler 'ob_gzhandler' cannot be used twice in D:\project\emlog\src\lib\F_base.php on line 370

警告中提到'ob_gzhandler' 被使用了2次,但是我全部程序代码中只调用了一次ob_start('ob_gzhandler');

在Google中找到的资料中提到出现这种情况很可能是php.ini中2个配置的设定问题:

如果在程序中正常启动Gzip那么这2个属性应该是这么配置的,其他情况就会导致报output handler 'ob_gzhandler' cannot be used twice

output_handler =
zlib.output_compression = Off

跑到自己的php.ini中一查,自己的设置为

output_buffering = 4096
output_handler = "ob_gzhandler"

晕,不知道什么时候在配置文件中把Gzip给打开了,改回原样后重启Apache,警告消失

php引用(References)不完全研究

2008-6-3 21:40 Tuesday
作者:朦朧中的罪惡 | 标签: php 原创

php中在变量、函数前都可以使用&符号来实现引用(References),也就是意味着在程序中使用不用的变量名称访问同一个数据内容。很多php开发者都对引用的概念认识不深,包括我自己。今天我自己结合php手册,做了一些php引用的例子加强自己对引用的理解。

阅读全文>>

php基础测试

2008-2-29 11:34 Friday
作者:朦朧中的罪惡 | 标签: php

如何改进以下的这行php代码?这段代码可以被用来测试php工程师应聘者:

<?
echo(”Search results for query: ” .$_GET[’query’] . “.”);
?>

参考答案:

<?php
if (isset($_GET[’query’]))
{
    echo ‘Search results for query: ‘,
     htmlspecialchars($_GET[’query’], ENT_QUOTES), ‘.’;
}
?>

 

改进的地方有 :

* 把php短标签(< ?)换成了长标签(< ?php),因为并非所有php环境都支持短标签
* 增加判断该全局变量是否存在,防止在某些环境下出现notice错误,而且在当前的例子里如果query无则没必要输出
* 把echo的”(”去掉,echo不是一个函数,没必要使用“(”
* 把字符串两边的双引号换成了单引号,提高了性能。因为双引号里的内容会被尝试进行变量和转义字符的解析。
* 对query这个get变量进行html过滤。防止输出html,这可能会带来包括xss在内的一些危险
* echo后面的字符串之间的间隔使用逗号而不是句号。因为句号之间的字符串会先被连接起来然后再输出,而,号只是按顺序输出。在这个例子里显然不需要先连接字符串。

本文来自:http://www.fulin.org/blog/2008/01/php_basic_test/

PHP防范XSS跨站脚本攻击的函数

2007-12-6 23:05 Thursday
作者:朦朧中的罪惡 | 标签: php 安全

跨站脚本攻击都是由于对用户的输入没有进行严格的过滤造成的,所以我们必须在所有数据进入我们的网站和数据库之前把可能的危险拦截。针对非法的HTML代码包括单双引号等,可以使用htmlentities() 。

<?php
$str = "A 'quote' is <b>bold</b>";

// 输出: A 'quote' is &lt;b&gt;bold&lt;/b&gt;
echo htmlentities($str);

// 输出: A &#039;quote&#039; is &lt;b&gt;bold&lt;/b&gt;
echo htmlentities($str, ENT_QUOTES);
?>

  这样可以使非法的脚本失效。

  但是要注意一点,htmlentities()默认编码为 ISO-8859-1,如果你的非法脚本编码为其它,那么可能无法过滤掉,同时浏览器却可以识别和执行。这个问题我先找几个站点测试后再说。

  这里提供一个过滤非法脚本的函数:
function RemoveXSS($val) {
    $val = preg_replace('/([x00-x08][x0b-x0c][x0e-x20])/', '', $val); 
    $search = 'abcdefghijklmnopqrstuvwxyz';
    $search .= 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
    $search .= '1234567890!@#$%^&*()';
    $search .= '~`";:?+/={}[]-_|'';
    for ($i = 0; $i <strlen($search); $i++) {
        $val = preg_replace('/(&#[x|X]0'.dechex(ord($search[$i])).';?)/i', $search[$i], $val);          $val = preg_replace('/(&#0'.ord($search[$i]).';?)/', $search[$i], $val); // with a ;
    }
    $ra1 = Array('javascript', 'vbscript', 'expression', 'applet', 'meta', 'xml', 'blink', 'link', 'style', 'script', 'embed', 'object', 'iframe', 'frame', 'frameset', 'ilayer', 'layer', 'bgsound', 'title', 'base');
    $ra2 = Array('onabort', 'onactivate', 'onafterprint', 'onafterupdate', 'onbeforeactivate', 'onbeforecopy', 'onbeforecut', 'onbeforedeactivate', 'onbeforeeditfocus', 'onbeforepaste', 'onbeforeprint', 'onbeforeunload', 'onbeforeupdate', 'onblur', 'onbounce', 'oncellchange', 'onchange', 'onclick', 'oncontextmenu', 'oncontrolselect', 'oncopy', 'oncut', 'ondataavailable', 'ondatasetchanged', 'ondatasetcomplete', 'ondblclick', 'ondeactivate', 'ondrag', 'ondragend', 'ondragenter', 'ondragleave', 'ondragover', 'ondragstart', 'ondrop', 'onerror', 'onerrorupdate', 'onfilterchange', 'onfinish', 'onfocus', 'onfocusin', 'onfocusout', 'onhelp', 'onkeydown', 'onkeypress', 'onkeyup', 'onlayoutcomplete', 'onload', 'onlosecapture', 'onmousedown', 'onmouseenter', 'onmouseleave', 'onmousemove', 'onmouseout', 'onmouseover', 'onmouseup', 'onmousewheel', 'onmove', 'onmoveend', 'onmovestart', 'onpaste', 'onpropertychange', 'onreadystatechange', 'onreset', 'onresize', 'onresizeend', 'onresizestart', 'onrowenter', 'onrowexit', 'onrowsdelete', 'onrowsinserted', 'onscroll', 'onselect', 'onselectionchange', 'onselectstart', 'onstart', 'onstop', 'onsubmit', 'onunload');
    $ra = array_merge($ra1, $ra2);
    $found = true;
    while ($found == true) {
        $val_before = $val;
        for ($i = 0; $i <sizeof($ra); $i++) {
            $pattern = '/';
            for ($j = 0; $j < strlen($ra[$i]); $j++) {
                if ($j > 0) {
                    $pattern .= '(';
                    $pattern .= '(&#[x|X]0([9][a][b]);?)?';
                    $pattern .= '|(&#0([9][10][13]);?)?';
                    $pattern .= ')?';
                }
                $pattern .= $ra[$i][$j];
            }
            $pattern .= '/i';
            $replacement = substr($ra[$i], 0, 2).'<x>'.substr($ra[$i], 2);   
            $val = preg_replace($pattern, $replacement, $val);
            if ($val_before == $val) {
                $found = false;
            }
        }
    }
}

[原创]做了几道国外公司出的PHP考试题

2007-12-3 14:16 Monday
作者:朦朧中的罪惡 | 标签: php 原创

从朋友那弄到了一套国外公司招聘程序员的PHP考试题,拿了几道很有意思的题目做了一下

题目一:
Make a variable called $apple and give it the value "apple".
Print apple to the screen.
Now without doing an assignment to the $apple variable change its 
value so that when you do echo $apple the word "orange" is output to 
the screen.
大致意思翻译:
定义一个叫$apple的变量并将它的值设定为'apple'后打印出来。现在改变$apple的值为'orange',但是不能对$apple使用任何赋值操作,也就是说当你再次打印$apple变量的时候输出的字符串为'orange'。

解决思想:
PHP变量的引用

答案代码:
1 $apple   =   ' apple ' ;
2 print   $apple
;
3 $orange   =   & $apple
;
4 $orange   =   ' orange '
;
5 echo   ' <br> '
;
6 print   $apple
;
7 echo   " <br> " ;

阅读全文>>