我的php脚本赢得了';t打开的文件不是';t在其根目录中


My php script won't open files that aren't in its root directory

  1. 这是我正在开发的一个用户登录系统的php脚本
  2. 我需要它来读取和写入/students/students.txt文件,但它甚至无法读取文件中已经包含的内容

<?php
//other code
echo "...";
setcookie("Student", $SID, time()+43200, "/");
fopen("/students/students.txt", "r");
$content = fread("/students/students.txt", filesize("/students/students.txt"));
echo $content;
fclose("/students/students.txt");
fopen("/students/students.txt", "w");
fwrite("/students/students.txt", $content."'n".$SID);
fclose("/students/students.txt");
//other code
?>

您没有正确使用fopen()。该函数返回一个句柄,然后用于读取或编辑文件,例如:

//reading a file
if ($handle = fopen("/students/students.txt", "r"))
{
    echo "info obtained:<br>";
    while (($buffer = fgets($handle))!==false)
    { echo $buffer;}
    fclose($handle);
}
//writing/overwriting a file
if ($handle = fopen("/students/students.txt", "w"))
{
    fwrite($handle, "hello/n");
    fclose($handle);
}

如果这对你有用,请告诉我。

p。S.:感谢评论员的建设性反馈

正如其他人所展示的那样,有很多读取/写入文件的方法。我只是想说明一下你这种特殊做法的错误。

fread采用文件句柄作为参数,而不是表示文件路径的字符串。

所以你的线路:

$content = fread("/students/students.txt", filesize("/students/students.txt"));不正确。

应该是:

$file_handle = fopen("/students/students.txt", "r");
$content = fread($file_handle, filesize("/students/students.txt"));

使用fwrite将内容写入文件时也是如此。它对文件的引用是使用fopen而不是文件路径打开的File Handle。当使用fopen()打开文件时,还可以检查返回的$file_handle是有效资源还是false。如果为false,则表示fopen操作未成功。

所以你的代码:

fopen("/students/students.txt", "w");
fwrite("/students/students.txt", $content."'n".$SID);
fclose("/students/students.txt"); 

需要重写为:

$file_handle = fopen("/students/students.txt", "w");
fwrite($file_handle, $content."'n".$SID);
fclose($file_handle);

您可以看到fclose也对文件句柄进行操作。

文件句柄(根据php.net):

 A file system pointer resource that is typically created using fopen().

这里有几个诊断函数,允许您验证文件是否存在并且可读。如果是权限问题,它会为您提供需要权限的用户的名称。

function PrintMessage($text, $success = true)
{
    print "$text";
    if ($success)
        print "&nbsp;[<font color='"green'">Success</font>]<br />'n";
    else
        print("&nbsp;[<font color='"red'">Failure</font>]<br />'n");
}
function CheckReadable($filename)
{
    if (realpath($filename) != "")
        $filename = realpath($filename);
    if (!file_exists($filename))
    {
        PrintMessage("'$filename' is missing or inaccessible by '" . get_current_user() . "'", false);
        return false;
    }
    elseif (!is_readable($filename))
    {
        PrintMessage("'$filename' found but is not readable by '" . get_current_user() . "'", false);
        return false;
    }
    else
        PrintMessage("'$filename' found and is readable by '" . get_current_user() . "'", true);
    return true;
}

我用(IMO)重新编写了您的代码,这是一个更干净、更高效的代码:

<?php
$SID = "SOMETHING MYSTERIOUS";
setcookie("Student", $SID, time()+43200, "/");
$file = "/students/students.txt"; //is the full path correct?
$content = file_get_contents($file); //$content now contains /students/students.txt
$size = filesize($file); //do you still need this ?
echo $content;
file_put_contents($file, "'n".$SID, FILE_APPEND); //do you have write permissions ?

文件集内容

file_get_contents()是读取文件转换为字符串。如果支持,它将使用内存映射技术通过您的操作系统来提高性能。


文件输出内容

此函数与调用fopen()fwrite()和CCD_ 12连续地将数据写入文件。如果文件名没有存在,则创建文件。否则,现有文件为重写,除非设置了FILE_APPEND标志。


注意:

  1. 确保完整路径/students/students.txt正确
  2. 检查您是否拥有/students/students.txtread/write权限

  3. 了解更多关于linux文件/文件夹权限的信息,或者,如果你不能访问shell,如何通过ftp 更改文件或目录权限

尝试这样做:

 fopen("students/students.txt", "r");

并检查是否有读取该文件的权限。