0

所以我意识到有很多方法可以解决这个问题,尽管堆栈上有很多答案,但我找不到任何允许将单个全局用于使用 ajax 的站点的方法。我设置了一些文件以允许两个调用。所以一个 if 语句检查 $_POST['json'] 并且如果它存在然后它调用文件中的函数。否则,您可以在文件中包含并直接调用该函数。下面是一个简单的例子:

if (!empty($_POST['json'])) {echo json_encode(create_table());} 
function create_table(){}

我遇到的问题是您不能在函数中使用包含 ../ ,因为如果包含它,则路径可能无效。我知道有 $_SERVER、$_SESSION,当然还有定义,但它们都有下跌。

  • 如果您将其用于多个平台,则$_SERVER不能被信任,因为您不能总是信任它。
  • $_SESSION超时
  • define不适用于需要一个包含的 ajax,这会破坏目的,因为您必须执行 ../ 才能访问该文件,但是如果您调用包含另一个文件的原始文件,则会出错。

请让我知道您对简单地说发送 ROOT_URL 和 ROOT_DIR 作为函数内参数的一部分的有效性有何看法?这将允许您在调用其他人的顶级页面中使用定义,对于只能通过 ajax 调用的文件,您可以使用 ../ 来调用它们。

回顾一下历史 我有一份就业表格,但无法弄清楚为什么人们随机无法提交,我意识到我的 save.php 和 encryption.php 文件使用会话变量来调用数据库连接。会话超时,因为他们需要多长时间才能提交,所以没有任何效果。我通过简单地将 save.php 设置为 ../ 来修复它,因为您只能使用 AJAX 调用它,但 encryption.php 文件是一个需要包含的类,所以我最终只允许调用它的人发送 $ mysqli 直接,它还允许不同的数据库连接在同一个站点中访问它(不知道你为什么要这样做,但认为它有点酷。

非常感谢任何建议。

编辑:我正在构建它以同时在 Windows 和 Linux 上工作。(我运行本地 Windows 服务器进行测试,并在 linux 机器上进行实时测试。

以下是我目前用来允许 Windows 和 linux 使用相同设置的方法。

$BASE_NAME = basename(__DIR__);
$PHP_SELF = str_replace($BASE_NAME . '/', '', $_SERVER['PHP_SELF']);
$REAL_PATH = str_replace($BASE_NAME, '', __DIR__);
$URL_CHECK = (count(array_slice(explode('/', $PHP_SELF), 1, -1))) ? join( '/', array_slice(explode('/', $PHP_SELF), 1, -1)) . '/' : '';
$URL_COUNT = count(array_slice(explode('/', $_SERVER['PHP_SELF']), 1, -1));
$ROOT_URL = 'http://' . $_SERVER['HTTP_HOST'] . '/' . $URL_CHECK;
$ROOT_DIR = (realpath(dirname(__DIR__))) ? str_replace('\\', '/', $REAL_PATH) : $REAL_PATH;
define("ROOT_URL", $ROOT_URL);
define("ROOT_DIR", $ROOT_DIR);

编辑:对所有这些使用 $_SERVER 标签有什么问题吗?或者至少是运行 ajax 并且无权访问唯一文件的文件?

4

2 回答 2

0

好的,这就是我想出的,它可以在 linux 和 windows 中使用,而无需任何额外帮助。这也可以在根级别设置,无论您将其包含在何处,都会找到根路径。

$URL_ROOT = array_shift(array_slice(explode('/', $_SERVER['PHP_SELF']), 1, -1));
$URL_CHECK = ($URL_ROOT == basename(__DIR__)) ? $URL_ROOT . '/' : '';
define("ROOT_URL", 'http://' . $_SERVER['HTTP_HOST'] . '/' . $URL_CHECK);
define("ROOT_DIR", (realpath(dirname(__DIR__))) ? str_replace('\\', '/', realpath(dirname(__FILE__))) . '/' : realpath(dirname(__FILE__)) . '/');
于 2013-08-02T13:37:52.833 回答
0

如果我理解正确,您在将页面中的相对路径转换为服务器上的绝对文件路径时遇到问题。

要解决此问题,您的网站将需要一小段信息,即网站的文档根目录。

例如,如果您的 index.php 在 'C:\Sites\MySite\www\index.php' 中,那么 'C:\Sites\MySite\www\' 可能是您的根目录。您可以将该值存储define在 PHP 中的 a 中。然后,当用户告诉您包含“admin/anyfile”时,您将其附加到文档根路径,有效地包含“C:\Sites\MySite\www\admin/anyfile”。

如果您的站点在 Linux 上运行,您仍然可以使用相同的技巧。

这样,您的所有代码都将是跨平台的,甚至可以在同一服务器上的不同目录中多次安装。您需要做的就是创建一小部分配置,您每次都更改并包含在每个请求中。但这并不奇怪,几乎每个站点都有某种config.php包含这样的设置。

不要担心/和之间的区别\。Web 和 Linux 都使用/,Windows 足够聪明,可以理解两者。

于 2013-08-01T16:40:21.857 回答