也算做PHP蛮久了,我也在想水平怎么样呢?找人凭什么说明人家的水平呢?其实这个有工作经验的成分,有知识面的成分,也有深度的成分。知识面觉得了你可以跟哪些人顺利的交流和工作,知识深度决定了你的工作能力和工作效果,工作经验是避免了你工作产生失误。
我很强调知识面,也是自己的个性所以然。我就喜欢看很多东西,但是我学东西的深度也许都不大,但我却有了和别人沟通的前提。所以我成为不了专家也许。成为专家的人是一群痴迷的人,为工作学习疯狂的人,只有这样的人才是专家。这个也是《卓有成效的管理者》一书说的一方面,这本书很好,我还得温习一遍才行。
回到正题,不多说,但看了一下别人发的帖子,所以转了,PHPer可以参考参考:
《什么样才算是学好了PHP?》
from: http://www.cpyeh.cn/?action=show&id=90
1. php基本语法,像《精通php》里的各个知识点.
2. Sql ,比如对Mysql的管理,sql语句的编写。
3. html,做页面肯定会需要这些东西了。
4. css,现在比较常用的的是Div+css设计。
当然还得对 apache, linux有一定的了解了。
上面的一些东西,就够做一些简单的网站,比如个人或公司主页了。
但是大网站是远远不是如上的一些东西就可以的,比如:
1. 要选择一个好的框架,比如Symfony,或zend framework。它们都采用了MVC模式。通过框架可以减少很多底层的重复开发,更重要的是可以让多人协作更加容易和让项目更易于扩展。
2. 代码和页面分离,比如Smarty,它可以让页面(html)和逻辑处理(php)做较好的分离,让美工和程序基本可以并行工作(前提是需求做得比较完善)。
3. 高级缓存。 这是一个php开发上永恒的话题,网站之所以要采用php就是因为速度快。采用缓存技术,可以让速度更快。 主要有的缓存技术有:
文件缓存,如Pear。
内存缓存,如Memcached。 速度非常快。
操作系统缓存,比如Squid。
4.加速工具,比如zend optimizer, 还有页面压缩。
5.高级数据库技术,比如设计优化,查询优化,集群等等。你能想象Google采用的数据库技术就是Mysql么?Mysql完全可以用于海量数据,但是我们一般到了几百万就很慢了,那是因为功底没有练就。
6.优化Apache,Mysql,linux服务器。主要是设计一些配置文件的参数,和关闭一些不需要的服务。
7.算法,不同的人写出来的东西效率可能差几十倍。建议多看看算法的书,还有多用php练习比较。
8.提高用户体验,当然就是要做的好看,但是页面文件不要太大,要不会影响速度,采用一些DHTML,Ajax技术。用普通人的使用习惯来设计。 Ajax可以采用一些框架,比如prototype。
当然从软件工程来看,你还得学一些比如CVS,phpunit等工具。
多研究一些开源的东西,对学习有帮助。
我很强调知识面,也是自己的个性所以然。我就喜欢看很多东西,但是我学东西的深度也许都不大,但我却有了和别人沟通的前提。所以我成为不了专家也许。成为专家的人是一群痴迷的人,为工作学习疯狂的人,只有这样的人才是专家。这个也是《卓有成效的管理者》一书说的一方面,这本书很好,我还得温习一遍才行。
回到正题,不多说,但看了一下别人发的帖子,所以转了,PHPer可以参考参考:
《什么样才算是学好了PHP?》
from: http://www.cpyeh.cn/?action=show&id=90
1. php基本语法,像《精通php》里的各个知识点.
2. Sql ,比如对Mysql的管理,sql语句的编写。
3. html,做页面肯定会需要这些东西了。
4. css,现在比较常用的的是Div+css设计。
当然还得对 apache, linux有一定的了解了。
上面的一些东西,就够做一些简单的网站,比如个人或公司主页了。
但是大网站是远远不是如上的一些东西就可以的,比如:
1. 要选择一个好的框架,比如Symfony,或zend framework。它们都采用了MVC模式。通过框架可以减少很多底层的重复开发,更重要的是可以让多人协作更加容易和让项目更易于扩展。
2. 代码和页面分离,比如Smarty,它可以让页面(html)和逻辑处理(php)做较好的分离,让美工和程序基本可以并行工作(前提是需求做得比较完善)。
3. 高级缓存。 这是一个php开发上永恒的话题,网站之所以要采用php就是因为速度快。采用缓存技术,可以让速度更快。 主要有的缓存技术有:
文件缓存,如Pear。
内存缓存,如Memcached。 速度非常快。
操作系统缓存,比如Squid。
4.加速工具,比如zend optimizer, 还有页面压缩。
5.高级数据库技术,比如设计优化,查询优化,集群等等。你能想象Google采用的数据库技术就是Mysql么?Mysql完全可以用于海量数据,但是我们一般到了几百万就很慢了,那是因为功底没有练就。
6.优化Apache,Mysql,linux服务器。主要是设计一些配置文件的参数,和关闭一些不需要的服务。
7.算法,不同的人写出来的东西效率可能差几十倍。建议多看看算法的书,还有多用php练习比较。
8.提高用户体验,当然就是要做的好看,但是页面文件不要太大,要不会影响速度,采用一些DHTML,Ajax技术。用普通人的使用习惯来设计。 Ajax可以采用一些框架,比如prototype。
当然从软件工程来看,你还得学一些比如CVS,phpunit等工具。
多研究一些开源的东西,对学习有帮助。
最近也有看大一点的项目该怎么管理,多人协作应该怎么做,发觉自己没有经历过大项目的开发,一直只能停留在自己构思的过程,还是经验很重要,也希望有很好的方法给工作带来效率的提升。
MVC (Modal View Controler)本来是存在于Desktop程序中的,M是指数据模型,V是指用户界面,C则是控制器。使用MVC的目的是将M和V的实现代码分离,从而使同一个程序可以使用不同的表现形式。比如一批统计数据你可以分别用柱状图、饼图来表示。C存在的目的则是确保M和V的同步,一旦M改变,V应该同步更新。
模型-视图-控制器(MVC)是Xerox PARC在八十年代为编程语言Smalltalk-80发明的一种软件设计模式,至今已被广泛使用。最近几年被推荐为Sun公司J2EE平台的设计模式,并且受到越来越多的使用 ColdFusion 和 PHP 的开发者的欢迎。模型-视图-控制器模式是一个有用的工具箱,它有很多好处,但也有一些缺点。
MVC如何工作
MVC是一个设计模式,它强制性的使应用程序的输入、处理和输出分开。使用MVC应用程序被分成三个核心部件:模型、视图、控制器。它们各自处理自己的任务。
MVC (Modal View Controler)本来是存在于Desktop程序中的,M是指数据模型,V是指用户界面,C则是控制器。使用MVC的目的是将M和V的实现代码分离,从而使同一个程序可以使用不同的表现形式。比如一批统计数据你可以分别用柱状图、饼图来表示。C存在的目的则是确保M和V的同步,一旦M改变,V应该同步更新。
模型-视图-控制器(MVC)是Xerox PARC在八十年代为编程语言Smalltalk-80发明的一种软件设计模式,至今已被广泛使用。最近几年被推荐为Sun公司J2EE平台的设计模式,并且受到越来越多的使用 ColdFusion 和 PHP 的开发者的欢迎。模型-视图-控制器模式是一个有用的工具箱,它有很多好处,但也有一些缺点。
MVC如何工作
MVC是一个设计模式,它强制性的使应用程序的输入、处理和输出分开。使用MVC应用程序被分成三个核心部件:模型、视图、控制器。它们各自处理自己的任务。
标题写的吸引人了些,不过我就觉得是挺高效的,我相信
之前看到过 irlvirus 写的 《php练习代码-日历》,我觉得效率都不是很好。
date()函数结合mktime() 可以得到一切东西,技巧问题
我觉得灵活运用两者即可得到日历了,说的没有用,还是写一下可以证明
于是乎有兴趣写一下,希望分享给大家
程序测试过,是比帖子里提到的快,不知道是否我的机器的问题,也希望大家做个比较,交流一下
下面贴一下代码,包含测试代码在里面,应用可以去掉测试代码
得到的测试结果是:
Array
(
[0] => 0.00038400000000005
[1] => 0.00030999999999998
[2] => 0.00029699999999999
[3] => 0.000303
[4] => 0.00030399999999997
[5] => 0.00034499999999998
[6] => 0.00032300000000002
[7] => 0.00033
[8] => 0.00032699999999997
[9] => 0.00032000000000004
)
之前看到过 irlvirus 写的 《php练习代码-日历》,我觉得效率都不是很好。
date()函数结合mktime() 可以得到一切东西,技巧问题
我觉得灵活运用两者即可得到日历了,说的没有用,还是写一下可以证明
于是乎有兴趣写一下,希望分享给大家
程序测试过,是比帖子里提到的快,不知道是否我的机器的问题,也希望大家做个比较,交流一下
下面贴一下代码,包含测试代码在里面,应用可以去掉测试代码
<?
@date_default_timezone_set('RPC');
function show_calender(){
//code by hqlulu
//date:2007-12-12
//web: http://www.aslibra.com
$starttime=microtime();
//处理请求日期
$y= isset($_GET["y"]) ? intval($_GET["y"]) : date("Y");
$m= isset($_GET["m"]) ? intval($_GET["m"]) : date("m");
if($m<1 || $m>12)$m=date("m");
if($y<=0)$y=date("Y");
//下个月
$nm=$m+1;
if($nm>12){
$nm=1;
$ny=$y+1;
}else{
$ny=$y;
}
//前一月
$pm=$m-1;
if($pm<1){
$pm=12;
$py=$y-1;
}else{
$py=$y;
}
//获取本月名称
$month = date("M",mktime(0, 0, 0, $m, 1, $y));
//获取本月最后一天
$lastday = date("d",mktime(0, 0, 0, $nm, 0, $ny));
//获取开始一天的星期几
$index = date("w",mktime(0, 0, 0, $m, 1, $y));
//生成日历头
echo "<table>\n<thead><tr><th colspan='1'><a href='?y={$py}&m={$pm}'>-</a></th><th colspan='5'> {$y} {$month} </th><th colspan='1'><a href='?y={$ny}&m={$nm}'>+</a></th></tr><thead>\n<tbody><tr><td>日</td><td>一</td><td>二</td><td>三</td><td>四</td><td>五</td><td>六</td></tr>";
//处理日历
$row=0;
$day=1;
while(1){
echo "<tr>";
if($row==0){
for($i=0;$i<=6;$i++)
if($i<$index)
echo "<td> </td>";
else
echo "<td>".$day++."</td>";
}else{
for($i=0;$i<=6;$i++)
if($day>$lastday)
echo "<td> </td>";
else
echo "<td>".$day++."</td>";
}
echo "</tr>";
$row++;
if($day>$lastday)break;
}
echo "</table>";
$endtime=microtime();
$usedtime=$endtime-$starttime;
return $usedtime;
}
$run_info=array();
for($i=0;$i<10;$i++)
$run_info[]=show_calender();
print_r($run_info);
?>
@date_default_timezone_set('RPC');
function show_calender(){
//code by hqlulu
//date:2007-12-12
//web: http://www.aslibra.com
$starttime=microtime();
//处理请求日期
$y= isset($_GET["y"]) ? intval($_GET["y"]) : date("Y");
$m= isset($_GET["m"]) ? intval($_GET["m"]) : date("m");
if($m<1 || $m>12)$m=date("m");
if($y<=0)$y=date("Y");
//下个月
$nm=$m+1;
if($nm>12){
$nm=1;
$ny=$y+1;
}else{
$ny=$y;
}
//前一月
$pm=$m-1;
if($pm<1){
$pm=12;
$py=$y-1;
}else{
$py=$y;
}
//获取本月名称
$month = date("M",mktime(0, 0, 0, $m, 1, $y));
//获取本月最后一天
$lastday = date("d",mktime(0, 0, 0, $nm, 0, $ny));
//获取开始一天的星期几
$index = date("w",mktime(0, 0, 0, $m, 1, $y));
//生成日历头
echo "<table>\n<thead><tr><th colspan='1'><a href='?y={$py}&m={$pm}'>-</a></th><th colspan='5'> {$y} {$month} </th><th colspan='1'><a href='?y={$ny}&m={$nm}'>+</a></th></tr><thead>\n<tbody><tr><td>日</td><td>一</td><td>二</td><td>三</td><td>四</td><td>五</td><td>六</td></tr>";
//处理日历
$row=0;
$day=1;
while(1){
echo "<tr>";
if($row==0){
for($i=0;$i<=6;$i++)
if($i<$index)
echo "<td> </td>";
else
echo "<td>".$day++."</td>";
}else{
for($i=0;$i<=6;$i++)
if($day>$lastday)
echo "<td> </td>";
else
echo "<td>".$day++."</td>";
}
echo "</tr>";
$row++;
if($day>$lastday)break;
}
echo "</table>";
$endtime=microtime();
$usedtime=$endtime-$starttime;
return $usedtime;
}
$run_info=array();
for($i=0;$i<10;$i++)
$run_info[]=show_calender();
print_r($run_info);
?>
得到的测试结果是:
引用
Array
(
[0] => 0.00038400000000005
[1] => 0.00030999999999998
[2] => 0.00029699999999999
[3] => 0.000303
[4] => 0.00030399999999997
[5] => 0.00034499999999998
[6] => 0.00032300000000002
[7] => 0.00033
[8] => 0.00032699999999997
[9] => 0.00032000000000004
)
最近要获取一批域名的IP列表,所以阿权想着要写些代码来做,懒得我一个一个处理了。
PHP来处理也OK,其它我不会,那就用它了,调用系统命令是使用 exec ,先看看介绍:
那我们执行系统命令ping就可以,返回结果回来处理就好
看看执行效果:
Pinging www.aslibra.com [220.162.244.47] with 32 bytes of data:
Reply from 220.162.244.47: bytes=32 time=42ms TTL=119
Reply from 220.162.244.47: bytes=32 time=40ms TTL=119
Reply from 220.162.244.47: bytes=32 time=40ms TTL=119
Reply from 220.162.244.47: bytes=32 time=40ms TTL=119
...
那我们取出第二行就可以得到ip了,但也有cname的域名,比如
ping online.aslibra.com
Pinging online.zcom.com [60.28.197.17] with 32 bytes of data:
Reply from 60.28.197.17: bytes=32 time=5ms TTL=57
Reply from 60.28.197.17: bytes=32 time=4ms TTL=57
Reply from 60.28.197.17: bytes=32 time=4ms TTL=57
Reply from 60.28.197.17: bytes=32 time=4ms TTL=57
这种情况是域名不一样的,所以,可以区分开,那执行一次ping就可以了,命令是 ping domain -n 1
所以就可以把以上事情写成功能函数啦:
返回的是数组,如果是空数组则域名无效,如果是domain没有指定,那就是A记录,否则是cname记录,并且返回了
PHP来处理也OK,其它我不会,那就用它了,调用系统命令是使用 exec ,先看看介绍:
引用
exec -- Execute an external program
说明
string exec ( string command [, array &output [, int &return_var]] )
exec() executes the given command.
参数
command
The command that will be executed.
output
If the output argument is present, then the specified array will be filled with every line of output from the command. Trailing whitespace, such as \n, is not included in this array. Note that if the array already contains some elements, exec() will append to the end of the array. If you do not want the function to append elements, call unset() on the array before passing it to exec().
return_var
If the return_var argument is present along with the output argument, then the return status of the executed command will be written to this variable.
返回值
The last line from the result of the command. If you need to execute a command and have all the data from the command passed directly back without any interference, use the passthru() function.
To get the output of the executed command, be sure to set and use the output parameter.
说明
string exec ( string command [, array &output [, int &return_var]] )
exec() executes the given command.
参数
command
The command that will be executed.
output
If the output argument is present, then the specified array will be filled with every line of output from the command. Trailing whitespace, such as \n, is not included in this array. Note that if the array already contains some elements, exec() will append to the end of the array. If you do not want the function to append elements, call unset() on the array before passing it to exec().
return_var
If the return_var argument is present along with the output argument, then the return status of the executed command will be written to this variable.
返回值
The last line from the result of the command. If you need to execute a command and have all the data from the command passed directly back without any interference, use the passthru() function.
To get the output of the executed command, be sure to set and use the output parameter.
那我们执行系统命令ping就可以,返回结果回来处理就好
看看执行效果:
引用
Pinging www.aslibra.com [220.162.244.47] with 32 bytes of data:
Reply from 220.162.244.47: bytes=32 time=42ms TTL=119
Reply from 220.162.244.47: bytes=32 time=40ms TTL=119
Reply from 220.162.244.47: bytes=32 time=40ms TTL=119
Reply from 220.162.244.47: bytes=32 time=40ms TTL=119
...
那我们取出第二行就可以得到ip了,但也有cname的域名,比如
ping online.aslibra.com
引用
Pinging online.zcom.com [60.28.197.17] with 32 bytes of data:
Reply from 60.28.197.17: bytes=32 time=5ms TTL=57
Reply from 60.28.197.17: bytes=32 time=4ms TTL=57
Reply from 60.28.197.17: bytes=32 time=4ms TTL=57
Reply from 60.28.197.17: bytes=32 time=4ms TTL=57
这种情况是域名不一样的,所以,可以区分开,那执行一次ping就可以了,命令是 ping domain -n 1
所以就可以把以上事情写成功能函数啦:
function domain2ip($domain){
exec("ping $domain -n 1",$a);
if (ereg ("Pinging (.*) \[(.*)\]", $a[1], $regs)) {
if($regs[1]!=$domain){
return Array("domain"=>$regs[1],"ip"=>$regs[2]);
}else{
return Array("domain"=>"","ip"=>$regs[2]);
}
}
return Array();
}
exec("ping $domain -n 1",$a);
if (ereg ("Pinging (.*) \[(.*)\]", $a[1], $regs)) {
if($regs[1]!=$domain){
return Array("domain"=>$regs[1],"ip"=>$regs[2]);
}else{
return Array("domain"=>"","ip"=>$regs[2]);
}
}
return Array();
}
返回的是数组,如果是空数组则域名无效,如果是domain没有指定,那就是A记录,否则是cname记录,并且返回了
今天安装了openads2.0.11版本,想起之前的广告bug,也就是flash文件曾经碰到的错误,URL地址的问题,所以今天特意修复一下,本身首页也还有雀巢的广告。
问题阐述:
客户的网址是这样的:http://server1.adpolestar.net/ADPolestar/lgs/way/;er=&mv=710&pu=ctharmony&ad=0038108?http://www.nescafe.com.cn/promotion/index.asp
经过广告系统后就是:
http://server1.adpolestar.net/ADPolestar/lgs/way/;er=?mv=710&pu=ctharmony&ad=0038108?http://www.nescafe.com.cn/promotion/index.asp
;er=&mv 变成 ;er=?mv 导致传递到adpolestar方会少一个参数或者网址不同而出错了。
openads是会改变flash的链接的脚本的,把按钮地址变成:
然后在代码里面传递变量 a.swf?alink1=****
一般的情况下,openads都会把urlencode一下,图片广告做这样的链接都没有问题,链接都是正常的,到了flash里就不同了,传递到flash的内容是通过参数传递的,虽然参数经过了urlencode,但是在flash里面的脚本却经过了unescape的,所以,网址变化如下:
1 要传递的参数是 a.swf?alink1=http://www.aslibra.com/blog/index.php
2 经过编码传递 a.swf?alink1=http%3A%2F%2Fwww.aslibra.com%2Fblog%2Findex.php
3 flash脚本处理后,其实获得的是 a.swf?alink1=http://www.aslibra.com/blog/index.php
4 也就是经过flash点击后,网址的参数没有编码
可以看到,碰到问题的url是变成了这样的:
adclick.php?dest=http://server1.adpolestar.net/ADPolestar/lgs/way/;er=&mv=710&pu=ctharmony&ad=0038108
阿权查看过adclick.php,里面是先检查自身系统用的变量,把所有变量都加在dest后面:
以上是获取变量,非系统变量存在vars里面,POST的处理就不说了
这个对于常理的链接是没有错误的,就算没有被编码过,那也是正常的,但是这里碰到的就是不正常的网址,不包含"?"字符,而直接就在后面有&字符,导致&后面的字符串被拆分为变量了。
那所以就会把网址变成了:
adclick.php?dest=http://server1.adpolestar.net/ADPolestar/lgs/way/;er=?mv=710&pu=ctharmony&ad=0038108
后面的字符串加在?字符后面了
问题就是上面阐述的了,阿权觉得有临时的方法是在adclick文件里面处理:
这个是临时的了,那永久的处理就是把cache生成之前处理,找了找,找啊找也终于找到了,是编辑素材的时候生成和整理的 htmlcache 参数。
那就从显示开始查,从adframe.php 开始:
查一下view_raw函数,是在 libraries/lib-view-main.inc.php 文件里定义的,是查找广告的过程,找到广告之后,调用 phpAds_getBannerDetails 函数来获取广告信息:
查一下phpAds_getBannerDetails函数,也是在 libraries/lib-view-main.inc.php 文件里定义的
查找是否有cache,否则从数据库读出,之前以为数据是直接整理出来的,一直想着是否在cache到文件或者数据库的时候定义的。其实是保存在数据库里的 htmlcache 字段,所以就要查一下保存入库的代码了。
搜一下就知道是在 admin/lib-banner.inc.php 里面定义了cache的方法:phpAds_getBannerCache
大约在388行位置有关于flash文件的处理:
里面有相应的代码,主要是把url两次urlencode就可以
测试正常了。
问题阐述:
客户的网址是这样的:http://server1.adpolestar.net/ADPolestar/lgs/way/;er=&mv=710&pu=ctharmony&ad=0038108?http://www.nescafe.com.cn/promotion/index.asp
经过广告系统后就是:
http://server1.adpolestar.net/ADPolestar/lgs/way/;er=?mv=710&pu=ctharmony&ad=0038108?http://www.nescafe.com.cn/promotion/index.asp
;er=&mv 变成 ;er=?mv 导致传递到adpolestar方会少一个参数或者网址不同而出错了。
openads是会改变flash的链接的脚本的,把按钮地址变成:
on (release)
{
getURL(_root.alink1, _root.atar1);
}
{
getURL(_root.alink1, _root.atar1);
}
然后在代码里面传递变量 a.swf?alink1=****
一般的情况下,openads都会把urlencode一下,图片广告做这样的链接都没有问题,链接都是正常的,到了flash里就不同了,传递到flash的内容是通过参数传递的,虽然参数经过了urlencode,但是在flash里面的脚本却经过了unescape的,所以,网址变化如下:
1 要传递的参数是 a.swf?alink1=http://www.aslibra.com/blog/index.php
2 经过编码传递 a.swf?alink1=http%3A%2F%2Fwww.aslibra.com%2Fblog%2Findex.php
3 flash脚本处理后,其实获得的是 a.swf?alink1=http://www.aslibra.com/blog/index.php
4 也就是经过flash点击后,网址的参数没有编码
可以看到,碰到问题的url是变成了这样的:
adclick.php?dest=http://server1.adpolestar.net/ADPolestar/lgs/way/;er=&mv=710&pu=ctharmony&ad=0038108
阿权查看过adclick.php,里面是先检查自身系统用的变量,把所有变量都加在dest后面:
// Get vars
if (isset($_GET))
foreach (array_keys($_GET) as $key)
{
if ($key != 'bannerid' &&
$key != 'zoneid' &&
$key != 'source' &&
$key != 'dest' &&
$key != 'ismap' &&
$key != 'log' &&
$key != 'trackonly' &&
$key != 'n' &&
$key != 'cb')
$vars[] = $key.'='.$_GET[$key];
}
if (isset($_GET))
foreach (array_keys($_GET) as $key)
{
if ($key != 'bannerid' &&
$key != 'zoneid' &&
$key != 'source' &&
$key != 'dest' &&
$key != 'ismap' &&
$key != 'log' &&
$key != 'trackonly' &&
$key != 'n' &&
$key != 'cb')
$vars[] = $key.'='.$_GET[$key];
}
以上是获取变量,非系统变量存在vars里面,POST的处理就不说了
if (isset($vars) && is_array($vars) && sizeof($vars) > 0)
{
if (strpos ($url, '?') > 0)
$url = $url.'&'.implode ('&', $vars);
else
$url = $url.'?'.implode ('&', $vars);
}
{
if (strpos ($url, '?') > 0)
$url = $url.'&'.implode ('&', $vars);
else
$url = $url.'?'.implode ('&', $vars);
}
这个对于常理的链接是没有错误的,就算没有被编码过,那也是正常的,但是这里碰到的就是不正常的网址,不包含"?"字符,而直接就在后面有&字符,导致&后面的字符串被拆分为变量了。
那所以就会把网址变成了:
adclick.php?dest=http://server1.adpolestar.net/ADPolestar/lgs/way/;er=?mv=710&pu=ctharmony&ad=0038108
后面的字符串加在?字符后面了
问题就是上面阐述的了,阿权觉得有临时的方法是在adclick文件里面处理:
if (isset($vars) && is_array($vars) && sizeof($vars) > 0)
{
//hqlulu 2007-12-6 方案一
if(strstr($url,"/;er=")){
$url = $url.'&'.implode ('&', $vars);
}else{
if (strpos ($url, '?') > 0)
$url = $url.'&'.implode ('&', $vars);
else
$url = $url.'?'.implode ('&', $vars);
}
}
{
//hqlulu 2007-12-6 方案一
if(strstr($url,"/;er=")){
$url = $url.'&'.implode ('&', $vars);
}else{
if (strpos ($url, '?') > 0)
$url = $url.'&'.implode ('&', $vars);
else
$url = $url.'?'.implode ('&', $vars);
}
}
这个是临时的了,那永久的处理就是把cache生成之前处理,找了找,找啊找也终于找到了,是编辑素材的时候生成和整理的 htmlcache 参数。
那就从显示开始查,从adframe.php 开始:
// Get the banner
$banner = view_raw ($what, $clientid, $target, $source, $withtext, $context);
$banner = view_raw ($what, $clientid, $target, $source, $withtext, $context);
查一下view_raw函数,是在 libraries/lib-view-main.inc.php 文件里定义的,是查找广告的过程,找到广告之后,调用 phpAds_getBannerDetails 函数来获取广告信息:
if ($found)
{
// Prepare impression logging
if ($phpAds_config['log_adviews'] && !$phpAds_config['log_beacon'])
phpAds_logImpression ($row['bannerid'], $row['clientid'], $row['zoneid'], $source);
$row = array_merge($row, phpAds_getBannerDetails($row['bannerid']));
return phpAds_prepareOutput($row, $target, $source, $withtext);
}
{
// Prepare impression logging
if ($phpAds_config['log_adviews'] && !$phpAds_config['log_beacon'])
phpAds_logImpression ($row['bannerid'], $row['clientid'], $row['zoneid'], $source);
$row = array_merge($row, phpAds_getBannerDetails($row['bannerid']));
return phpAds_prepareOutput($row, $target, $source, $withtext);
}
查一下phpAds_getBannerDetails函数,也是在 libraries/lib-view-main.inc.php 文件里定义的
查找是否有cache,否则从数据库读出,之前以为数据是直接整理出来的,一直想着是否在cache到文件或者数据库的时候定义的。其实是保存在数据库里的 htmlcache 字段,所以就要查一下保存入库的代码了。
搜一下就知道是在 admin/lib-banner.inc.php 里面定义了cache的方法:phpAds_getBannerCache
大约在388行位置有关于flash文件的处理:
// Set flash variables
if ($banner['contenttype'] == 'swf')
{
if ($banner['url'] != '')
if ($banner['contenttype'] == 'swf')
{
if ($banner['url'] != '')
里面有相应的代码,主要是把url两次urlencode就可以
$buffer = str_replace ('{swf_param}', 'clickTAG={url_prefix}/adclick.php%3Fbannerid={bannerid}%26zoneid={zoneid}%26source={source}%26dest='.urlencode(urlencode($banner['url'])), $buffer);
$buffer = str_replace ($matches[0],
'{url_prefix}/adclick.php%3Fbannerid={bannerid}%26zoneid={zoneid}%26source='.$source.'%26dest='.urlencode(urlencode($url)),
$buffer);
'{url_prefix}/adclick.php%3Fbannerid={bannerid}%26zoneid={zoneid}%26source='.$source.'%26dest='.urlencode(urlencode($url)),
$buffer);
测试正常了。
一般常见的表单是单选,文本输入以及选择框,但也有多选的,处理多选也还有讲究的,我们看看以下代码:
点击这里查看本实例
以上代码点击提交后是这样的:
一般在dreamwear里面设计一个列表:

选择多选就可以,设置一下显示几行

最关键的其实就是下面的代码:
name要设定为数组标识,否则只能收到最后一个选定的值
size是显示几行
multiple是这个形式必选的。
<pre>
<?
print_r($_POST);
?>
<form method=post action="">
你喜欢哪些网站?<br />
<select name="product[]" size="4" multiple="multiple" id="product">
<option value="www.aslibra.com" selected="selected"> -www.aslibra.com- </option>
<option value="www.163.com"> -www.163.com- </option>
<option value="www.zcom.com" selected="selected"> -www.zcom.com- </option>
<option value="www.sohu.com"> -www.sohu.com- </option>
<option value="www.265.com"> -www.265.com- </option>
</select><br />
<input type="submit" value="提交!">
</form>
</pre>
<?
print_r($_POST);
?>
<form method=post action="">
你喜欢哪些网站?<br />
<select name="product[]" size="4" multiple="multiple" id="product">
<option value="www.aslibra.com" selected="selected"> -www.aslibra.com- </option>
<option value="www.163.com"> -www.163.com- </option>
<option value="www.zcom.com" selected="selected"> -www.zcom.com- </option>
<option value="www.sohu.com"> -www.sohu.com- </option>
<option value="www.265.com"> -www.265.com- </option>
</select><br />
<input type="submit" value="提交!">
</form>
</pre>
点击这里查看本实例
以上代码点击提交后是这样的:
Array
(
[product] => Array
(
[0] => www.aslibra.com
[1] => www.zcom.com
)
)
(
[product] => Array
(
[0] => www.aslibra.com
[1] => www.zcom.com
)
)
一般在dreamwear里面设计一个列表:

选择多选就可以,设置一下显示几行

最关键的其实就是下面的代码:
name="product[]" size="4" multiple="multiple"
name要设定为数组标识,否则只能收到最后一个选定的值
size是显示几行
multiple是这个形式必选的。






