所以我意识到有很多方法可以解决这个问题,尽管堆栈上有很多答案,但我找不到任何允许将单个全局用于使用 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 并且无权访问唯一文件的文件?