PHP新手上路(六)


Posted in PHP onOctober 09, 2006

建设一个简单交互的网站(二)

5.5 计数器

让我们在首页上加上一个计数器。这个例子已经被讲过多次了,但是还是有利于演示怎样读写文件以及创建自己的函数。counter.inc包含以下代码:

<?
/*
|| 一个简单的计数器
*/
function get_hitcount($counter_file)
{
/* 将计数器归零
这样如果计数器还未被使用,初始值将是1
你当然也可以把初始值设成20000来骗人咯
*/
$count=0;
// 如果存放计数器文件已经存在,读取其中的内容
if ( file_exists($counter_file) )  
{
$fp=fopen($counter_file,"r");
// 我们只取了前20位,希望你的站点不要太受欢迎啊
$count=0+fgets($fp,20);
// 由于函数fgets()返回字符串,我们可以通过加0的方法将其自动转换为整数
fclose($fp);
// 对文件操作完毕
}
// 增加一次计数值
$count++;
// 将新的计数值写入文件
$fp=fopen($counter_file,"w");
fputs($fp,$count);
fclose($fp);
# 返回计数值
return ($count);
}
?>

然后我们更改front.php3文件以显示这个计数器:
<?
include("include/counter.inc");
// 我把计数值放在文件counter.txt中,读出并输出
printf ("<CENTER><B>%06d</B></CENTER> <BR> n",
get_hitcount("counter.txt"));
include("include/footer.inc");
?>
看看我们的新front.php3

5.6 反馈表单

让我们再添加一个反馈表单以便你的浏览者填写并e-mail给你。举例来说我们用一种很简单的方法实现它,我们只需要两个页面:一个为浏览者提供输入表单;一个获得表单数据并处理、mail给你。

PHP中获取表单数据是很简单的。当一个表单被发送后,表单中所包含的各个元素被赋上了相应的值,而这样就可以像引用一般变量一样使用了。
<FORM name="myform" ACTION="process_form.php3" METHOD="POST">
<INPUT TYPE="TEXT" NAME="mytext" VALUE="Some Value">
</FORM>

在process_form.php3中,变量$mytext就被赋予了输入的值--非常简单!同样的,你可以从列表框、多选框、单选框、按钮等表单元素中取得变量值。你唯一要做的就是为表单中的每一个元素取名以便将来可以引用。

根据这个方法,我们可以生成一个简单的包含三个元素的表单:姓名、e-mail地址和留言。当浏览者发送表单后,处理该表单的PHP页面(sendfdbk.php3)读取数据,检查姓名是否为空,最后将数据mail给你。

表单:form.php3
<?
include("include/common.inc");
$title = "Feedback";
include("include/header.inc");
?>
<P>
<FORM ACTION="sendfdbk.php3" METHOD="POST">
<INPUT TYPE="text" NAME="name" value="Your name" SIZE="20" MAXLENGTH="30">
<INPUT TYPE="text" MAXLENGTH="40" WIDTH="20" value="Your Email" NAME="email">
<BR>
<TEXTAREA ROWS="7" COLS="40" NAME="comment">
Your feedback on my home page.
</TEXTAREA>
<BR>
<INPUT TYPE="submit" VALUE="Send Feedback!">
</FORM>
</P>
<?
include("include/footer.inc");
?>

