显示标签为“PHP”的博文。显示所有博文
显示标签为“PHP”的博文。显示所有博文

2020年5月22日星期五

网址书签(收藏夹)主页开发小记

从Chrome诞生起就用了,到现在有十几年了,无奈Google在国内是不存在的,Chrome无法同步数据包括网址书签,每回换电脑和手机都要手工加一堆书签便于访问,好在常用的不多,也就十几个,加起来也不难,所以一直也没想到解决书签同步的问题。

前几天突然想为什么自己不做个书签主页,类似于导航网站那样,把经常访问的网址放在浏览器主页。

我想着找一个现成的导航网站源码,然后挂到虚拟主机空间里,再绑定一个子域名。找来找去,都是臃肿的,没有合适的。

后来想着WordPress自带链接页,何不把这个链接页改造一下呢。

我用的WordPress主题是inove,差不多有十年了,大大小小的修改很多,也不想去折腾了。但是inove诞生的时候没有考虑手机浏览的问题,只能自己动手把links页面给改造成手机和PC都能友好访问的页面。

在网站HTML文件的开头,增加viewport meta标签告诉浏览器视口宽度等于设备屏幕宽度,且不进行初始缩放。代码如下:

<meta content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0;" name="viewport" />

然后把页面中固定宽度的删除,再删除掉head和foot,下面就是不断的调整css的样式了,调一点看下效果,模样初现了。

只显示链接文字,Jasmine说太单调,辨识度不高,于是想在链接上面加个图片,实现的效果是图片在上,下面显示网址标题及链接。图片直接取网站favicon的图标,如下:

<img src="', $bookmark->link_url , '/favicon.ico" onerror="this.src=img/wp-logo.png "/>

实际发现好多问题:1、加载缓慢。2、好多网址取不到favicon.ico。3、由于网络及缓存原因,有时能取到有时取不到favicon.ico

于是干脆不要favicon.ico了,直接用纯文字的首字作为图片,为了提高辨识度,“图片”的背景色要不一样。

HTML部分的代码如下:

<div class="content">			<?php if($linkcats) : foreach($linkcats as $linkcat) : ?>				<div class="boxcaption"><H6><?php echo $linkcat->name; ?><h6></div>				<div class="box linkcat">					<ul>						<?php							$bookmarks = get_bookmarks('orderby=rating & category_name=' . $linkcat->name);							if ( !empty($bookmarks) ) {								foreach ($bookmarks as $bookmark) {									echo '<li><div class="nav-icon-normal" id="' . $bookmark->link_id . '" style="background-color:#'. str_pad(pow($bookmark->link_id,3), 6, 'f', STR_PAD_BOTH) .'" >' . $bookmark->link_name . '</div><a href="' . $bookmark->link_url . '" title="' . $bookmark->link_description . '">' . $bookmark->link_name . '</a></li>';								}							}						?>					</ul>					<div class="fixed"></div>				</div>			<?php endforeach; endif; //the_content(); ?>			<div class="fixed"></div></div>

CSS样式如下:

