【问题标题】:How to auto include files with php not OOP?如何使用php而不是OOP自动包含文件?
【发布时间】:2012-01-13 00:41:25
【问题描述】:

我有不同的模组,例如用户、统计等。如果我点击用户我会得到有关用户的信息,如果我点击统计我会得到用户统计等等。但我想用 php(不是 OOP)自动执行此操作 - 自动包含和调用 mods 文件夹中的文件(例如 users.php、statistics.php 等)。我知道 php OOP 具有自动加载类功能。但我不知道 PHP 面向对象。我如何在没有 OOP 的情况下使用 PHP 做到这一点? 我希望链接是这样的:

<a href='index.php?mod=users'>User list</a> <a href='index.php?mod=statistics'>Statistics</a>

【问题讨论】:

  • 如果 $_GET["mod"] 是用户,您想自动包含 mods 文件夹中的所有文件,或者您想自动包含文件夹 mods 中的 users.php?
  • @micha 如果 $_GET["mod"] 是用户,我想从文件夹 mods 中自动包含 users.php

标签: php include include-path require-once


【解决方案1】:
if (isset($_GET["mod"]) && file_exists("mods/" . preg_replace("/[^\w\d]+/", "", $_GET["mod"]) . ".php")) {
    include "mods/" . preg_replace("/[^\w\d]+/", "", $_GET["mod"]) . ".php"; // or: require("mods/" . preg_replace("/[^\w\d]+/", "", $_GET["mod"]) . ".php");
}

【讨论】:

  • 您需要清理输入。如果有人制作了一个 URL,其中 $_GET['mod'] 是 ../../../../../../../etc/passwd 或类似的怎么办?此外,include 和 require 之间的区别不仅仅是一个比另一个更现代。
  • @liquorvicar 如何清理输入?
  • @EmilAzizov 在liquevicar 提醒我应该这样做之后,我直接清理输入。
  • @micha 我会推荐一种“白名单”风格的消毒方法。例如,OP 正在寻找包含 mods/NAME.php 形式的文件。因此,如果他的 php 只包含字母和下划线,我会删除除这些之外的所有字符。
  • 如果你觉得更好,可以。
【解决方案2】:

使用switch/case 或一些现代卫生系统。

// BASE_PATH is some previously defined application path constant

// fetch $mod from $_GET, and if set strtolower() it

switch($mod){
    case 'user':
    case 'admin':
    case 'statistics':
        $path = realpath(BASE_PATH . "/mods/{$mod}.php");
        if(false === $path || !is_file($path)){
            // error, 404?
        }
        require $path;
        break;
    default:
        // invalid mod, 404?
        break;
}

// and so forth

【讨论】:

    猜你喜欢
    • 2018-05-25
    • 1970-01-01
    • 2017-01-21
    • 2011-08-15
    • 2016-02-05
    • 2011-09-13
    • 2011-03-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多