2012年SkyDrive最新外链方法

请见老胡的个人博客 http://hjp.jimdo.com/2012/01/05/skydrive/

 

自从SkyDrive升级之后就没有这个问题了。而且现在有点不一样了。。。

我比较懒,不去换图片了。

大概说下,其实也就是现在的分享外链变了,以前是图片上的很复杂的,现在很简单了,现在的是这样的:https://skydrive.live.com/redir?resid=3585EF8CC3FC9845!164

所以更加简单了,外链地址只要是:http://storage.live.com/items/3585EF8CC3FC9845!164

够简单吧~当然,如果要用在Tencent和Sina等等空间上的话,因为添加网络歌曲的时候它会自动检测你的外链中是否含有“.mp3”,所以上面那个链是没法用的,所以可以加个“Filename=XXX.mp3”~(XXX无所谓的,反正歌名没用了。)

也就是:http://storage.live.com/items/3585EF8CC3FC9845!164?Filename=XXX.mp3

说完了。~

<del>

但是我需要补充下,要想使该方法有效的话,是不能建立文件夹的,等于说,文件要直接传到Root文件夹,额,换言之,就是不建立任何文件夹,直接上传文件。

 

像这样。。。。

 

 

 

 


然后点共享,获取连接,再点第三个,获取之后用第三个链接在浏览器中打开。像这样。。

 

然后取地址栏中最后的id=“”中的内容

像这样。。。

</del>

然后按照下面的格式来拼接:

像这样、、、、

http://storage.live.com/items/3585EF8CC3FC9845%21133?filename=不值得.mp3

黑体是固定格式。

斜体是上图获取到的id

最后就是文件名。

好了,这样就算完了。。。。。

不信?如果这招没用的话,你也就看不到我的图片了。不信的话你可以查看图片的外链地址哦亲~呵呵。

hotfile wupload premium资格

偶尔在yisi.us上看到的、还不错。还在使用。就是最大的限制是中国的宽带和国际的接轨速度还是不够。。所以使用起来还是有点慢的。。。

哦,一个分享cookies的网站。因为他给的软件要java环境才打得开的。

http://pastebin.com/u/hosterpremiumcookies

——————————————————————————————–

DISCLAIMER:

It’s not allowed to share this program somewhere else! (It won’t even work)

免责声明:

请不要到处显摆这种方法!(要不然就失效啦)

——————————————————————————————–

于是上面是Tom Test的声明。

Tom Test是一项很伟大的工程,有必要把它在天朝推广!= =

Google了一下,国外用这种方法的人蛮多,繁体字的教程也不少,简体字的就寥寥了。好吧,有之,请从斯始!

1.这是啥?

它用写入Cookie的方法获得外国网盘的高级会员使用权限,从而突破IP限制无限下载。

原理:大家在输入账号密码的时候经常会选择“记住”吧,下次访问时就会处于登录状态了。而浏览器就是用Cookie来“记住”的。如果你登录了高级会员账号并“记住”,这时Cookie里就会写入相应的“值”,有人把它提取出来并写入到自己浏览器的Cookie中……

(我的猜测,说的不对请批评!)

2.准备工作

由于天朝特殊的环境,我们首先要做的当然是翻墙,翻墙方法不是本文重点,自己找去。

Chrome或Firefox浏览器

3.寻找Premium Cookie

没错,最重点的部分就是寻找上面说的Cookie的“值”,即所谓的“Premium Cookie”。

比如下面是一串用于Hotfile的Premium Cookie(在这一秒它还是有效的)。

4d1eb6cb4cef4c8ab8d8207dbdce815c32b70b19e146770d8c5147ca83b18ac1

它的“保质期”并不长,我们得不断寻找替代品。你可以用Google搜索。

当然也有专门收集并发布这玩意的站点,比如:premium-accounts-daily和本次的主角Tom Test。

使用Tom Test有两种方法

一是网页版(所幸这个站还没被墙)

首先进入网址(先不要翻墙):http://tomtest.net/,注册(Register)个账号,进入http://tomtest.net/?p=mcg,选择网盘后点击“Generate Cookie”即可生成。

二是客户端

下载最新版本的Multi Cookie Generator(简称“MCG”,用来生成Hotfile,Filesonic,Megaupload,Oron,Uploaded.to,Wupload,Depositfiles的Premium Cookie)。

官网地址:http://tomtest.net/?p=download&d=1。

我上传的:MCG 2.1

下载时都需要翻墙。

还有另一个生成器只用于Hotfile的Hotfile Premium Link Generator(这个下不下看你心情)。

下载之后,解压,运行exe。不出意外应该像下面这样:

Multi Cookie Generator

若出现升级提醒或IP变更警告,不管是啥,点击“OK”。之后下载最新版本,或修改账号的IP地址。你需要有基础的英语能力。

之后点击“Get code”按钮,浏览器会出现跳转到一个页面,把Authorization code复制下来即可。如果没出现Authorization code,说明你浏览网页时的IP和电脑本地IP不一致。

把Code粘贴进去,点击“Sign in”。

之后看图:

终于得到一串Premium Cookie了!

右下角有目前的数量

4.使用Premium Cookie

现在我们只需把Premium Cookie写入Cookie里。

可以通过插件的方式实现

