加密的GET参数
WEB驱动事件与交互的最基本的方法就是通过GET参数,我想你懂paperen说的是什么意思的。
www.example.com/news/?id=234
www.example.com/goods.php?id=2
众所周知的事情,discuz的产品是被广泛使用的,大部分论坛都是使用discuz的,而uchome也作为discuz在sns领域的产品被广泛使用,充分扩展了论坛用户的联系,从一个论坛变为一个社区。而且关键是源代码公开的,也就是说你可以看它的代码并根据自己需要加入自己的代码与二次开发,或者二次开发discuz的产品能被作为php程序员的基本技能之一。
最近,也不能说是最近了……近一个月……paperen研究了uchome,虽然也并没有把所有功能都看完,但是整体的模式还是明白了,有MVC的味道。paperen主要看了cp.php与space.php的代码,还有它是如何处理ajax的请求的。而paperen发的这篇博文的主题就是一个很简单ajax的运用。
SPL,PHP 标准库(Standard PHP Library),paperen之前在《PHP高级程序设计:模式、框架与测试》一书中就见过这个词,但是那时貌似没有认真对待它,而今天paperen再重新查阅了spl相关的资料,证实了一样东西“值得一试并值得加以融入到以前的编码模式中”。放在前面,本文并不是要详说spl中的具体东西,而是纯属个人吹水……
可能您也没怎么了解有关spl的东西,但是建议您不妨查阅一下资料,在google输入php spl您会得到一些很吸引人的标题,比如“PHP SPL,遗落的宝石”,确实值得您浏览一番滴~~
”spl从 PHP 5.0 起内置的组件和接口,并且从 PHP5.3 已逐渐的成熟“,但目前spl貌似没怎被开发使用。当然啦,在使用spl之前还是得需要一定的代码基础,因为大部分都是与类或者接口打交道的,如果您连什么叫类都不是太清楚的话,相信阅读手册会可能会有点困难,您至少需要有些少oop(Object Oriented Programming)面向对象的基础。
之前都有想过将paperen的博客开源,不过最近到了深圳空余时间就越来越少了,而今天终于提早来公司将paperen的博客发布了。
本博客是PHP的,默认数据库为mysql。因为最近paperen的在线时间实在太少了,住的地方还没办上网,所以目前没有安装程序,也就说需要手动配置一下,请大家按照以下步骤进行手动配置。
将paperenblog.rar解压后:
1.登录到您的数据库并新建一个数据库,如果之前有数据库的话可以跳过这步(比如您现在新建了一个叫paperenblog的数据库)
IP to location就是ip地址转为实际地址啦,近来paperen在公司的一个任务是做一个叫防同行的插件,其实就是实现网站屏蔽被某个地区ip或者城市,甚至是国家的人浏览的功能,在网页中放上一个script的调用就可以,在这个项目中paperen终于体会到大数据量的数据库是怎样一回事……嗯……多余的就不说太多了,直接说这个iptolocation算啦。(声明一下这篇文章的IP to location并不是在公司那个项目所使用的技术)?
今天为博客加上了一个接口,功能只是来获得浏览者的所在地,这个接口的实现主要难在实现ajax跨域,而数据主要是使用了www.webxml.com.cn的webservices来获得,它的接口的地址是
今天早上才发表了一篇,下午paperen我趁着有空又回头去看了下个phpcms的代码,一直看到晚上,当然啦,这次再看又有了不少收获,有些地方理解更加深刻了,或许paperen说的学习php的好办法就是在动手与读代码中循环进行的。?
不说太多废话了吧,这次挖了它操作mysql的那个类过来解剖,这个类用起来还真是相当的方便啊。让我们来see see到底是怎样使用吧。不过在你看下面的东西时先声明一下单这个类的代码就有240多行。paperen我会在下面慢慢说的。?
一开始肯定要定义一系列数据库相关的常量与require这个文件过来。
又是一个以自己为钻研目标的话题,可能你会有更好的办法(例如使用框架开发)欢迎交流,而我这里也只是与大家分享一下自己的做法。?
初期:庞大而独立的风格。?
记得那时paperen我从asp过来php的时候,都是将一大堆的php代码写在一个文件中,夹杂着html与php代码,而且每个文件的独立性很强,它们彼此间缺少分享精神,它们都是很自私,除了那个连接数据库的文件外,因为那时我就是在每个文件头部require("db.php");这样做的,而且还没分块来实现,就是说整个页面的html都是复制过去另一个页面里面,变的可能只是php代码与一些模块内容。
相信在大多数blogger中甚至在大多数喜欢网上冲浪的人眼中,WordPress这个名词就从没有陌生过,虽然paperen我没做过统计但是在10个博客中至少有6个是用WordPress打造的,不是我夸张是实际如此。power by wordpress,即使你在他网页中看不到这段话但是在地址栏加上wp-login.php,也就会看到WordPress的登录入口。
其实paperen不是特别推荐php新手直接就从WordPress开始你的php之路,因为一开始接触wp(WordPress的简称),你需要从创作主题开始慢慢上手,而创作主题的过程中其实你接触到的php的核心代码是很少的,一般你只是在用wp已经封装好的函数,创作一些文件,paperen我今天才算弄了一个比较像样的主题,但是总觉得不是我渴望那种方式,怎我还是觉得自己从头到尾写完一个网站比较有feel点,不过对快速开发网站而言,WordPress的优势实在是很明显,本身的功能对于打造博客而言已经是很足够了,但是你还可以改造成一些cms网站,企业网站。其实说到底paperen似乎是说自己没有将wp玩熟了。?
最近paperen我都是在看别人的代码,phpcms,wordpress,都看得头晕眼花的,再次证实了自己那个真理--“看别人写的代码真是痛苦”,但是为了升级自己的php技能与水平,增加点经验值这也是必经之路啊。
不多说,前几天看到phpcms一个addslashes功能的函数,挺不错的,有了递归的方法,如果参数是一个数组的话会遍历整个数组数值,对于addslashes函数的定义就是给单引号('),双引号("),反斜杠(/)加上反斜杠。
echo addslashes(" ' " ");//将会得到 ' "
虽然递归用得不是很多,但是有时候也会派上用场,例如phpcms中那个函数。
最近paperen公司的那个搞了一年的东西也差不多可以拿出来了,至少在数据上可靠了点,界面上就……程序上就更……关于丢失密码的处理会有涉及到给会员的注册邮箱发送邮件功能,其实就是运用了SMTP这个服务。
正如对PHP函数有了解的人都应该知道PHP中有一个mail函数,直接调用它理论上就可以发送邮件了
220 163.com Anti-spam GT for Coremail System (163com[20101010])
helo paperen
250 OK
auth login
334 dXNlcm5hbWU6
//你帐号的base64码
334 UGFzc3dvcmQ6
//你帐号密码的base64码
235 Authentication successful
mail from:
250 Mail OK
rcpt to:
250 Mail OK
data
354 End data with.
mime-version:1.0
from:paperen
to:paperen
subject:test
content-type:text/html; charset="utf-8"
//这里要空两行,1行
//2行
hello world!
.
250 Mail OK queued as smtp4,DtGowLCbrgVa+y5N1C9xAA--.11142S2 1294924769
$smtp_server = 'smtp.163.com';
$smtp_port = '25';
$fp = fsockopen( $smtp_server , $smtp_port );
echo fgets( $fp );//220 163.com Anti-spam GT for Coremail System (163com[20101010])
fclose( $fp );阅读更多既然可以这样搞,故下面的代码就明了,注意的是可能需要判断一下服务端返回的状态,是否错误,是否可以继续。不过在这个例子中paperen就不写这么严谨了,毕竟最后会分享一个摘自uchome的利用socket发送邮件的函数。$username = '***';//您邮箱的帐号,@前面的
$password = '***';//密码
$from = 'paperen@163.com';//寄信人邮箱
$to = 'paperen@gmail.com';//收件人邮箱
$smtp_server = 'smtp.163.com';//smtp服务器
$smtp_port = '25';//端口
$message = "Hello paperen,i use php send a mail to you,very cool yet?";//邮件内容
$subject = "Test Only";//邮件标题
set_time_limit(0);
$fp = fsockopen( $smtp_server , $smtp_port );
if( substr( fgets( $fp ), 0, 3 ) != '220' ) exit('connect error');
//hello
fputs($fp, "helo 163\r\n");
if( substr( fgets( $fp ), 0, 3 ) != '250' ) exit('helo error');
//auth login
fputs($fp, "auth login\r\n");
if( substr( fgets( $fp ), 0, 3 ) != '334' ) exit('user error');
fputs($fp, base64_encode( $username ) . "\r\n" );
if( substr( fgets( $fp ), 0, 3 ) != '334' ) exit('pwd error');
fputs($fp, base64_encode( $password ) . "\r\n" );
//auth success
if( substr( fgets( $fp ), 0, 3 ) != '235' ) exit('auth failed');
//mail from
fputs($fp, "mail from:<{$from}>\r\n" );
if( substr( fgets( $fp ), 0, 3 ) != '250' ) exit('mail from error');
//rcpt to
fputs($fp, "rcpt to:<{$to}>\r\n" );
if( substr( fgets( $fp ), 0, 3 ) != '250' ) exit('rcpt to error');
//data
fputs($fp, "data\r\n" );
if( substr( fgets( $fp ), 0, 3 ) != '354' ) exit('data error');
//header
$headers = "mime-version: 1.0\r\n";
$headers .= "from: paperen<{$from}>\r\n";
$headers .= "to: paperen<{$to}>\r\n";
$headers .= "subject: {$subject}\r\n";
$headers .= "content-type: text/html; charset=utf-8\r\n";
fputs($fp, "{$headers}\r\n\r\n" );
fputs($fp, "$message\r\n");
fputs($fp, ".\r\n");
if( substr( fgets( $fp ), 0, 3 ) != '250' ) exit('sendmail failed');
echo 'OK';
fclose( $fp );就是这么简单就可以用php帮你搞掂,是不是很cool~下面附带自己在uchome摘出来的一个sendmail函数,具体配置需要自己根据自己需求修改才可以发送,paperen测试过gmail,163,126,sina,hotmail,qq均可以收到邮件。关于中文标题与内容乱码的问题自己参照sendmail这个函数中看吧,看完你就明白了,主要是43行到53行的代码要看看。$email_subject = '=?' . $mail['charset'] . '?B?'.base64_encode(preg_replace("/[\r|\n]/", '', '['.$mail['sitename'].'] '.$subject)).'?=';
$email_message = chunk_split(base64_encode(str_replace("\n", "\r\n", str_replace("\r", "\n", str_replace("\r\n", "\n", str_replace("\n\r", "\r", $message))))));
$headers = "From: $email_from{$maildelimiter}X-Priority: 3{$maildelimiter}X-Mailer: ". $mail['sitename'] ."{$maildelimiter}MIME-Version: 1.0{$maildelimiter}Content-type: text/html; charset=" . $mail['charset'] . "{$maildelimiter}Content-Transfer-Encoding: base64{$maildelimiter}";下载地址 这里呼·~~好不容易才写完一篇,希望对使用php发送邮件或者想玩玩底层发邮件的你有点帮助吧
最近看恶心代码太多了,也写了太多垃圾代码了……真是哦弥陀佛……感觉paperen变垃圾……
唉~~不多说了,直接开始正文算了。放代码,对比一下下面两个sql变量,然后入库查询,你觉得有问题么?
$id = isset($_GET['id']) ? $_GET['id'] : '';
if ($id) {
$sql = 'select * from goods where id='.$id;
echo $sql.'
';
$r_1 = $db->select($sql);
print_r($r_1);
echo '----
';
$sql = "select * from goods where id='$id'";
echo $sql.'
';
$r_2 = $db->select($sql);
print_r($r_2);
echo '----
';
}
表面上看上去都是可以的,当test.php?id=1时输出sql这个变量都是一样的,但是如果我随意改变一下这个id呢?改为test.php?id=1 or 1=1,你就会看到区别了。
顶~~N久没发表东西了,近来paperen除了工作还是工作,paperen对于公司目前的项目管理有一大堆意见~~不过新来就不要太激进了,前段时间已经因为自己对于目前开发的那个项目首页的性能而弄了一个小会,我提的意见主管老是说好,但是结果还是没有落实,唉,算啦~~竟然他们都不理会,paperen会用代码与实例来证明给他们听的啦。
今天自己将本机中的后台代码传上本地网络的一台测试服务器上(因为他们要在局域网中测试项目),但是遇到了一个header的问题,让paperen郁闷了一会。自己用下面这个函数来重定向(有js模式的重定向与直接使用header),比如后台某些操作成功后会自动跳转之类的功能,当然也会直接跳转。
function dheader($location, $isjs = false, $timer = 1){
if(empty($location)) return '';
if($isjs){
$timer = $timer*1000;
echo "<script type='"text/javascript"'>setTimeout("window.location.href='$location'", $timer);</script>";
}else{
header("location:$location");
exit();
}
}
而结果在直接header时总出现警告。
今天终于算是可以来更新一下paperen的网站,嗯……因为写毕设论文写累了所以就发表一篇关于上传文件类的东东吧,这个类也是自己写的,不知道对大家有没有用,如果觉得可以就拿去用吧。不过在编码上面还是没做好,自己是在utf8的页面将数据进行提交的,所以生成的文件如果保持原来的中文名字的话在文件夹中看到就是乱码的名字,如果不想出现乱码的话需要进行一下编码的转换。?
随便说下这个类怎样调用吧,方法很简单?
对于这个三个字母组成的这个专业名词,paperen我就不具体解析太多了,因为自己也不是十分十分的掌握。对于初学者而言或许你不用过分地从这个名词开始你的php之路,但是如果你走在php的道路上时就不可不知道这个名词了,因为这种思想对于开发网站而言是十分有利的,充分体验就是它将一个站点的分离成三个大体部分,M(模型),V(视图)和C(控制器),而正是这样使之可以使用具有不同专长的人员进行整个站点的开发,比如你是一个优秀的网页设计师,那么好简单你的工作就是去写好你的css,js还有html结构,当然他还要学一种模板语言,或者是开发小组自定义的一种模板语言,他不用理会过多关于php的东西甚至数据的组织问题。至于模型应该是算法最为之集中的地方,与数据库交互并处理数据,而这个部分就交由程序工程人员吧,而他们也不用处理任何页面表现的东西。而(C)控制器就是衔接V与M的一个桥梁吧,通过浏览者的动作去触发相应的响应进而通知相应模型获得数据之后再放入视图进行显示,那么一个页面就是如此完成了。?
当然啦,开头说了这些都只是一个很模糊的描述,paperen我也不是理解得很深刻,但是看了一下《php高级程序设计》一书还有看了一些开源的代码,也使用过qeephp这个框架就不多不少有了点了解。有这个思想是很重要的,所以在开发中就要向这方面去靠。?
对于模板语言,当然你可以使用smarty,还可以自己定义自己的一套,在paperen看的一些开源程序中就经常使用一些正则去将这些模板语言翻译成能被php解析的语言。而显然这一部分是很好理解的,如果真的还是不那么了解你可以去看看phpcms的那些视图文件。?
话说paperen都N久没写东西了,这段时间都是在折腾,昨天才从广州折腾回来,感觉生活有时候真是很累很累……工作都是要求你会框架,会改造一些开源东东,确实自己这方面还是不行啊,oop这种思想也不经常使用,或许是自己懒吧,当习惯了以前那种编码风格后老是照着那种模式去编,而没有再去研究一些更好的方法,例如大家推荐的oop风格与框架开发。?
昨晚看了一些书,也得到了一些启发。其实对于php中类的概念与c++中的类是差不多的,应该说几乎一样吧,不过php的class不支持多重继承,书中说你可以使用接口去弥补,不过这里多余的东西就不多说了。?
记得paperen之前那篇解析自己是怎样写php网站的文章吧,思想是很简单的,统一入口index,在index页中判断传入的参数决定给予浏览者哪个页面与应该调用哪个相应的处理文件(一般都要写写.htaccess文件来完成网址重写的功能),例如首页是index.inc.php(这里就paperen我就叫处理文件吧)在这里面可以处理一些与数据库交互的操作与运算,然后再调用需要的文件(视图文件)index.tpl。
原来懒吧的空间也支持php的,那行啦,干脆用php写算了,asp我都不会了……写几行就有错而且用惯了php后用asp特不顺手,php对变量的定义太宽松,回到asp里面却觉得不习惯。昨天晚上试弄了一下个购物车功能,这里也写出来分享一下吧,顺便也更新一下博客……?
例子地址http://paperen.com/demo/cart/?
购物车的实现说到底就是在使用一些超级变量,你可以使用cookie或者session来做你的购物车,就是存储你的临时购物记录,当然你还可以使用数据库进行记录,方法就三种,自己随便挑一种适合自己使用的就可以了,而paperen这里使用了cookie进行记录。?
话说吴同学有任务给我做,昨天还打电话给我说需要搞几个功能,一个是报表一个是打印,昨天都研究了打印那个控件半天,结果证实了某些功能需要购买才能使,也不能怪人家,都不容易嘛,哪有像外国人那么大方的(貌似是吧……)就找了这两个报表工具而言(都是free的--免费),当然你也可以买,paperen我也不知道付费与不付费有啥不同,没仔细看他们的网站。(还有事先声明paperen我没给他们买广告……)?
http://down.52z.com/xl/FusionChartsFree.rar FusionChartsFree下载?
至于open-flash-chart的下载自己到官网上找找就有,paperen我忘了记地址了……?
前几天小白让我看看怎样去实现邮件激活账号的功能,对于一些大型的论坛或网站注册一般都会这样做的啦,用来防止某些人乱注册的情况,一开始paperen我就有个思路,就是在用户注册时,生成一个随机的数列同时放入到数据库中(自己就想到用MD5),然后调用mail函数向注册的邮箱发一封邮件,里面装着一个地址(如example.php?rand=f3223d2d32d&id=12)刚才实现了下,看来paperen我的思路是可行的。下面来具体说一下是到底怎实现的吧。?
首先从基本开始吧,对于注册页面肯定就是一个form啦
<form method="post" action="reg.php">
<p>Name:<input type="text" name="name" /></p>
<p>Email:<input type="text" name="email" /></p>
<p>Password:<input type="password" name="pwd" /></p>
<p><input type="submit" name="submit" value="Reg Now" /></p>
</form>
最近评论