1.用户自定义函数
function 函数名字([$parameter,[,…]])
{
//函数代码
}
注意:函数名不能与系统函数或用户已经定义的函数重名。
$parameter为函数参数,函数一般可以有0个或多个参数,
2.参数的传递
参数是通过值来传递的,例如前面定义func()函数是通过变量$a和$b的值传递的。通过值传递参数不会因为函数内部参数值的变化而改变函数外部的值。
<?php
function color(&$col) //定义函数color()
{
$col="yellow";
}
$blue="blue";
color($blue); //调用函数color(),参数使用变量$blue
echo $blue; //输出"yellow"
?>
3.函数变量的作用域
在主程序定义的变量和在函数中定义的变量都是局部变量。在函数中定义的变量只能在函数内部使用。在主程序中定义的变量
只能在主程序中使用,而不能在函数中使用。
<?php
function sum()
{
$count=2;
}
sum();
echo $count;
?>
由于函数中的变量无法作用于函数外部,所以上面运行时出错,提示$count变量未定义。
4.函数的返回值
函数声明时,在函数代码中使用return 语句可以立即结束函数的运行,程序返回到时调用该函数的下一条语句。
<?php
function my_function($a=1)
{
echo $a;
return; //结束函数的运行,下面的语句将不被运行
$a++;
echo $a;
}
my_function(); //输出1
?>
中断函数并不是return语句常用的功能,许多函数使用return语句返回一个值来与调用它们的代码进行交互。<FONT color=#c0504d>函数的返回值可以是任何类型,包括列表对象</FONT>
5.函数的调用
在函数声明后可以被调用了,另外函数如果没有返回值,调用进使用函数名即可。如果函数具有返回值,则可以将函数的返回值赋给一个变量。
//对一个数组进行升序排序的函数my_sort()
function my_sort($array)
{
for($i=0;$i<count($array);$i++)
{
for($j=$i+1;$j<count($array);$j++)
{
if($array[$i]>$array[$j])
{
$tmp=$array[$j];
$array[$j]=$array[$i];
$array[$i]=$tmp;
}
}
}
return $array;
}
$arr=array(6,4,7,5,9,2); //未排序的数组
$sort_arr=my_sort($arr); //将排序后的数组赋给$sort_arr
foreach($sort_arr as $num)
echo $num; //输出245679
?>
6.递归函数
php支持递归函数,递归函数就是自己调用自已,可以实现循环的作用。
求10!
例如:
<?php
function factorial($n)
{
if($n==0)
return 1; //如果$n为0则返回1
else
return $n*factorial($n1); //递归调用,直到$n等于0为止 }
echo factorial(10); //输出3628800
?>
使用递归一事实上要给出递归终止条件,否则函数将一直执行下去直到内存耗尽,或达到最大调用次数。
使用递归一事实上要给出递归终止条件,否则函数将一直执行下去直到内存耗尽,或达到最大调用次数。
7.变量函数
php有函数变量这个概念,在变量的后面加上一对小括号就构成一个变量函数。
$count();
8.系统函数
9.实例-设计一个计算器程序
<html>
<head>
<title>计算器程序</title>
</head>
<body>
<form method=post>
<table>
<tr><td><input type="text" size="4" name="number1">
<select name="caculate">
<option value="+">+
<option value="-">-
<option value="*">*
<option value="/">/
</select>
<input type="text" size="4" name="number2">
<input type="submit" name="ok" value="计算">
</td>
</tr>
</table>
</form>
</body>
</html>
<?php
function cac($a, $b, $caculate) //定义cac函数,用于计算两个数的结果
{
if($caculate=="+") //如果为加法则相加
return $a+$b;
if($caculate=="-") //如果为减法则相减
return $a-$b;
if($caculate=="*") //如果为乘法则返回乘积
return $a*$b;
if($caculate=="/")
{
if($b=="0") //判断除数是否为0
echo "除数不能等于0";
else
return $a/$b; //除数不为0则相除
}
}
if(isset($_POST['ok']))
{
$number1=$_POST['number1']; //得到数1
$number2=$_POST['number2']; //得到数2
$caculate=$_POST['caculate']; //得到运算的动作
//调用is_numeric()函数判断接收到的字符串是否为数字
if(is_numeric($number1)&&is_numeric($number2))
{
//调用cac函数计算结果
$answer=cac($number1,$number2,$caculate);
echo "<script>alert('".$number1.$caculate.$number2."=".$answer."')</script>";
}
else
echo "<script>alert('输入的不是数字!')</script>";
}
?>
phpd 处理数据,特别是对数据库中时间类型数据进行格式化时,需先将时间类型的数据转化为UNIX时间戳进行处理。不同的数据库系统对时间类型的数据
不能兼容 转换,这时就需要将时间转化为UNIX时间戳。这样京实现了不同数据库系统的跨平台性。
2.时间转化为时间戳
如果要将用字符串表达的日期和时间转化为时间戳的形式,可以使用strtotime()函数。
语法格式如下:
int strtotime(string $time [, int $now ])
例如:
<?php
echo strtotime('2009-03-05'); //输出1236211200
echo strtotime('2009-03-05 10:24:30'); //输出1236248670
echo strtotime("10 September 2000"); //输出968544000
?>
另一个取得日期的UNIX时间戳的函数是mktime()函数,
语法格式如下:
int mktime([int $hour [, int $minute [, int $second [, int $month [, int $day [, int $year]]]]]])
3.获取日期和时间
1.data()函数
是将时间戳照给定的格式转化为具体的日期和时间字符串。
语法格式如下:
string date(string $format [, int $timestamp ])
说明:
$format指定了转化后的日期和时间的格式,
$timestamp是需要转化的时间戳,如果省略则使用本地当前时间,即默认值为time()函数的值。
time()函数返回当前时间的时间戳
date函数的$format参数的取值如下表。
表4.6 date()函数支持的格式代码
字 符
说 明
返回值例子
d
月份中的第几天,有前导零的2位数字
01~31
D
星期中的第几天,用3个字母表示
Mon到Sun
j
月份中的第几天,没有前导零
1~31
l
星期几,完整的文本格式
Sunday~Saturday
N
ISO-8601格式数字表示的星期中的第几天
1(星期一)~7(星期天)
S
每月天数后面的英文后缀,用2个字符表示
st、nd、rd或th,可以和j一起用
w
星期中的第几天,数字表示
0(星期天)~6(星期六)
z
年份中的第几天
0~366
W
ISO-8601格式年份中的第几周,每周从星期一开始
例如:42(当年的第42周)
F
月份,完整的文本格式,如January或March
January~December
m
数字表示的月份,有前导零
01~12
M
三个字母缩写表示的月份
Jan~Dec
n
数字表示的月份,没有前导零
1~12
t
给定月份所应有的天数
28~31
L
是否为闰年
如果是闰年为1,否则为0
o
ISO-8601格式年份数字。这和Y的值相同,只是如果ISO的星期数(W)属于前一年或下一年,则用那一年
例如:1999或2003
Y
4位数字完整表示的年份
例如:1999或2003
y
2位数字表示的年份
例如:99或03
a
小写的上午和下午值
am或pm
A
大写的上午和下午值
AM或PM
B
Swatch Internet标准时
000~999
g
小时,12小时格式,没有前导零
1~12
G
小时,24小时格式,没有前导零
0~23
h
小时,12小时格式,有前导零
01~12
H
小时,24小时格式,有前导零
00~23
i
有前导零的分钟数
00~59
s
秒数,有前导零
00~59
e
时区标志
例如:UTC,GMT,Atlantic/Azores
I
是否为夏令时
如果是夏令时为 1,否则为0
O
与格林尼治时间相差的小时数
例如:+0200
P
与格林尼治时间(GMT)的差别,小时和分钟之间用冒号分隔
例如:+02:00
T
本机所在的时区
例如:EST,MDT
Z
时区偏移量的秒数。UTC 西边的时区偏移量总是负的,UTC 东边的时区偏移量总是正的
-43200~43200
c
ISO 8601格式的日期
2004-02-12T15:19:21+00:00
r
RFC 822 格式的日期
Thu, 21 Dec 2000 16:01:07 +0200
U
从UNIX纪元开始至今的秒数
time()函数
2.getdate()函数可以获得日期和时间信息数组,
语法格式如下:
array getdate([ int $timestamp ])
说明:$timestamp是要转化的时间戳,如果不给出则使用当前时间。
函数根据$timestamp返回一个包含日期和时间信息的数组,数组的键名和值如表4.7所示
键 名
说 明
值 的 例 子
seconds
秒的数字表示
0~59
minutes
分钟的数字表示
0~59
hours
小时的数字表示
0~23
mday
月份中第几天的数字表示
1~31
wday
星期中第几天的数字表示
0(表示星期天)~6(表示星期六)
mon
月份的数字表示
1~12
year
4位数字表示的完整年份
例如:1999或2003
yday
一年中第几天的数字表示
0~365
weekday
星期几的完整文本表示
Sunday~Saturday
month
月份的完整文本表示
January~December
0
自UNIX 纪元开始至今的秒数
系统相关,典型值从-2147483648~2147483647
4.6.4 其他日期和时间函数1.日期和时间的计算
<?php
$oldtime=mktime(0,0,0,9,24,2008);
$newtime=mktime(0,0,0,10,12,2008);
$days=($newtime-$oldtime)/(24*3600); //计算两个时间相差的天数
echo $days; //输出18
?>
2.检查日期
checkdate()函数可以用于检查一个日期数据是否有效,语法格式如下:
bool checkdate( int $month , int $day , int $year)
<?php
var_dump(checkdate(12,31,2000)); //输出bool(TRUE)
var_dump(checkdate(2,29,2001)); //输出bool(FALSE)
?>
3.设置时区
系统默认的是格林尼治标准时间,所以显示当前时间时可能与本地时间会有差别。PHP提供了可以修改时区的函数date_default_timezone_set(),
语法格式如下:
bool date_default_timezone_set (string $timezone_identifier)
参数$timezone_identifier为要指定的时区,
中国大陆可用的值是Asia/Chongqing,Asia/Shanghai,Asia/Urumqi(依次为重庆,上海,乌鲁木齐)。北京时间可以使用PRC。
4.5实例-生成日历
<?php
$year=@$_GET['year']; //获得地址栏的年份
$month=@$_GET['month']; //获得地址栏的月份
if(empty($year))
$year=date("Y"); //初始化为本年度的年份
if(empty($month))
$month=date("n"); //初始化为本月的月份
$day=date("j"); //获取当天的天数
$wd_ar=array("日","一","二","三","四","五","六"); //星期数组
$wd=date("w",mktime(0,0,0,$month,1,$year)); //计算当月第一天是星期几
//年链接
$y_lnk1=$year<=1970?$year=1970:$year-1; //上一年
$y_lnk2=$year>=2037?$year=2037:$year+1; //下一年
//月链接
$m_lnk1=$month<=1?$month=1:$month-1; //上个月
$m_lnk2=$month>=12?$month=12:$month+1; //下个月
echo "<table cellpadding=6 cellspacing=0 width=200 bgcolor=#eeeeee><tr align=center bgcolor=#cccccc>";
//输出年份,单击“<”链接跳到上一年,单击“>”链接跳到下一年
echo "<td colspan=4><a href='/blog_article/EX4_15/year/$y_lnk1/amp;month/$month.html'>
<</a>".$year."年<a href='/blog_article/EX4_15/year/$y_lnk2/amp;month/$month.html'>></a></td>";
//输出月份,单击“<”链接跳到上个月,单击“>”链接跳到下个月
echo "<td colspan=3><a href='/blog_article/EX4_15/year/$year/amp;month/$m_lnk1.html'>
<</a>".$month."月<a href='/blog_article/EX4_15/year/$year/amp;month/$m_lnk2.html'>></a></td> </tr>";
echo "<tr align=center>";
for($i=0;$i<7;$i++)
{
echo "<td>$wd_ar[$i]</td> "; //输出星期数组
}
echo "</tr>";
$tnum=$wd+date("t",mktime(0,0,0,$month,1,$year)); //计算星期几加上当月的天数
for($i=0;$i<$tnum;$i++)
{
$date=$i+1-$wd; //计算日数在表格中的位置
if($i%7==0) echo "<tr align=center>"; //一行的开始
echo "<td>";
if($i>=$wd)
{
if($date==$day&&$month==date("n")) //如果是当月的当天则将天数加黑
echo "<b>".$day."</b>";
else
echo $date; //输出日数
}
echo "</td> ";
if($i%7==6) echo "</tr> "; //一行结束
}
echo "</table>";
?>
最顶层止录是磁盘根目录,用'/'或'//'
当前目录 ./
../表示apache的目录即htdocs目录
1.创建与删除目录 mkdir
<?php
if(mkdir("./path",0700)) //在当前目录中创建path目录
echo "创建成功";
?>
2.获取和更改当前目录
使用getcwd()函数可以取得当前的工作目录,该函数没有参数。成功则返回当前的工作目录,失败则返回FALSE
3.打开和关闭目录句柄
opendir($dir)
closed($dir_handle)
4.读取目录内容
readdir(),该参数是一个已经打开的目录句柄,与while循环可以实现对目录的遍历
5.获取指定路径中的目录与文件 。
array scandir(string $directory [, int $sorting_order [, resource $context ]])
说明:$directory为指定路径。参数$sorting_order默认是按字母升序排列,如果设为1表示按字母的降序排列。
$context是可选参数,是一个资源变量,可以用stream_context_create()函数生成,这个变量保存着与具体的操作对象有关的一些数据。
函数运行成功则返回一个包含指定路径下的所有目录和文件名的数组,失败则返回FALSE
2.操作文件的一般方法
3.文件的打开与关闭
1.打开文件
resource fopen(string $filename , string $mode [, bool $use_include_path [, resource $context ]])
●$filename参数。fopen()函数将$filename参数指定的名字资源绑定到一个流上
●$mode参数。$mode参数指定了fopen()函数访问文件的模式,取值见表4.5。
$mode
说 明
'r'
只读方式打开文件,从文件头开始读
'r+'
读写方式打开文件,从文件头开始读写
'w'
写入方式打开文件,将文件指针指向文件头。如果文件已经存在则删除已有内容,如果文件不存在则尝试创建它
'w+'
读写方式打开文件,将文件指针指向文件头。如果文件已经存在则删除已有内容,如果文件不存在则尝试创建它
'a'
写入方式打开文件,将文件指针指向文件末尾,如果文件已有内容将从文件末尾开始写。如果文件不存在则尝试创建它
'a+'
读写方式打开文件,将文件指针指向文件末尾。如果文件已有内容将从文件末尾开始读写。如果文件不存在则尝试创建它
'x'
创建并以写入方式打开文件,将文件指针指向文件头。如果文件已存在,则fopen()调用失败并返回FALSE,并生成一条E_WARNING级别的错误信息。如果文件不存在则尝试创建它。此选项被PH及以后的版本所支持,仅能用于本地文件
'x+'
创建并以读写方式打开文件,将文件指针指向文件头。如果文件已存在,则fopen()调用失败并返回FALSE,并生成一条E_WARNING级别的错误信息。如果文件不存在则尝试创建它。此选项被PH及以后的版本所支持,仅能用于本地文件
'b'
二进制模式,用于连接在其他模式后面。如果文件系统能够区分二进制文件和文本文件(Windows区分,而UNIX不区分),则需要使用到这个选项,推荐一直使用这个选项以便获得最大程度的可移植性
●$use_include_path参数。如果需要在include_path(PHP的include路径,在PHP的配置文件设置)中搜寻文件,
可以将可选参数 $use_include_path的值设为1或TRUE,默认为FALSE。
●$context参数。可选的$context参数只有文件被远程打开时(如通过HTTP打开)才使用,它是一个资源变量,
其中保存着与fopen()函数具体的操作对象有关的一些数据。如果fopen()打开的是一个HTTP地址,
那么这个变量记录着HTTP请求的请求类型、HTTP版本及其他头信息;如果打开的是FTP地址,
记录的可能是FTP的被动/主动模式
2.关闭文件
bool fclose(resource $handle)
4.文件的写入
文件写入前需打开文件,不存在先创建它,一般用fopen()函数创建
●fwrite().文件打开后,向文件写入内容
int fwrite(resource $handle , string $string [, int $length ])
说明:参数$handle是写入的文件句柄,
$string是将要写入文件中的字符串数据,
$length是可选参数,如果指定了$length,则当写入了$string中的前$length个字节的数据后停止写入。
●file_put_contents()函数。PHP 5还引入了file_put_contents()函数。这个函数的功能与依次调用fopen()、fwrite()及fclose()函数的功能一样。语法格式如下:
int file_put_contents(string $filename , string $data [, int $flags [, resource $context ]])
说明:$filename是要写入数据的文件名。
$data是要写入的字符串,$data也可以是数组,但不能为多维数组。
在使用FTP或HTTP向远程文件写入数据时,可以使用可选参数$flags和$context,这里不具体介绍。
写入成功后函数返回写入的字节数,否则返回FALSE。
●fputcsv()函数。CSV是一种比较常用的文件格式,一般以.csv作为扩展名。CSV格式把文件的一行看做是一条记录,记录里的字段使用逗号分隔。
在PHP中使用 fputcsv()函数可以把指定的数组格式化为符合CSV文件格式的内容,并写入文件指针指向的当前行。语法格式如下:
int fputcsv(resource $handle [, array $fields [, string $delimiter [, string $enclosure ]]])
说明:参数$handle是要写入的文件句柄。
参数$fields是要格式化的数组。
可选的$delimiter参数用于设定字段分界符(只允许一个字符),默认为逗号。
可选的$enclosure参数设定字段环绕符(只允许一个字符),默认为双引号
5 文件的读取
1.读取任意长度
fread()函数可以用于读取文件的内容,语法格式如下:
string fread(int $handle, int $length)
说明:参数$handle是已经打开的文件指针,
$length是指定读取的最大字节数,$length的最大取值为8192。
如果读完$length个字节数之前遇到文件结尾标志(EOF),则返回所读取的字符,并停止读取操作。
如果读取成功则返回所读取的字符串,如果出错返回FALSE。
注意:在读取文件后显示文件内容时,文本中可能含有无法直接显示的字符,如HTML标记。
这时需要使用htmlspecialchars()函数将HTML标记转化为实体才能显示文件中的字符。
2.读取整个文件
●file()函数。file()函数用于将整个文件读取到一个数组中,语法格式如下:
array file(string $filename [, int $use_include_path [, resource $context ]])
说明:本函数的作用是将文件作为一个数组返回,数组中的每个单元都是文件中相应的一行,包括换行符在内,
如果失败则返回FALSE。参数$filename是读取的文件名,参数$use_inclue_path和$context的意义与之前介绍的相同
●readfile()函数。readfile()函数用于输出一个文件的内容到浏览器中,语法格式如下:
int readfile(string $filename [, bool $use_include_path [, resource $context ]])
●fpassthru()函数。fpassthru()函数可以将给定的文件指针从当前的位置读取到EOF,并把结果写到输出缓冲区。
要使用这个函数,必须先使用fopen()函数打开文件,然后将文件指针作为参数传递给fpassthru()函数,
fpassthru()函数把文件指针所指向的文件内容发送到标准输出。如果操作成功返回读取到的字节数,否则返回FALSE。
●file_get_contents()函数。file_get_contents()函数可以将整个或部分文件内容读取到一个字符串中,
功能与依次调用fopen()、fread()及fclose()函数的功能一样。语法格式如下:
string file_get_contents(string $filename [, int $offset [, int $maxlen ]])
说明:$filename是要读取的文件名,可选参数$offset可以指定从文件头开始的偏移量,
函数可以返回从$offset所指定的位置开始长度为$maxlen的内容。如果失败,函数将返回FALSE
3. 读取一行数据
●fgets()函数。fgets()函数可以从文件中读出一行文本,语法格式如下:
string fgets(int $handle [, int $length ])
说明:$handle是已经打开的文件句柄,可选参数$length指定了返回的最大字节数,考虑到行结束符,
最多可以返回length-1个字节的字符串。如果没有指定$length,默认为1024个字节
●fgetss()函数与fgets()基本相同,不过fgetss()函数会尝试从读取的文本中去掉任何html和php标记。
●fgetcsv()函数。fgetcsv()函数可以读取指定文件的当前行,使用CSV格式解析出字段,并返回一个包含这些字段的数组。
语法格式如下:
array fgetcsv(int $handle [, int $length [, string $delimiter [, string $enclosure ]]])
4. 读取一个字符
fgetc()函数。fgetc()函数可以从文件指针处读取一个字符,语法格式为:
string fgetc(resource $handle)
该函数返回$handle指针指向的文件中的一个字符,遇到EOF则返回FALSE
5. 使用指定格式读取文件
fscanf()函数。fscanf()函数可以读取文件中的数据,并根据指定的格式进行格式化,并返回一个数组。语法格式如下:
mixed fscanf(resource $handle , string $format [, mixed &$... ])
格式字符串中的任何空白会与输入流中的任何空白匹配。
这意味着甚至格式字符串中的制表符“\t”也会与输入流中的一个空格字符匹配。
6.文件的上传与下载
1.文件上传
文件上传可以通过提交html表单来实现。文件上传结束后,默认存储在临时目录中,这时必须从临时目录中删除或移动到其他地方
使用PHP的move_uploaded_file()将其移到其它位置上
move_uploaded_file()函数语法格式如下:
bool move_uploaded_file(string $filename , string $destination)
注意:在将文件移动之前需要检查文件是否是通过HTTP POST上传的,这可以用来确保恶意的用户无法欺骗脚本去访问本不能访问的文件,
这时需要使用is_uploaded_file()函数。该函数的参数为文件的临时文件名,若文件是通过HTTP POST上传的,则函数返回TRUE。
例4.5 将由HTML表单上传的GIF图片文件移动到html目录中
<form enctype="multipart/form-data" action="" method="post">
<input type="file" name="myFile">
<input type="submit" name="up" value="上传文件">
</form>
<!-- HTML表单 -->
<?php
if(isset($_POST['up']))
{
if($_FILES['myFile']['type']=="image/gif") //判断文件格式是否为GIF
{
if($_FILES['myFile']['error']>0) //判断上传是否出错
echo "错误:".$_FILES['myFile']['error']; //输出错误信息
else
{
$tmp_filename=$_FILES['myFile']['tmp_name']; //临时文件名
$filename=$_FILES['myFile']['name']; //上传的文件名
$dir="html/";
if(is_uploaded_file($tmp_filename)) //判断是否通过HTTP POST上传
{
if(move_uploaded_file($tmp_filename,$dir.$filename)) //上传并移动文件
{
echo "文件上传成功!";
//输出文件大小
echo "文件大小为:". ($_FILES['myFile']['size']/1024)."kb";
}
else
echo "上传文件失败!";
}
}
}
else
{
echo "文件格式非GIF图片!";
}
}
?>
2.文件下载
header()函数的作用是向浏览器发送正确的HTTP报头,报头指定了网页内容的类型、页面的属性等信息。
header()函数的功能很多,这里只列出以下几点:
●页面跳转。如果header()函数的参数为“Location: xxx”,页面就会自动跳转到“xxx”指向的URL地址。例如:
header("Location: http://www.baidu.com"); //跳转到百度页面
header("Location: first.php"); //跳转到工作目录的first.php页面
●指定网页内容。例如,同样的一个XML格式的文件,如果header()函数的参数指定为“Content-type: application/xml”,
浏览器会将其按照XML文件格式来解析。但如果是“Content-type: text/xml”,浏览器就会将其看做文本解析。
header()函数结合readfile()函数可以下载将要浏览的文件
7.其他常用文件函数
1.计算文件大小
filesize()函数用于计算文件的大小,以字节为单位
filesize()函数结合fread()函数可以实现一次读取整个文件
2.判断文件是否存在
file_exits()
is_dir()函数用于判断给定文件名是否是目录
is_file()函数用于判断给定文件名是否是文件。
is_readable()函数用于判断给定文件是否可读。
is_writeable()用于判断给定的文件是否可写
3.删除文件
unlink()
4.复制文件
bool copy(string $source,string $dest),如果目示文件已存在,则将被覆盖
5.移动、重命名文件
除了move_uploaded_file()函数,还有一个rename()函数也可以移动文件。
语法格式如下:
bool rename ( string $oldname , string $newname [, resource $context ] )
说明:rename()函数主要用于对一个文件进行重命名,$oldname是文件的旧名,$newname为新的文件名。
当然,如果$oldname与$newname的路径不相同,就实现了移动该文件的功能
6.文件指针操作
PHP中有很多操作文件指针的函数,如rewind()、ftell()、fseek()函数等。之前用过的feof()函数用于测试文件指针是否处于文件尾部,
也属于文件指针操作函数。
rewind()函数。用于重置文件的指针位置,使指针返回到文件头。它的参数只有一个,就是已经打开的指定文件的文件句柄。
ftell()函数。可以以字节为单位,报告文件中指针的位置,也就是文件流中的偏移量。它的参数也是已经打开的文件句柄。
fseek()函数。可以用于移动文件指针,语法格式如下:
int fseek ( resource $handle , int $offset [, int $whence ] )
例4.8 投票统计
<form enctype="multipart/form-data" action="" method="post">
<table border="0">
<tr><td bgcolor="#CCCCCC">
<font size=4 color=blue>当前最流行的Web开发语言:</font>
</td></tr>
<tr><td><input type="radio" name="vote" value="PHP">PHP</td></tr>
<tr><td><input type="radio" name="vote" value="ASP">ASP</td></tr>
<tr><td><input type="radio" name="vote" value="JSP">JSP</td></tr>
<tr><td><input type="submit" name="sub" value="请投票"> </td></tr>
</table>
</form>
<?php
$votefile="EX4_6_vote.txt"; //用于计数的文本文件$votefile
if(!file_exists($votefile)) //判断文件是否存在
{
$handle=fopen($votefile,"w+"); //不存在则创建该文件
fwrite($handle,"0|0|0"); //将文件内容初始化
fclose($handle);
}
if(isset($_POST['sub']))
{
if(isset($_POST['vote'])) //判断用户是否投票
{
$vote=$_POST['vote']; //接收投票值
$handle=fopen($votefile,"r+");
$votestr=fread($handle,filesize($votefile)); //读取文件内容到字符串$votestr
fclose($handle);
$votearray=explode("|", $votestr); //将$votestr根据“|”分割
echo "<h3>投票完毕!</h3>";
if($vote=='PHP')
$votearray[0]++; //如果选择PHP,则数组第1个值加1
echo "目前PHP的票数为:<font size=5 color=red>".$votearray[0]."</font><br>";
if($vote=='ASP')
$votearray[1]++; //如果选择ASP,则数组第2个值加1
echo "目前ASP的票数为:<font size=5 color=red>".$votearray[1]."</font><br>";
if($vote=='JSP')
$votearray[2]++; //如果选择JSP,则数组第3个值加1
echo "目前JSP的票数为:<font size=5 color=red>".$votearray[2]."</font><br>";
//计算总票数
$sum=$votearray[0]+$votearray[1]+$votearray[2];
echo "总票数为:<font size=5 color=red>".$sum."</font><br>";
$votestr2=implode("|",$votearray); //将投票后的新数组用“|”连接成字符串$votestr2
$handle=fopen($votefile,"w+");
fwrite($handle,$votestr2); //将新字符串写入文件$votefile
fclose($handle);
}
else
{
echo "<script>alert('未选择投票选项!')</script>";
}
}
?>