代码之家  ›  专栏  ›  技术社区  ›  wqyutv

当找不到文件时,任何破坏错误的东西都不会出现,我该怎么解决这个问题?

  •  2
  • wqyutv  · 技术社区  · 4 月前

    截至目前,这段代码的工作原理是什么,但我需要一些帮助来解决这个问题。我将这段php代码放在了我的网页中间,见下面的示例:

    此处为页面标题
    Nar酒吧在这里
    这里还有一些文字。。。

    <?php
    $file = fopen($_GET["potus"] . ".txt", "r") or exit("Oh No. The info has not been found. Please try again.");
    //output a line of the file until the end is reached
    while(!feof($file))
    {
    //will return each line with a break
    echo fgets($file). '<br />';
    }
    
    ?>
    

    页脚
    支持链接,如主页、关于、搜索等

    我希望我能解释清楚。假设我有一个名为“abc.txt”、“cbs.txt”、”nbc.txt等的文本文件上传到我的服务器上,其中包含有关abc等网络的一些信息,当有人输入example.com/usr?potus=abc时,网站会显示磁贴、导航栏、一些文本、文本文件的内容、页脚和支持链接。这里没有问题,一切正常。

    现在,如果有人只是输入example.com/usr或example.com//usr,问题会发生在哪里?potus=鼠标,只显示网站的点击部分、互动程序、导航栏、一些文本、错误“” 哦,不。信息还没有找到。请重试。 “显示,但错误下方的任何内容都不显示,这是页脚和支持链接。我查看了很多资源,我尝试了不同类型的代码,它们都产生了相同的结果。如果找不到文本文件,则错误消息下方的任何信息“哦,不。信息有。。。再试一次。“像页脚和支持链接不显示。

    我不确定如何解决这个问题,我现在有这个脚本,我也制作了其他网站,所以它们都有同样的问题,只是从来没有找到解决方案。

    2 回复  |  直到 4 月前
        1
  •  4
  •   Mureinik    4 月前

    您检查返回值的想法是正确的 fopen 打电话,但正如你所说,打电话 exit 终止页面加载。

    相反,您可以将相关代码括在 if 块:

    Page title here
    Nar bar here
    Some more text here...
    <?php
    $file = fopen($_GET["potus"] . ".txt", "r");
    if ($file) {
        //output a line of the file until the end is reached
        while(!feof($file)) {
            //will return each line with a break
            echo fgets($file). '<br />';
        }
    } else {
        echo "Oh No. The info has not been found. Please try again.";
    }
    ?>
    Footer
    Support links
    
        2
  •  2
  •   Lajos Arpad    4 月前

    exit 停止脚本。你不应该这样称呼它。相反,请这样做:

    $path = $_GET["potus"] ?? "";
    if (file_exists($path) && isValidPath($path) && ($file = fopen($path . ".txt", "r"))) {
        //do your stuff here
    }
    

    我们这里有三个标准:

    1. file_exists 检查文件是否存在。在打开文件之前进行此操作非常重要,以避免在发生这种情况时因找不到文件而收到警告。如果 文件_存在 返回false,其他操作数甚至不会被计算 if 块将被跳过
    2. isValidPath 是您需要实现的一个功能,以确保恶意用户不会从您不希望他们从的地方获取文件,例如传递文件名 /var/www/html/your-repo/.env 。我们无法确定项目中的有效路径,因此我将此函数的实现留给您
    3. 实际 fopen 尝试打开文件的调用。如果它返回true结果,则可以在If块内处理该文件

    之后 如果 无论文件是否已找到,您都可以执行任何您想执行的块。