php相对路径和目录

php相对路径和目录,php,relative-path,directory,Php,Relative Path,Directory,我想知道一些事情,但我似乎找不到一个好的、明确的答案,甚至找不到解决这个问题的办法: 我的PHP网站具有以下结构: root functions generators helpers scripts style index.php 这些都是文件夹和一个php文件。函数包含与数据库连接和各种其他数据库操作(如插入、删除、更新等)相关的一组php文件,。。。生成器包含自动生成网页的类,使网页看起来完全相同。助手是处理登录、注销、注册等的类。脚本是javascri

我想知道一些事情,但我似乎找不到一个好的、明确的答案,甚至找不到解决这个问题的办法:

我的PHP网站具有以下结构:

root
   functions
   generators
   helpers
   scripts
   style
   index.php
这些都是文件夹和一个php文件。函数包含与数据库连接和各种其他数据库操作(如插入、删除、更新等)相关的一组php文件,。。。生成器包含自动生成网页的类,使网页看起来完全相同。助手是处理登录、注销、注册等的类。脚本是javascript,样式是CSS

在my generators文件夹中,有一个文件mainGenerator.php,它生成网站的各个部分:

 private function generateLogin()
    {
        if (!isLoggedIn()) {
            echo "
                <h2>Login</h2>
                <form method='post' action='../helpers/login.php' id='loginForm'>
                <p>
                Username:<br/>
                <input class='search' type='text' name='username'/>
                Password:<br/>
                <input class='search' type='password' name='password'/>
                <input name='login' type='image' style='border: 0; margin: 0 0 -9px 5px;' src='style/login.png' alt='Login' title='Login'/><br/>
                No account yet? <a href='../register.php'>Register</a>
                </p></form>";
        } else {
            echo "
                <h2>Welome, <a href='user.php' style='color: #1293EE;'>" .
                 $_SESSION['user_name'] .
                 "</a></h2>
                <a href='logout.php'>Log off</a>";
        }
    }
但如果我需要从某个子目录中访问generateLogin(),这也会给我带来同样的问题。。。
如何解决这个特殊的问题,即:对/helpers/login.php的引用保持正确,无论我从何处尝试访问它。

如果您有一个以斜杠开头的链接,它总是附加到根目录,而不是当前目录

因此,如果您的页面是
www.example.com/mySite/foo.html
,并且您有这样一个链接:
Bar/
,用户将被重定向到
www.example.com/Bar.html


您应该让表单操作指向
helpers/login.php

action='/ProjectName/helpers/login.php'
假设你的根是,那么上面的链接应该总是决定它是从还是从中调用的

如果不想将“ProjectName”硬编码到许多不同的脚本中,可以使用全局变量并在配置文件中定义它:

helpers/ConfigOptions.php:

<?php
$ProjectName = "ProjectName";
?>
include $_SERVER['DOCUMENT_ROOT'] . '/helpers/ConfigOptions.php';

...

echo "
  <form action='/$ProjectName/helpers/login.php'>
  ....
";
或者使用相对路径。我会投后者的票,因为你不需要硬编码“ProjectName”

因此,include()和require()将采用以下两种方法之一:

  • 文件的绝对路径
  • 相对于当前正在执行的脚本的路径。如果A包括B,B包括C,当B包括C时,它需要提供一条相对于A的路径

  • 那么什么时候需要使用DOCUMENT_ROOT呢?通常在模板中,像
    。/helpers/file.php
    这样的相对路径可以解析为不同的绝对路径,具体取决于包含文件的内容。在上面的示例中,index.php包含ConfigOptions.php,您可能不需要使用DOCUMENT_ROOT,因为index.php不是模板。我用它是为了安全,但也许我在这里打开了一整罐虫子。我希望我没有让你更加困惑。

    helpers/login.php
    将只在顶级目录下工作。感谢您提供有关斜杠的信息。投票赞成!如果我错了,请纠正我的错误,但这对需求不起作用,对吗?像这样:包括$服务器['DOCUMENT\u ROOT']/MyProject/helpers/ConfigOptions.php';require_once($ProjectName.'/functions/account_fns.php')这不重要,因为include()和require()都是文件的相对或绝对路径。我用有关文档根的更多信息更新了我的答案。
    include $_SERVER['DOCUMENT_ROOT'] . '/helpers/ConfigOptions.php';
    
    ...
    
    echo "
      <form action='/$ProjectName/helpers/login.php'>
      ....
    ";
    
    include $_SERVER['DOCUMENT_ROOT'] . '/ProjectName/helpers/ConfigOptions.php';