>  기사  >  백엔드 개발  >  어떻게 PHP 파일을 읽을 수 있지만 데이터를 쓸 수 없나요?

어떻게 PHP 파일을 읽을 수 있지만 데이터를 쓸 수 없나요?

青灯夜游
青灯夜游원래의
2021-09-15 18:51:432254검색

PHP 파일에서 데이터를 읽지만 쓰지 않는 방법: 1. "fopen('file path', 'r')" 문을 사용하여 읽기 전용 방식으로 파일을 엽니다. 2. fgetc(), fgets를 사용합니다. ( ), fgetss() 및 기타 함수를 사용하여 데이터를 읽습니다.

어떻게 PHP 파일을 읽을 수 있지만 데이터를 쓸 수 없나요?

이 튜토리얼의 운영 환경: Windows 7 시스템, PHP 버전 7.1, DELL G3 컴퓨터

PHP에서는 fopen() 함수를 사용하여 읽기 전용 방식으로 파일을 열 수 있지만, 데이터 쓰기용이 아닙니다.

PHP의 fopen() 함수를 사용하여 파일이나 URL을 열 수 있습니다. 열기에 성공하면 파일 포인터 리소스가 반환되고, 열기에 실패하면 FALSE가 반환됩니다. 이 함수의 구문 형식은 다음과 같습니다.

fopen(string $filename, string $mode[, bool $use_include_path = false[, resource $context]])

매개변수 설명은 다음과 같습니다.

  • $filename: 열려는 파일의 URL입니다. 이 URL은 파일이 있는 서버의 절대 경로일 수도 있고, 네트워크 리소스의 파일일 수도 있습니다. 파일 열기 방법(파일 모드)을 설정합니다. 특정 값은 다음 표에서 선택할 수 있습니다.

mode 설명파일 헤더를 가리키는 파일 포인터를 가리키는 읽기 전용 모드로 엽니다. 읽기-쓰기 모드로 열고 파일 포인터로 파일 헤더를 가리킵니다. 쓰기용으로 열고 파일 포인터를 파일 헤더로 가리키고 파일 크기를 0으로 자릅니다. 파일이 없으면 작성하십시오. 읽기-쓰기 모드로 열고 파일 포인터로 파일 헤더를 가리키고 파일 크기를 0으로 자릅니다. 파일이 없으면 작성하십시오. 쓰기용으로 열고 파일 포인터를 파일 끝으로 가리킵니다. 파일이 없으면 작성하십시오. 읽기-쓰기 모드로 열고 파일 포인터가 파일 끝을 가리키도록 합니다. 파일이 없으면 작성하십시오. 파일 포인터를 파일 헤더로 지정하여 쓰기용으로 만들고 엽니다. 파일이 이미 존재하는 경우 fopen() 호출은 실패하고 FALSE를 반환하며 E_WARNING 수준 오류 메시지를 생성합니다. 파일이 없으면 작성하십시오. 로컬 파일에만 적용됩니다. 이 생성되어 읽기-쓰기 모드로 열리며, 그 외 동작은 x와 동일합니다. 쓰기용으로만 파일을 열거나 파일이 없으면 생성합니다. 파일이 존재하는 경우 파일 내용은 지워지지 않고 파일 포인터는 파일 헤더를 가리킵니다. 읽기 및 쓰기용 파일을 열고 파일이 없으면 새로 만듭니다. 파일이 존재하는 경우 파일 내용은 지워지지 않고 파일 포인터는 파일 헤더를 가리킵니다.
r
r+
w
w+
a
a+
x
x+
c
c+
  • $use_include_path:可选参数,如果也需要在 include_path 中搜寻文件的话,可以将 $use_include_path 设为 1 或 TRUE;

  • $context:可选参数,在 PHP5.0.0 中增加了对上下文(Context)的支持。

读取文件数据,可以使用fgetc()、fgets()、fgetss()等函数

fgetc():从文件中读取一个字符

在对某一个字符进行查找、替换时,就需要有针对性地对某个字符进行读取,在 PHP 中可以使用 fgetc() 函数实现此功能。该函数语法格式如下:

fgetc(resource $handle)

其中参数 $handle 为使用 fopen() 或 fsockopen() 成功打开的文件资源。

fgetc() 函数可以返回一个包含有一个字符的字符串,该字符是从 $handle 指向的文件中得到。当碰到 EOF 时返回 FALSE。

注意:fgetc() 函数可能返回布尔值 FALSE,也可能返回等同于 FALSE 的非布尔值。所以应该使用===运算符来测试此函数的返回值。

另外,fgetc() 函数可安全用于二进制对象,但不适用于读取中文字符串,因为一个中文通常占用 2~3 个字符。

【示例】使用 fgetc() 函数逐个字符的读取文件中的内容并输出。

<?php
    header("Content-Type: text/html;charset=utf-8");    //设置字符编码
    $handle = fopen(&#39;./test.txt&#39;, &#39;r&#39;);                 //打开文件
    if (!$handle) {                                     //判断文件是否打开成功
        echo &#39;文件打开失败!&#39;;
    }
    while (false !== ($char = fgetc($handle))) {        //循环读取文件内容
        echo $char;
    }
    fclose($handle);                                    //关闭文件
?>

fgets()和fgetss():逐行读取文件

fgets() 函数用于一次读取一行数据。函数的语法格式如下:

fgets(resource $handle[, int $length])

其中参数 $handle 是被打开的文件;参数 $length 为可选参数,用来设置读取的数据长度。函数能够实现从指定文件 $handle 中读取一行并返回长度最大值为 $length-1 个字节的字符串。在遇到换行符、EOF 或者读取了 $length-1 个字节后停止。如果忽略 $length 参数,则默认读取 1k(1024字节)长度。

【示例】使用 fgets() 函数逐行读取文件的内容并输出。

<?php
    $handle = @fopen("./test.txt", "r");
    if ($handle) {
        while (($info = fgets($handle, 1024)) !== false) {
            echo $info.&#39;<br>&#39;;
        }
        fclose($handle);
    }                                
?>

fgetss() 函数是 fgets() 函数的变体,用于读取一行数据,同时 fgetss() 函数会过滤掉读取内容中的 HTML 和 PHP 标记,函数的语法格式如下:

fgetss(resource $handle[, int $length[, string $allowable_tags]])

参数说明如下:

  • $handle:为被打开的文件;

  • $length:可选参数,用来设置要读取的数据长度;

  • $allowable_tags:可选参数,用来指定哪些标记不被去掉。

注意:fgetss() 函数在 PHP7.3 及之后的版本中已经弃用。

【示例】分别使用 fgets() 函数和 fgetss() 函数读取 index.html 文件并输出结果,看一看有什么区别。

<?php
    echo &#39;-------使用 fgets() 函数的输出结果:-------<br>&#39;;
    $handle = @fopen("index.html", "r");
    if ($handle) {
        while (!feof($handle)) {
            $buffer = @fgets($handle, 4096);
            echo htmlentities($buffer,ENT_QUOTES,"UTF-8").&#39;<br>&#39;;
        }
        fclose($handle);
    }
    echo &#39;-------使用 fgetss() 函数的输出结果:-------<br>&#39;;
    $handle = @fopen("index.html", "r");
    if ($handle) {
        while (!feof($handle)) {
            $buffer = @fgetss($handle, 4096);
            echo $buffer.&#39;<br>&#39;;
        }
        fclose($handle);
    }
?>

推荐学习:《PHP视频教程

위 내용은 어떻게 PHP 파일을 읽을 수 있지만 데이터를 쓸 수 없나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.