Mat*_*ias 2 php directory relative-path
我想知道一些事情,但我似乎无法找到一个好的,明确的答案,甚至是解决这个问题的方法:
我的PHP网站具有以下结构:
root
functions
generators
helpers
scripts
style
index.php
Run Code Online (Sandbox Code Playgroud)
这些都是文件夹和一个php文件.函数包含一堆与数据库连接相关的op php文件和各种其他数据库操作,如插入,删除,更新......生成器包含自动生成网页的类,使它们看起来完全相同.助手是处理登录,注销,注册等的类.脚本是javascript,Style是CSS.
在我的generator文件夹中,有一个文件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>";
}
}
Run Code Online (Sandbox Code Playgroud)
这段代码在每个页面上生成登录框,或者如果用户已经登录则显示欢迎消息.正如您所看到的,该操作引用了"../helpers/login.php",因为这是相对位置从这个生成器的角度来看loginhelper.
现在,问题出现了:如果我按下index.php(http://example.com/ProjectName/index.php)上的登录按钮,它会将我重定向到http://example.com/helpers/login.php并且说找不到文件.
我看到问题是什么,post动作看到来自index.php的请求并上升到一个目录,然后查找/helpers/login.php,当然不存在.
修复可能是将操作更改为
action='/helpers/login.php'
Run Code Online (Sandbox Code Playgroud)
但是,如果我需要从某个子目录中访问generateLogin(),那就会给我带来同样的问题......如何解决这个特殊问题,即:对/helpers/login.php的引用保持正确,无论从哪里来我尝试访问它.
Ans*_*son 10
action='/ProjectName/helpers/login.php'
Run Code Online (Sandbox Code Playgroud)
假设你的root是http:// localhost,那么上面的链接应该总是解析为http://localhost/ProjectName/helpers/login.php,无论是从http://localhost/ProjectName/index.php还是http://调用它本地主机/项目名/子目录/ index.php的
如果您不想将"ProjectName"硬编码到许多不同的脚本中,可以使用全局变量并在配置文件中定义它:
助手/ ConfigOptions.php:
<?php
$ProjectName = "ProjectName";
?>
Run Code Online (Sandbox Code Playgroud)
然后在脚本中包含配置文件并使用您定义的变量:
index.php文件:
include $_SERVER['DOCUMENT_ROOT'] . '/helpers/ConfigOptions.php';
...
echo "
<form action='/$ProjectName/helpers/login.php'>
....
";
Run Code Online (Sandbox Code Playgroud)
有关DOCUMENT_ROOT的更多信息:
DOCUMENT_ROOT在服务器配置文件中定义,是执行脚本的文件系统的根,而不是您在浏览器中键入的Web地址.在上面的例子中,我假设文档根看起来像/ home/user/www/ProjectName.如果DOCUMENT_ROOT仅为/ home/user/www,那么您可以将包含路径更改为:
include $_SERVER['DOCUMENT_ROOT'] . '/ProjectName/helpers/ConfigOptions.php';
Run Code Online (Sandbox Code Playgroud)
或使用相对路径.我的投票将是后者,因为你不需要硬编码"ProjectName".
因此include()和require()将采用:
那你什么时候需要使用DOCUMENT_ROOT?通常使用模板,其中相对路径../helpers/file.php可以解析为不同的绝对路径,具体取决于包含文件的内容.在上面的示例中,index.php包含ConfigOptions.php,您可能不需要使用DOCUMENT_ROOT,因为index.php不是模板.无论如何我用它是安全的,但也许我在这里打开了一整套蠕虫.我希望我不要再混淆你了.
| 归档时间: |
|
| 查看次数: |
20291 次 |
| 最近记录: |