【问题标题】:PHP include/require without passing variablesPHP include/require 不传递变量
【发布时间】:2012-01-18 17:19:35
【问题描述】:

是否可以在 PHP 中包含某些内容而不传递传递给原始脚本的变量?

我正在使用 Joomla,我收到错误记录 here(“非法变量...”)。 php 脚本是一个将数据发送回浏览器的 AJAX 脚本,因此该脚本需要大量 POST 变量,执行数据库查询,然后回显结果。我正在尝试加强安全性,因此我在此脚本中添加了一个包含以使用内置的 Joomla 模块对用户进行身份验证。我从here 得到了用户身份验证脚本的想法。
身份验证脚本适用于某些页面,但对于其他页面,我会收到上述错误。所以我想包含身份验证脚本而不向它传递任何变量。这可能吗?

编辑:这里有更多细节。

在 ajax 脚本中我有这个:

<?php
    include '/var/www/joomla-auth.php';
...

下面是脚本,基本上包含的“joomla-auth.php”脚本负责获取mysql查询的用户名和密码。 joomla-auth 的内容:

<?php

define( '_JEXEC', 1 );
define('JPATH_BASE', dirname(__FILE__));
define( 'DS', DIRECTORY_SEPARATOR );
require_once ( JPATH_BASE .DS.'includes'.DS.'defines.php' );
require_once ( JPATH_BASE .DS.'includes'.DS.'framework.php' );

/* Create the Application */
$mainframe =& JFactory::getApplication('site');

/* Make sure we are logged in at all. */
if (JFactory::getUser()->id == 0)
    die("Access denied: login required.");

$user =& JFactory::getUser();

我很确定抛出错误的是定义或要求行:

非法变量 _files 或 _env 或 _get 或 _post 或 _cookie 或 _server 或 _session 或全局变量传递给脚本。

如上面第一个链接中所述。

编辑 2:

'joomla-auth.php' 脚本生成 $username 和 $password 变量,然后在 AJAX 脚本中使用。我在 AJAX 脚本的顶部尝试了这个:

function get_creds(){
    include '/var/www/joomla-auth.php';
    return Array($username,$password);
}

$creds = get_creds();
$username = $creds[0];
$password = $creds[1];
....

但是 $_POST 变量仍然被传递到 /var/www/joomla-auth.php :-(

【问题讨论】:

  • 从您的描述中很难准确说出您要完成的工作。您能否将您的代码添加到您的问题中?只是进行 post 调用的片段和引发错误的被调用脚本的一部分。

标签: php ajax authentication joomla include


【解决方案1】:

如果您将错误中提到的变量之一传递给 url(或通过 mod_rewrite),Joomla 会抛出此错误:

_files 或 _env 或 _get 或 _post 或 _cookie 或 _server 或 _session

此外,我认为如果您传递一个完整的数字变量,则会引发相同的错误,例如:

http://yoursite.com/?123456=abc

只要确保您没有在 url 中传递任何这些变量。如果找不到问题,请尝试在引发错误之前检查请求中的内容。

希望对你有帮助!

【讨论】:

  • 是的,这很有帮助,不幸的是我希望仍然可以选择传递我认为的所有数字变量...
  • 是的,我的数据库中有一些字段名称全为数字,因此帖子中的某些名称/值对全为数字名称。任何人都知道为什么 Joomla 不允许这样做?谢谢!
【解决方案2】:

将包含包装在另一个函数中以创建(几乎)空范围 function foo($path){ include($path); }

edit:如果确实需要传递一些变量,可以将它们作为数组传递到第二个参数中,然后在函数中进行extract():

function foo($path, array $vars=array()) { extract($vars); include($path); }

这类似于在 Kohana 的视图引擎中为类似目的所做的(在 View::capture() 中)。您可能想看看他们是如何实现它以及他们是如何使用它的。

【讨论】:

  • 我没有发现它有效......好吧,也许不是为了我的目的,实际上我仍然需要将包含中创建的变量传递给我的 AJAX 脚本,但不是其他名称.
  • @rdlowrey PHP 只有函数作用域,没有其他方法可以创建空作用域。 Jeffery_the_wind,如果您需要将一些变量传递到范围内,请参阅我的编辑
  • @shesek 请参阅我上面的编辑 2。我不需要将变量传递到范围内,但我需要将 2 个变量移出范围。但是,似乎 $_POST 变量仍然被传递给函数内的脚本。
  • 全局变量是……嗯,全局的。它们可以随处访问,您无能为力。
  • 哦,至于获取范围之外的变量 - 只需从包含文件中获取 return 它们,它将成为调用 include 的返回值。然后,从包装include 的函数中返回它。我不得不说,看起来你做错了什么:-\
【解决方案3】:

Namespaces 可能有助于以不那么骇人听闻的方式解决您的问题。

【讨论】:

  • Namespaces 和他的要求无关
猜你喜欢
  • 2015-10-25
  • 1970-01-01
  • 2011-04-12
  • 2011-10-30
  • 1970-01-01
  • 2016-07-03
  • 1970-01-01
  • 1970-01-01
  • 2014-05-31
相关资源
最近更新 更多