存档

‘Experience(经验)’ 分类的存档

刚改VPS出问题了,现在刚解决好,原来打算多写几篇关于dedeims的文件,无奈现在太晚了,先写一篇 给dedeims添加在线支付的功能之数据库设置 ,页面代码等改天整理好再发。

–为会员添加余额
ALTER TABLE `dede_member` ADD `money` DOUBLE(11,2) Default 0 NOT NULL AFTER `scores`
ALTER TABLE `dede_member` ADD `moneyto` DOUBLE(11,2) Default 0 NOT NULL AFTER `money`

–添加充值记录
–paytype 0:在线充值;1:提现;2:积分兑换
DROP TABLE IF EXISTS `dede_paylog`;
CREATE TABLE IF NOT EXISTS `dede_paylog` (
`id` mediumint(8) NOT NULL auto_increment,
`mid` mediumint(8) NOT NULL,
`paytype` smallint(5) NOT [...]

三 23rd, 2010 | Filed under Experience(经验), PHP, Share(分享)

给华众的Other业务添加一个续费提醒,新注册业务的提醒
华众程序的用户,应该有很多人用过Other类型的产品。但是Other产品有一个缺点,那就是会员新注业务和续费业务没有提醒。这样就增大了该类产品的维护成本(时间)。今天我给大家带来一种解决方案。
我们以ot2为例,在ot2lst中添加字段肯定是不可取的方案,我的方案是添加一个表。malst,字段设置如下:
ma_id 自动编号
ma_otid 对应的ot2list.s_id
ma_otstr ot2,如果改成ot1,ma_otid就是ot1lst.s_id
ma_lastdate 到期日期+1天
加表的好处如下:无需修改任何子平台,主平台只需修改后台的1个文件。
原理如下:
1.新注册业务,ma_lastdate字段为空,我们处理后,值变成了到期日期+1天
2.续费业务,到期日期比原来有所增加,但是ma_lastdate字段并未变化,所以查询到期日期lastmanager”

在合适的位置添加链接:

<a class=commonface href=”ot2_lst.asp?querytype=175″>待处理申请业务</a>
<a class=commonface href=”ot2_lst.asp?querytype=176″>待处理续费业务</a>

处理日期的程序:

< %
's_exptme 业务到期日期
'sid 业务ID

set rs=server.createobject("ADODB.recordset")
rs.open "select * from malst where ma_otstr='ot2' and ma_otid="&sid,conn,3,2
if rs.eof then
rs.addnew
rs("ma_otstr")="ot2"
rs("ma_otid")=sid
rs("ma_lastdate")=s_exptme+1
else
rs("ma_lastdate")=s_exptme+1
end if
rs.update
rs.close
set rs=nothing
%>

如果other产品有产品,请用以下代码升级。

‘Name:addLastManager.vbs
‘Desc:给所有ot型业务添加lastmanager记录
‘Auth:猫七(Miaoqiyuan.cn)

set conn=createobject(“ADODB.connection”)
conn.open “Provider=SQLOLEDB.1;Persist Security Info=False;User ID=hzhost7;Password=********;Initial Catalog=hzhost7;Data Source=********”

set rs=conn.execute(“select [...]

三 20th, 2010 | Filed under ASP, Experience(经验), Share(分享), Thinks(想法)
标签: , ,

前几天写过一篇巧用404.php解决Wordpress耗资源的问题,给Wordpress加个缓存功能(http://www.miaoqiyuan.cn/p/wordpress-haoziyuan-wordpress-cache)中提到了PHP缓存的方法,总感觉不是很方便,现在我又写了一个新的。

< ?php
class cache404{
public $K,$P;
public function __construct($URI,$P='blog',$Par='./cache/'){
$this->U = $URI;
$this->K = md5($URI);
$this->P = $P;
$this->Par = $Par;
$this->E = ‘.tmp_miaoqiyuan’;
$this->F = $this->Par . $this->P . ‘/’ . $this->K . $this->E;
}
public function getCache(){
if(!!($fp=@fopen($this->F,’r'))){
$html=fread($fp,102400);
}else{
$html=file_get_contents($this->U);
$this->addIndex();
$fp=fopen($this->F,’w');
fwrite($fp,$html);
}
fclose($fp);
return $html;
}
public function noCache(){
$html=file_get_contents($this->U);
$fp=fopen($this->F,’w');
fwrite($fp,$html);
fclose($fp);
return $html;
}
public function flushCache(){
unlink($this->F);
}
public function addIndex(){
$fpidx=fopen($this->Par . $this->P . ‘.rtf’,'a’);
fwrite($fpidx,$this->K . ‘ ‘ .$this->U);
fclose($fpidx);
}
}
?>

用的时候很简单

require_once(‘./inc/404cache.php’);
$Cache=new cache404($URI,$Path);
#echo $Cache->noCache();
echo $Cache->getCache();

< ?php
require_once('./inc/404cache.php');
$q=explode("/",$URI=substr(($qs = strtolower($_SERVER['QUERY_STRING'])),strpos($qs, ':80')+4));
$URI="/".$URI;
switch($q[0]){
case 'test':
#/test -> /seo_test/test.asp
if(preg_match(‘/^\/test(\/)?$/’,$URI)){
$URI=’http:’.'//’.$_SERVER['SERVER_NAME'].’/seo_test/test.asp’;
}

#/test/[a-z]\.html -> /seo_test/test.asp?key=$1
else [...]

一 22nd, 2010 | Filed under Experience(经验), PHP, Share(分享), Thinks(想法)
标签: , , ,

现在经常用到ISAPI_Rewrite,遇到的问题就是在本地测试的时候,一切没有问题,到服务器上,竟然不起作用。郁闷~
经过我的一些探索,发现了比起作用的原因如下:
1、IIS_WPG对ISAPI_Rewrite.dll没有读取的权限
2、IIS_WPG对httpd.ini没有读取的权限
3、IIS_WPG对站点目录中的httpd.ini没有读取的权限(用于每个站点有独立的httpd.ini)。
4、IIS_WPG对站点目录中没有写入的权限(ISAPI_Rewrite要写入一个httpd.parse.errors文件)。
基本上就是这个问题了,如果是启动进程池的用户不是IIS_WPG组的,请修改成相应的用户有足够的权限。34这两个问题可能经常有朋友会遇到,ISAPI_Rewrite安装好了,只有在ISAPI_Rewrite的安装目录的httpd.ini起作用,对于Web站点根目录的站点无效。其实就是IIS_WPG组对站点目录没有读取的权限,ISAPI_Rewrite是用IIS_WPG组的用户执行的。

一 22nd, 2010 | Filed under Experience(经验)
标签: ,

在程序设计时,可能经常用到随机读取几条记录的功能,MSSQL有order by NewID()的方法,Access怎么办呢?
经过一翻百度搜索,还真找到了一些解决方案:
网上还有一种说法,有人采用一条SQL语句解决Access随机读取几条记录的问题:select top 50 * from table order by int(rnd()*50),不过这种方法我不敢苟同,也许是我的只是不够渊博,我竟然不能理解。如果int(rnd()*50)应该是一个数了吧,int(rnd()*50),不初始化种子,所以每次返回结果都是一样的,所以相当于没有排序。
还有一种方法,就是先获取总记录数,然后取1~总数之间的随机数,rs.move,不过这种方法有点罗嗦,在此不推荐。
再反回来看第一种方法,如果稍微修改一下,给rnd添加一个种子呢,比如第一条记录rnd(1),第二条记录rnd(2)….。有了,数据库中的id字段(自动编号主键)不正是现成的吗?select top 10 * from news order by rnd(id)。对就是这样简单。
在测试的时候还发现了另一个有趣的事情,如果order by 常量数字,比如select top 10 * from news order by 1 desc则是按第一列结果倒序来排序。

一 5th, 2010 | Filed under Experience(经验)

这个函数我觉得还是比较实用的,用于69dns.com的一个新项目。代码有点熟悉?不过这个可是我原创的代码哦。
还有一个控制xml,控制form,控制css,以及加载的boot.js。
当然还有很多东西都不完善,等以后有空的时候,都整理一下。
实际上只是创建了一个stcms的json对象。为了能独立使用加入了if(typeof(stcms)==”undefined”)stcms={};,算是另类的命名空间吧。

/*
文件:ajax.js
挂载:stcms
独立:可独立使用
设计:猫七@69dns.com
*/

(function(){
if(typeof(stcms)==”undefined”)stcms={};
stcms.ajaxstatus=0;
stcms.ajax=function(url,str,method,callback){
if(stcms.ajaxstatus==1){
alert(“请等待上一个进程处理完。”);
return;
}
if(url.indexOf(“?”)!=-1)url+=”&sendTme=”+new Date();else url+=”?sendTme=”+new Date();
var xmlhttpRequest;
if(typeof(xmlhttpRequest!=”object”)){
   if(window.ActiveXObject){
   try{
   xmlhttpRequest = new ActiveXObject(“Microsoft.XMLHTTP”);
   }catch(e){
   xmlhttpRequest = false;
   }
}else if(window.XMLHttpRequest){
xmlhttpRequest = new XMLHttpRequest();
}
}
if(xmlhttpRequest){
stcms.ajaxstatus=1;
xmlhttpRequest.open(method,url,true);
if(method==”post”)xmlhttpRequest.setRequestHeader(“Content-Type”,”application/x-www-form-urlencoded”);
xmlhttpRequest.setRequestHeader(“charset”,”gb2312″);
xmlhttpRequest.onreadystatechange=function(){
if(xmlhttpRequest.readyState==4){
if(xmlhttpRequest.status==200){
  callback(xmlhttpRequest.responseText);
  stcms.ajaxstatus=0;
}
}
};
xmlhttpRequest.send(str);
}
  }
})();

使用方法很简单:

stcms.ajax(‘a.asp’,null,’get’,function(t){alert(t)});

很简单吧。另外发一下我boot.js,我觉得还是比较实用的;

/*
文件:boot.js
挂载:root
功能:加载js
设计:猫七@69dns.com
*/
(function(skin){
var i,ie,d;
stcms={
listen:function(f){
var l;
window.onload=(typeof(l=window.onload)!=’function’)?f:function(){l();f();};
},
$:function(id){
return document.getElementById(id);
}
};
ie=!!((d=(document)).all);
(function(arr){
for(i in arr){
var o=d.createElement(“script”);
o.setAttribute(“type”,”text/javascript”);
o.setAttribute(“src”,arr[i].replace(“stcms.”,”js/”).replace(/\./g,”\/”).replace(“*”,”all”)+”.js”)
d.getElementsByTagName(‘head’)[0].appendChild(o);
}
})([
'stcms.common.client.mouse',
'stcms.common.client.keyboard',
'stcms.skin.'+skin,
'stcms.common.form.form',
'stcms.common.form.grid',
'stcms.common.form.box',
'stcms.common.ajax',
'stcms.common.xml',
'stcms.common.cookie',
'stcms.user.checklogin',
'stcms.control.init'
]);
})(‘default’);

现在boot.js已经实现了皮肤,listen(实际就是window.onload),加载js,通过id获取dom等四个功能。
其他的可能就不太常用的,吧所有的都细分,这样可以减少请求和文件大小哦。
’stcms.common.ajax’,就是上边的ajax.js。
如果有时间,我也准备写个js框剪,集合了所有的功能,哈哈哈。