当前位置: 首页 > 编程日记 > 正文

PHP新手上路(六)

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而举出的一个例子而已。理想的情况是你应该建立一个包含关键字的数据库然后进行搜索。

转载于:https://www.cnblogs.com/kylskjb/archive/2008/08/12/1265676.html

相关文章:

如何教计算机认识手写数字(下)

本文详细介绍了如何利用C#语言编写KDTree结构加速KNN算法来处理手写字符的识别问题。本文由安晟提供。

linux下字符串处理工具二:awk( 二),awk脚本

awk脚本 awk脚本是一个可执行的文件&#xff0c;常习惯以.awk命名。 结构&#xff1a; $test.awk #!/bin/awk -f #脚本系统中awk的位置BEGIN{} #脚本主体之前&#xff0c;执行些什么。该行内的语句&#xff0c;可以只执行一次{} #脚本主体,此中的语句&am…

JavaScript正则表达式test的用法

<script LANGUAGE"javascript">function checkStr( s)...{var regu /abc/gi;var re new RegExp(regu);return re.test(s);}checkMobile(vabceeabc);</script>用途&#xff1a;检查输入的字符串是否含有abc,如果有返回true,否则返回false方法test(string…

如何利用C#开发“通讯录”小程序

本文介绍了数理系15级魏道鑫同学汇报的成果&#xff0c;利用C#开发的通讯录小程序。

Ubuntu 16.04 install NVDIA display driver

2019独角兽企业重金招聘Python工程师标准>>> 1. search and download the driver http://www.nvidia.cn/Download/ 2. vim /etc/modprobe.d/blacklist.conf append this lines to the file blacklist vga16fb blacklist nouveau blacklist rivafb blacklist rivatv …

C#Hello World

自己是做java开发的&#xff0c;但是有时候有些问题用java解决起来很不方便&#xff0c;比如调用windows系统的东西&#xff0c;所以要快速自学一下C#&#xff0c;快速解决一个问题。 下面是一个简单的控制台程序。 using System; //using 关键字的作用是导入命名空间 using Sy…

如何利用离散Hopfield神经网络进行高校科研能力评价(1)

如何利用离散Hopfield神经网络进行高校科研能力评价(1)代码部分

OpenDNS 不再向用户展示广告

OpenDNS是流行的免费域名解析服务提供商&#xff0c;它的收入一度主要来自广告&#xff0c;当用户输入的网址无法解析它会将用户重定向到广告页。在OpenDNS诞生前&#xff0c;ISP提供的域名解析是用户唯一的选择。但ISP的DNS服务称不上有多好&#xff0c;不怎么可靠。但如今&am…

winform配置文件的简单使用(转载)

1&#xff0e; 首先创建一个winform解决方案2&#xff0e; 与添加类文件相同的方法添加配置文件&#xff0c;比如&#xff1a;右击解决方案下的项目名称—>添加—>新建项—>选择 “应用程序配置文件”&#xff0c;.net默认文件名为app.config&#xff0c;点击确定 打开…

C#版及nodejs版的com端口监听程序

感受: 写监听程序的感受&#xff1a;原来有些事情并不是想象的那么难&#xff0c;难和简单就只在一个点上&#xff0c;一个点突破了&#xff0c;后面就豁然开朗了。所以有些问题&#xff0c;不能死闷&#xff0c;要先思考&#xff0c;然后查资料&#xff0c;然后问有经验的人…

C++各大有名库的介绍之C++标准库

C各大有名库的介绍之C标准库标准库中提供了C程序的基本设施。虽然C标准库随着C标准折腾了许多年&#xff0c;直到标准的出台才正式定型&#xff0c;但是在标准库的实现上却很令人欣慰得看到多种实现&#xff0c;并且已被实践证明为有工业级别强度的佳作。1、Dinkumware C Libra…

自己动手——实现 Dustjs 中间件

Dustjs是我个人比较喜欢的一个JS模版引擎&#xff0c;原因有两个&#xff0c;一是&#xff0c;同时支持客户端和服务端渲染&#xff0c;模版编译成JS后使用&#xff0c;性能好&#xff1b;二是&#xff0c;有大公司的支持&#xff0c;Linkedin有专门的Dustjs版本&#xff08;本…

如何利用离散Hopfield神经网络进行高校科研能力评价(2)

如何利用离散Hopfield神经网络进行高校科研能力评价&#xff0c;应用部分

yyyy-MM-dd HH:mm:ss和yyyy-MM-dd hh:mm:ss

做项目&#xff0c;需要24小时制式的时间&#xff0c;误用了yyyy-MM-dd hh:mm:ss&#xff0c;导致出现一个很难发现的bug&#xff0c;现记录下,方便以后查阅。 yyyy-MM-dd hh:mm:ss 12小时制 yyyy-MM-dd HH:mm:ss 24小时制

Asp.Net开发架构设计(二)

