11.1 文件操作
在不使用数据库系统的情况下,数据可以通过文件来实现数据的存储和读取。这个数据存取的过程也是PHP处理文件的过程。这里涉及的文件是文本文件。
11.1.1 文件数据写入
对于一个文件的“读”或“写”操作,基本步骤如下。
01 打开文件。
02 从文件里读取数据,或者向文件内写入数据。
03 关闭文件。
打开文件的前提是,文件是存在的。如果不存在,则需要建立一个文件,并且在所在的系统环境中,代码应该对文件具有“读”或“写”的权限。
以下实例介绍PHP如何处理文件数据。在这个实例中需要把客人订房填写的信息保存到文件中,以便以后的使用。
【例11.1】(实例文件:ch12\11.1.php和11.1.1.php)
01 在PHP文件同目录下建立一个文本名称booked.txt,然后创建11.1.php,代码如下。
<!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.org/1999/xhtml"> <HEAD><meta http-equiv="Content-Type" content="text/html; charset=gb2312" /><h2>GoodHome在线订房 表(文件存储)。</h2></HEAD> <BODY> <form action="11.2.php" method="post"> <table> <tr bgcolor="#3399FF" > <td>客户姓名:</td> <td><input type="text" name="customername" size="20" /></td> </tr> <tr bgcolor="#CCCCCC" > <td>客户性别:</td> <td> <select name="gender"> <option value="m">男</option> <option value="f">女</option> </select> </td> </tr> <tr bgcolor="#3399FF" > <td>到达时间:</td> <td> <select name="arrivaltime"> <option value="1">一天后</option> <option value="2">两天后</option> <option value="3">三天后</option> <option value="4">四天后</option> <option value="5">五天后</option> </select> </td> </tr> <tr bgcolor="#CCCCCC" > <td>电话:</td> <td><input type="text" name="phone" size="20" /></td> </tr> <tr bgcolor="#3399FF" > <td>email:</td> <td><input type="text" name="email" size="30" /></td> </tr> <tr bgcolor="#666666" > <td align="center"><input type="submit" value="确认订房信息" /></td> </tr> </table> </form> </BODY> </HTML>
02 在11.1.php文件的同目录下创建11.2.php文件,代码如下。
<html> <head> <title> </title> </head> <body> <?php $DOCUMENT_ROOT = $_SERVER['DOCUMENT_ROOT']; $customername = trim($_POST['customername']); $gender = $_POST['gender']; $arrivaltime = $_POST['arrivaltime']; $phone = trim($_POST['phone']); $email = trim($_POST['email']); if( $gender == "m"){ $customer = "先生"; }else{ $customer = "女士"; } $date = date("H:i:s Y m d"); $string_to_be_added = $date."\t".$customername."\t".$customer." 将在 ".$arrivaltime." 天后到达\t 联系电话:".$phone."\t Email: ".$email ."\n"; $fp = fopen("$DOCUMENT_ROOT/booked.txt",'ab'); if(fwrite($fp, $string_to_be_added, strlen($string_to_be_added))){ echo $customername."\t".$customer." ,您的订房信息已经保存。我们会通过Email和电话和您联系。"; }else{ echo "信息存储出现错误。"; } fclose($fp); ?> </body> </html>
03 运行11.1.php文件,最终效果如图11-1所示。
04 在表单中输入数据,【客户姓名】为“李莉莉”,【到达时间】为“三天后“,【电话】为“159XXXXX266”。单击【确认订房信息】按钮,浏览器会自动跳转到formfilehandler.php页面,并且同时会把数据写入booked.txt。如果之前没有创建booked.txt文件,PHP会自动创建。运行结果如图11-2所示。
连续写入几次不同的数据,都会被保存到booked.txt中。用写字板打开booked.txt,运行结果如图11-3所示。
【案例分析】
(1)$DOCUMENT_ROOT = $_SERVER['DOCUMENT_ROOT'];是通过使用超全局数组$_SERVER来确定本系统文件根目录。在Windows桌面开发环境中的目录是c:/wamp/www/。
(2)$customername、$arrivaltime、$phone为form4file.html通过POST方法给formfilehandler.php传递的数据。
(3)$date为用date()函数处理的写入信息时的系统时间。
(4)$string_to_be_added是要写入booked.txt文件的字符串数据。它的格式是通过“\t”和“\n”完成的。“\t”是tab,“\n”是换新行。
(5)$fp = fopen("$DOCUMENT_ROOT/booked.txt",'ab');是fopen()函数打开文件并赋值给变量$fp。fopen()函数的格式是fopen("Path", "Parameter")。其中,"$DOCUMENT_ROOT/ booked.txt"就是路径,而'ab'是参数。'ab'中的a是指在原有文件上继续写入数据,b是规定了写入的数据是二进制(binary)的数据模式。
(6)fwrite($fp, $string_to_be_added, strlen($string_to_be_added));是对已经打开的文件进行写入操作。strlen($string_to_be_added)是通过strlen()函数给出所要写入字符串数据的长度。
(7)在写入操作完成之后,用fclose()函数关闭文件。
11.1.2 文件数据读取
到目前为止,数据写入到了文件。而且文件也可以直接被打开,来查看数据,并对数据进行其他操作。但是,学习PHP的一个重要目的,是要完成通过浏览器对数据的读取和使用。那么如何读取数据并且通过浏览器进行展示呢?
下面的实例就对文件数据读取进行讲解。
【例11.2】(实例文件:ch12\11.3.php)
<html> <head> <title> </title> </head> <body> <?php $DOCUMENT_ROOT = $_SERVER['DOCUMENT_ROOT']; @$fp = fopen("$DOCUMENT_ROOT/booked.txt",'rb'); if(!$fp){ echo "没有订房信息。"; exit; } while (!feof($fp)){ $order = fgets($fp, 2048); echo $order. "<br />"; } fclose($fp); ?> </body> </html>
运行结果如图11-4所示。
【案例分析】
(1)$DOCUMENT_ROOT = $_SERVER['DOCUMENT_ROOT'];确认文件位置。
(2)fopen()通过参数rb打开booked.txt文件进行二进制读取。将读取内容赋值给变量$fp。$fp前的@用来排除错误提示。
(3)if语句表示,如果变量$fp为空,则显示“没有订房信息。”且退出。
(4)while循环中,!feof($fp)表示只要不到文件尾,就继续while循环。循环中fgets()读取变量$fp中的内容并赋值给$order。
(5)fgets()中2048的参数表示允许读取的最长字节数为2048-1=2047字节。
(6)调用fclose()关闭文件。
【讲解知识点】
不管是读文件还是写文件,其实在调用fopen()打开文件的时候就确定了文件模式。也就是说,打开某个特定的文件是用来做什么的。fopen()中的参数表明了用途,详述如表11-1所示。
参数 | 含义 | 说明 |
r | 读取 | 打开文件用于读取,且从文件头开始读取 |
r+ | 读取 | 打开文件用于读取和写入,且从文件头开始读取和写入 |
w | 写入 | 打开文件用于写入,且从文件头开始写入。如果文件已经存在,则清空原有内容;如果文件不存在,则创建此文件 |
w+ | 写入 | 打开文件用于写入和读取,且从文件头开始写入。如果文件已经存在,则清空原有内容;如果文件不存在,则创建此文件 |
x | 谨慎写入 | 打开文件用于写入,且从文件头开始写入。如果文件已经存在,则不会被打开,同时fopen返回false,且PHP生成警告 |
x+ | 谨慎写入 | 打开文件用于写入和读取,且从文件头开始写入。如果文件已经存在,则不会被打开,同时fopen返回false,且PHP生成警告 |
a | 添加 | 打开文件仅用于添加写入,且在已存在内容之后写入。如果文件不存在,则创建此文件 |
a+ | 追加 | 打开文件用于追加写入和读取,且在已存在内容之后写入。如果文件不存在,则创建此文件 |
b | 二进制(binary) | 配合以上的不同参数使用。二进制文件模式不管是在Linux或是Windows下都是可以使用的。一般情况下,都选择二进制模式 |
t | 文本(text) | 文本模式只能在Windows下使用 |