PHP常量不“粘”

时间:2013-01-08 00:32:23

标签: php conditional constants

我正在尝试保护PHP不被其他页面调用。为了做到这一点,我在初始页面中设置了一个常量,并在后续页面中检查它是否存在。到目前为止,这种方法运作良好。现在我有一种需要设置条件常量的情况。在第一个文件中,设置值常量值 - 即

define('FOO','bar');
define('FOO2', 'bar2');

在下一页中,我检查了常量:

if (!defined('FOO'))
{
echo "Hack Attack";
} 

if (defined('FOO2'))
{
echo "Do Something Else";
} 

这很好用。问题是“FOO2”需要像这样有条件:

define('FOO','bar');
$vld = $_GET['pageno'];
if ($vld>2)
{
  define('FOO2', bar2');
}

现在,在我看来,这应该可行,如果我将大于2的数字传递到页面中,则应创建常量'foo2'。实际上它是创建的,但在此函数之外不存在,几乎击败了它的目的。

为了测试这个,我在代码中添加了一些'echo'。

define('FOO','bar');
$vld = $_GET['pageno'];
if ($vld>2)
{
  echo $vid;
  echo '<br />';
  echo FOO;
  define('FOO2', bar2');
  echo '<br />' ;
  echo FOO2;
}

将值3传递到此页面会产生以下输出:

3

BAR2

正是你所期望的。但是,该程序的第二部分不起作用。

所以我在第二部分插入了一些类似的'echo'语句:

if (!defined('FOO'))
{
echo "Hack Attack";
} else {
echo FOO;
echo '<br />';
}

if (defined('FOO2'))
{
echo "Do Something Else";
} else {
echo FOO2;
}

结果如下:

foo2的

不是我的预期。所以我在第一部分删除了条件并重新运行了两个部分:

define('FOO','bar');
$vld = $_GET['pageno'];
// if ($vld>2)
// {
  echo $vid;
  echo '<br />';
  echo FOO;
  define('FOO2', bar2');
  echo '<br />' ;
  echo FOO2;
// }

此部分的结果与以前相同:

3

BAR2

但第二部分明显不同:

BAR2

这里发生了什么????

我该如何解决?

2 个答案:

答案 0 :(得分:1)

您的脚本没有问题,如果我理解正确您的意思是您将一个页面包含在另一个页面中。

在第一部分:

if (!defined('FOO')){
  echo "Hack Attack"; // Echoed when FOO is not defined
} else {
  echo FOO; // Echoed when FOO is defined
  echo '<br />';
}

它回显"bar2"因为您只回显是FOO 定义

但是第二部分回应了"FOO2",因为只有当FOO2 未定义时才回显它。

if (defined('FOO2')){
  echo "Do Something Else"; // Echoed when FOO2 is defined
} else {
  echo FOO2; // Echoed when FOO2 is not defined
}

当您尝试回显未定义的常量时,您将只获得它的名称。

答案 1 :(得分:0)

文字'bar2'写为bar2',并且在您的示例中缺少一个在if语句中定义bar2的开始标记:

define('FOO','bar');
$vld = $_GET['pageno'];
if ($vld>2) 
{
  echo $vid;
  echo '<br />';
  echo FOO;

  //Are you sure this is what you want - bar2' without a beginning tick?
  define('FOO2', bar2');
  echo '<br />' ;
  echo FOO2;
}