数据的存储与检索
文件处理
写入文件
- 打开这个文件。如果不存在,就创建它。
- 将数据写入这个文件
- 关闭这个文件
读出数据
- 打开这个文件,如果不能打开,意识到这一点并正确退出
- 从文件中读出数据
- 关闭这个文件
打开文件
$fp = fopen("$DOCUMENT_ROOT/../orders/orders.txt" , 'w');
- 若没指定路径,这个文件将在脚本自身坐在的相同目录中查找或者创建。
- UNIX 使用 / (正斜线)
- WINDOWS 可以使用正斜线 / 和反斜线 \ 但是反斜线需要转义字符 \ \
- 返回指向这个文件的指针
- 第三个参数可选 ,如果希望在inclue_path中搜索,则设置为true;
- 第四个参数可选,是否允许文件名以协议名称开始,远程打开文件。
预定义的服务器变量
$_SERVER['DOCUMENT_ROOT']
$DOCUMENT_ROOT
$HTTP_SERVER_VARS['DOCUMENT_ROOT']
- 表单首选第一个
模式
通过FTP或者HTTP打开文件
- 在php.ini 文件总,关闭allow_url_fopen 来禁用这个功能。
可能遇到问题
@ $fp = fopen("$DOCUMENT_ROOT/../orders/orders.txt" , 'w');
// 或者
$fp = @fopen("$DOCUMENT_ROOT/../orders/orders.txt" , 'w');
if (!$fp){
echo "<p><strong>Your order could not be processed at this time.
Please try again later.<strong></p></body></html>"
exit;
}
写文件
fwrite($fp,$outputstring);
- fputs 是 fwrite 的别名函数
file_put_contents
int file_put_contents( string filename,
string data,
[, int flag
[, resource context]])
- 此函数可以再不调用fopen( ) 函数打开文件之前,将data中的字符串写入filename指定的文件中
- 匹配函数为 file_get_contents()
fwrite()
int fwrite( resource handle, string string [, int length])
- length 是写入最大字符数。
fwrite($fp, $outputstring, strlen($outputstring));
关闭文件
fclose($fp);
// program
$fp = @fopen("$_SERVER['DOCUMENT_ROOT']", 'w');
flock($fp, LOCK_EX);
if (!$fp){
echo "..."
exit;
}
fwrite($fp, $outputstring, strlen($outputstring));
flock($fp, LOCK_UN);
fclose($fp);
读文件
@$fp = fopen("$_SERVERNT['DOCUMENT_ROOT']", 'rb');
if(!fp){
echo '...';
exit;
}
while(!feof($fp)){
$order= fgets($fp, 999);
echo $order."<br />";
}
feof()
唯一参数为文件指针,若指针指向文件末尾,返回true, File End Of File
fgets()、 fgetss()、fgetcsv()
fgets($fp, 999);
- 读数据直到读到 \n 或者 EOF 或者 998B。
- 最大长度为指定长度-1B。
string fgetss(resource fp, int length, string [allowable_tags]);
- 可过滤PHP和HTML的标记,如果需要过滤特殊标记,添加在allowable_tags中
array fgetcsv( resource fp, int length [, string delimiter
[, string enclosure]]);
$order= fgercsv($fp, 100, "\t");
- 从文件中读取一行 \n 在特定制表符 \t 的地方将文件分行 ,返回一个数组
- enclosure 指定每行中封闭每一个域的字符,若没指定,默认为 " (双引号)
读取整个文件
readfile("$DOCUMENT_ROOT/../orders/orders.txt");
int readfile(string filename, [,int use_include_path [, resource context]])
- readfile() 将会打开这个文件,并将文件输出到标准输出中,然后关闭这个文件。返回值为从文件读出的字节综述
$fp = fopen("$DOCUMENT_ROOT/../orders/orders.txt" , 'rb');
fpassthru($fp);
- 如果读取成功返回true;
$filearry = file("$DOCUMENT_ROOT/../orders/orders.txt");
- 每行作为一个元素保存在数组中;
读取字符
while(!feof($fp)){
$char = fgetc($fp);
if (!feof($fp))
echo ($char=="\n" ? "<br \>" :$char);
}
- 唯一参数指针 ,返回下一个字符
读取任意长度
string fread(resource fp, int length);
- 读取或者读满length指定的字节数或者读到文件末尾;
其他文件函数
查看文件是否存在
if (file_exits("$DOCUMENT_ROOT/../orders/orders.txt")){
echo '...';
}else{
echo '...';
}
确定文件大小
$fp = fopen ("$DOCUMENT_ROOT/../orders/orders.txt", 'rb');
echo n12br(fread($fp, filesize("$DOCUMENT_ROOT/../orders/orders.txt")));
fclose($fp);
- 以字节为单位返回文件大小
- n21br() 将 \n 转化为 <br >
删除文件
unlink("$DOCUMENT_ROOT/../orders/orders.txt");
- 若删除失败返回false;
文件定位
echo 'Final position of the file pointer is'.(ftell($fp));
echo '<br \>';
rewind($fp);
echo 'After rewind, the position is'.(ftell($fp));
echo '<br \>';
- ftell() 以字节为单位返回当前指针在文件中的位置
- rewind() 可以将文件指针复位到文件的开始
int fseek( resource fp, int offset [, int whence])
- fp从whence位置移动 offset 个字节
- whence 是可选参数 默认值 SEEK_SET 为文件的开始处
- 也可以为其他值 SEEK_CUR 指针当前位置 SEEK_END 文件结束
文件锁定
int flock(resource fp, int operation [, int & wouldblock])
- 锁定成功为true 否则为false