涉及 PHP 标签的文章 所有标签


手工制作的polygon框架
4年前
  • 2
  • 0

手工制作的polygon框架

这个小框架是paperen3年前就写了,但说来惭愧一直闭源同时模型层糟糕,最近抽空将模型层丰富与抽象了接近可用程度才敢拿出来开源,暂且给个0.0.1版本...

代码确实是一般般,但作为平时快速搭建与开发接口来说也还勉强够用,如各位大佬发现有什么可以改进的话或bug随时吐槽

https://paperen.com/file/208

git地址:https://github.com/paperen/polygon

下面为polygon的README

polygon框架

  • 编写始于插件化/模块化思想
  • 适合快速编写简单的接口
  • 半自动转换中英语言

如何开始

  1. git clone到本地后
  2. composer update
  3. 修改config/config.php(按实际情况调整数据库信息,区分develop/test/production三种环境配置,关于环境常量参见index.php中的ENV)
  4. 浏览器访问 本地地址+/api/index
  5. clone下来自带存在两个模块adminapiadmin是后台(只有一个登录页,没写什么逻辑,不是重点)仅提示也可以做成后台或前台等,重点是api
  • /api/index - API模块
  • /admin/login - admin模块

具体指向哪个控制器方法需要对照分别模块中路由映射

阅读更多
用户动作记录器
12年前
  • 0
  • 0

用户动作记录器

当我们设计的站点应用对安全有一定要求的话,就可能会涉及到需要记录使用者的操作记录,比如什么时候登录什么时候做了些什么之类的,你也可以称之为用户操作足迹。

具体来说要实现的最终要得到的数据是如下的:

吴给力在 2012-02-18 01:14:13 上了厕所
吴给力在 2012-02-18 01:17:23 回到床上
吴给力在 2012-02-18 02:26:43 接起电话
吴给力在 2012-02-18 02:27:11 放下电话

就针对上面这个描述来说的话,我们可以有两种解决办法:在吴给力身上装一个记录器,凡是与其身体有接触的东西都会被记录下来同时记录触发的时间;在所有东西上放置记录器,每当触摸人是吴给力时就会连同时间记录下来,理论上两种都是可行的办法,既然这样那就写写试试吧。

阅读更多
你是这样处理来自$_GET的数据吗
14年前
  • 0
  • 1

你是这样处理来自$_GET的数据吗

最近看恶心代码太多了,也写了太多垃圾代码了……真是哦弥陀佛……感觉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,你就会看到区别了。

阅读更多
换行符与header
14年前
  • 0
  • 0

换行符与header

顶~~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时总出现警告。

阅读更多
phpcms中那个操作mysql的类
14年前
  • 2
  • 2

phpcms中那个操作mysql的类

今天早上才发表了一篇,下午paperen我趁着有空又回头去看了下个phpcms的代码,一直看到晚上,当然啦,这次再看又有了不少收获,有些地方理解更加深刻了,或许paperen说的学习php的好办法就是在动手与读代码中循环进行的。?

不说太多废话了吧,这次挖了它操作mysql的那个类过来解剖,这个类用起来还真是相当的方便啊。让我们来see see到底是怎样使用吧。不过在你看下面的东西时先声明一下单这个类的代码就有240多行。paperen我会在下面慢慢说的。?

一开始肯定要定义一系列数据库相关的常量与require这个文件过来。

阅读更多
我是怎样编写网站代码的
15年前
  • 0
  • 0

我是怎样编写网站代码的

又是一个以自己为钻研目标的话题,可能你会有更好的办法(例如使用框架开发)欢迎交流,而我这里也只是与大家分享一下自己的做法。?

初期:庞大而独立的风格。?

记得那时paperen我从asp过来php的时候,都是将一大堆的php代码写在一个文件中,夹杂着html与php代码,而且每个文件的独立性很强,它们彼此间缺少分享精神,它们都是很自私,除了那个连接数据库的文件外,因为那时我就是在每个文件头部require("db.php");这样做的,而且还没分块来实现,就是说整个页面的html都是复制过去另一个页面里面,变的可能只是php代码与一些模块内容。

阅读更多
关于打造自己的WP主题
15年前
  • 0
  • 0

关于打造自己的WP主题

相信在大多数blogger中甚至在大多数喜欢网上冲浪的人眼中,WordPress这个名词就从没有陌生过,虽然paperen我没做过统计但是在10个博客中至少有6个是用WordPress打造的,不是我夸张是实际如此。power by wordpress,即使你在他网页中看不到这段话但是在地址栏加上wp-login.php,也就会看到WordPress的登录入口。

201001241264263309

其实paperen不是特别推荐php新手直接就从WordPress开始你的php之路,因为一开始接触wp(WordPress的简称),你需要从创作主题开始慢慢上手,而创作主题的过程中其实你接触到的php的核心代码是很少的,一般你只是在用wp已经封装好的函数,创作一些文件,paperen我今天才算弄了一个比较像样的主题,但是总觉得不是我渴望那种方式,怎我还是觉得自己从头到尾写完一个网站比较有feel点,不过对快速开发网站而言,WordPress的优势实在是很明显,本身的功能对于打造博客而言已经是很足够了,但是你还可以改造成一些cms网站,企业网站。其实说到底paperen似乎是说自己没有将wp玩熟了。?

