存档

文章标签 ‘php编程’

有关IIS下zencart的伪静态设置

2010年1月16日

公司的zencart 项目放在了window2003的服务器上,为了seo的考虑,开启了搜索引擎优化模块,可是碰到了一个问题,url的伪静态是通过网站根目录下的.htaccess文件来实现的,这需要apache的rewrite模块,可是iis中怎么实现?其实可以通过iis的ISAPI_Rewrite扩展来实现,下载一个ISAPI Rewrite的安装包,Lite免费版本ISAPI_Rewrite Lite (freeware)即可。安装运行后,打开IIS,在网站单击右键选属性,就可以看到ISAPI_Rewrite已经被加入到了ISAPI筛选器中。在ISAPI_Rewrite的安装目录下,找到 httpd.ini 在此文件中输入Rewrite的规则即可,这里的规则基本跟apache的rewrite差不多,不过在我的测试过程中,发现了一些问题,例如http.ini中不能使用%{QUERY_STRING}这样的服务器变量,也不知道是不是我服务器配置的原因,这里我对 zencart 里的.htaccess文件需要经过一些修改解决了这个问题
RewriteRule ^(.*)-p-(.*).html$ index\.php?main_page=product_info&products_id=$2&%{QUERY_STRING} [L]
修改为,无非是一个简单的正则替换
RewriteRule ^(.*)-p-(.*).html(\?(.*))?$ index\.php?main_page=product_info&products_id=$2&$4 [L]

强大的php魔术,类方法的overload,cakephp中findby的实现

2009年11月19日

今天又摸了下cakephp,突然想研究一下cakephp中modle所提供的findbyfieldname..这样的方法,深入研究了一下,又发现了php的一个新技能!这确实是一个很有魔力的东西,简单代码如下
class OverLoadable{
//这个方法,当调用类中不存在的的方法时会调用这个方法,php自动把这个不存在的方法名和这个方法里的变量数组填充进这个方法并自动调用,于是我要findbyUsername时, 我就可以简单的通过正则提取出方法名中的Username这个字符串,然后传递给类中真正存在的方法findbyfield($field),这样就间接的实现了findbyUsername方法
于是这里,我就可以通过正则提出出方法名
function __call($method, $params){
if(preg_match(“/findby(?P.*)/i”,$method,$preg))
return $this->findbyfield($preg['field']);
}
function findbyfield($field)
{
echo $field;
}
//当读取类的成员变量不存在时,触发这个方法,以你要读取的变量名作为参数
function __get($name){
echo “Your val is $name,and is not exsit in this class!”;
}
//当写入类的成员变量不存在时,触发这个方法,以你要写入的变量名和值作为参数
function __set($name,$value){
echo ‘Your val is ‘.$name.’=>’.$value;
}
}
$oo = new OverLoadable();
$oo->findbyusername();
$oo->i = 5;
?>

我的wordpress图形验证码插件Wp-validcode

2009年10月25日

今天一天收到了65个垃圾评论,于是在前一个php验证码的基础上做出了自己的第一个wordpress插件,case见本站,下载地址在下面
wp-validcode
解压上传到wp-content/plugins目录,从后台安装即可!

php mkdir 递归创建多级目录

2009年9月14日

php默认的mkdir一次只能创建一层目录,如果在当前目录下创建一个div/css/layout 的目录就需要逐层逐层的先创建div,再创建div/css 再创建 div/css/layout,然而我们希望能让程序自动帮我们完成这个过程。
其实思路也很简单,1.先判断 div目录是否存在,不存在则创建;2.判断子目录 div/css 是否存在,不能存在则创建,3.在第二步中以子目录作为参数递归调用函数本身。也可以按相反顺序来,1.先判断最底层目录div/css/layout是否存在;2.判断div/css/layout的上层目录div/css是否存在,不存在则以div/css作为参数递归进行。。
下面是程序代码:

function mkdirs($dir)
{
if(!is_dir($dir))
{
if(!mkdirs(dirname($dir))){
return false;
}
if(!mkdir($dir,0777)){
return false;
}
}
return true;
}
mkdirs(‘div/css/layout’);

同样的思路,php用rmdir和unlink递归删除多级目录的代码:
function rmdirs($dir)
{
$d = dir($dir);
while (false !== ($child = $d->read())){
if($child != ‘.’ && $child != ‘..’){
if(is_dir($dir.’/’.$child))
rmdirs($dir.’/’.$child);
else unlink($dir.’/’.$child);
}
}
$d->close();
rmdir($dir);
}

