2.7.3 每次读取一行数据:fgets()、fgetss()和fgetcsv()
在这个例子中,使用fgets()函数来读取文件内容:
$order=fgets($fp,999);
这个函数可以从文件中每次读取一行内容。这样,它将不断地读入数据,直至读到一个换行字符(\n)、或者文件结束符EOF,或者是从文件中读取了998B。可以读取的最大长度为指定的长度减去1B。
也可以使用许多不同的函数来读文件。当需要按块方式处理一些纯文本文件时,fgets()函数将会非常有用。
fgets()函数的一个非常有趣的变体是fgetss()函数,其函数原型如下所示:
string fgetss(resource fp,int length,string[allowable_tags]);
fgetss()函数与fgets()非常相似,但是它可以过滤字符串中包含的PHP和HTML标记。如果要过滤任何特殊的标记,可以将它们包含在allowable_tags字符串中。当读取由别人所编写的文件或者包含用户输入的文件时,出于操作安全的考虑,可以使用fgetss()函数。
允许无限制的HTML代码出现在文件中可能会破坏你精心设计好的格式。允许无限制的PHP代码出现在文件可能会让恶意用户以几乎自由的方式控制服务器。
fgetcsv()函数是fgets()的另一个变体。它具有如下所示的函数原型:
array fgetcsv(resource fp,int length[,string delimiter
[,string enclosure]])
当在文件中使用了定界符时,例如我们在前面所介绍的制表符或者在电子制表软件和其他应用程序中使用的逗号,可以使用fgetcsv()函数将文件分成多行。如果希望重新构建订单中的变量,而不是将整个订单作为一行文本,使用fgetcsv()函数可以很容易实现。可以像调用fgets()一样调用它,但是必须向这个函数传递一个用于分隔表单域的定界符。
例如:
$order=fgetcsv($fp,100,"\t");
以上代码将从文件中读取一行,并且在有制表符(\t)的地方将文件内容分行。该函数结果将返回一个数组(在以上代码就是$order)。我们将在第3章详细介绍数组。
参数length应该比要读的文件中最长数据行的字符数大。
enclosure参数用来指定每行中封闭每一个域的字符。如果没有指定任何字符,在默认情况下,这个字符就是"(双引号)。