阅读更多
CI模型扩展成调用即加载(含缓存模式)
12年前
  • 2
  • 0

CI模型扩展成调用即加载(含缓存模式)

关于CI中的模型的标准用法是先要load然后才能使用的,基于这种调用模型的做法长久下来就让paperen觉得麻烦,一开头就得要将用到的模型手动全部load过来,当然这种算是比较苛刻的做法也是有它的理由,毕竟这就清楚这部分引用了哪些模型与减少加载多余模型的机会。

// 加载用户模型
$this->load->model('user');
// 获取所有用户数据
$this->user->all( $per_page, $offset );

CI的模型文档 http://ellislab.com/codeigniter/user-guide/general/models.html

在开始后续内容之前还是声明一下

调用即加载

paperen想象中要达到的目的就是

// YY一下要实现的调用写法
$this->model_user_all( $per_page, $offset );

我们不需要再先load,调用的时候就会自动加载,格式必须是model_{模型名称}_{方法}( 参数1, 参数2, ... )

如果你觉得这样不适合自己使用就不用往下看了

附带查询缓存的概念
// YY一下要实现的调用写法
$this->model_cache( 'model_user_all', $per_page, $offset );

之前也有一篇关于查询缓存的文章 http://paperen.com/post/ci-querycache-extend

其实就是避免不同模块执行了相同的SQL语句,模块之间的数据完成是可以公用的,而这个querycache就是桥梁,也算是一种解决办法吧,不过在这次扩展中querycache将成为其中的组件,对于我们来说它完全是透明的

强调一下 对插入与更新、删除的动作不要使用查询缓存 paperen在代码中并没有限制这个也就是意味着你可以使用model_cache来完成update、insert、delete等操作,但是这有什么意义呢。。。

阅读更多
关于smtp发送邮件一些东东
14年前
  • 0
  • 0

关于smtp发送邮件一些东东

最近paperen公司的那个搞了一年的东西也差不多可以拿出来了,至少在数据上可靠了点,界面上就……程序上就更……关于丢失密码的处理会有涉及到给会员的注册邮箱发送邮件功能,其实就是运用了SMTP这个服务。

正如对PHP函数有了解的人都应该知道PHP中有一个mail函数,直接调用它理论上就可以发送邮件了

bool mail ( string $to , string $subject , string $message [, string $additional_headers [, string $additional_parameters ]] )

你能从手册中获得更多例子,这个函数确实是太方便了,以至于paperen一开始也会对它感到神奇,因为实在是搞不清为什么一个函数就能发送一封邮件,直观上看来貌似这个函数能直接跟邮局联系。但实质上它要起作用需要服务器的支持,简单来说你的服务器需要有SMTP 服务。

很幸运公司的服务器有这个服务,但也很不幸运直接调用mail函数来发邮件的结果并不能让自己满意。当然paperen也找了不少网上提供的发送邮件代码,结果都不是很满意的,有些邮箱能收到有些邮箱收不到,而且绝大部分都是一些主流的邮箱,例如163,126等

所以paperen觉得还是有必要自己搞清楚一下这个原理,其实真的没那么神秘。

或者你开始你需要对smtp有一个基本的了解,paperen貌似以前大学的时候就学过这个,但书上学得确实没有实践中学的劲。

或者你可以看看以下链接的内容

然后动动手试试在"黑屏"下发一封邮件玩玩。下图为telent localhost 25后的界面,可以使用help参数查看命令。

20110113210420

如果有一台服务器而且有smtp服务的话不妨可以试试,paperen公司里面就有一台对外的服务器可以玩,oy~~不过如果没有服务器也不要紧,你可以使用第三方的smtp服务的,参见下面的例子(使用163的)

在cmd下输入 telnet smtp.163.com 25

20110113210644

就能登陆到163的smtp服务了,不过首先要使用helo命令打个招呼先

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

20110113212115

其中334两行分别要填写您在163的帐号与密码,而且要用base64码,这个也很容易嘛,可以用php中的base64_encode函数帮你或者用在线工具 http://tool.114la.com/base64.html  复制后在黑屏里面右击粘贴就可以了,也不用自己照着输入。

后面其实也就没什么了,mail from你懂的,rcpt to也就是要发给谁。不过要注意一下在data后,也就是在写邮件内容前空两行。然后到gmail看看吧。

20110114091637

这就使用命令行模式下成功发送了一封邮件了,这就是发送邮件的原理。Of course~光来点英文的信件也没神马意思,我们就是喜欢玩花样的,或者你觉得"发中文内容还不容易嘛,也是拷贝的功夫",在黑屏下的确不支持中文输入法的,没错也得用拷贝的方法将中文弄到邮件内容里面去,但别高兴得太早,如果你以为就这么简单那么你就错了,结果发送过来的邮件就是一堆乱码"??????????????????",N个口……问你死未……

其实发中文的关键也在于要对内容进行一下base64加密,并在邮件头加上一个声明