zen cart 中使用自定义 session

2009年9月5日

    上次给zen cart添加图片验证码功能的时候同时碰到了一个问题,自己定义的session在zen cart程序中读取不到值,后来分析了一下得出如下结论。
    zen cart自定义了session的处理函数,session_save_path设在了/cache/文件夹,在include/configure.php里有个选项 define(‘STORE_SESSIONS’, ‘db’); // use ‘db’ for best support, or ” for file-based storage 设置session的保存方式。
    不同的程序间要想共享session数据,至少要遵循以下几个条件:session_save_path 相同,session_id相同,当然session的保存方式肯定要一样,php默认的session保存方式就是文件存储,而保存目录就在系统的临时目录。
    这里我们要想zen cart 读取到我们自己定义的 session变量,就需要我们在自己的程序里把session的存储目录放到zc目录下的cache文件夹,例如 session_save_path(‘e:/zc/cache’),然后修改zc/include/configure.php文件中 define(‘STORE_SESSIONS’, ‘db’); 修改为 define(‘STORE_SESSIONS’, ”);这样就让zen cart的session也以文件形式存储,就可以实现自定义session的共享了!
    以上的原理适用于其他类似的不同程序间session共享的问题,其实 zen cart中使用自定义 session的最简单的方法是 直接在自己的程序最顶部 require进来zen cart 的application_top.php即可,简单固然简单,但了解原理更重要!

php产生验证码完整案例

2009年8月28日