/* linkcat START */.post .content .linkcat ul li {	list-style:none;	float:left;	width:25%;	padding:2px 0;	overflow:hidden;		margin:5px 0;		text-align: center;}.post .content .linkcat ul li a {	padding-left:22px;*/	height:1.2rem;	line-height:1.2rem;}.nav-icon-normal {       width: 32px;       height: 32px;       line-height: 33px;       display: inline-block;       border-radius: 6px;       background-color: #b3b4c5;       vertical-align: middle;       overflow: hidden;       font-size: 16px;       text-indent: 8px;       text-align: center;       letter-spacing: 8px;       color: #fff;       word-break: break-all;       display: block;       margin: 0 auto;}/* linkcat END */

核心代码如下:

echo '<li><div class="nav-icon-normal" id="' . $bookmark->link_id . '" style="background-color:#'. str_pad(pow($bookmark->link_id,3), 6, 'f', STR_PAD_BOTH) .'" >' . $bookmark->link_name . '</div><a href="' . $bookmark->link_url . '" title="' . $bookmark->link_description . '">' . $bookmark->link_name . '</a></li>';

纯文字的首字图片背景颜色取得是链接的id,然后补全成6位十六进制颜色,这里用了这个函数str_pad($string, 6, ‘f’, STR_PAD_BOTH),用f来补充。因为id很接近,为了更好的区分颜色,我用了pow(x,y)函数把id的数字扩大化,最终使用的函数是str_pad(pow($bookmark->link_id,3), 6, ‘f’, STR_PAD_BOTH)

因为多次修改HTML页面,可能会有HTML标签不闭合的问题,推荐使用在线的HTML标签闭合检测工具来检查下页面代码。

点击查看我做出来的链接页效果

PS. 链接的排序用的是orderby=rating,评分低的在前面。

网址书签(收藏夹)主页开发小记

从Chrome诞生起就用了,到现在有十几年了,无奈Google在国内是不存在的,Chrome无法同步数据包括网址书签,每回换电脑和手机都要手工加一堆书签便于访问,好在常用的不多,也就十几个,加起来也不难,所以一直也没想到解决书签同步的问题。

前几天突然想为什么自己不做个书签主页,类似于导航网站那样,把经常访问的网址放在浏览器主页。

我想着找一个现成的导航网站源码,然后挂到虚拟主机空间里,再绑定一个子域名。找来找去,都是臃肿的,没有合适的。

后来想着WordPress自带链接页,何不把这个链接页改造一下呢。

我用的WordPress主题是inove,差不多有十年了,大大小小的修改很多,也不想去折腾了。但是inove诞生的时候没有考虑手机浏览的问题,只能自己动手把links页面给改造成手机和PC都能友好访问的页面。

在网站HTML文件的开头,增加viewport meta标签告诉浏览器视口宽度等于设备屏幕宽度,且不进行初始缩放。代码如下:

<meta content=”width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0;” name=”viewport” />

然后把页面中固定宽度的删除,再删除掉head和foot,下面就是不断的调整css的样式了,调一点看下效果,模样初现了。

只显示链接文字,Jasmine说太单调,辨识度不高,于是想在链接上面加个图片,实现的效果是图片在上,下面显示网址标题及链接。图片直接取网站favicon的图标,如下:

<img src=”‘, $bookmark->link_url , ‘/favicon.ico” onerror=”this.src=img/wp-logo.png “/>

实际发现好多问题:1、加载缓慢。2、好多网址取不到favicon.ico。3、由于网络及缓存原因,有时能取到有时取不到favicon.ico

于是干脆不要favicon.ico了,直接用纯文字的首字作为图片,为了提高辨识度,“图片”的背景色要不一样。

HTML部分的代码如下:

name; ?>
    name); if ( !empty($bookmarks) ) { foreach ($bookmarks as $bookmark) { echo '
  • ' . $bookmark->link_name . '
  • '; } } ?>

CSS样式如下:

/* linkcat START */.post .content .linkcat ul li {	list-style:none;	float:left;	width:25%;	padding:2px 0;	overflow:hidden;		margin:5px 0;		text-align: center;}.post .content .linkcat ul li a {	padding-left:22px;*/	height:1.2rem;	line-height:1.2rem;}.nav-icon-normal {       width: 32px;       height: 32px;       line-height: 33px;       display: inline-block;       border-radius: 6px;       background-color: #b3b4c5;       vertical-align: middle;       overflow: hidden;       font-size: 16px;       text-indent: 8px;       text-align: center;       letter-spacing: 8px;       color: #fff;       word-break: break-all;       display: block;       margin: 0 auto;}/* linkcat END */

核心代码如下:

echo ‘<li><div class=”nav-icon-normal” id=”‘ . $bookmark->link_id . ‘” style=”background-color:#’. str_pad(pow($bookmark->link_id,3), 6, ‘f’, STR_PAD_BOTH) .'” >’ . $bookmark->link_name . ‘</div><a href=”‘ . $bookmark->link_url . ‘” title=”‘ . $bookmark->link_description . ‘”>’ . $bookmark->link_name . ‘</a></li>’;

纯文字的首字图片背景颜色取得是链接的id,然后补全成6位十六进制颜色,这里用了这个函数str_pad($string, 6, ‘f’, STR_PAD_BOTH),用f来补充。因为id很接近,为了更好的区分颜色,我用了pow(x,y)函数把id的数字扩大化,最终使用的函数是str_pad(pow($bookmark->link_id,3), 6, ‘f’, STR_PAD_BOTH)

因为多次修改HTML页面,可能会有HTML标签不闭合的问题,推荐使用在线的HTML标签闭合检测工具来检查下页面代码。

点击查看我做出来的链接页效果

PS. 链接的排序用的是orderby=rating,评分低的在前面。

2010年8月10日星期二

PHP回复留言之邮件通知的实现

浏览网页留下了自己的评论脚印,或者是在问答系统中提出了问题,之后有人回复了你的留言或者回答了你提出的问题,这时候我们总是希望通过邮件来通知一下。其实PHP实现起来极其得简单,只需要Mail函数就可以来实现。

mail()函数:作用是寄出电子邮件。
语法: boolean mail(string to, string subject, string message, string [additional_headers]);
to 指定的邮件地址,subject 表示主题,message 为信件内容。额外的选项 additional_headers 可省略,表示其它的邮件文件头。


例如:mail(123@example.com,"你的评论有人回复了","回复的内容是:balabala……",456@example.com)

当然我们不想回复的内容就是简单的一句话,希望它尽量丰富些,比如说有只想网站的超链接。

可以把message定义为



$message = '
<html>
<head>
<title>Birthday Reminders for August</title>
</head>
<body>
<p>Here are the birthdays upcoming in August!</p>
<table>
<tr>
<th>Person</th><th>Day</th><th>Month</th><th>Year</th>
</tr>
<tr>
<td>Joe</td><td>3rd</td><td>August</td><td>1970</td>
</tr>
<tr>
<td>Sally</td><td>17th</td><td>August</td><td>1973</td>
</tr>
</table>
</body>
</html>
';




另外,邮件主题或者内容中是中文的话,接收到的邮件总会出现乱码的现象。

2010年8月2日星期一

简单PHP相关文章链接的实现

一般文章的正文后面会跟上该文章的相关文章,罗列一条条相似的文章。这种做法不仅对于作者还是读者都是有利的,既可以吸引粘连读者又可以使读者加深阅读。

对于PHP编程实现来说,一般的方法是在写文章时自己添加或者自动生成Tag标记,之后再寻找这些Tag相关性高的文章。谷歌实验室的Google Related Links同样也可以实现此功能,有兴趣的同学可以前往研究,不过需要申请。

我们知道文章标题能够涵盖文章的大体要义(标题党除外),相关文章在标题上也会有一定的相似度。下面就来介绍一种基于文章标题Tilte的相关文章实现方法,其实也就是利用了PHP自身带的similar_text函数来判断内容的相似度。





<?php

require('conn.php');
$sql="select title from content order by id"; //判断标题相似度
$result=mysql_query($sql,$conn);

while($row=mysql_fetch_array($result)){
similar_text($row['title'], $title, $percent); //比较相似度 存放于$percent

if($percent>30 && $percent<100){echo $row['title'];} //相似度高于30小于100,小于100就是排除掉自己。当然这个值可以根据实际来修改。

}

?>




这样的话就可以把和该文章标题相似度在30-100间的文章标题输出了。

2010年7月18日星期日

PHP加密函数Authcode使用

Authcode函数是一个使用PHP写的加密和解密函数,它是使用异或运算进行加密和解密的。你如果没有心思分析代码的工作原理,大可以不看下面一大坨的内容,不过还是建议你看一下函数头,注意一下参数的含义。既然可以使用加密和解密,使用合适的密匙就显得尤其重要了。

需要注意的是,每次加密后得到的结果是不一样的(可以输出$code看一下),这是为加密的安全性着想。如果还觉得不放心,可以配合MD5来加密,形式如下:md5(md5($password).$salt)

Authcode函数代码如下:



//$string: 明文或密文
//$operation:DECODE表示解密,其它表示加密
//$key: 密匙
//$expiry:密文有效期
function authcode($string,$operation='DECODE',$key='',$expiry=0){
//动态密匙长度,相同的明文会生成不同密文就是依靠动态密匙
$ckey_length=4;
 
//密匙
$key=md5($key?$key:$GLOBALS['discuz_auth_key']);
 
//密匙a会参与加解密
$keya=md5(substr($key,0,16));
 
//密匙b会用来做数据完整性验证
$keyb=md5(substr($key,16,16));
 
//密匙c用于变化生成的密文
$keyc=$ckey_length?($operation=='DECODE'?substr($string,0,$ckey_length):substr(md5(microtime()),-$ckey_length)):'';
 
//PHP加密解密函数authcode参与运算的密匙
$cryptkey=$keya.md5($keya.$keyc);
$key_length=strlen($cryptkey);
 
//明文,前10位用来保存时间戳,解密时验证数据有效性,10到26位用来保存$keyb(密匙b),解密时会通过这个密匙验证数据完整性
//如果是解码的话,会从第$ckey_length位开始,因为密文前$ckey_length位保存动态密匙,以保证解密正确
$string=$operation=='DECODE'?base64_decode(substr($string,$ckey_length)):sprintf('%010d',$expiry?$expiry+time():0).substr(md5($string.$keyb),0,16).$string;
$string_length=strlen($string);
$result='';
$box=range(0,255);
$rndkey=array();
 
//PHP加密解密函数authcode产生密匙簿
for($i=0; $i<=255; $i++)
$rndkey[$i]=ord($cryptkey[$i%$key_length]);
 
//用固定的算法,打乱密匙簿,增加随机性,好像很复杂,实际上对并不会增加密文的强度
for($j=$i=0; $i<256; $i++){
$j=($j+$box[$i]+$rndkey[$i])%256;
$tmp=$box[$i];
$box[$i]=$box[$j];
$box[$j]=$tmp;
}
 
//PHP加密解密函数authcode核心加解密部分
for($a=$j=$i=0; $i<$string_length; $i++){
$a=($a+1)%256;
$j=($j+$box[$a])%256;
$tmp=$box[$a];
$box[$a]=$box[$j];
$box[$j]=$tmp;
 
//PHP加密解密函数authcode从密匙簿得出密匙进行异或,再转成字符
$result.=chr(ord($string[$i]) ^ ($box[($box[$a]+$box[$j])%256]));
}
 
if($operation=='DECODE'){
//substr($result,0,10)==0 验证数据有效性
//substr($result,0,10)-time()>0 验证数据有效性
//substr($result,10,16)==substr(md5(substr($result,26).$keyb),0,16) 验证数据完整性
 
//验证数据有效性,请看未加密明文的格式
if((substr($result,0,10)==0 || substr($result,0,10)-time()>0) && substr($result,10,16)==substr(md5(substr($result,26).$keyb),0,16))
return substr($result, 26);
else return '';
} else {
//PHP加密解密函数authcode把动态密匙保存在密文里,这也是为什么同样的明文,生产不同密文后能解密的原因
//因为加密后的密文可能是一些特殊字符,复制过程可能会丢失,所以用base64编码
return $keyc.str_replace('=','',base64_encode($result));
}
}
?>




加密$code=authcode('12345','','mishi');//mishi为密匙,可以修改

解密authcode($code,'DECODE','mishi');//使用加密的密匙

验证码的“换一张”实现

突然有一天评论条数激增,还以为是流量大涨了呢,仔细一看是些垃圾评论,且评论的间隔极短,突破了JS的限制,可能是使用了评论工具实现的。谷歌早有远见,在用户生成的垃圾评论中总结了对抗垃圾评论的方法,同时提供了reCAPTCHA这个很强悍的工具,不过使用前需要注册。使用方法比较简单,和一般的验证码没有太大的区别,且Google给的使用说明足够详细。只是我考虑到这个家伙太过庞大,而且占用面积大,用在注册页面还算可以,如果用在评论验证就显得“大炮打蚊子”。于是就使用个简单点的,放在附件里吧,这里主要说明的是“换一张”的实现,先看代码:



<input type="text" name="captcha" id="captcha-form" size="4"/><img src="captcha.php" id="captcha" />
<a onclick="
document.getElementById('captcha').src='captcha.php?'+Math.random();
document.getElementById('captcha-form').focus();return false;" href="#"

id="change-image">换一张</a>




就是通过点击链接使用js把src替换成'captcha.php?'+Math.random();就可以了。

PS:我们之前介绍的php仿Google验证码工具同样也很好很强大。

2010年7月13日星期二

PHP时间函数

1.年-月-日
echo date('Y-m-j');

2007-02-6

echo date('y-n-j');
07-2-6

大写Y表示年四位数字,而小写y表示年的两位数字;
小写m表示月份的数字(带前导),而小写n则表示不带前导的月份数字。

echo date('Y-M-j');
2007-Feb-6

echo date('Y-m-d');
2007-02-06

大写M表示月份的3个缩写字符,而小写m则表示月份的数字(带前导0);
没有大写的J,只有小写j表示月份的日期,无前导o;若需要月份带前导则使用小写d。

echo date('Y-M-j');
2007-Feb-6

echo date('Y-F-jS');
2007-February-6th

大写M表示月份的3个缩写字符,而大写F表示月份的英文全写。(没有小写f)
大写S表示日期的后缀,比如“st”、“nd”、“rd”和“th”,具体看日期数字为何。

小结:
表示年可以用大写的Y和小写y;
表示月可以用大写F、大写M、小写m和小写n(分别表示字符和数字的两种方式);
表示日可以用小写d和小写j,大写S表示日期的后缀。

2.时:分:秒

默认情况下,PHP解释显示的时间为“格林威治标准时间”,与我们本地的时间相差8个小时。

echo date('g:i:s a');
5:56:57 am

echo date('h:i:s A');
05:56:57 AM

小写g表示12小时制,无前导0,而小写h则表示有前导0的12小时制。
当使用12小时制时需要表明上下午,小写a表示小写的“am”和“pm”,大写A表示大写的“AM”和“PM”。

echo date('G:i:s');
14:02:26

大写G表示24小时制的小时数,但是不带前导的;使用大写的H表示带前导的24小时制小时数

小结:
字母g表示小时不带前导,字母h表示小时带前导;
小写g、h表示12小时制,大写G、H表示24小时制。

3.闰年、星期、天

echo date('L');
今年是否闰年:0

echo date('l');
今天是:Tuesday

echo date('D');
今天是:Tue

大写L表示判断今年是否闰年,布尔值,为真返回1,否则为0;
小写l表示当天是星期几的英文全写(Tuesday);
而使用大写D表示星期几的3个字符缩写(Tue)。

echo date('w');
今天星期:2

echo date('W');
本周是全年中的第 06 周

小写w表示星期几,数字形式表示
大写W表示一年中的星期数

echo date('t');
本月是 28 天

echo date('z');
今天是今年的第 36 天

小写t表示当前月份又多少天
小写z表示今天是本年中第几天

4.其他

echo date('T');
UTC
大写T表示服务器的时间区域设置

echo date('I');
0
大写I表示判断当前是否为夏令时,为真返回1,否则为0

echo date('U');
1170769424
大写U表示从1970年1月1日到现在的总秒数,就是Unix时间纪元的UNIX时间戳。

echo date('c');
2007-02-06T14:24:43+00:00
小写c表示ISO8601日期,日期格式为YYYY-MM-DD,用字母T来间隔日期和时间,时间格式为HH:MM:SS,时区使用格林威治标准时间(GMT)的偏差来表示。

echo date('r');
Tue, 06 Feb 2007 14:25:52 +0000
小写r表示RFC822日期。

来源:BSD爱好者乐园 作者: 剑心通明

PHP系统时区设置的通用方法

我使用的服务器空间是ATBhost,网站有些文件需要调用系统时间,发现系统时间和需要的北京时间总是相差12个小时,一直在寻找设置时区的地方。开始以为在ATBhost的Contrl panel里面设置,找来找去找不到设置时区的选项;之后在cPanel里寻找,还是同样没有找到;网上有人说可以设置mysql数据库的时区,最终发现没有权限修改。功夫不负有心人,设定时区终于给解决了。下面介绍系统时间和北京时间相差的两种解决方法:

方法一:

在public_html中找到php.ini,没有的话可以自己新建一个同名的文件,然后上传到此文件夹中。

php.ini中有“;date.timezone”这么一项,它是用来设置时区的,默认状态下是关闭的,我们需要开启它。如果需要的是上海时间,那么就设置成:date.timezone = "Asia/Shanghai"。其他可用的值是:Asia/Chongqing 、Asia/Shanghai 、Asia/Urumqi (依次为重庆,上海,乌鲁木齐);港台地区可用:Asia/Macao、Asia/Hong_Kong、Asia/Taipei(依次为澳门,香港,台北);还有新加坡:Asia/Singapore;以及:Etc/GMT-8、Singapore、Hongkong、PRC.

方法二:

在需要修改时区的PHP文件中使用date_default_timezone_set('Asia/Shanghai');然后再使用date函数$time = date(Y."年".m."月".d."日".G."时".i."分");调用就行了。

2010年7月12日星期一

php仿Google验证码

源文件地址:http://code.google.com/p/cool-php-captcha/

文件下载下来,只需要resources、captcha.php、example-form.php这三个文件。resources主要是字体资源,captcha.php是验证码文件,这两个文件不需要修改,需要修改example-form.php文件。

接收表单的文件修改为:



<form method="post" action="post.php">




验证码填写的表单是:



<input type="text" name="captcha" id="captcha-form" />




需要在post.php文件中使用:$_POST["captcha"]来接收填写的内容,系统生成的验证码设置在session中的格式是:$_SESSION['captcha'],下面就是判断填写的验证码是否和系统生成的验证码相等。



if (!empty($_REQUEST['captcha'])) {
if (empty($_SESSION['captcha']) || trim(strtolower($_REQUEST['captcha'])) != $_SESSION['captcha']) {
echo "输入的验证码错误";
} else {
//验证码正确的操作
}
unset($_SESSION['captcha']);//不管输入的验证码是否正确,都应该进行验证码的注销
}



2010年6月24日星期四

记住帐号、记住密码、记住表单信息等“记住”的实现

登录界面有记住帐号、记住密码,留言时有记住表单信息等,这使得用户在下次访问该页面时不用重复地输入重复的信息,减少重复劳动。网页设计者当然要满足用户的需求,那么PHP是怎么实现这些“记住”的呢。
使用客户端的cookie可以实现上述需求,下面以留言板为实例来讲解:
先看一下一般的Form(不具有记住功能的表单):








我们需要在名称、邮箱、网站链接处填上用户的信息,这些信息应该从用户上一次提交时得到。
只需要在post.php中加入下面的语句:

$sql = "insert into comment (nid,username,email,info,ip,site,submit_time) values ('$nid','$username','$email','$info','$ip','$site',NOW())";
$result = mysql_query($sql);
setcookie("CookieNAME",mysql_insert_id(),time()+94608000,"/"); /* 三年后 cookie 才会失效 */

把刚添加进数据库中的记录id保存在CookieNAME中,保存时间为三年。
上面是写入cookie,取出直接用$CookieNAME。可是取出id没什么用,我们需要的是用户的信息,那么就执行一下数据库查询操作就行了:

if(!empty($CookieNAME)){
$sql = "select username,email,site from comment where id=$CookieNAME";
$rss = mysql_query($sql);
$rs= mysql_fetch_array($rss);
}

然后把这些得到的信息填到上面的form表单中就完成了“记住”。
可是用户不一定都希望被“记住”,那么就要增加一个复选框供用户选择。表单中在按钮的右边添加:




post.php处理时只需要简单的判断复选框有没有被选中即可:

if(!empty($_POST["chkRemember"])){//如果复选框选中,设置cookie
setcookie("CookieNAME",mysql_insert_id(),time()+94608000,"/"); /* 三年后 cookie 才会失效 */
}

整个过程就是这样的,登录框和这个实现起来差不多。

2010年6月18日星期五

PHP生成静态网页HTML

PHP生成静态网页HTML方法分为生成伪静态HTML和生成真正静态的HTML.

伪静态使用.htaccess来重定位:



RewriteEngine on
RewriteRule ([0-9]{1,}).html$ detail.php?nid=$1




上面表示遇到数字+html,比如99.html就会跳转到datail.php,然后把括号里的参数给$1. 这样就实现了使用静态htnl页面了。

真正的静态html,是使用php来生成html页面。对于那种网站访问量大的大站,一般采用这种方式。 下面介绍一种简单的方法的例子,两个文件:add.php和model.php

model.php



<html> 
<body>
此新闻的标题:{title}
此新闻的内容:{content}
</body>
</html>






add.php:



<?php
require_once("conn.php"); //引用conn.php,连接数据库
$title="我是标题";
$content="我是内容"; //获得表单变量
//以下建立一文本文档,其值自动计数
$countfile="count.txt";
if(!file_exists($countfile))
{
fopen($countfile,"w"); //如果此文件不存在,则自动建立一个
}
$fp=fopen($countfile,"r");
$num=fgets($fp,20);
$num=$num+1; //每次其值自动加一
fclose($fp);
$fp=fopen($countfile,"w");
fwrite($fp,$num); //更新其值
fclose($fp);
//利用上面自动计数的值获得HTML的路径$path
$houzui=".php";
$htmlfile ="archives";
if (!is_dir($htmlfile)) //先判断是否已经创建了此目录!无,则先创建此目录
{
mkdir($htmlfile);
}
$path=$htmlfile."/".$num.$houzui;
//这样形成的路径是自动增长的,如1.html,2.html,3.html……添加一条新闻便自动加上1
//以下用SQL语句添加数据至表 news
$sql="insert into news (title,content,path) values (‘".$title."’,’".$content."’,’".$path."’)";
$query=mysql_query($sql);
//以下为关键之处,把从表单获得的数据替换模板中的{title},{content}标记
$fp=fopen("model.php","r"); //只读打开模板
$str=fread($fp,filesize("model.php"));//读取模板中内容
$str=str_replace("{title}",$title,$str);
$str=str_replace("{content}",$content,$str);//替换内容
fclose($fp);
$handle=fopen($path,"w"); //写入方式打开新闻路径
fwrite($handle,$str); //把刚才替换的内容写进生成的HTML文件
fclose($handle);
//收尾工作:
echo "查看刚才添加的新闻";
?>




add.php首先生成count文件,主要用来计数,以后每生成一个html,就加1.然后把生成的html文件路径,文件名称,内容存入数据库。之后最主要的是,使用模板生成html文件。模板中需要替换的地方使用{}留着标记。

.htaccess文件保护实例讲解

比如说,想要保护admin文件夹,经过以下两个步骤:

步骤一、可以用记事本新建文件.htaccess,输入以下内容:

AuthType BasicAuth


UserFile D:/AppServ/www/Hill/admin/.htpasswd


AuthName "hill"


require valid-user


各行不多解释,关键是第二行,一定要是绝对路径,表示.htpasswd文件的位置。(位置任意)

然后把这个名为.htaccess的文件放到admin文件夹中。

步骤二、下面就是新建一个名为.htpasswd的文件,名字应该和上面第二行一致。

简单的方法:开始-运行-cmd-apache>bin\htpasswd -c .htpasswd name


下面就是输入密码了,是经过md5加密的。


建好后把这个名为.htpasswd的文件放到第二行指定的位置处。

再次说明一下UserFile第二行,花了我好长时间才弄好,如果提示500错误就是路径不正确。对于atbhost空间的位置是/home/注册名。

atbhost空间提供了存放密码的地方:.htpasswds

2010年6月14日星期一

PHP和JS的几点总结

1、Javascript的值传给php来处理可以把这个值放在一个hidden表单里面,例如:




<---javascript>
form.myclass.value = classString;
<---javascript>

这样的话就把classString的值传给了name是myclass的隐藏的表单。

2、数据库查找的时候是精确查找,一定要注意查找的字符串中的空格,今天我被这个问题快整崩溃了,怎么着都不对,又找不到错误,例如:

$array = @explode(“”,$class); //把$class分解并放到$array数组中

我没有想到这个分解的字符串中存在的空格。具体的过程是这样的:

比如给一段字符串:abc

分出来的字符串为:a,b,c, ,

c后面是存在空格的。

我在数据库中查找的时候总是不对,错误就在这里了。

3、表单提交按钮中的return

有return的语句



无return的语句



上面两条语句的区别就是:有return时,当funtion返回false时,网页不提交。
4、JS中使用<!— —>的作用是注释,主要为了支持老版本的浏览器。
5、表单中的关键字



上面的语句中出现了“class”的关键字,调试的时候除了问题,我怎么找都没有找到错误。所以给表单中的元素命名时最好不要使用关键字,比如:


2010年6月13日星期日

Robots文件举例

Robots使得网络蜘蛛按规矩搜索网站,也可以使蜘蛛远离某些服务器上的目录。下面是一个Robots.txt的例子:(可以通过谷歌网站管理员工具生成)

User-agent: *
Disallow: /admin/   后台管理文件
Disallow: /require/   程序文件
Disallow: /attachment/  附件
Disallow: /images/     图片
Disallow: /data/       数据库文件
Disallow: /template/   模板文件
Disallow: /css/       样式表文件
Disallow: /lang/      编码文件
Disallow: /script/    脚本文件


*表示对于所有的搜索引擎,Disallow表示不允许访问的目录,如果网站建有站点地图,只需在Robots.txt中添加下列行:


Sitemap: http://www.example.com/sitemap.xml

PHP生成Google Sitemaps

Google Sitemaps是在网站根目录下,建立的网站网页的xml索引文件,然后通过Google Sitemaps的提交页面,提交该xml文件,这样的话Google可以方便地找到你网站的网页索引。传统方式是Google爬虫来查找你的网页,而现在是你主动地提交自己的网页索引。显而易见的好处是,你的网站可以更好更快地被搜索引擎索引到更多的网页。

我们可以通过一些方式来生成这个sitemap,然后拷贝到网站根目录并提交,wordpress也可以通过添加插件来自动生成并主动提交。对于PHP,我们同样可以像生成RSS的XML文件一样来生成sitemap的XML文件。

提供一个PHP生成sitemap的类(google_sitemap.class.php)和实例(google_sitemap-example.php)文件,点击下载地址

2010年6月12日星期六

首页内容的截取输出方式

一般在首页或者在评论处需要使用内容的截取输出,我在使用“mb_strimwidth()”发现在最后一个位置会发现截取半个字的现象,显示的是个小框框“口”。之后使用“mb_substr()”就没有这个问题了。在截断输出内容,我们还应该搭配 strip_tags() 来共同实现。strip_tags() 的作用是清除字符串内的 html 标签,放在这里就是清除输出的内容格式(包括清除图片)。既然目的是截取小段文字,自然也不需讲求格式。下面是strip_tags()函数:



string strip_tags ( string $str [, string $allowable_tags ] )




把你要输出的内容





<?=$rs->content ?>




替换为:





<? mb_substr(strip_tags($rs->content), 0, 200, 'utf-8');?>




通过清除格式函数和截取函数的搭配使用,就可以实现输出200个长度的无格式字了,当然你网页的编码如果是gb2312,记得要把utf-8修改为gb2312.

2010年6月11日星期五

php绝对路径与相对路径



这篇文章转自网上很流行的一篇《php绝对路径与相对路径之间关系的的深入研究》,它的亮点是使用chdir(dirname(__FILE__)); 其他的我觉得讲的有点罗嗦,总结一下:一般我们用相对路径中比较多的就是../,简单的可以理解为“向上一层”。比如说,../../b/a.php表示向上两层,也就是找到b文件夹所在目录,然后找到b文件夹中的a.php。绝对路径中使用$_SERVER['DOCUMENT_ROOT']来取得根目录,同时,dirname(__FILE__)函数返回的是当前文件的路径。

-----------------------------

php中好像不能像asp那样用“/”表示根目录,代之以$_SERVER['DOCUMENT_ROOT'],其它则相同:../表示向上一层。./表示当前层。假如现在a/b/c/s.php要调用根目录下的 /bb/s2.txt,则:






$RootDir = $_SERVER['DOCUMENT_ROOT'];
$fireDir = "$RootDir/bb/s2.txt";



或者:“../../../bb/s2.txt”表示向上返回到b再向上到a再向上到根目录然后到bb下。前一阵子老是受php开发中,文件互相引入require()相对位置关系的困扰,为了彻底弄清它们的关系,笔者做了个实验。

以下是实验图:



当前项目(project2)的绝对路径是:D:\www\php_case\Coucom_make。也就是我们当前项目的根目录root.
为了能更加清楚的表述不同级别的目录文件相互的引入问题,偶大胆将引用分成三种类型即:上级对下级的引用(简称上级引用,英文译为:superior to underling。简称(stou)).
下级对上级的引用(简称下级引用,英文反之便是)平级引用或叫同级引用(英文:paratactic)。好了,我们明确了引用类型,下面我们来看不同类型引用它们有着什么样的规则。我们先来说说上级引用:看我们的实验图,在图中项目下分别有aa bb ee 三个同级目录和一个index.php文件,在bb下又有cc目录,cc下又有dd目录和cc.php ccc.php两个文件,同样dd下也包含一个dd.php文件。凡是上层对下层均属上级引用.








例如:index.php对于所有文件的引用:
cc .php对dd.php的引用:
ee.php对dd.php的引用:

大家仔细看一下目录结构,便会发现这三种引用虽然同属于上级引用,但它们又不完全相同,我把它分成两种情况:即在上级引用中存在两种引用情况:1.从属的上级引用(类如cc.php对dd.php,,因为这两个文件同属于cc目录)2.非从属的上级引用(类如index.php对于所有文件的引用和ee.php对dd.php的引用都属于这种情况因为它们与被引用的文件并没有一个共同的父目录,在能相对于站点根目录).对于从属上级引用:以下是在cc.php对dd.php的引用






require('dd/dd.php');

对于非从属上级引用:以下是在ee.php中对cc.php的引用






require('../bb/cc/cc.php');

以上所说的是上级引用,下面我们来了解一下下级引用!同理下层对上层的引用都属于下级引用,同样分成从属与非从属两类,从属下级引用相对路径以它们的父目录为根目录,例如:ttt.php对bbff.php的引用就属于这种情况:require('../bbff.php');非从属的下级引用却是以网站的根目录为准的,例如:ccc.php对ee.php的引用: require('../../ee/ee.php');以上是下级引用的介绍,最后我们来看一下平级引用或者叫同级引用,其实同级引用也是分为这两种情况:从属同级引与非从属同级引用从属同级引用很简单:即在同一个目录下的两个文件的引用例如:在dd.php中引用ttt.php require('ttt.php');非从属同级引用:即不在同一个目录下(没有共同的父目录,只有以网站目站为父目录的情况),但是级别是相同的两个文件的引用,例如: 在aa.php在引用ee.php   require('../ee/ee.php');以上是三种类型不同情况下的引用,另外还有涉及到嵌套引用的问题。比如:ff.php引用dd.php,而dd.php又引用的gf.php,这种情况,本来dd.php 引用gf.php属于下级引用中的非从属引用,写法是这样的:require('../../../ee/gf.php');而ff.php引用dd.php属于上级引用中的从属引用,写法是这样的:require('./cc/dd/dd.php'); 可是你会发现在ff.php中无法找到gf.php文件,那该如何写呢?我告诉你应该在dd.php中这样写:require('../ee/gf.php');只有这样写就正确了,为什么呢?因为在涉及到嵌套引用的时候被引用文件的相对路径要以最终的引用文件为准!


简而言之:其实很简单的,你用你的web根目录做根目录.不管你怎么定,你文件肯定有一个全部都要包含的文件的,比如有的较global.php,有的较common.php假如这个文件放再根目录








wwwroot/global.php

里面第一行你加个chdir(dirname(__FILE__)); //切换到global.php所在目录就是跟目录


其他文件使用








require "../../../global.php";
require "aa/aa.php";
require "bb/bb/cc.php";

这样就行了,因为你的global.php已经把路径切换到wwwroot了,你不用像很多人那么麻烦






define('ROOT_PATH',dirname(__FILE__));
require ROOT_PATH.....

chdir(dirname(__FILE__)); 的确很好使,相对位置引入这个文件其他引入文件只要以他为基准就好了。

2010年6月10日星期四

PHP建站之后的几点总结

1、网站在设计前应该首先考虑一下,网站的各模块,各文件的树层次关系。

2、富文本编辑器。网上用js写的富文本编辑器很多,tinymce算是不错的一个,功能强大,可定制性强,wordpress和人人网用的就是这个。

3、CSS网页布局明显比传统的表格布局好,简单可操作性强。我也是借了好几本关于CSS的书看,头都看大了。建议初学者可以先下载一下别人的模板研究一下。小众软件上介绍的Simple CSS也不错,适合小面积改动CSS。

4、php中出现乱码:首先,各个网页的编码要一致,或者都是”charset=utf-8″或者都是”charset=gb2312.”其次,用记事本或者Dreamweaver新建的文件会在文件头自动添加bom头标记。对已经出现乱码的文件可以使用UltraEdit另存为一下,注意格式中选中no bom。

5、rss确实是很神奇的东西,能让你不登录网站就能得到网页的内容。PHP实现rss的输出,也就是用PHP输出XML格式的文件。记住一定是XML格式的,前面和后面不要添加任何东西。这个地址上的文章介绍得很简单明了:http://www.ownself.org/oswpblog/?p=37

6、网络空间的数据库的名称不是随便的,我申请的空间数据库名称必须是“注册名_名称”。

7、内容的截断输出,可以使用这个函数:” mb_substr(“这里是内容”, 0, 3, ‘utf-8′)”。输出第0个字符开始,3个字数。网页的跳转可以使用js实现,这就是一个转到上一页的代码:”history.go(-1)”

8、下面是个网页跳转时所带参数举例,多个参数用&连接:detail.php?id=3&md=9

9、网站可以使用空间提供的二级域名,也可以申请一下自己的域名,这样的好处是,当你变换空间时,别人还可以找到你的网站。免费的顶级域名很少,TK就是一个,网上也有申请的教程。我开始怎么都申请不下来,之后换了代理才搞定。

10、网站建好了当然需要一个网站数据统计的功能,推荐Google analytics,功能强大。想赚钱的话,也可以在网站上添加 Google adsence代码。