Content-Transfer-Encoding: base64

那么发送的内容就ok了,不过至于邮件的标题嘛,详见下面,因为标题处有些少复杂,需要加上一些字符来标识。

所谓懒惰是动力是对的,想象一下如果我们都是在命令行下发送邮件的话……发一封邮件少则需要15分钟,多则半个小时……这真的让人崩溃了,就连paperen自己面对着这个黑屏状态敲着无数遍重复的命令也快要崩溃了(还不能输错,paperen不知道如何删除之前的输入……只能覆盖而且覆盖后的命令会乱码的,你试试看就明白),就写一个程序让它帮我们发送邮件好了。

下面开始来更爽的,就是搞一个发邮件的php程序。

或者在开始之前你需要了解关于socket的知识  http://baike.baidu.com/view/13870.htm

简单来说socket就是ip+端口号的意思,你需要跟其他机子交流你需要链接到正确的端口号上并且该端口号应该有进程在接收与处理数据,或者大概就是这个意思吧~~而正如在命令行下操作发送邮件,我们首先要做的就是要连上smtp服务器,然后再输送命令与数据,所以我们第一步是要连接到服务器smtp服务监听的端口上,163的就是25。

php内置关于socket操作的函数也够全面的了,自己可以在手册中输入socket看看。

对于连上163的smtp,首先使用的是fsockopen(Open Internet or Unix domain socket connection)打开一个socket连接,fsockopen返回的是一个资源类型的数据,换言之可以使用fgets来获取在socket上传输的数据。

$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 );

20110114205835

就是这么简单就可以用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发送邮件或者想玩玩底层发邮件的你有点帮助吧

阅读更多
传说中的SPL
14年前
  • 3
  • 2

传说中的SPL

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)面向对象的基础。

阅读更多
一个上传文件的Class
14年前
  • 1
  • 0

一个上传文件的Class

今天终于算是可以来更新一下paperen的网站,嗯……因为写毕设论文写累了所以就发表一篇关于上传文件类的东东吧,这个类也是自己写的,不知道对大家有没有用,如果觉得可以就拿去用吧。不过在编码上面还是没做好,自己是在utf8的页面将数据进行提交的,所以生成的文件如果保持原来的中文名字的话在文件夹中看到就是乱码的名字,如果不想出现乱码的话需要进行一下编码的转换。?

代码地址?

随便说下这个类怎样调用吧,方法很简单?

阅读更多
oop思想去建造网站
14年前
  • 0
  • 0

oop思想去建造网站

话说paperen都N久没写东西了,这段时间都是在折腾,昨天才从广州折腾回来,感觉生活有时候真是很累很累……工作都是要求你会框架,会改造一些开源东东,确实自己这方面还是不行啊,oop这种思想也不经常使用,或许是自己懒吧,当习惯了以前那种编码风格后老是照着那种模式去编,而没有再去研究一些更好的方法,例如大家推荐的oop风格与框架开发。?

昨晚看了一些书,也得到了一些启发。其实对于php中类的概念与c++中的类是差不多的,应该说几乎一样吧,不过php的class不支持多重继承,书中说你可以使用接口去弥补,不过这里多余的东西就不多说了。?

记得paperen之前那篇解析自己是怎样写php网站的文章吧,思想是很简单的,统一入口index,在index页中判断传入的参数决定给予浏览者哪个页面与应该调用哪个相应的处理文件(一般都要写写.htaccess文件来完成网址重写的功能),例如首页是index.inc.php(这里就paperen我就叫处理文件吧)在这里面可以处理一些与数据库交互的操作与运算,然后再调用需要的文件(视图文件)index.tpl。

阅读更多
实现购物车功能
15年前
  • 0
  • 0

实现购物车功能

原来懒吧的空间也支持php的,那行啦,干脆用php写算了,asp我都不会了……写几行就有错而且用惯了php后用asp特不顺手,php对变量的定义太宽松,回到asp里面却觉得不习惯。昨天晚上试弄了一下个购物车功能,这里也写出来分享一下吧,顺便也更新一下博客……?

例子地址http://paperen.com/demo/cart/?

购物车的实现说到底就是在使用一些超级变量,你可以使用cookie或者session来做你的购物车,就是存储你的临时购物记录,当然你还可以使用数据库进行记录,方法就三种,自己随便挑一种适合自己使用的就可以了,而paperen这里使用了cookie进行记录。?

阅读更多
面试那个小测试
15年前
  • 0
  • 0

面试那个小测试

第一天上班回来……累死了,头晕……?

不说苦了,越说越累……直接入正题,话说昨天的面试那个作业,后台添加上可以管理友情链接的功能,就是一个很基本而且很简单的功能,paperen我不知道若我昨天没做出来会不会应聘成功。下面说说这个功能是如何实现吧。?

要添加并管理友情链接,当然需要数据库的支持啦,不是说每添加一个友情链接就要去改页面的代码,这样维护性太差了而且也不合理。(这里的代码是自己回来后写的,当然某些部分与我在面试时写的不一样,特别是css那块)

阅读更多