<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>生活点滴 &#187; PHP</title>
	<atom:link href="http://www.storyday.com/cat/web-tech/php/feed" rel="self" type="application/rss+xml" />
	<link>http://www.storyday.com</link>
	<description>生活点滴、旅游、web技术、虚拟主机、电子信息</description>
	<lastBuildDate>Tue, 31 Aug 2010 02:55:49 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.6</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>如何保持持久</title>
		<link>http://www.storyday.com/html/y2010/2628_how-to-maintain-long-lasting.html</link>
		<comments>http://www.storyday.com/html/y2010/2628_how-to-maintain-long-lasting.html#comments</comments>
		<pubDate>Wed, 31 Mar 2010 08:06:50 +0000</pubDate>
		<dc:creator>江东</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[互联网事]]></category>
		<category><![CDATA[网站技术]]></category>
		<category><![CDATA[web]]></category>

		<guid isPermaLink="false">http://www.storyday.com/?p=2628</guid>
		<description><![CDATA[此文提到的“持久”是指web 的session会话持久。
有的时候，为了方便，我们需要在用户一直保持登录状态，即使用户没有做任何动作也不要因为超时而将让将用户的登录状态终止，除非用户主动关闭浏览器。
当然，实现这个方法有最简单的方式，那就是改变服务器的配置，将会话超时的时间设置更久，但是有些时候，我们只是做一个小的应用，或许我们的程序仅仅是放置在共享的虚拟主机上，这个时候我们可能无法更改服务器的设置，那么就将这个任务交给web程序去做吧。
其实实现的方法很简单，那就是用js定时去获取服务器端数据，赶在超时前去告诉服务器：“我还在做动作呢”。
实现方式很简单
首先，在服务器端建一个文件，随便取名，比如keepalive.php. 可以有内容，比如&#60;?php echo &#8220;当前时间是:&#8221;.date(&#8217;Y-m-d H:i:s&#8217;);?&#62;,也可以干脆为空。
然后在在公共的文件（比如 inc.footer.php）中写一段js，代码如下：
 function keepAlive(){
var url="keepalive.php";
$.get(url,function(d){});
setTimeout ( "loadAdminStatus()", 120000 );
}
keepAlive();
当然，前提是你要引入 jquery 库。
如此这般之后，一旦打开网页，系统将会每120秒去通知一次服务器，只要服务器的超时时间在120秒外（若少于120秒，请修改120000为合适的值 单位是毫秒），登录状态便会永不超时。
]]></description>
			<content:encoded><![CDATA[<p>此文提到的“持久”是指web 的session会话持久。</p>
<p>有的时候，为了方便，我们需要在用户一直保持登录状态，即使用户没有做任何动作也不要因为超时而将让将用户的登录状态终止，除非用户主动关闭浏览器。</p>
<p>当然，实现这个方法有最简单的方式，那就是改变服务器的配置，将会话超时的时间设置更久，但是有些时候，我们只是做一个小的应用，或许我们的程序仅仅是放置在共享的虚拟主机上，这个时候我们可能无法更改服务器的设置，那么就将这个任务交给web程序去做吧。</p>
<p>其实实现的方法很简单，那就是用js定时去获取服务器端数据，赶在超时前去告诉服务器：“我还在做动作呢”。</p>
<p>实现方式很简单</p>
<p>首先，在服务器端建一个文件，随便取名，比如keepalive.php. 可以有内容，比如&lt;?php echo &#8220;当前时间是:&#8221;.date(&#8217;Y-m-d H:i:s&#8217;);?&gt;,也可以干脆为空。</p>
<p>然后在在公共的文件（比如 inc.footer.php）中写一段js，代码如下：</p>
<p><code> function keepAlive(){<br />
var url="keepalive.php";<br />
$.get(url,function(d){});<br />
setTimeout ( "loadAdminStatus()", 120000 );<br />
}<br />
keepAlive();</code></p>
<p>当然，前提是你要引入 jquery 库。</p>
<p>如此这般之后，一旦打开网页，系统将会每120秒去通知一次服务器，只要服务器的超时时间在120秒外（若少于120秒，请修改120000为合适的值 单位是毫秒），登录状态便会永不超时。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.storyday.com/html/y2010/2628_how-to-maintain-long-lasting.html/feed</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>解决最近刚刚出现的图片红叉问题</title>
		<link>http://www.storyday.com/html/y2009/2493_solve-the-emerging-picture-has-recently-been-the-issue-of-red-fork.html</link>
		<comments>http://www.storyday.com/html/y2009/2493_solve-the-emerging-picture-has-recently-been-the-issue-of-red-fork.html#comments</comments>
		<pubDate>Thu, 16 Jul 2009 15:13:49 +0000</pubDate>
		<dc:creator>江东</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[网站技术]]></category>
		<category><![CDATA[google]]></category>

		<guid isPermaLink="false">http://www.storyday.com/?p=2493</guid>
		<description><![CDATA[由于本人的相册都很和谐，所以还是得想办法让用户能看见。
原理很简单，首先在国外的主机上加上一段代码，让国外的主机根据GET传递过去的url参数相片读取下来，缓存在自己服务器上，由于某个东西异常厉害，所以传递参数的时候还得要将某些单词给替代，才能传递，否则国外的主机连带撞死；
然后打开模板中的footer文件，添加一段js代码，此js代码的作用就是遍历该页所有图片，然后将其替代成http://xxx.com/readimg.php?这里是图片的地址，这样图片就可以正常显示了。js代码如下
$(&#8221;img &#8220;).each(function(i){//遍历本页所有的图片
var src = $(this).attr(&#8221;src&#8221;);
if( src.indexOf(&#8217;ｇｇｐｈｔ&#8217;)!=-1 ){//如果图片来自某个地方，则替代之
$(this).attr(&#8221;src&#8221;,&#8221;http://0bad.com/readimg.php?src=&#8221;+src.replace(&#8221;ｇｇｐｈｔ&#8221;,&#8221;gouride&#8221;) );//则将图片地址改成转发的地址，记住ｇｇｐｈｔ替代掉，因为这个会触发墙
}
});
上面的全角字母请自行改成半角字母（请保证你主题引入了jquery ）
至于那个php文件，请到这里下载:pika 然后放置到你国外的空间。ache和cache下的所有文件夹属性请设置成0777
另外，请大家低调发表评论，不要带上关键字，被和谐怕了
另，效果请参见右上角的homezz图片。
php插件方式将会在明天发布，届时feed中的图片也会正常显示！
此举仅仅是为了正常的blog能正常的显示图片，本人不敢造次！
不太熟悉如何使用的朋友，请等待我的插件发布！
]]></description>
			<content:encoded><![CDATA[<p>由于本人的相册都很和谐，所以还是得想办法让用户能看见。</p>
<p>原理很简单，首先在国外的主机上加上一段代码，让国外的主机根据GET传递过去的url参数相片读取下来，缓存在自己服务器上，由于某个东西异常厉害，所以传递参数的时候还得要将某些单词给替代，才能传递，否则国外的主机连带撞死；</p>
<p>然后打开模板中的footer文件，添加一段js代码，此js代码的作用就是遍历该页所有图片，然后将其替代成http://xxx.com/readimg.php?这里是图片的地址，这样图片就可以正常显示了。js代码如下</p>
<blockquote><p>$(&#8221;img &#8220;).each(function(i){//遍历本页所有的图片<br />
var src = $(this).attr(&#8221;src&#8221;);<br />
if( src.indexOf(&#8217;ｇｇｐｈｔ&#8217;)!=-1 ){//如果图片来自某个地方，则替代之<br />
$(this).attr(&#8221;src&#8221;,&#8221;http://0bad.com/readimg.php?src=&#8221;+src.replace(&#8221;ｇｇｐｈｔ&#8221;,&#8221;gouride&#8221;) );//则将图片地址改成转发的地址，记住ｇｇｐｈｔ替代掉，因为这个会触发墙<br />
}<br />
});</p></blockquote>
<p>上面的全角字母请自行改成半角字母（请保证你主题引入了jquery ）</p>
<p>至于那个php文件，<strong>请到这里下载:<a href="http://www.storyday.com/wp-content/uploads/2009/07/pika.zip">pika</a> </strong>然后放置到你国外的空间。ache和cache下的所有文件夹属性请设置成0777</p>
<p>另外，请大家低调发表评论，不要带上关键字，被和谐怕了</p>
<p>另，效果请参见右上角的homezz图片。</p>
<p>php插件方式将会在明天发布，届时feed中的图片也会正常显示！</p>
<p>此举仅仅是为了正常的blog能正常的显示图片，本人不敢造次！</p>
<p><strong>不太熟悉如何使用的朋友，请等待我的插件发布！</strong></p>
]]></content:encoded>
			<wfw:commentRss>http://www.storyday.com/html/y2009/2493_solve-the-emerging-picture-has-recently-been-the-issue-of-red-fork.html/feed</wfw:commentRss>
		<slash:comments>45</slash:comments>
		</item>
		<item>
		<title>web 500错误的原因可能有哪些</title>
		<link>http://www.storyday.com/html/y2009/2431_web-500-may-be-caused-by-an-error-which.html</link>
		<comments>http://www.storyday.com/html/y2009/2431_web-500-may-be-caused-by-an-error-which.html#comments</comments>
		<pubDate>Wed, 24 Jun 2009 01:47:30 +0000</pubDate>
		<dc:creator>江东</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[网站技术]]></category>
		<category><![CDATA[虚拟主机]]></category>

		<guid isPermaLink="false">http://www.storyday.com/?p=2431</guid>
		<description><![CDATA[可能原因如下：
web根目录权限错误。解决办法，将根目录的权限由错误的777改成755，参见下图。
php文件属性错误。解决办法，将php文件的属性改成 644
.htaccess文件错误 。 解决办法，修改.htaccess文件的内容，若在ftp下无法查看.htaccess文件，请用在本机制作一个空的.htaccess文件，上传覆盖之；
如何修改文件和文件夹的权限，请参考下图：
capanel文件管理器中：

FTP工具中：




]]></description>
			<content:encoded><![CDATA[<p>可能原因如下：</p>
<p><strong>web根目录权限错误。</strong>解决办法，将根目录的权限由错误的777改成755，参见下图。</p>
<p><strong>php文件属性错误。</strong>解决办法，将php文件的属性改成 644</p>
<p><strong>.htaccess文件错误</strong> 。 解决办法，修改.htaccess文件的内容，若在ftp下无法查看.htaccess文件，请用在本机制作一个空的.htaccess文件，上传覆盖之；</p>
<p>如何修改文件和文件夹的权限，请参考下图：</p>
<p>capanel文件管理器中：</p>
<p><img class="alignnone" title="cpanel文件管理器修改文件属性" src="http://0bad.com/readimg.php?src=http%3A%2F%2Flh5.gouride.com%2F_MUGaOIKDFIU%2FSiuZe5vqUPI%2FAAAAAAAAD_U%2FSxsq2PpfdcE%2Fs800%2Fsshot-15.jpg" alt="" width="225" height="185" /><span id="more-2431"></span></p>
<p>FTP工具中：</p>
<p><img class="alignnone" src="http://0bad.com/readimg.php?src=http%3A%2F%2Flh4.gouride.com%2F_MUGaOIKDFIU%2FSkGFVfmdsAI%2FAAAAAAAAESE%2Fvzas_ouH_2s%2Fs800%2Fsshot-2009-06-24-%5B09-45-28%5D.jpg" alt="" width="390" height="375" /></p>
<p><img class="alignnone" src="http://0bad.com/readimg.php?src=http%3A%2F%2Flh3.gouride.com%2F_MUGaOIKDFIU%2FSkGFVTmgeqI%2FAAAAAAAAESA%2FfcjwUTFHUCQ%2Fs800%2Fsshot-2009-06-24-%5B09-45-35%5D.jpg" alt="" width="391" height="347" /></p>
<p><strong><br />
</strong></p>
]]></content:encoded>
			<wfw:commentRss>http://www.storyday.com/html/y2009/2431_web-500-may-be-caused-by-an-error-which.html/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>写了一个基于ajax的图片文件管理器</title>
		<link>http://www.storyday.com/html/y2009/2409_write-a-picture-based-on-the-ajax-file-manager.html</link>
		<comments>http://www.storyday.com/html/y2009/2409_write-a-picture-based-on-the-ajax-file-manager.html#comments</comments>
		<pubDate>Sat, 13 Jun 2009 12:52:17 +0000</pubDate>
		<dc:creator>江东</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[网站技术]]></category>
		<category><![CDATA[虚拟主机]]></category>

		<guid isPermaLink="false">http://www.storyday.com/?p=2409</guid>
		<description><![CDATA[用了一天的时间做了一个简单的文件管理器。
特点：

整个程序就一个文件，毕竟是用来管理图片的，php和其他文件过多不好打理；
不需要数据库，直接基于正常文件结构；
只可上传web能正常显示的图片格式（jpg,png,gif）;
ajax采用了缓存。文件目录一旦打开，浏览器不刷新，再次关闭和打开不会重复读取服务器内容，节约时间，这个功能耗费了80%的时间，因为要考虑到用户上传图片，修改文件夹之后缓存的局部更新；
ctrl+鼠标左键可以选择多张图片；

目前还没有添加用户登录验证功能！欢迎大家去围观：0bad.com，目前只能保证在FireFox上最正常。
写在后面。有了jquery，处理dom真的好方便，缓存是本程序最伤脑筋的地方，一方面为了节约用户时间，所以load之后的数据必须以变量的方式缓存在浏览器里面，这个很简单，最麻烦的就是当用户创建文件夹、创建文件、删除文件夹、删除文件，一方面要保持左边的树形不要变化，另外一方面还好保证需要更改的缓存得以及时的更新。这个逻辑太麻烦了，所以现在依然有bug，可能还不少。
]]></description>
			<content:encoded><![CDATA[<p>用了一天的时间做了一个简单的文件管理器。</p>
<p>特点：</p>
<ol>
<li>整个程序就一个文件，毕竟是用来管理图片的，php和其他文件过多不好打理；</li>
<li>不需要数据库，直接基于正常文件结构；</li>
<li>只可上传web能正常显示的图片格式（jpg,png,gif）;</li>
<li>ajax采用了缓存。文件目录一旦打开，浏览器不刷新，再次关闭和打开不会重复读取服务器内容，节约时间，这个功能耗费了80%的时间，因为要考虑到用户上传图片，修改文件夹之后缓存的局部更新；</li>
<li>ctrl+鼠标左键可以选择多张图片；</li>
</ol>
<p>目前还没有添加用户登录验证功能！欢迎大家去围观：<a href="http://0bad.com">0bad.com</a>，目前只能保证在FireFox上最正常。</p>
<p>写在后面。有了jquery，处理dom真的好方便，缓存是本程序最伤脑筋的地方，一方面为了节约用户时间，所以load之后的数据必须以变量的方式缓存在浏览器里面，这个很简单，最麻烦的就是当用户创建文件夹、创建文件、删除文件夹、删除文件，一方面要保持左边的树形不要变化，另外一方面还好保证需要更改的缓存得以及时的更新。这个逻辑太麻烦了，所以现在依然有bug，可能还不少。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.storyday.com/html/y2009/2409_write-a-picture-based-on-the-ajax-file-manager.html/feed</wfw:commentRss>
		<slash:comments>15</slash:comments>
		</item>
		<item>
		<title>phpmyadmin无法导入大的SQL解决方案</title>
		<link>http://www.storyday.com/html/y2009/2337_phpmyadmin-can-not-import-large-sql-solutions.html</link>
		<comments>http://www.storyday.com/html/y2009/2337_phpmyadmin-can-not-import-large-sql-solutions.html#comments</comments>
		<pubDate>Sun, 10 May 2009 03:16:20 +0000</pubDate>
		<dc:creator>江东</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[网站技术]]></category>
		<category><![CDATA[mysql]]></category>

		<guid isPermaLink="false">http://www.storyday.com/html/y2009/2337_phpmyadmin%e6%97%a0%e6%b3%95%e5%af%bc%e5%85%a5%e5%a4%a7%e7%9a%84sql%e8%a7%a3%e5%86%b3%e6%96%b9%e6%a1%88.html</guid>
		<description><![CDATA[其实导入SQL的最快的方法还是直接登录到服务器上，直接命令行导入，没有开通SSH的服务器可以通过其他服务器中转导入，但是这些方法对于不熟悉linux命令的朋友都显得比较麻烦。所以，我昨天晚上就花了一点时间，写了一个简陋的php文件，用于导入大的sql到新的mysql数据库中。
内容如下
define('DB_NAME', 'wordpress');
define('DB_USER', 'wordpress');
define('DB_PASSWORD', 'wordpress');
define('DB_HOST', 'localhost');
/*直接copy您wordpress数据库设置部分即可*/
$mysql = mysql_connect(DB_HOST,DB_USER,DB_PASSWORD) or die("mysql connect fail, wrong password");
mysql_select_db(DB_NAME)or die("select DB fail");
mysql_query("set names utf8");
$fp = fopen("db.sql","r") or die('can not open file');
while( $s = fgets( $fp,100000 ) ){
$m .= $s;
}
$sql_content = explode(";\n",$m);
$i = 0;
$max = count($sql_content) ;
while( $i &#60; $max ){
mysql_query( $sql_content [$i] );
if( mysql_error()) echo mysql_error()."&#60;br /&#62;";
else{
$n ++;
}
$i ++;
}
echo "&#60;br /&#62;mysql [...]]]></description>
			<content:encoded><![CDATA[<p>其实导入SQL的最快的方法还是直接登录到服务器上，直接命令行导入，没有开通SSH的服务器可以通过其他服务器中转导入，但是这些方法对于不熟悉linux命令的朋友都显得比较麻烦。所以，我昨天晚上就花了一点时间，写了一个简陋的php文件，用于导入大的sql到新的mysql数据库中。</p>
<p>内容如下<code><br />
define('DB_NAME', 'wordpress');<br />
define('DB_USER', 'wordpress');<br />
define('DB_PASSWORD', 'wordpress');<br />
define('DB_HOST', 'localhost');<br />
/*直接copy您wordpress数据库设置部分即可*/<br />
$mysql = mysql_connect(DB_HOST,DB_USER,DB_PASSWORD) or die("mysql connect fail, wrong password");<br />
mysql_select_db(DB_NAME)or die("select DB fail");<br />
mysql_query("set names utf8");<br />
$fp = fopen("db.sql","r") or die('can not open file');<br />
while( $s = fgets( $fp,100000 ) ){<br />
$m .= $s;<br />
}<br />
$sql_content = explode(";\n",$m);<br />
$i = 0;<br />
$max = count($sql_content) ;<br />
while( $i &lt; $max ){<br />
mysql_query( $sql_content [$i] );<br />
if( mysql_error()) echo mysql_error()."&lt;br /&gt;";<br />
else{<br />
$n ++;<br />
}<br />
$i ++;<br />
}<br />
echo "&lt;br /&gt;mysql queries:".$n;<br />
fclose($fp);</code></p>
<p>导入就很简单了，将需要导入的sql文件命名为db.sql，上传到网站根目录，将上面的代码保存为import.php也上传到根目录，然后运行import.php，即可完成数据库的导入。<br />
当然，您也可以直接下载这个文件：<a href='http://www.storyday.com/wp-content/uploads/2009/05/import.zip'>import</a>。</p>
<p>注意：导入之后，请一定要删除或者重命名这个import.php文件</p>
]]></content:encoded>
			<wfw:commentRss>http://www.storyday.com/html/y2009/2337_phpmyadmin-can-not-import-large-sql-solutions.html/feed</wfw:commentRss>
		<slash:comments>13</slash:comments>
		</item>
		<item>
		<title>Cannot modify header information</title>
		<link>http://www.storyday.com/html/y2009/2295_cannot-modify-header-information.html</link>
		<comments>http://www.storyday.com/html/y2009/2295_cannot-modify-header-information.html#comments</comments>
		<pubDate>Sat, 28 Mar 2009 11:19:19 +0000</pubDate>
		<dc:creator>江东</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[网站技术]]></category>

		<guid isPermaLink="false">http://www.storyday.com/html/y2009/2295_cannot-modify-header-information.html</guid>
		<description><![CDATA[请php熟练者略过此文。
既然你打算继续往下看，说明你不熟悉php或者正在入门，那么我就用最简单（不会假装高深的搬出http 协议中header的解释，其实我也不会）的说说出现这样问题的原因：
当php程序出现cannot modify header information错误的时候，从cannot modify header information的字面不难理解，表示程序无法发送header信息，一般的出错信息完整的应该是类似Warning: Cannot modify header information &#8211; headers already sent by的提示。那么下面几种情况会出现Cannot modify header information：

单独的php文件session_start()之前有echo print等等输出； 
在setcookie之前有echo print等等输出； 
在set cookie和session_start之前有包含的文件，而这个包含的文件有输出； 
在set cookie和session_start之前有包含的文件，而这个包含的文件为html或者含有html（包括&#60;?php ?&#62;外面的空格）； 
程序文件&#60;?php之前不小心打了一个空格； 
带有bom的utf8编码文件，因为有bom，所有在&#60;?php之前其实有编辑器看不到的输出； 

总之，出现这个问题的根源只有一个：那就是在session_start和setcookie之前有输出的都会出现Cannot modify header information的错误。无论是程序本身echo出来的、被include 进来的程序echo的还是php代码之外的html存在空格它们统统都是输出。
所以你若是使用wordpress，第一次安装进入后台，发现Cannot modify header information之类的错误，首先要要检查的就是wp-config.php文件中&#60;?php之前和?&#62;之后是不是不小心打了换行或者空格符号?是的话，则删除之。检查wp-config.php是不是utf8编码？管他是不是，用编辑器（下载一个editplus的试用版本）打开，另存为的时候，选择UTF-8再次覆盖保存即可。
]]></description>
			<content:encoded><![CDATA[<p>请php熟练者略过此文。</p>
<p>既然你打算继续往下看，说明你不熟悉php或者正在入门，那么我就用最简单（不会假装高深的搬出http 协议中header的解释，其实我也不会）的说说出现这样问题的原因：</p>
<p>当php程序出现cannot modify header information错误的时候，从cannot modify header information的字面不难理解，表示程序无法发送header信息，一般的出错信息完整的应该是类似Warning: <em>Cannot modify header information</em> &#8211; headers already sent by的提示。那么下面几种情况会出现<em>Cannot modify header information</em>：</p>
<ol>
<li>单独的php文件session_start()之前有echo print等等输出； </li>
<li>在setcookie之前有echo print等等输出； </li>
<li>在set cookie和session_start之前有包含的文件，而这个包含的文件有输出； </li>
<li>在set cookie和session_start之前有包含的文件，而这个包含的文件为html或者含有html（包括&lt;?php ?&gt;外面的空格）； </li>
<li>程序文件&lt;?php之前不小心打了一个空格； </li>
<li>带有bom的utf8编码文件，因为有bom，所有在&lt;?php之前其实有编辑器看不到的输出； </li>
</ol>
<p>总之，出现这个问题的根源只有一个：那就是在session_start和setcookie之前有输出的都会出现<em>Cannot modify header information</em>的错误。无论是程序本身echo出来的、被include 进来的程序echo的还是php代码之外的html存在空格它们统统都是输出。</p>
<p>所以你若是使用wordpress，第一次安装进入后台，发现<em>Cannot modify header information</em>之类的错误，首先要要检查的就是wp-config.php文件中&lt;?php之前和?&gt;之后是不是不小心打了换行或者空格符号?是的话，则删除之。检查wp-config.php是不是utf8编码？管他是不是，用编辑器（<a href="ftp://ftp.editplus.com/epp310_en.exe" target="_blank">下载一个editplus的试用版本</a>）打开，<strong>另存为</strong>的时候，选择UTF-8再次覆盖保存即可。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.storyday.com/html/y2009/2295_cannot-modify-header-information.html/feed</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>host.storyday.com集成了部分Cpanel功能</title>
		<link>http://www.storyday.com/html/y2009/2274_hoststorydaycom-integrated-part-of-cpanel-features.html</link>
		<comments>http://www.storyday.com/html/y2009/2274_hoststorydaycom-integrated-part-of-cpanel-features.html#comments</comments>
		<pubDate>Fri, 20 Mar 2009 07:44:52 +0000</pubDate>
		<dc:creator>江东</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[网站技术]]></category>
		<category><![CDATA[web]]></category>
		<category><![CDATA[webhost]]></category>

		<guid isPermaLink="false">http://www.storyday.com/html/y2009/2274_hoststorydaycom%e9%9b%86%e6%88%90%e4%ba%86%e9%83%a8%e5%88%86cpanel%e5%8a%9f%e8%83%bd.html</guid>
		<description><![CDATA[
 发现Cpanel还是比较强大的，也提供了API函数供第三方集成，使用起来很方便，因此cosbeta为了方便管理，把部分Cpanel的功能集成到了host.storyday.com中。 
目前host.storyday.com可以自动将到期用户挂起，10日之后若不续费，挂起用户将被删除。 
今天干脆把Cpanel登录也集成到host.storyday.com的后台中，这样用户就只需要登录host.storyday.com即可，登录Cpanel就不需要再次输入用户和密码了，应该会很方便，如左图所示，点击那个Cpanel的图标就可以自动登录到后台进行管理了。 
同样，cosbeta也用比较BT的办法将支付宝支付直接集成进来了。这样用户续费的时候就可以直接给我支付宝汇款（因为是续费，已经使用过cosbeta的服务，所以不存在信用的问题了），然后按照流程操作即可，如下图所示： 

点击续费一年，然后直接给cosbeta打款，付款回来之后，在上面的表格中填写上详细的信息：转帐金额、交易编码、真实姓名，然后点击确认，我们的系统便会去模拟人工操作：连接支付宝，查看当日交易记录，搜索交易编码、交易金额、交易人的姓名，系统一旦找到符合标准的直接转帐，便会自动将帐户续费一年，同时将此笔交易标记为已经操作。 
当初有朋友在twitter问我，若是你的接口出错了怎么办？其实是没有关系的，因为这个接口只是模拟人工检查交易记录，即使检查失败，完全可以发邮件给我，我也可以人工再次检查。毕竟直接转帐是通过支付宝操作的，所以资金不存在任何风险。 
就写到这里，完善一个系统是一个漫长的过程！ 
]]></description>
			<content:encoded><![CDATA[<h6><a href="http://lvfans.spaces.live.com/blog/cns%217D2440D27184A911%21587.entry"></a></h6>
<p><img title="生活点滴虚拟主机" height="218" alt="生活点滴虚拟主机" src="https://xcrhwg.bay.livefilestore.com/y1m-7d98xmHHxslFY36jHnyssudhOwXxqYKY4lOCSKeOCmsKa8KkYTnhMdtGsfZ1-zu-z3UDucqMvIS3-58AwWMpu_vl9qNz4NOOyE5m4v_PomEmAnT-w1lmkHjTbF47pNfOxaOQPml9js/image%5B13%5D%202DEDB859.png" width="240" align="left" border="0" /> 发现Cpanel还是比较强大的，也提供了API函数供第三方集成，使用起来很方便，因此cosbeta为了方便管理，把部分Cpanel的功能集成到了<a href="http://host.storyday.com">host.storyday.com</a>中。 </p>
<p>目前<a href="http://host.storyday.com">host.storyday.com</a>可以自动将到期用户挂起，10日之后若不续费，挂起用户将被删除。 </p>
<p>今天干脆把Cpanel登录也集成到<a href="http://host.storyday.com">host.storyday.com</a>的后台中，这样用户就只需要登录<a href="http://host.storyday.com">host.storyday.com</a>即可，登录Cpanel就不需要再次输入用户和密码了，应该会很方便，如左图所示，点击那个Cpanel的图标就可以自动登录到后台进行管理了。 </p>
<p>同样，cosbeta也用比较BT的办法将支付宝支付直接集成进来了。这样用户续费的时候就可以直接给我支付宝汇款（因为是续费，已经使用过cosbeta的服务，所以不存在信用的问题了），然后按照流程操作即可，如下图所示： </p>
<p><a href="https://xcrhwg.bay.livefilestore.com/y1mDin2UIX6VB0EdQHvp78znjihb30em7WWEGhbqph3koGN6pAEYfzqq4EXrtqlsW38TK0s0Nw-8k_R2l0XCJ3meo7EGYewxQGeHSdQnPPtmxLTnbZ-viC0abiVwEM0tmLPBnFRE4UUb2I/image%5B18%5D%2074F08240.png"><img title="生活点滴虚拟主机" height="280" alt="生活点滴虚拟主机" src="https://xcrhwg.bay.livefilestore.com/y1mnZI310ecRSSIG2rbjVoWytM18mi0aExAcV4yKJfcGdTZgfNxJNi-PiBGERYJf64WCtsHFya2PywrOubZzfHxLV_T5uLf0uFUKzxmItmjd20MfKNuR9F1u29m2joQiGTmSa4FhiJzHH0/image_thumb%5B19%5D.png" width="501" border="0" /></a></p>
<p>点击续费一年，然后直接给cosbeta打款，付款回来之后，在上面的表格中填写上详细的信息：转帐金额、交易编码、真实姓名，然后点击确认，我们的系统便会去模拟人工操作：连接支付宝，查看当日交易记录，搜索交易编码、交易金额、交易人的姓名，系统一旦找到符合标准的直接转帐，便会自动将帐户续费一年，同时将此笔交易标记为已经操作。 </p>
<p>当初有朋友在twitter问我，若是你的接口出错了怎么办？其实是没有关系的，因为这个接口只是模拟人工检查交易记录，即使检查失败，完全可以发邮件给我，我也可以人工再次检查。毕竟直接转帐是通过支付宝操作的，所以资金不存在任何风险。 </p>
<p>就写到这里，完善一个系统是一个漫长的过程！ </p>
]]></content:encoded>
			<wfw:commentRss>http://www.storyday.com/html/y2009/2274_hoststorydaycom-integrated-part-of-cpanel-features.html/feed</wfw:commentRss>
		<slash:comments>18</slash:comments>
		</item>
		<item>
		<title>phpmailer 连接Gmail和web发送短信</title>
		<link>http://www.storyday.com/html/y2009/2266_phpmailer-to-connect-gmail-and-web-send-message.html</link>
		<comments>http://www.storyday.com/html/y2009/2266_phpmailer-to-connect-gmail-and-web-send-message.html#comments</comments>
		<pubDate>Sat, 14 Mar 2009 14:48:17 +0000</pubDate>
		<dc:creator>江东</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[网站技术]]></category>
		<category><![CDATA[mail]]></category>

		<guid isPermaLink="false">http://www.storyday.com/html/y2009/2266_phpmailer-%e8%bf%9e%e6%8e%a5gmail%e5%92%8cweb%e5%8f%91%e9%80%81%e7%9f%ad%e4%bf%a1.html</guid>
		<description><![CDATA[折腾了一个小时，终于将在线发送短信给折腾成功了，哇，网友能在线给webmaster发短信，真的好高深啊！其实未必，下面我就介绍相关的一些解决方法。
首先是如何通过php连接pop3发送邮件。在旧版本的phpmailer中，要连接Gmail可不是那么一件容易的事情，需要修改核心代码，但是在新版的phpmailer中，这个问题就被完美的解决了，首先请下载phpmailer,然后利用cosbeta写的这个发送邮件的函数：

include("lib/phpmailer/class.phpmailer.php");
function sendMail($to,$reply,$subject,$body,$mydisname,$att){
define(MYGMAIL,"mail@storyday.com"); //修改成你的邮箱地址
define(MYGMAILPASS,"你的gmail密码"); //
//下面不用修改了
$subject =     $title = "=?UTF-8?B?".base64_encode($subject)."?=";
// utf8  for chinese
$mail             = new PHPMailer();
$mail-&#62;CharSet ="utf8";
$mail-&#62;IsSMTP();
$mail-&#62;SMTPAuth   = true;                  // enable SMTP authentication
$mail-&#62;SMTPSecure = "ssl";                 // sets the prefix to the servier
$mail-&#62;Host       = "smtp.gmail.com";      // sets GMAIL as the SMTP server
$mail-&#62;Port       = 465;                   // set the SMTP port for the GMAIL server
$mail-&#62;Username   = MYGMAIL;  // GMAIL username
$mail-&#62;Password   [...]]]></description>
			<content:encoded><![CDATA[<p>折腾了一个小时，终于将<a href="http://host.storyday.com" target="_blank">在线发送短信</a>给折腾成功了，哇，网友能在线给webmaster发短信，真的好高深啊！其实未必，下面我就介绍相关的一些解决方法。</p>
<p>首先是如何通过php连接pop3发送邮件。在旧版本的phpmailer中，要连接Gmail可不是那么一件容易的事情，需要修改核心代码，但是在新版的phpmailer中，这个问题就被完美的解决了，首先请<a href="http://downloads.sourceforge.net/phpmailer/phpMailer_v2.3.zip?use_mirror=biznetnetworks" target="_blank">下载phpmailer</a>,然后利用cosbeta写的这个发送邮件的函数：</p>
<p><span id="more-2266"></span></p>
<p><code lang="php">include("lib/phpmailer/class.phpmailer.php");<br />
function sendMail($to,$reply,$subject,$body,$mydisname,$att){<br />
define(MYGMAIL,"mail@storyday.com"); //修改成你的邮箱地址<br />
define(MYGMAILPASS,"你的gmail密码"); //<br />
//下面不用修改了<br />
$subject =     $title = "=?UTF-8?B?".base64_encode($subject)."?=";<br />
// utf8  for chinese<br />
$mail             = new PHPMailer();<br />
$mail-&gt;CharSet ="utf8";<br />
$mail-&gt;IsSMTP();<br />
$mail-&gt;SMTPAuth   = true;                  // enable SMTP authentication<br />
$mail-&gt;SMTPSecure = "ssl";                 // sets the prefix to the servier<br />
$mail-&gt;Host       = "smtp.gmail.com";      // sets GMAIL as the SMTP server<br />
$mail-&gt;Port       = 465;                   // set the SMTP port for the GMAIL server<br />
$mail-&gt;Username   = MYGMAIL;  // GMAIL username<br />
$mail-&gt;Password   = MYGMAILPASS;            // GMAIL password<br />
if( is_array($reply) ){<br />
$i = 0;<br />
while( $reply[$i] !='' ){<br />
$mail-&gt;AddReplyTo($reply[$i], " ");<br />
$i ++;<br />
}<br />
}else{<br />
$mail-&gt;AddReplyTo($reply , " ");<br />
}<br />
$mail-&gt;From       = MYGMAIL;<br />
$mail-&gt;FromName   = SITE_NAME;<br />
$mail-&gt;Subject    = $subject;<br />
$mail-&gt;AltBody    = $body; // optional, comment out and test<br />
$mail-&gt;WordWrap   = 100; // set word wrap<br />
$mail-&gt;MsgHTML($body);<br />
if( is_array($to) ){<br />
$i = 0;<br />
while( $to[$i] !='' ){<br />
$mail-&gt;AddAddress($to[$i], " ");<br />
$i ++;<br />
}<br />
}else{<br />
$mail-&gt;AddAddress($to, " ");<br />
}<br />
if( $att != '' ){<br />
if( is_array($att) ){<br />
$i = 0;<br />
while( $att[$i] !='' ){<br />
$mail-&gt;AddAttachment( $att[$i] );<br />
$i ++;<br />
}<br />
}else{<br />
$mail-&gt;AddAttachment( $att );<br />
}<br />
}<br />
$mail-&gt;IsHTML(true); // send as HTML<br />
if(!$mail-&gt;Send()) {<br />
Return   "Mailer Error: " . $mail-&gt;ErrorInfo;<br />
}<br />
else {<br />
Return true;<br />
}<br />
}</code><br />
函数用法：sendMail($to,$reply,$subject,$body,$mydisname,$att)</p>
<ol>
<li>$to 邮件接收者，若发送给多人，$to为接收者的邮件地址数组;</li>
<li>$reply 邮件将被回复的地址；</li>
<li>$subject邮件标题；</li>
<li>$body邮件内容；</li>
<li>$mydisname邮件发送者显示姓名；</li>
<li>$att附件地址，若发送多个附件，请用数组</li>
</ol>
<p>那现在就看看怎么能通过web发短信呢？</p>
<p>秘密在于：使用广东移动全球通（这里不是广告哈），可以<a href="http://www.storyday.com/html/y2008/1396_mobile-e-mail-to-send-and-receive-text-messages.html" target="_blank">通过移动邮箱发送和接收短信</a>,所以，所谓的通过web发送短信，其实就是通过web向自己的全球通邮箱发送邮件罢了！</p>
]]></content:encoded>
			<wfw:commentRss>http://www.storyday.com/html/y2009/2266_phpmailer-to-connect-gmail-and-web-send-message.html/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>集成paypal和支付宝支付的另外一种思路</title>
		<link>http://www.storyday.com/html/y2009/2265_integrated-paypal-payment-and-payment-bao-another-train-of-thought.html</link>
		<comments>http://www.storyday.com/html/y2009/2265_integrated-paypal-payment-and-payment-bao-another-train-of-thought.html#comments</comments>
		<pubDate>Sat, 14 Mar 2009 09:37:04 +0000</pubDate>
		<dc:creator>江东</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[网站技术]]></category>
		<category><![CDATA[alipay]]></category>
		<category><![CDATA[b2c]]></category>
		<category><![CDATA[paypal]]></category>

		<guid isPermaLink="false">http://www.storyday.com/html/y2009/2265_%e9%9b%86%e6%88%90paypal%e5%92%8c%e6%94%af%e4%bb%98%e5%ae%9d%e6%94%af%e4%bb%98%e7%9a%84%e5%8f%a6%e5%a4%96%e4%b8%80%e7%a7%8d%e6%80%9d%e8%b7%af.html</guid>
		<description><![CDATA[我们知道，paypal和alipay(支付宝)都支持商家工具功能，不幸的是，他们都是收费的，基本上都是按照交易金额的百分比来收费。然而对于支付宝来说，需要一次性缴纳一定的费用，用来抵消今后交易中的收费。这点对于刚刚起步尝试做网络B2C服务的朋友可能无法接受。
商家工具的好处在于可以很方便的将支付方式集成在自己的网站中，稍会一点代码的人都可以根据帮助手册将其集成进来。所以cosbeta的这篇的日志就不写如何集成商家工具了，这篇日志只是想提出一个变态的解决思路，看看通过这样的方式是否可行！
假设我们将购物的方式的流程设计如下：

买家将商品添加到购物车、或者直接购买结帐；
到了结帐的页面（收银台），给买家一个支付宝直接转帐的链接，并且告诉买家直接转帐到某个帐户；
支付宝的页面是通过javascript打开的，所以收银台能够定时监控得到当前页面的变化（即使监控不到也没有关系）；
买家直接转帐，然后收银台通过js获取到转帐交易的ID号码，若无法获取，则请买家手动输入；
在服务器端，登录支付宝（通过CURL），通过ID检查支付金额，若和需求金额相同，则提交订单；
完成支付；

其实上面的方式应该可行，而且这个也不会给支付宝带来任何损失，因为通过程序模拟客户端登录支付宝和用户本身登录支付宝没有什么两样，而且直接转帐超过5000之后，支付宝照样要收取手续费的，因此这种思路仅仅曲线的解决办法，不存在利用漏洞之说。
或者，支付宝本身就会拒绝非正常浏览器的登录，不过用程序模拟浏览器登录应该也不是难事。
当然，paypal也可以利用同样的方法，不过由于paypal的商家工具没有一次性费用的说法，而是按照交易金额的百分比来收费，所以完全没有这个必要。
另外，支付宝的商家工具是不是也可以来个0收费，直接从交易金额中按照一定百分比来扣除？
]]></description>
			<content:encoded><![CDATA[<p>我们知道，paypal和alipay(支付宝)都支持商家工具功能，不幸的是，他们都是收费的，基本上都是按照交易金额的百分比来收费。然而对于支付宝来说，需要一次性缴纳一定的费用，用来抵消今后交易中的收费。这点对于刚刚起步尝试做网络B2C服务的朋友可能无法接受。</p>
<p>商家工具的好处在于可以很方便的将支付方式集成在自己的网站中，稍会一点代码的人都可以根据帮助手册将其集成进来。所以cosbeta的这篇的日志就不写如何集成商家工具了，这篇日志只是想提出一个变态的解决思路，看看通过这样的方式是否可行！</p>
<p>假设我们将购物的方式的流程设计如下：</p>
<ol>
<li>买家将商品添加到购物车、或者直接购买结帐；</li>
<li>到了结帐的页面（收银台），给买家一个支付宝直接转帐的链接，并且告诉买家直接转帐到某个帐户；</li>
<li>支付宝的页面是通过javascript打开的，所以收银台能够定时监控得到当前页面的变化（即使监控不到也没有关系）；</li>
<li>买家直接转帐，然后收银台通过js获取到转帐交易的ID号码，若无法获取，则请买家手动输入；</li>
<li>在服务器端，登录支付宝（通过CURL），通过ID检查支付金额，若和需求金额相同，则提交订单；</li>
<li>完成支付；</li>
</ol>
<p>其实上面的方式应该可行，而且这个也不会给支付宝带来任何损失，因为通过程序模拟客户端登录支付宝和用户本身登录支付宝没有什么两样，而且直接转帐超过5000之后，支付宝照样要收取手续费的，因此这种思路仅仅曲线的解决办法，不存在利用漏洞之说。</p>
<p>或者，支付宝本身就会拒绝非正常浏览器的登录，不过用程序模拟浏览器登录应该也不是难事。</p>
<p>当然，paypal也可以利用同样的方法，不过由于paypal的商家工具没有一次性费用的说法，而是按照交易金额的百分比来收费，所以完全没有这个必要。</p>
<p>另外，支付宝的商家工具是不是也可以来个0收费，直接从交易金额中按照一定百分比来扣除？</p>
]]></content:encoded>
			<wfw:commentRss>http://www.storyday.com/html/y2009/2265_integrated-paypal-payment-and-payment-bao-another-train-of-thought.html/feed</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>随便谈谈:合理设置网站的登录密码</title>
		<link>http://www.storyday.com/html/y2009/2241_not-to-talk-about-a-reasonable-set-up-the-site-log-in-a-password.html</link>
		<comments>http://www.storyday.com/html/y2009/2241_not-to-talk-about-a-reasonable-set-up-the-site-log-in-a-password.html#comments</comments>
		<pubDate>Tue, 03 Mar 2009 07:06:30 +0000</pubDate>
		<dc:creator>江东</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[网站技术]]></category>

		<guid isPermaLink="false">http://www.storyday.com/?p=2241</guid>
		<description><![CDATA[n年前，也就是大学期间，cosbeta接了几个php程序的开发，客户居然有奇怪的要求，说用户的密码要能在后台查看，以方便给用户找回密码。后来，在cosbeta的苦口婆心的劝说下，客户终于同意了cosbeta的方案：将密码加密保存在数据库中，访客不可以取回密码，只能重设密码。这样的好处有三：1.保密用户资料，即使黑客攻破MySql，也无法查看用户的密码，因为密码已经加密过；2.保护用户隐私，即便是是数据库管理员也无法查看用户的密码，从而去猜测用户其他地方可能会使用的密码；3.让用户更加信任你的站点。
为此，cosbeta在这个blog刚建立的时候还发表了一篇日志，建议大家妥善分类管理自己的密码。然而在我们的身边，密码不分等级的人比比皆是，比如有人的OA密码就设置得非常复杂，我在想，要是哪一天公司的IT部门相关人员邪恶一下，将你的密码记录下来，然后因此去推测你的银行卡密码，岂不是很危险。
不过各位放心，cosbeta在保存用户密码时，一律采用了md5(username+password)的方式将密码进行了加密，然后才保存，所以在cosbeta开发的应用中，你是无法找回密码的，只能重设。当然，即使我在这里信誓旦旦的承诺，你依然也要考虑分等级来管理你的密码，永远不要在不信任的站点使用你最重要的密码。
]]></description>
			<content:encoded><![CDATA[<p>n年前，也就是大学期间，<a href="http://www.storyday.com">cosbet</a>a接了几个php程序的开发，客户居然有奇怪的要求，说用户的密码要能在后台查看，以方便给用户找回密码。后来，在cosbeta的苦口婆心的劝说下，客户终于同意了cosbeta的方案：将密码加密保存在数据库中，访客不可以取回密码，只能重设密码。这样的好处有三：1.保密用户资料，即使黑客攻破MySql，也无法查看用户的密码，因为密码已经加密过；2.保护用户隐私，即便是是数据库管理员也无法查看用户的密码，从而去猜测用户其他地方可能会使用的密码；3.让用户更加信任你的站点。</p>
<p>为此，<a href="http://www.storyday.com">cosbeta</a>在这个blog刚建立的时候还发表了一篇日志，建议大家<a href="http://www.storyday.com/html/y2007/581_manage-your-password.html">妥善分类管理自己的密码</a>。然而在我们的身边，密码不分等级的人比比皆是，比如有人的OA密码就设置得非常复杂，我在想，要是哪一天公司的IT部门相关人员邪恶一下，将你的密码记录下来，然后因此去推测你的银行卡密码，岂不是很危险。</p>
<p>不过各位放心，<a href="http://www.storyday.com">cosbeta</a>在保存用户密码时，一律采用了md5(username+password)的方式将密码进行了加密，然后才保存，所以在cosbeta开发的应用中，你是无法找回密码的，只能重设。当然，即使我在这里信誓旦旦的承诺，你依然也要考虑分等级来管理你的密码，永远不要在不信任的站点使用你最重要的密码。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.storyday.com/html/y2009/2241_not-to-talk-about-a-reasonable-set-up-the-site-log-in-a-password.html/feed</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
	</channel>
</rss>