今天继续开发zen cart项目,加上了验证码的功能,考虑到需要较高的安全性,自己手工写了个小程序,功能还算全面,自动检测背景和字体,并随机选取背景图片中的一块范围,随机使用字体,显示验证字符串时随机显示字体大小,字符间距,字符颜色等。以下是程序代码。
validimg.php文件
<?php
/**
* Class for Validate image
* @author  zcs
* @version 1.0-20090828
*/
session_start();
class validimg
{
//背景图片目录
var $backgroundpath = ‘validbg’;
//生成验证码宽度
var $width =’80′;
//生成验证码高度
var $height =’25′;
//背景
var $background;
//验证文本
var $text=’abcd’;
//字体目录
var $fontpath = ‘validbg’;
//字体
var $font=’simhei.ttf’;
//字体宽度
var $font_width = ‘20′;
function validimg($text)
{
$this->text = $text;
//随机选取一个背景文件
$bgdir =  @dir($this->backgroundpath);
while(false !== ($image = $bgdir ->read()))
{
if($image != ‘.’ && $image != ‘..’ && $this->checktype($image) != false)
{
$backgroundarr[] = $image;
}
}
$bgdir->close();
//随机选取一个字体文件
$fonts =  @dir($this->fontpath);
while(false !== ($font = $fonts [...]

zen cart 的sidebox 机制

2009年8月24日

zen cart的左右边栏很有特色,由一块一块的sidebox拼合起来的,在模板的sidebox文件夹建立一个sidebox程序,登陆管理后台后,选择外观控制,系统会自动检测到新增加的sidebox程序,并提醒你操作。并把所有的sidebox配置信息存储在layout_boxes的表格中。
程序调用边栏是通过includes/modules 目录下的column_left.php,和column_right.php 控制。分析下源码也非常简单:首页查询layout_boxes数据表,检索出在左栏和或右栏显示的所有sidebox,再直接require 进来 layout_box_name 字段标记的sidebox名称。随便打开一个sidebox的源代码,如系统自带的includes/modules/sideboxes/banner_box.php,banner_box.php只要用来获取sidebox显示所要的数据,再通过require($template->get_template_dir(‘tpl_banner_box.php’,DIR_WS_TEMPLATE, $current_page_base,’sideboxes’),载入显示这个sidebox的模板,其实这个所谓的模板就是生成一个$content的字符串,然后再require($template->get_template_dir($column_box_default, DIR_WS_TEMPLATE, $current_page_base,’common’) . ‘/’ . $column_box_default) 再用一个显示sidebox的公共模板,在$column_box_default中打印出$content的内容,这样一个sidebox就显示完成了!
如何添加一个自己的sidebox?其实很简单,在includes/modules/sideboxes/{模板目录}/  建立一个文件,就是一个sidebox了,可以在后台控制是否显示在默认的左右边栏和排序 。在这个文件中就输出任何内容了,当然可以按照标准的模式,再在includes/templates/{模板目录}/sideboxes 下建立一个模板文件require进来,尽量做到 M/V的分离,这样以后修改也会比较方便!

zen cart的运行过程

2009年8月23日

zencart是典型的单入口程序,所有的程序的url都是index.php?mainpage=XX的形式,通过$_GET['mainpage']载入相应的页面程序。先说首页的输出过程如下:入口index.php->载入初始化文件application_top.php->载入首页默认变量文件mail_template_vars.php->载入公用模板控制文件tpl_main_template.php->载入方框(sidebox)控制文件column_left.php,column_left.php->载入各个sidebox的控制文件和模板->载入首页默认核心部分模板tpl_index_default.php->载入公共页面底部,到这里就完成了首页的显示。其他页面的显示则是在载入include/pages/ $_GET['mainpage']文件下的文件,基本跟首页相同,只是根据不同页面载入不同配置文件和模板。
初次接触zencart,觉得zencart的模板系统异常的复杂,其最大的特点就是覆盖机制,通过其class/template_func.php模板类的get_template_dir方法,按照预先设定的位置按顺序查找模板文件,这种机制极大的提高了模板修改的灵活性,同时避免影响其他的模板和系统程序,也方便了以后的升级,我像扩充下系统默认的模板很简单,拷贝到我自己的模板相应文件夹,想怎么改就怎么改,也不会担心会跟系统不和谐。
以上皆是根据印象所写,文件名也许错误,下次修正。

php递归遍历目录

2009年7月10日

demo:http://anfirst.cn/wap.php
<?php
class listdir{
var $depth;
var $dirname;
var $list;
var $tostring;
function listdir($dir){
$this->dirname=$dir;
$this->depth=0;
$this->tostring=””;
}
//把结果保存进多维数组
function getlist($dir=””){
if($dir==””)$dir=$this->dirname;
$d=@dir($dir);
while(false!==($item=$d->read()))
{
if($item!=”.”&&$item!=”..”)
{
$path=$dir.”/”.$item;
if(is_dir($path)){
$this->depth+=1;
$this->getlist($path);
}else{
$this->list[$this->depth][]=$item;
}
}
}
$this->list[$this->depth]['directory']=$dir;
$this->depth-=1;
$d->close();
return $this->list;
}
//字符窜化结果
function tostring($dir=””){
if($dir==””)$dir=$this->dirname;
$d=@dir($dir);
$this->tostring.=”<UL>\n”;
$this->tostring.=”Directory:”.$dir.”\n”;
while(false!==($item=$d->read()))
{
if($item!=”.”&&$item!=”..”)
{
$path=$dir.”/”.$item;
if(is_dir($path)){
$this->depth+=1;
$this->tostring($path);
}else{
$this->tostring.=”<LI>”.$item.”</LI>\n”;
}
}
}
$this->depth-=1;
$d->close();
$this->tostring.=”</UL>\n”;
return $this->tostring;
}
}
$wapdir=”jquery”;
$d=new listdir($wapdir);
echo $d->tostring();
?>
输出结果:
<UL>
Directory:jquery
<LI>jquery-1.3.2.js</LI>
<LI>jquery-1.3.2.min.js</LI>
<LI>jquery-1.3.2-vsdoc2.js</LI>
<LI>test.html</LI>
<LI>common.js</LI>
<UL>
Directory:jquery/d
<LI>common.js</LI>
<LI>jquery-1.3.2.js</LI>
</UL>
</UL>

按指定概率随机抽取

2009年6月15日

$ar=array(‘a’=>30,’b’=>30,’c’=>10,’d’=>20,’e’=>10);
function myrandom($ar)
{
$ar_temp=array();
$temp=0;
foreach ($ar as $k => $v)
{
$ar_temp[$k]=array(‘min’=>$temp,’max’=>$temp+$v);
$temp+=$v;
}
$rand=rand(0,100);
$key=null;
foreach ($ar_temp as $k => $v)
{
if($rand>$v[min]&&$rand<=$v[max])
{
return $ar[$k];
break;
}
}
}
echo myrandom($ar);

作者: shooting 分类: 学习笔记 标签: , , ,