2012-11-12 25 views
1

我有一個PHP圖形頁面,顯示從另一個PHP文件生成的圖形。如何設置一個PHP變量,如果沒有發佈到它呢?

該圖生成PHP文件將通過AJAX腳本更改其變量。

當PHP圖形頁面第一次加載時,我需要能夠識別生成PHP文件中的變量是否爲空,因此我可以將其更改爲默認值,直到數據通過$ _get函數覆蓋它爲止。

我已經嘗試過這個目前爲止沒有運氣,我有點卡住,任何援助將不勝感激,因爲我是非常新的PHP。謝謝:)

$course = $_GET['usercourse']; 

if (empty($course)) 
{ 
    $course = 'All'; 
} 

else 
{ 
} 
+3

'$ course = isset($ _ GET ['usercourse'])? $ _GET ['usercourse']:「All」;' –

+0

@SalmanA你應該將其作爲答案發布,尤其是因爲這是迄今爲止寫在這個問題上的最好的東西。 (這是令人沮喪的多少錯誤信息已經在這個問題上得到了回答......) – Corbin

+1

除了聲明之外,發佈的代碼應該工作,除非你想區分'usercourse'作爲空字符串或0傳遞而根本不傳遞。什麼不適合你? –

回答

3

使用isset()功能。

if (isset($_GET['usercourse']) 
{ 
    //do something 
} 
+0

在這種情況下不應該'isset'與'empty'一樣嗎? – woz

+2

@woz PHP是奇怪的語言。它具有'isset','empty'和'is_null'功能,它們基本上做同樣的事情,但是不同。 – sed

+1

不,在這種情況下,空是不一樣的(假設你們都是'!empty()')。想象'$ _GET ['usercourse'] ==='0':'(!empty($ _ GET ['usercourse']))=== false',但是'isset($ _ GET ['usercourse'])= == true' – Corbin

0

爲什麼不比較空字符串?

if (!isset($course) || empty($course)) { 
    $course = 'All'; 
} 
+3

'empty()'將爲空字符串返回true,從而使OR條件完全冗餘。 –

1

使用isset功能,這樣,

if(isset($_GET['usercourse'])) 
$course = $_GET['usercourse']; 

if (empty($course)) 
{ 
$course = 'All'; 
} else { 
//do something... 
} 
2

使用isset()功能。

,檢查如果變量被設定,它是不等於空字符串
if (isset($_GET['usercourse']) 
{ 
    //do something 
} 
+0

這可以使用一些澄清。如果$ course僅在第一個if中定義,則可以爲未定義的變量發出通知。 – Corbin

+0

@Corbin請檢查我的更新回答 – Aryan

+0

仍然錯誤。如果沒有定義$ _GET ['usercourse']'會發生什麼?你會得到一個未定義的索引警告。 – Corbin

1

樸素代碼例如:

$course = isset($_GET['usercourse']) && $_GET['usercourse'] !== '' 
    ? $_GET['usercourse'] 
    : 'All'; 

稍好:

$course = isset($_GET['usercourse']) && preg_match('@^(LIST|of|AccEPtabLE|vaLUes)[email protected]', $_GET['usercourse']) 
    ? $_GET['usercourse'] 
    : 'All'; 

$course = isset($_GET['usercourse']) && in_array($_GET['usercourse'], array('list', 'of', 'acceptable', 'values')) 
    ? $_GET['usercourse'] 
    : 'All'; 

甚至更​​好:

使用Filter Functions

+0

如果他要檢查一個劃定的白名單,那麼擁有一個$ allowed = ...的數組會更有意義。然後檢查in_array。 – Corbin

+0

是的,同意...! –

1

其他答案已經回答了你的直接問題,但我認爲這裏有更深層次的東西需要解釋。

您通常希望避免訪問您不確定存在的數組索引。

例如:

$a = array('foo' => 'bar'); 
echo $a['test']; //bad! 

這同樣適用於$ _GET,_POST,$ COOKIE,等等,除非你知道它們的存在,不要訪問索引。

請注意,對於用戶定義的索引,這將轉換爲「除非您已檢查它們是否存在,否則不要訪問索引」。

$content = $_GET['content']; //ALWAYS wrong 

你必須檢查數組索引三個選項:isset,空,array_key_exists。

isset($x)如果$ x非空,則返回true。 isset基本上等同於:$x !== null,但isset不會發出未定義的索引/變量通知。

(empty($x) === (!isset($x) || !$x))

換句話說,空考慮任何鬆散等於假是空的。這在某些情況下很有用。

array_key_exists($key, $array)是一個簡單的保證$array[$key]不會發出未定義的索引通知。

那麼以適當的方式提取用戶輸入最簡單的方法是什麼?

$content = (isset($_GET['content'])) ? $_GET['content'] : null; 

如果用戶提供了輸入,那麼您在這一點上有一個特別的保證$content !== null


請注意,您也應該避免永遠不必離開不確定變量的excecution路徑:

if (isset($_GET['content'])) { 
    $content = $_GET['content']; 
} 

echo $content; //WRONG - $content is not guaranteed to be defined 

你可以使用$內容在這種情況下,如果它被包裹在isset或空的,但妨礙了代碼的可讀性。如果您想在某些條件下保留一個未定義的變量,請將其定義爲null。如果沒有它發出變量不存在警告,這會將其視爲「未定義」。

$a = null; 
var_dump($a === $b); //true, because the non-existent $b is treated as false 
//(note that this is terrible style though -- this would issue a variable doesn't exist warning for $b 

還有,當然,PHP的filter擴展。特別是,您可以使用filter_input來避免重寫大量用於處理用戶輸入的代碼。

你可以在正確的部分閱讀更多關於正確(或偏執,有些人可能稱之爲)輸入處理herehere


順便說一句,你應該總是有錯誤的發展手搖一路上漲,你應該監視任何類型的錯誤(警告,通知等)。這將有助於防止潛在的邏輯錯誤,並且它會保持代碼清潔。 (好像是從來沒有發出通知的代碼和編寫良好的代碼之間的相關性。)

+0

優秀的答案 - 不僅回答了問題,而且對所涉及的所有因素給出了正確的解釋。 –

相關問題