(英文教程在这:http://www.isoftdl.com/2011/05/hotfile-premium-account-cookie.html)。

Firefox的插件叫Cookie Manager,Chrome的插件也叫Cookie Manager。

Firefox的更好用一点。

我猜你更喜欢用下面的方法。

不管用的是Firefox还是Chrome,先调出你的书签工具栏,之后右键——“添加书签(网页)”。

名称随便写,地址(网址)里复制下面这行代码。

javascript:hf=location.hostname;if(hf==”depositfiles.com”||hf==”www.depositfiles.com”){coo=”autologin”;dom=”.depositfiles.com”;}else if(hf==”easy-share.com”||hf==”www.easy-share.com”){coo=”PREMIUM”;dom=”.easy-share.com”;}else if(hf==”filefactory.com”||hf==”www.filefactory.com”){coo=”ff_membership”;dom=”.filefactory.com”;}else if(hf==”alldebrid.fr”||hf==”www.alldebrid.fr”){coo=”uid”;dom=”.alldebrid.fr”;}else if(hf==”alldebrid.com”||hf==”www.alldebrid.com”){coo=”uid”;dom=”.alldebrid.com”;}else if(hf==”alldebrid.org”||hf==”www.alldebrid.org”){coo=”uid”;dom=”.alldebrid.org”;}else if(hf==”alldebrid.it”||hf==”www.alldebrid.it”){coo=”uid”;dom=”.alldebrid.it”;}else if(hf==”alldebrid.de”||hf==”www.alldebrid.de”){coo=”uid”;dom=”.alldebrid.de”;}else if(hf==”alldebrid.ru”||hf==”www.alldebrid.ru”){coo=”uid”;dom=”.alldebrid.ru”;}else if(hf==”alldebrid.pl”||hf==”www.alldebrid.pl”){coo=”uid”;dom=”.alldebrid.pl”;}else if(hf==”fileserve.com”||hf==”www.fileserve.com”){coo=”PHPSESSID”;dom=”.fileserve.com”;}else if(hf==”filesonic.com”||hf==”www.filesonic.com”){coo=”PHPSESSID”;dom=”.filesonic.com”;}else if(hf==”filesonic.com”||hf==”www.filesonic.vn”){coo=”PHPSESSID”;dom=”.filesonic.vn”;}else if(hf==”filesonic.fr”||hf==”www.filesonic.fr”){coo=”PHPSESSID”;dom=”.filesonic.fr”;}else if(hf==”hotfile.com”||hf==”www.hotfile.com”){coo=”auth”;dom=”.hotfile.com”;}else if(hf==”uploading.com”||hf==”www.uploading.com”){coo=”remembered_user”;dom=”.uploading.com”;}else if(hf==”megaupload.com”||hf==”www.megaupload.com”){coo=”user”;dom=”.megaupload.com”;}else if(hf==”megavideo.com”||hf==”www.megavideo.com”){coo=”user”;dom=”.megavideo.com”;}else if(hf==”rapidshare.com”||hf==”www.rapidshare.com”){coo=”enc”;dom=”.rapidshare.com”;}else if(hf==”netload.in”||hf==”www.netload.in”){coo=”cookie_user”;dom=”.netload.in”;}else if(hf==”4shared.com”||hf==”www.4shared.com”){coo=”PHPSESSID”;dom=”.4shared.com”;}else if(hf==”oron.com”||hf==”www.oron.com”){coo=”xfss”;dom=”.oron.com”;}else if(hf==”wupload.com”||hf==”www.wupload.com”){coo=”PHPSESSID”;dom=”.wupload.com”;}else if(hf==”wupload.cn”||hf==”www.wupload.cn”){coo=”PHPSESSID”;dom=”.wupload.cn”;}else if(hf==”real-debrid.fr”||hf==”www.real-debrid.fr”){coo=”auth”;dom=”.real-debrid.fr”;}else if(hf==”real-debrid.com”||hf==”www.real-debrid.com”){coo=”auth”;dom=”.real-debrid.com”;}else if(hf==”uploadstation.com”||hf==”www.uploadstation.com”){coo=”PHPSESSID”;dom=”.uploadstation.com”;}else if(hf==”turbobit.net”||hf==”www.turbobit.net”){coo=”kohanasession”;dom=”.turbobit.net”;}else if(hf==”debridmax.com”||hf==”www.debridmax.com”){coo=”PHPSESSID”;dom=”.www.debridmax.com”;}else if(hf==”fast-debrid.com”||hf==”www.fast-debrid.com”){coo=”PHPSESSID”;dom=”.www.fast-debrid.com”;}else if(hf==”mega-debrid.eu”||hf==”www.mega-debrid.eu”){coo=”PHPSESSID”;dom=”.www.mega-debrid.eu”;}else if(hf==”uploaded.to”||hf==”www.uploaded.to”){coo=”login”;dom=”.uploaded.to”;}else{alert(“网址好像不对吧,只能用在部分外国网盘上哦!n教程 http://yisi.us/?p=2720″)+fonction.close;}c=prompt(“输入用于”+hf+”上的Premium Cookie n教程 http://yisi.us/?p=2720″,””);if(hf==”uploadstation.com”||hf==”www.uploadstation.com”){coo=”PHPSESSID”;ho=”.uploadstation.com”;}else if(hf==”turbobit.net”||hf==”www.turbobit.net”){coo=”kohanasession”;ho=”.turbobit.net”;}else if(hf==”debridmax.com”||hf==”www.debridmax.com”){coo=”PHPSESSID”;ho=”.www.debridmax.com”;}else if(hf==”fast-debrid.com”||hf==”www.fast-debrid.com”){coo=”PHPSESSID”;ho=”.www.fast-debrid.com”;}else if(hf==”mega-debrid.eu”||hf==”www.mega-debrid.eu”){coo=”PHPSESSID”;ho=”.www.mega-debrid.eu”;}if(c!==””||c!==null+fonction.close)if(c.length < 70 && hf==”uploaded.to”){coo=”PHPSESSID”;ho=”.uploaded.to”;}if(c!==””||c!==null+fonction.close){r=d=new Date();nd=new Date(d.getFullYear()+2,2 ,11);void(document.cookie=coo+”=”+c+”;domain=”+dom+”;path=/;”+(r?”expires=”+nd:””));location.reload(true);}if(c!==””||c!==null+fonction.close){r=d=new Date();nd=new Date(d.getFullYear()+2,2 ,11);void(document.cookie=coo+”=”+c+”;host=”+ho+”;path=/;”+(r?”expires=”+nd:””));location.reload(true);}

(脚本来自这里,我只是做了汉化并添加了wupload.cn。这种技术叫bookmarklet,通过javascript来写入Cookie。)

然后进入Hotfile、Megaupload等网盘的主页,点击此书签,把相应的Premium Cookie粘贴进去,确定。

稍等片刻网页会自动刷新,之后

尽情下载吧!

官方FAQ:http://tomtest.net/?p=faq

声明: 本文采用BY-NC-SA协议进行授权,转载请注明来源:http://yisi.us/?p=2720

WordPress 邮箱插件设置

服务器不想开mail 函数,于是决定是WP的插件实现。用QQ的邮箱。

但是下载的叻插件,按照QQ邮箱官方的提示设置,怎么设置也不成功。就是收不到邮件。

最后多方搜索下,终于发现并非是按照QQ官方的设置,真是杯具了。

分享一下设置和邮箱插件。

前面的设置都一样。断口要写的是25
smtp.qq.com

port:25  (记住是25)

然后选择  :不加密

最后还要记得开启QQ邮箱的SMTP功能,默认是不开启的。

插件下载wp-mail-smtp.0.8.2:http://u.tbemv.com/file/73/AsI56IZ2/

SAE上传文件到SaeStorage代码

首先这是表单:
<html>

<head>
<title>Upload</title>
<meta http-equiv=”Content-Type” content=”text/html;charset=utf-8″ />
</head>

<body>
<br>
<form enctype="multipart/form-data" action="upload.php" method="post">
<label for="file">Filename:</label>
<input type="file" name="file" id="file" />
<br />
<input type="submit" name="submit" value="submit" />
</form>
存储遍历查找:<a href="bianli.php">Start</a>
</body>
</html>
其次是上传文件:
<?php
$s=new saestorage();
$name=$_FILES['file']['name'];
echo $s->upload('sc',$name,$_FILES['file']['tmp_name']);
echo $s->getUrl('sc', $name);
echo '<br/>';
?>
具体见这个:http://apidoc.sinaapp.com/sae/SaeStorage.html
再来就是遍历查找:
<?php
//遍历Domain下所有文件
$stor = new SaeStorage();

$num = 0;
while ( $ret = $stor->getList("sc", "*", 100, $num ) ) {
        foreach($ret as $file) {
            echo "文件名称:  {$file}n";
			echo "文件地址:  {$stor->getUrl('sc',$file)}n";
			echo "<br/><br/>";
            $num ++;
        }
}
echo "<br/>";
echo "nTOTAL: {$num} filesn";
?>

表单(FORM)标记(TAGS)

基本语法

 

表单的基本语法

<form action="url" method=*>
...
...
<input type=submit> <input type=reset>
</form>

*=GET, POST

 

 

表单中提供给用户的输入形式

<input type=* name=**>

*=text, password, checkbox, radio, image, hidden, submit, reset

**=Symbolic Name for CGI script

 

+ 文字输入和密码输入

*=text, password

<input type=*>
<input type=* value=**>

<form action=/cgi-bin/post-query method=POST>
您的姓名:
<input type=text name=姓名><br>
您的主页的网址:
<input type=text name=网址 value=http://><br>
密码:
<input type=password name=密码><br>
<input type=submit value="发送"><input type=reset value="重设">
</form>

 

您的姓名: 
 您的主页的网址: 
 密码: 
 

发送

 

重设

 

 

 

<input type=* size=**>
<input type=* maxlength=**>

<form action=/cgi-bin/post-query method=POST>
<input type=text name=a01 size=40><br>
<input type=text name=a02 maxlength=5><br>
<input type=submit><input type=reset>
</form>

 

  

SUBMIT

 

RESET

 

 

+ 复选框(Checkbox) 和 单选框(RadioButton)

 

<input type=checkbox>
<input type=checkbox checked>
<input type=checkbox value=**>

<form action=/cgi-bin/post-query method=POST>
<input type=checkbox name=水果1>
        Banana<p>
<input type=checkbox name=水果2 checked>
        Apple<p>
<input type=checkbox name=水果3 value=橘子>
        Orange<p>
<input type=submit><input type=reset>
</form>

 

Banana  

Apple 

Orange 

SUBMIT

 

RESET

 

 

 

<input type=radio value=**>
<input type=radio value=** checked>

<form action=/cgi-bin/post-query method=POST>
<input type=radio name=水果>
        Banana<p>
<input type=radio name=水果 checked>
        Apple<p>
<input type=radio name=水果 value=橘子>
        Orange<p>
<input type=submit><input type=reset>
</form>

 

Banana  

Apple 

Orange 

SUBMIT

 

RESET

 

 

+ 图象坐标

在下面选则一个系数后,在图象上点一下,就知道什么是图象坐标了!

<input type=image src=url>

<form action=/cgi-bin/post-query method=POST>
<input type=image name=face src=f.gif><p>
<input type=radio name=zoom value=2 checked>x2
<input type=radio name=zoom value=4>x4
<input type=radio name=zoom value=6>x6<p>
<input type=reset>
</form>

 

  

x2 

x4 

x6 

RESET

 

 

+ 隐藏表单的元素

<input type=hidden value=*>

<form action=/cgi-bin/post-query method=POST>
<input type=hidden name=add value=hoge@hoge.jp>
Here is a hidden element. <p>
<input type=submit><input type=reset>
</form>

 

Here is a hidden element.  

SUBMIT

 

RESET

 

 

+ 列表框(Selectable Menu)

 

基本语法

<select name=*>
<option> …
</select>

 

<option selected>
<option value=**>

<form action=/cgi-bin/post-query method=POST>
<select name=fruits>
        <option>Banana
        <option selected>Apple
        <option value=My_Favorite>Orange
</select><p>
<input type=submit><input type=reset>
</form>

 

Banana Apple Orange   

SUBMIT

 

RESET

 

 

 

<select size=**>

<form action=/cgi-bin/post-query method=POST>
<select name=fruits size=3>
        <option>Banana
        <option selected>Apple
        <option value=My_Favorite>Orange
        <option>Peach
</select><p>
<input type=submit><input type=reset>
</form>

 

Banana Apple Orange Peach   

SUBMIT

 

RESET

 

 

 

<select size=** multiple>

注意,是用 Ctrl 键配合鼠标实现多选。
(和 MS-WINDOWS 的 File Manager 一样)

<form action=/cgi-bin/post-query method=POST>
<select name=fruits size=3 multiple>
        <option selected>Banana
        <option selected>Apple
        <option value=My_Favorite>Orange
        <option selected>Peach
</select><p>
<input type=submit><input type=reset>
</form>

 

Banana Apple Orange Peach   

SUBMIT

 

RESET

 

 

+ 文本区域

<textarea name=* rows=** cols=**> … <textarea>

<form action=/cgi-bin/post-query method=POST>
<textarea name=comment rows=5 cols=60>
</textarea>
<P>
<input type=submit><input type=reset>
</form>

 

  

SUBMIT

 

RESET

 

 

对于很长的行是否进行换行的设置(Word Wrapping) 

<textarea wrap=off> … </textarea>

不换行,是缺省设置。

 

<textarea wrap=soft> … </textarea>

“软换行”,好象 MS-WORD 里的“软回车”。

<form action=/cgi-bin/post-query method=POST>
<textarea wrap=soft name=comment rows=5 cols=25> </textarea><P>
<input type=submit><input type=reset>
</form>

 

  

SUBMIT

 

RESET

 

 

<textarea wrap=hard> … </textarea>

“硬换行”,好象 MS-WORD 里的“硬回车”。

<form action=/cgi-bin/post-query method=POST>
<textarea wrap=hard name=comment rows=5 cols=25> </textarea><P>
<input type=submit><input type=reset>
</form>

 

  

SUBMIT

 

RESET

PayPal-tyler的日记

对于初次接触PayPal和支付宝的网友来说,可能不好区分两者之间的优缺点。paypal中文注册指南网结合对paypal和支付宝的了解,较为详细的阐述一下。 PayPal 是一家 eBay 公司,它是在线付款解决方案的全球领导者,在全世界有超过七千一百六十万个帐户用户。PayPal 可由易趣买家和卖家、在线零售商和其他商家在 56 个市场以加元,欧元,英镑,美元,日元,澳元6 种货币使用。PayPal 快速、安全而又方便,是跨国交易的理想解决方案。它的支付流程是买家先付款后卖家才发货。如果卖家不发货买家可以提出上诉。因为PayPal是用信用卡注册的,而且都是实名制,所以卖家的信用都是比较好的。如果真的不发货PayPal也会帮助买家收回费用的。 支付宝(中国)网络技术有限公司是国内领先的独立第三方支付平台,由阿里巴巴集团创办。支付宝致力于为中国电子商务提供“简单、安全、快速”的在线支付解决方案。它的支付流程是:1.卖家发布商品 2.买家买下商品 3.买家付款给支付宝 4.卖家确认发货 5.买家收获通知支付宝付款 6.支付宝把钱付给卖家。 Paypal的优点: 买家好处: 安全:PayPal 保证信息的安全。您可以在线付款,而不用将银行卡或银行帐户的详细信息透露给他人。 快速:使用 PayPal,您就可以立即向有电子邮件地址的任何人进行付款。 方便/轻松:注册 PayPal 非常快捷,而且您一旦成为用户,就可以与全球范围内 56 个市场(包括美国、英国和其他亚洲及欧洲市场)的卖家交易。 卖家好处: 安全:您的财务信息不会透露给其他任何人。PayPal 使用最先进的商用加密技术保护您的数据,这些技术正是一流的全球性银行(比如 CSFB、Citibank、HSBC)所使用的。 快速:无论您的买家身在何处,付款都会立刻汇入您的 PayPal 余额。 方便:您可以使用我们的各种工具管理交易并提高效率。 支付宝的优点是: 买家使用的好处: 1、货款先由支付宝保管,收货满意后才付钱给卖家,安全放心 2、不必跑银行汇款,网上在线支付,方便简单 3、付款成功后,卖家立刻发货,快速高效 4、经济实惠 卖家使用的好处: 1、无需到银行查账,支付宝即时告知您买家付款情况,省力、省时 2、账目分明,交易管理帮您清晰地记录每一笔交易的详细信息,省心 3、支付宝认证是卖家信誉的有效体现 两者的相同点是: 1、都是第三方资金中介,提供对货款的担保。 2、两者的产生最初都是作用于c2c平台:淘宝和ebay。 3、很重要的,两者都是实名制:禁止从事洗钱等活动。 两者的区别是: 1、paypal是全球性的,通用货币为加元,欧元,英镑,美元,日元,澳元6 种货币,支付宝是中国的,以人民币结算。 2、paypal是保护买方方针,支付宝是偏向卖家方针。也就是说paypal从买家角度考虑问题,买家有任何不满意都可以提出争议,卖家无法拿到钱。而支付宝超过时效就钱货2清。 3、paypal是一个将会员分等级的机构,对高级帐户会收取手续费,当然利益保障也更牢靠。支付宝则不存在这一分等级。 4、由3可以引出:paypal帐户存在纠纷会导致帐户永久性关闭,因此卖家是很谨慎的。支付宝不会轻易关闭账户。 5、paypal的资金在美国可以提现至银行,中国可以电汇至银行,都是要手续费的。支付宝直接提现银行,免手续费。 总的来说,paypal是先驱、是强大的、国际化的、安全性很高。支付宝只是paypal其中的一个担保功能的体现、为淘宝服务的、功能一样、起第三方担保作用.。但支付宝支持人民币结算,PAYPAL用外币结算。PAYPAL提现到中国帐户手续费是$35每笔。

为什么 ++[[]][+[]]+[+[]] = 10 ?

首先,问这个问题的人是个天才,他怎么会遇到这样的一个问题。其次,回答这个问题的人更是一个天才,我难以想象他会回答这个问题,更难以想象的是,他的回答是如此的详细和丰富和完整,真正称得上诲人不倦。

既然遇到了这个问题,我们不妨也跟着提高一下。

这是一个Javascript语言题目,一个完全有效的等式,不信自己可以试一下,下面看看高人的题解:

++[[]][+[]]+[+[]]

 

如果把这段表达式拆分开来,它相等于:

++[[]][+[]]

+

[+[]]

 

在JavaScript里,+[] === 0 是完全正确的。 + 会把一些字符转化成数字,在这里,这个式子会变成 +”” 或 0。

因此,我们可以简化一下(++ 比 + 有更高的优先级):

++[[]][0]

+

[0]

 

因为 [[]][0] 的意思是:获取 [[]] 的第一个元素,这就得出了下面的结果:

[[]][0] 返回内部数组 ([])。根据语言规范,我们说 [[]][0] === [] 是不正确的,但让我们把这个内部数组称作 A,以避免错误的写法。

++[[]][0] == A + 1, 因为 ++ 的意思是“加一”。

++[[]][0] === +(A + 1);换句话说,你得到的永远是个数值( +1 并不一定得到的是个数值,但 ++ 一定是)。

同样,我们可以把这一堆代码简化的更清晰。让我们把 A 换回成 [] :

+([] + 1)

+

[0]

 

在JavaScript里,这也是正确的:[] + 1 === “1″,因为 [] == “” (这相当于一个空的数组的内部元素连接),于是:

+([] + 1) === +(“” + 1),并且

+(“” + 1) === +(“1″),并且

+(“1″) === 1

让我们再次简化一下:

1

+

[0]

 

同样,在Javascript里,这是正确的:[0] == “0″,因为这是相当于一个有一个元素的数组的内部元素的连接。各元素会使用,分隔。当只有一个元素时,你可以推论出这个过程的结果就是它自身的第一个元素。

所以,最终我们得到(数字 + 字符串 = 字符串):

1

+

“0″

=== “10″ // 耶!

<
(转发请注明转自:学PHP)

优秀的PHP开发者是怎样炼成的

PHP是一门高效的网络编程语言,由于它具有编写灵活、运行快速等优点,迅速成为Web程序员的首选语言。那么怎样才能成为一个优秀的PHP开发者呢?

要成为一名PHP编程高手并不容易,并不像很多人想象的那样,只要能够飞快地编写几条简单的代码去解决一个复杂的问题就是PHP编程高手了,真正的PHP高手还需要考虑更多的其它问题。以下三条准则是一名成熟的PHP程序员在编程中应该首先遵循的准则。

◆懒惰是金

◆编写漂亮的代码

◆追求程序的速度,而不是编程的速度

  懒惰是金

做一个懒惰的程序员吗?这个想法太奇怪了!因为这个世界上最忙碌的人可能就是计算机程序员了。但正是因为程序员太忙了,所以才应该在编程时学会偷懒。对于一个程序员来说,懒惰的方法有两种:

其一,大胆使用现成的别人的程序代码,把这些代码融入到你自己的程序或者项目中去。其二是编写一些有用的代码建立一个函数库,在将来编写程序时可以顺手拈来,省去了许多重复的劳动,自然就可以懒惰一点了。这两种偷懒的方法都非常适合PHP程序员了。

首先,PHP是在自由开放的环境中诞生和成长的一门语言。在世界各地,有成千上万的程序员,他们一直在为PHP的完美而不断奋斗,他们也愿意和别人分享自己的聪明才智和自己编写的代码。你每天都可以从一些PHP网站、邮件列表、新闻组发现大量的优秀的程序代码。

这样说,我并不是鼓励你整天等着让别人为你编写代码,但是你可以“站在伟人的肩膀上”,充分发扬“拿来主义”,聪明地应用别人的程序代码可以节省你大量时间。其次,在PHP中,你可以方便地建立自己的函数库,这样可以在你以后编写程序时省去很多麻烦。

下面笔者为大家介绍几个通用的函数,这些函数有的来自网上的一些开放源代码的项目,有的精选自邮件列表。如果你能把它们加入到你自己的函数库中,迟早你将会发现自己受益无穷。

  1.通用数据库处理函数

和其它的CGI函数相比,PHP的优点之一是具有很强大的数据库处理能力。但是,在PHP中,对于不同的数据库都使用一些特定的函数来专门处理,缺少通用的数据库处理函数。这大大降低了程序代码的可移植性,这也为初学编程的朋友带来了很多不便。

在网上,许多程序员都通过封装类解决了这个问题。他们编写了统一的函数用来处理任何流行的数据库——不管是在Linux世界深受欢迎的Mysql还是在Windows平台上广泛流行的SqlServer。

就笔者个人来说,非常喜欢使用这些函数,因为可以直接使用一些简单的诸如”query”、”next_record”之类的函数,而不需要考虑数据库的连接、数据库句柄这些复杂的东西,更不需要考虑使用的是何种数据库。如果你需要这些函数,你可以通过访问以下的几个网址而得到:

◆http://phplib.netuse.de/

◆http://phpclasses.UpperDesign.com/browse.html/package/20

◆http://phpdb.linuxbox.com/

  2.变量调试函数

PHP程序的调试一直是一件让人头疼的事,它既不像VB等高级语言那样有集成的编译调试环境,也不想Perl那样可以在Linux或者DOS环境下直接运行。其实,我们完全可以通过灵活地使用echo语句来完成对PHP的调试工作。下面的几个函数可以让你随时查看程序中任何变量的类型及其值。

 

function ss_array_as_string (&$array, $column = 0) {

$str = “Array(n”;

while(list($var, $val) = each($array)){

for ($i = 0; $i < $column+1; $i++){

$str .= “    ”;

}

$str .= $var. ==> ;

$str .= ss_as_string($val, $column+1).” n”;

}

for ($i = 0; $i < $column; $i++){

$str .= “    ”;

}

return $str.);

}

function ss_object_as_string (&$object, $column = 0) {

if (empty($object->classname)) {

return “$object”;

}

else {

$str = $object->classname.”( n”;

while (list(,$var) = each($object->persistent_slots)) {

for ($i = 0; $i < $column; $i++){

$str .= “    ”;

}

global $$var;

$str .= $var. ==> ;

$str .= ss_as_string($$var, column+1).” n”;

}

for ($i = 0; $i < $column; $i++){

$str .= “    ”;

}

return $str.);

}

}

function ss_as_string (&$thing, $column = 0) {

if (is_object($thing)) {

return ss_object_as_string($thing, $column);

}

elseif (is_array($thing)) {

return ss_array_as_string($thing, $column);

}

elseif (is_double($thing)) {

return “Double(“.$thing.”)”;

}

elseif (is_long($thing)) {

return “Long(“.$thing.”)”;

}

elseif (is_string($thing)) {

return “String(“.$thing.”)”;

}

else {

return “Unknown(“.$thing.”)”;

}

}

 

需要的时候,在程序中简单地加入下面的一条代码即可查看程序中的所使用的变量(包括数组和对象)的类型和值:

echo ss_as_string($my_variable);

使用下面的语句,我们可以直接查看程序中所有的变量的值:

echo ss_as_string($GLOBALS);

  3. 控制Log信息的函数

调试PHP程序的另外一种重要的方法就是查看Log信息。如果能够方便地控制Log信息的级别以及Log信息的显示内容,将会给程序调试带来更多的便利。下面的几个函数可以方便地实现这个功能。

 

$ss_log_level = 0;

$ss_log_filename = /tmp/ss-log;

$ss_log_levels = array(

NONE => 0,

ERROR => 1,

INFO => 2,

DEBUG => 3);

function ss_log_set_level ($level = ERROR) {

global $ss_log_level;

$ss_log_level = $level;

}

function ss_log ($level, $message) {

global $ss_log_level, $ss-log-filename;

if ($ss_log_levels[$ss_log_level] < $ss_log_levels[$level]) {

// 不显示Log信息

return false;

}

$fd = fopen($ss_log_filename, “a+”);

fputs($fd, $level. – [.ss_timestamp_pretty().] – .$message.”n”);

fclose($fd);

return true;

}

function ss_log_reset () {

global $ss_log_filename;

@unlink($ss_log_filename);

}

 

在上面的函数中,有四个Log级别变量。运行PHP程序时,只有当Log的级别低于预设的级别值时,Log信息才可以被记录和显示出来。例如,在程序中加入如下的一条语句:

ss_log_set_level(INFO);

那么,运行PHP程序时,只有ERROR和INFO级别的LOG信息才能被记录和显示出来,DEBUG级的信息则被忽略了。除此之外,我们还可以设定显示的信息内容,其语句如下:

 

ss_log(ERROR, “testing level ERROR”);

ss_log(INFO, “testing level INFO”);

ss_log(DEBUG, “testing level DEBUG”);

 

你也可以随时使用下面的语句清空LOG信息:

ss_log_reset();

  4.速度测试函数

为了优化代码,我们需要一种可以测试代码运行时间的方法,从而来选择最优的代码。下面的函数可以测试运行代码所需的时间:

 

function ss_timing_start ($name = default) {

global $ss_timing_start_times;

$ss_timing_start_times[$name] = explode( , microtime());

}

function ss_timing_stop ($name = default) {

global $ss_timing_stop_times;

$ss_timing_stop_times[$name] = explode(, microtime());

}

function ss_timing_current ($name = default) {

global $ss_timing_start_times, $ss_timing_stop_times;

if (!isset($ss_timing_start_times[$name])) {

return 0;

}

if (!isset($ss_timing_stop_times[$name])) {

$stop_time = explode(, microtime());

}

else {

$stop_time = $ss_timing_stop_times[$name];

}

$current = $stop_time[1] – $ss_timing_start_times[$name][1];

$current += $stop_time[0] – $ss_timing_start_times[$name][0];

return $current;

}

 

现在可以轻松地检查任何一段代码的执行时间了,甚至我们可以同时使用多个计时器,只需在使用上述的几个函数时设定不同的参数作为计时器的名称就可以了。

  5.调试和优化数据库的操作

对于数据库来说,运行速度是至关重要的。尽管很多书籍和文章都讲授了一些快速运行数据库的方法,但是所有的方法都必须经过实践的检验。下面我们将把PHPLib函数库中的query()函数和上面介绍的几个函数综合起来编写成新的query()函数,和原先的函数相比,这个函数增加了运行时间的监测功能。

 

function query($Query_String, $halt_on_error = 1) {

$this->connect();

ss_timing_start();

$this->Query_ID = @mysql_query($Query_String,$this->Link_ID);

ss_timing_stop();

ss_log(INFO, ss_timing_current(). Secs – .$Query_String);

$this->Row = 0;

$this->Errno = mysql_errno();

$this->Error = mysql_error();

if ($halt_on_error && !$this->Query_ID) {

$this->halt(“Invalid SQL: “.$Query_String);

}

return $this->Query_ID;

}

 

编写漂亮的代码

1.将后台程序与前端程序分开

在编写PHP程序时,有些代码是用来处理一些事务,例如操作数据库、进行数学运算等,而另外的一些代码则只是事务处理的结果显示出来,例如一些使用echo语句将结果以HTML的格式显示在Web浏览器上的PHP代码以及那些直接嵌入PHP程序的HTML代码。首先我们应该清晰地区分这两种代码,把前者称为后台程序,把后者称为前端程序。

因为PHP是一种嵌入式编程语言,也就是说,所有的PHP代码都可以嵌入到HTML代码之中,这为程序的编写带来了许多便利之处。但是,“物极必反”,如果在一段较长的程序中将PHP代码和HTML代码混合编写,这将使程序杂乱无章,不利于程序的维护和阅读。

所以我们需要尽可能地将这些程序中混杂于HTML代码中的PHP代码移植出来,在专门的文件中将这些代码封装成函数,然后在HTML代码中使用include语句来包含这些文件,在适当的位置调用这些函数即可。

这种做法一方面使HTML代码和PHP代码都简单易读,另一方面因为HTML代码需要不断更新,而这种分离的方法可以确保后台程序不会被破坏。同前端程序不同,后台程序更多追求的是稳定、结构化,极少更改,所以应该认真地设计和管理。其实,在设计台程序时,投入大量时间是值得的,“现在栽树,以后乘凉”,在以后的设计工作中将可以轻松地使用现在编写的后台程序。

2.灵活使用包含文件

正如前面所说的那样后台程序应当安排在一系列的包含文件中。包含文件可以通过include语句在需要时动态装入,也可以在php.ini文件中通过使用auto_prepend_file指令预先自动装入。如果使用后一种方法的话,虽然取得了一劳永逸的好处,但是也有一些缺点值得我们注意。下面的一段代码向我们展示了解析一个庞大的包含文件需要一定的时间:

 

require(timing.inc);

ss_timing_start();

include(test.inc);

ss_timing_stop();

echo

.ss_timing_current().

;

?>

 

在上面的代码中,test.inc是一个1000行的包含文件,运行的结果显示,解析这个包含文件花费了0.6秒钟,对于一个大型网站来说,这个速度并不是可以忽略不记的。使用包含文件的另外一个缺点是:如果一个文件中的一个语句发生错误,将会使整个网站的PHP程序都无法运行。所以使用起来也及其小心。其实,对包含文件稍做处理,即可以使包含文件只在需要时进行解析。下面的代码使abc.inc文件只在程序需要时才作解析:

if ( defined( __LIBA_INC) ) return; define( __LIBA_INC, 1 ); /* * 代码… */ ?>

 

  3.使用面向对象的编程方法

PHP也是一种面向对象的语言,面向对象的编程方法是优秀的程序员们非常推崇的一种软件设计方法,在PHP编程中可以充分发挥面向对象语言的优势,对编程中的对象进行封装。在前面的代码中,我们使用了面向对象的方法,例如在管理数据库时,我们将query()函数封装进数据库类中,这极大地方便了代码的管理,增加了程序的可读性。

 

  追求程序速度,而不是编程的速度

在网站建设中,程序运行速度和网页下载速度都是关系成败的重要因素。作为一名Web程序员,应该更加注意代码的运行速度。下面介绍的几种方法都在不同程度上提高了代码的运行速度。

  1.使用内嵌的HTML代码,而不是PHP的echo语句。

因为PHP是一门嵌入式Web编程语言,可以将HTML代码和PHP代码相互嵌入。但是很多程序员担心在HTML代码中过多的使用””嵌入PHP代码会多次调用PHP解释器,从而降低了PHP代码的运行速度,所以宁愿使用PHP的echo语句来输出HTML代码,而不直接使用HTML代码。

但事实却恰恰相反。每一个PHP页面只调用一次PHP解释器来解释所有的PHP代码,所以,只在需要时才嵌入PHP代码,而大多数的时候直接使用HTML代码输入结果,不但不会降低程序的运行速度,而且因为减少了对echo语句的解析,往往可以提高代码的运行速度。下面的一段代码证明了我们的结论。在这段代码中,我们使用了前面介绍的时间测试函数。

  2.使用str-replace而不是ereg-replace

习惯使用Perl进行编程的程序员更加愿意使用ereg_replace完成字符串替换工作,因为在PHP中ereg_replace的用法和Perl中模式匹配的用法相近。但是,下面的这段代码证明,使用str_replace 代替 ereg_replace将可以大大提高代码的运行速度。测试str_replace和ereg_replace的运行速度:

 

//这段代码测试str_replace的运行速度 emphasis; ?>

for ($i=0; $i<1000; $i++) {

str_replace(i>, b>, $string).

;

}

?>

//这段代码测试ereg_replace的运行速度

for ($i=0; $i<1000; $i++) {

ereg_replace(<([/]*)i>, <1b>, $string).

;

}

?>

 

  3.注意字符串的引用

PHP和其它很多编程语言一样,可以使用双引号(“”)来引用字符串,也可以使用单引号()。但是在PHP中,如果使用双引号来引用字符串,那么PHP解析器将首先分析字符串中有没有对变量的引用,有变量的话,将对变量进行替换。如果是单引号,则没有如此复杂——直接将单引号包含起来的所有字符串直接显示出来。显然,在PHP编程中,如果使用单引号引用字符串变量要比使用双引号快速一些。

  4.在数据库中避免使用联合操作

比起其它的Web编程语言来说,PHP的数据库功能十分强大。但是在PHP中数据库的运行仍然是一件十分费时费力的事情,所以,作为一个Web程序员,要尽量减少数据库的查询操作,同时应该为数据库建立适当的索引。

另一件值得注意的事情是在用PHP操作数据库时,尽可能不使用多个数据表的联合操作,尽管联合操作可以增强数据库的查询功能,但是却大大增加了服务器的负担。为了说明这个问题,我们可以看看下面的这个简单的例子。

我们在数据库中创建了两个数据表foo和big_foo。在数据表foo中,只有一个字段,包含了从1-1000之间的所有自然数。数据表big_foo同样只有一个字段,但包含了从1-1,000,000之间的全部自然数。所以,从大小上说,big_foo等于foo与它自身进行了联合操作。

 

$db->query(“select * from foo”);

0.032273 secs

$db->next_record();

0.00048999999999999 secs

$db->query(“insert into foo values (NULL)”);

0.019506 secs

$db->query(“select * from foo as a, foo as b”);

17.280596 secs

$db->query(“select * from foo as a, foo as b where a.id > b.id”);

14.645251 secs

$db->query(“select * from foo as a, foo as b where a.id = b.id”);

0.041269 secs

$db->query(“select * from big_foo”);

25.393672 secs

 

从上面操作结果我们可以发现,对于两个有1000条记录的数据表进行联合,其速度并不比对一个1000000条纪录的大型数据表单独进行操作快多少。

  5.注意include与require的区别

在PHP变成中,include()与require()的功能相同,但在用法上却有一些不同,include()是有条件包含函数,而require()则是无条件包含函数。例如在下面的一个例子中,如果变量$somgthing为真,则将包含文件somefile:

if($something){ include(“somefile”); }

 

但不管$something取何值,下面的代码将把文件somefile包含进文件里:

if($something){ require(“somefile”); }

 

下面的这个有趣的例子充分说明了这两个函数之间的不同。

$i = 1; while ($i < 3) { require(“somefile.$i”); $i++; }

 

在这段代码中,每一次循环的时候,程序都将把同一个文件包含进去。很显然这不是程序员的初衷,从代码中我们可以看出这段代码希望在每次循环时,将不同的文件包含进来。如果要完成这个功能,必须求助函数include();

 

$i = 1; while ($i < 3) { include(“somefile.$i”); $i++; }

  6.注意echo和print的区别

PHP中echo和print的功能也基本相同,但是两者之间也有细微差别。在PHP代码中可以把print作为一个普通函数来使用,例如执行下面的代码后变量$res的值将为1。

$ret = print “Hello World”;

这意味着print可用在一些复杂的表达式中,而echo则不行。同样,在代码中echo语句的运行速度要略微快于print语句,因为echo语句不要求返回任何数值。

<

一些重要的php算法和应用

1. 使用PHP描述冒泡排序和快速排序算法,对象可以是一个数组

//冒泡排序(数组排序)

function bubble_sort($array)

{

       $count = count($array);

       if ($count <= 0) return false;

       for($i=0; $i<$count; $i++){                for($j=$count-1; $j>$i; $j–){

                       if ($array[$j] < $array[$j-1]){

                               $tmp = $array[$j];

                               $array[$j] = $array[$j-1];

                               $array[$j-1] = $tmp;

                       }

               }

       }

       return $array;

}

//快速排序(数组排序)

function quick_sort($array) {

       if (count($array) <= 1) return $array;

       $key = $array[0];

       $left_arr = array();

       $right_arr = array();

       for ($i=1; $i<count($array); $i++){

               if ($array[$i] <= $key)

                       $left_arr[] = $array[$i];

               else

                       $right_arr[] = $array[$i];

       }

       $left_arr = quick_sort($left_arr);

       $right_arr = quick_sort($right_arr);

       return array_merge($left_arr, array($key), $right_arr);

}

2. 使用PHP描述顺序查找和二分查找(也叫做折半查找)算法,顺序查找必须考虑效率,对象可以是一个有序数组

//二分查找(数组里查找某个元素)

function bin_sch($array, $low, $high, $k){

   if ($low <= $high){

       $mid = intval(($low+$high)/2);

       if ($array[$mid] == $k){

           return $mid;

       }elseif ($k < $array[$mid]){

           return bin_sch($array, $low, $mid-1, $k);

       }else{

           return bin_sch($array, $mid+1, $high, $k);

       }

   }

   return -1;

}

//顺序查找(数组里查找某个元素)

function seq_sch($array, $n, $k){

   $array[$n] = $k;

   for($i=0; $i<$n; $i++){

       if($array[$i]==$k){

           break;

       }

   }

   if ($i<$n){

       return $i;

   }else{

       return -1;

   }

}  

3. 写一个二维数组排序算法函数,能够具有通用性,可以调用php内置函数

//二维数组排序, $arr是数据,$keys是排序的健值,$order是排序规则,1是升序,0是降序

function array_sort($arr, $keys, $order=0) {

if (!is_array($arr)) {

 return false;

}

$keysvalue = array();

foreach($arr as $key => $val) {

 $keysvalue[$key] = $val[$keys];

}

if($order == 0){

 asort($keysvalue);

}else {

 arsort($keysvalue);

}

reset($keysvalue);

foreach($keysvalue as $key => $vals) {

 $keysort[$key] = $key;

}

$new_array = array();

foreach($keysort as $key => $val) {

 $new_array[$key] = $arr[$val];

}

return $new_array;

}

4. 使用五种以上方式获取一个文件的扩展名

function get_ext1($file_name){

return strrchr($file_name, ”.”);

}

function get_ext2($file_name){

return substr($file_name, strrpos($file_name, ”.”));

}

function get_ext3($file_name){

return array_pop(explode(”.”, $file_name));

}

function get_ext4($file_name){

$p = pathinfo($file_name);

return $p[''extension''];

}

function get_ext5($file_name){

return strrev(substr(strrev($file_name), 0, strpos(strrev($file_name), ”.”)));

}

(转发请注明转自:学PHP)

简单的加密解密php代码

表单:
<html>
<head>
<title>字符加密解密</title>
</head>

<body>
<form  method="post">
请输入你要加密的内容(仅支持小写英文和空格!!):
<input type="text" name="content">
<br/>

请输入你要解密的内容(Example:TTTJJJLTJJJTTLJTLJLTJ):
<input type="text" name="content2">
<br />
<input type="submit" name="submit" value="加密或解密">
<br/>
<br/>
</form>
这是你加密的内容:
<?php require("denc.php");?>
<br/>
<br/>
这是你解密的内容:
<?php require("benc.php");?>
</body>
</html>
加密:
<?php
function denc($text){
$len=strlen($text);
for($i=0;$i<$len;$i++){
switch($text[$i]){

case "a":
echo "JJJ";
break;

case "b":
echo "JJL";
break;

case "c":
echo "JJT";
break;

case "d":
echo "JLJ";
break;

case "e":
echo "JLL";
break;

case "f":
echo "JLT";
break;

case "g":
echo "JTJ";
break;

case "h":
echo "JTL";
break;

case "i":
echo "JTT";
break;

case "j":
echo "LJJ";
break;

case "k":
echo "LJL";
break;

case "l":
echo "LJT";
break;

case "m":
echo "LLJ";
break;

case "n":
echo "LLL";
break;

case "o":
echo "LLT";
break;

case "p":
echo "LTJ";
break;

case "q":
echo "LTL";
break;

case "r":
echo "LTT";
break;

case "s":
echo "TJJ";
break;

case "t":
echo "TJL";
break;

case "u":
echo "TJT";
break;

case "v":
echo "TLJ";
break;

case "w":
echo "TLL";
break;

case "x":
echo "TLT";
break;

case "y":
echo "TTJ";
break;

case "z":
echo "TTL";
break;

case " ":
echo "TTT";
break;

}
}
}
denc($_POST["content"]);
?>
解密:
<?php
function benc($text){
$len=strlen($text);
for($i=0;$i<$len;$i+=3){
if($text[$i]=="J"){
if($text[$i+1]=="J"){
if($text[$i+2]=="J") echo "a";
if($text[$i+2]=="L") echo "b";
if($text[$i+2]=="T") echo "c";
}

if($text[$i+1]=="L"){
if($text[$i+2]=="J") echo "d";
if($text[$i+2]=="L") echo "e";
if($text[$i+2]=="T") echo "f";
}

if($text[$i+1]=="T"){
if($text[$i+2]=="J") echo "g";
if($text[$i+2]=="L") echo "h";
if($text[$i+2]=="T") echo "i";
}
}

if($text[$i]=="L"){
if($text[$i+1]=="J"){
if($text[$i+2]=="J") echo "j";
if($text[$i+2]=="L") echo "k";
if($text[$i+2]=="T") echo "l";
}

if($text[$i+1]=="L"){
if($text[$i+2]=="J") echo "m";
if($text[$i+2]=="L") echo "n";
if($text[$i+2]=="T") echo "o";
}

if($text[$i+1]=="T"){
if($text[$i+2]=="J") echo "p";
if($text[$i+2]=="L") echo "q";
if($text[$i+2]=="T") echo "r";
}
}

if($text[$i]=="T"){
if($text[$i+1]=="J"){
if($text[$i+2]=="J") echo "s";
if($text[$i+2]=="L") echo "t";
if($text[$i+2]=="T") echo "u";
}

if($text[$i+1]=="L"){
if($text[$i+2]=="J") echo "v";
if($text[$i+2]=="L") echo "w";
if($text[$i+2]=="T") echo "x";
}
if($text[$i+1]=="T"){
if($text[$i+2]=="J") echo "y";
if($text[$i+2]=="L") echo "z";
if($text[$i+2]=="T") echo " ";
}
}
}
}
benc($_POST["content2"]);
?>