文章教程

11.1文件操作

9/17/2020 9:40:31 PM 人评论 次浏览

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所示。

image

图11-1 11.1.php页面效果

04 在表单中输入数据,【客户姓名】为“李莉莉”,【到达时间】为“三天后“,【电话】为“159XXXXX266”。单击【确认订房信息】按钮,浏览器会自动跳转到formfilehandler.php页面,并且同时会把数据写入booked.txt。如果之前没有创建booked.txt文件,PHP会自动创建。运行结果如图11-2所示。

image

图11-2 formfilehandler.php

连续写入几次不同的数据,都会被保存到booked.txt中。用写字板打开booked.txt,运行结果如图11-3所示。

image

图11-3 booked.txt

【案例分析】

(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所示。

image

图11-4 11.3.php页面效果

【案例分析】

(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所示。

表11-1 fopen()的参数及其说明

参数 含义 说明
r 读取 打开文件用于读取,且从文件头开始读取
r+ 读取 打开文件用于读取和写入,且从文件头开始读取和写入
w 写入 打开文件用于写入,且从文件头开始写入。如果文件已经存在,则清空原有内容;如果文件不存在,则创建此文件
w+ 写入 打开文件用于写入和读取,且从文件头开始写入。如果文件已经存在,则清空原有内容;如果文件不存在,则创建此文件
x 谨慎写入 打开文件用于写入,且从文件头开始写入。如果文件已经存在,则不会被打开,同时fopen返回false,且PHP生成警告
x+ 谨慎写入 打开文件用于写入和读取,且从文件头开始写入。如果文件已经存在,则不会被打开,同时fopen返回false,且PHP生成警告
a 添加 打开文件仅用于添加写入,且在已存在内容之后写入。如果文件不存在,则创建此文件
a+ 追加 打开文件用于追加写入和读取,且在已存在内容之后写入。如果文件不存在,则创建此文件
b 二进制(binary) 配合以上的不同参数使用。二进制文件模式不管是在Linux或是Windows下都是可以使用的。一般情况下,都选择二进制模式
t 文本(text) 文本模式只能在Windows下使用

教程类别