2013-01-08 60 views
1

我試圖保護一個PHP與其他頁面失序調用。爲了做到這一點,我在初始頁面中設置了一個常量,並在隨後的頁面中檢查它是否存在。直到現在,這一切都很順利。現在我有一種情況,我需要設置一個條件常量。在第一個文件,該值恆定值設置 - 即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到這個頁面會導致以下的輸出:

酒吧

BAR2你所期望的

什麼。但是,程序的第二部分不起作用。

所以我插入一些類似 '回聲' 語句進入第二部分:

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; 
// } 

結果是一樣的這部分前:

酒吧

BAR2

但第二部分顯着不同:

BAR2

這到底是怎麼回事????

我該如何解決?

+9

常量僅存在於當前腳本的生命週期中。如果「下一頁」是另一個HTTP請求,則該常量不會被設置。相反,使用'$ _SESSION'。 –

+0

@MichaelBerkowski但他們*不變*! ;) – alex

+0

我也看到你正在定義一個名爲'$ vld'的變量,但後來使用'$ vid'。 –

回答

0

字面'bar2'寫成bar2'和丟失在你的例子/ s的開始tick中定義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; 
} 
+0

尼斯觀察,但從它看起來像名稱FOO2和BAR2只是例子,或者至少我希望如此:) – Shedokan

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 
} 

當您嘗試回顯一個未定義的常量時,您將只會得到它的名稱。