上回说到&#xff0c;我们配置了一下UnityConfig层&#xff0c;在这个层中定义了一个IContainerAccessor的接口和一个返回IUnityContainer类型的方法&#xff0c;这个方法的主要作用就是把Service层中的接口类和Business层中的接口实现类装配到UnityContainer中并返回&#xff…

Matlab与线性代数 -- 稀疏矩阵的创建

本文详细介绍了在Matlab中创建稀疏矩阵的三种方法。

uva 10491 Cows and Cars

https://vjudge.net/problem/UVA-10491 题意&#xff1a; a头牛&#xff0c;b辆车&#xff0c;每扇门后面都有一头牛或一辆车 开始选手选择一扇门 然后主持人打开c扇有牛的门&#xff08;选中的除外&#xff09; 然后选手换一扇门 问最后选手选的门后面是车的概率 开始选牛的概…

ssh免密码登录的原理

工作第一天&#xff0c;就需要登录各种服务器&#xff0c;免密码登录无疑能大大的提高工作效率。以前只知道配置&#xff0c;今天了解了下原理。 免密码登录原理 图解&#xff0c;server A免登录到server B: 1.在A上生成公钥私钥。 2.将公钥拷贝给server B&#xff0c;要重命…

mysql-cluster 安装配置

mysql-cluster免编译包下载&#xff1a;https://dev.mysql.com/downloads/file/?id469881 新版本支持只把索引和用到的数据加载到内存&#xff0c;而不是老版本的整个数据库都得加到内存中wget https://cdn.mysql.com//Downloads/MySQL-Cluster-7.5/mysql-cluster-gpl-7.5.6-l…

ExtJs学习笔记(5)_Ajax示例

ExtJs对于Ajax的使用非常简单&#xff0c;看下面的代码: 1.Html页&#xff1a; <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns"http://www.w3.o…

Matlab与线性代数 -- 稀疏矩阵的图形显示

本文详细说明了Matlab中稀疏矩阵可视化的过程。

浏览器及时感知服务端数据变化的方式

需求 在公司&#xff0c;有一个需求&#xff0c;是浏览器实时获取服务端数据变化&#xff0c;然后根据变化做相应的动作。需求场景如下&#xff1a;手机端扫描二维码&#xff0c;然后获取待取件订单列表&#xff0c;点击取件&#xff0c;进行取件&#xff0c;同时远端打印机打…

拥抱Node.js 8.0,N-API入门极简例子

本文摘录自《Nodejs学习笔记》&#xff0c;更多章节及更新&#xff0c;请访问 github主页地址。欢迎加群交流&#xff0c;群号 197339705。 N-API简介 Node.js 8.0 在2017年6月份发布&#xff0c;升级的特性中&#xff0c;包含了N-API。编写过或者使用过 node扩展的同学&#x…

什么是标记符控制的分水岭算法

本文首先指出传统分水岭算法的不足&#xff0c;然后介绍了标记符控制的分水岭算法&#xff0c;最后通过实例演示了该算法在图像分割中的应用。该微信图文由安晟提供。

.NE 后退刷新验证码

Response.Buffer true; Response.Expires -1; Response.ExpiresAbsolute DateTime.Now.AddDays(-1); Response.Expires0; Response.CacheControl "no-cache"; 转载于:https://www.cnblogs.com/lmjob/archive/2008/09/01/128096…

intellij打开工程在每个java文件上有个红色的无效符的解决办法

说明该类不是可编译文件。在project Structure中&#xff08;快捷键ctrlaltshifts&#xff09;选Modules将你带红圈的文件添加上&#xff0c;将你带红圈的文件夹设为Sources。一般是src文件夹&#xff0c;点Sources文件夹&#xff0c;然后点击OK。设置为可编译文件再去工程中看…

[zt] petshop4.0 详解之三

三、PetShop数据访问层之消息处理在进行系统设计时&#xff0c;除了对安全、事务等问题给与足够的重视外&#xff0c;性能也是一个不可避免的问题所在&#xff0c;尤其是一个B/S结构的软件系统&#xff0c;必须充分地考虑访问量、数据流量、服务器负荷的问题。解决性能的瓶颈&a…

windows下Bullet 2.82编译安装(Bullet Physics开发环境配置)

平台&#xff1a;Win7&#xff0c;VS2010 1. Bullet库的组织 下图是Bullet_User_Manual中的截图&#xff1a; 从中可见&#xff0c;Bullet的LinearMath&#xff08;线性数学模块&#xff09;&#xff0c;其上是BulletCollision&#xff08;碰撞检测模块&#xff09;&#xff0c…

Matlab与线性代数 -- 寻找矩阵的非零元素

本微信图文详细介绍了Matlab中find函数的用法。

java重新回顾

很不幸&#xff0c;自己的移动硬盘坏掉了&#xff0c;之前自己所做的学习笔记都没了&#xff0c;大概有300多篇&#xff0c;是大学学习java的时候整理复习的&#xff0c;这样的损失是巨大的&#xff0c;这将花费我更多的时间重新去整理&#xff0c;但是事实已经是这样的了。 基…