处理表单:sendfdbk.php3
<?
include("include/common.inc");
$title = "Feedback";
include("include/header.inc");
if ( $name == "" )  
{
// 现在我很讨厌匿名的留言!
echo "Duh ? How come you are anonymous?";
}  
elseif ($name == "Your name")  
{
// 这个浏览者真是不想透露姓名啊!
echo "Hello ? <B>Your name</B> is supposed to be replaced with
your actual name!</B>";
}  
else  
{
// 输出一段礼貌的感谢语
echo "
Hello, $name.
<BR>
Thank you for your feedback. It is greatly appreciated.
<BR>
Thanking you
<BR>
$MyName <BR>
$MyEmailLink
";
// 最后mail出去
mail($MyEmail, "Feedback.","
Name : $name
E-mail : $email
Comment : $comment  
");
}
include("include/footer.inc");
?>

注意:如果在你的测试过程中,该程序末能正常工作,请查看你的PHP配置文件(PHP3为php3.ini,PHP4为php.in)有没有设置好。因为本程序需要您的PHP配置文件作如下的设置:

首先,用NotePad打开你的php3.ini或是php.ini文件,查看一下[mail function]有没有设置好,默认的情况如下所示:
SMTP = localhost  
sendmail_from = me@localhost.com
给SMTP设置SMTP服务器,最好是你当地的SMTP服务器,我这里以21cn的SMTP服务器作为例子,然后,在sendmail_from处填上你的E-MAIL地址,例如可以改成这样:
SMTP = smtp.21cn.com
sendmail_from = pert@21cn.com  
修改后不要忘了重启Apache,IIS或PWS服务哦.  

5.7 简单的站内搜索引擎

PHP可以调用外部程序。在Unix环境下我们可以利用程序grep实现一个简单的搜索引擎。我们可以做的稍微复杂一些:使用一个页面既输出一个表单供用户输入搜索字串又输出查询结果。

<?
include("include/common.inc");
$title = "Search";
include("include/header.inc");
?>
<P>
<FORM ACTION="<? echo "$PHP_SELF"; ?>" METHOD="POST">
<INPUT TYPE="text" NAME="searchstr" value="<? echo "$searchstr"; ?>"
SIZE="20" MAXLENGTH="30">
<INPUT TYPE="submit" VALUE="Search!">
</FORM>
</P>
<?
if ( ! empty($searchstr) )  
{
// empty()用来检查查询字串是否为空
// 如果不为空,调用grep查询
echo "<HR>n";
// 调用grep对所有文件进行大小写非敏感模式的查询
$cmdstr = "grep -i $searchstr *";
$fp = popen( $cmdstr, "r" ); // 执行命令并输出管道
$myresult = array(); // 存储查询结果
while( $buffer = fgetss ($fp, 4096))  
{
// grep返回这样格式: 文件名:匹配字串出现行数
// 因此我们利用函数split()分离处理数据
list($fname, $fline) = split(":",$buffer, 2);
// 我们只输出第一次匹配的结果
if ( !defined($myresult[$fname]))
$myresult[$fname] = $fline;
}
// 现在我们将结果存储在数组中,下面就可以处理并输出了
if ( count($myresult) )
{
echo "<OL>n";
while(list($fname,$fline) = each($myresult))
echo "<LI>
<A HREF="$fname">$fname</A> : $fline </LI>n";
echo "</OL>n";
}  
else  
{
// 如果没有查询结果
echo "Sorry. Search on <B>$searchstr</B>
returned no results.<BR>n";
}
pclose($fp);
}
?>
<?
include("include/footer.inc");
?>

注释:

PHP_SELF是PHP内建的变量。包含当前文件名。  
fgets()按行读取文件,最多4096(指定)字符长度。  
fgetss()与fgets()相似,只是解析输出的HTML标记。  
split()有一个参数是2,因为我们只需要把输出分成两部分。另外需要省略":"。  
each()是一个数组操作函数,用来更方便的遍历整个数组。  
popen()、pclose()与fopen()、fclose()的功能很相似,只是增加了管道处理。  
请注意以上的代码并不是实现一个搜索引擎的好办法。这只是有助于我们更好学习PHP而举出的一个例子而已。理想的情况是你应该建立一个包含关键字的数据库然后进行搜索。   

PHP 相关文章推荐
PHP+AJAX实现无刷新注册(带用户名实时检测)
Jan 02 PHP
php 表单验证实现代码
Mar 10 PHP
批量获取memcache值并按key的顺序返回的实现代码
Jun 14 PHP
php数组函数序列之sort() 对数组的元素值进行升序排序
Nov 02 PHP
php木马webshell扫描器代码
Jan 25 PHP
PHP实现支持SSL连接的SMTP邮件发送类
Mar 05 PHP
微信支付开发维权通知实例
Jul 12 PHP
PHP入门教程之数组用法汇总(创建,删除,遍历,排序等)
Sep 11 PHP
thinkphp5.0整合phpsocketio完整攻略(绕坑)
Oct 12 PHP
laravel-admin 实现给grid的列添加行数序号的方法
Oct 08 PHP
php设计模式之备忘模式分析【星际争霸游戏案例】
Mar 24 PHP
解决thinkphp6(tp6)在状态码500下不报错,或者显示错误“Malformed UTF-8 characters”的问题
Apr 01 PHP
PHP新手上路(七)
Oct 09 #PHP
Apache, PHP在Windows 9x/NT下的安装与配置 (一)
Oct 09 #PHP
简单的页面缓冲技术
Oct 09 #PHP
php 之 没有mysql支持时的替代方案
Oct 09 #PHP
在PWS上安装PHP4.0正式版
Oct 09 #PHP
在IIS上安装PHP4.0正式版
Oct 09 #PHP
html中select语句读取mysql表中内容
Oct 09 #PHP
You might like
中国广播史趣谈 — 几个历史第一次
2021/03/01 无线电
可以在线执行PHP代码包装修正版
2008/03/15 PHP
浅谈web上存漏洞及原理分析、防范方法(安全文件上存方法)
2013/06/29 PHP
显示youtube视频缩略图和Vimeo视频缩略图代码分享
2014/02/13 PHP
php排序算法实例分析
2016/10/17 PHP
分享5个非常有用的Laravel Blade指令
2018/05/30 PHP
封装了一个js图片轮换效果的函数
2011/09/28 Javascript
jQuery选择器源码解读(七):elementMatcher函数
2015/03/31 Javascript
jQuery实现带分组数据的Table表头排序实例分析
2015/11/24 Javascript
js实现微博发布小功能
2017/01/12 Javascript
js数字舍入误差以及解决方法(必看篇)
2017/02/28 Javascript
vue-cli入门之项目结构分析
2017/04/20 Javascript
原生js二级联动效果
2017/06/20 Javascript
jQuery AJAX 方法success()后台传来的4种数据详解
2018/08/08 jQuery
JavaScript多种滤镜算法实现代码实例
2019/12/10 Javascript
node.js使用http模块创建服务器和客户端完整示例
2020/02/10 Javascript
让Vue响应Map或Set的变化操作
2020/11/11 Javascript
[01:14:12]2018DOTA2亚洲邀请赛4.7 总决赛 LGD vs Mineski 第二场
2018/04/09 DOTA
Python自动化测试Eclipse+Pydev 搭建开发环境
2016/08/15 Python
Django rest framework基本介绍与代码示例
2018/01/26 Python
Python简单获取网卡名称及其IP地址的方法【基于psutil模块】
2018/05/24 Python
解决PyCharm同目录下导入模块会报错的问题
2018/10/13 Python
Python人工智能之路 jieba gensim 最好别分家之最简单的相似度实现
2019/08/13 Python
Python数组并集交集补集代码实例
2020/02/18 Python
Python unittest单元测试openpyxl实现过程解析
2020/05/27 Python
python判断变量是否为列表的方法
2020/09/17 Python
pandas抽取行列数据的几种方法
2020/12/13 Python
Europcar德国:全球汽车租赁领域的领导者
2018/08/15 全球购物
意大利香水和化妆品购物网站:Parfimo.it
2019/10/06 全球购物
大学生旅游业创业计划书
2014/01/29 职场文书
个人委托书范本
2014/09/13 职场文书
2014年招商引资工作总结
2014/11/22 职场文书
2015年读书月活动总结
2015/03/26 职场文书
公路施工安全责任书
2015/05/08 职场文书
于丹讲座视频观后感
2015/06/15 职场文书
Python爬虫入门案例之爬取二手房源数据
2021/10/16 Python