2010-01-29 33 views
11

在PHP頁面錯誤我有以下代碼:未定義指數:在PHP腳本

if($_REQUEST['c']!="") // I get error on this line itself. Why? 
{ 
$pidis=(int)($_REQUEST['c']); 
} 

我不斷收到未定義指數錯誤。

在谷歌搜索我設法瞭解,如果一個頁面訪問沒有參數(在URL中),我們試圖訪問我們可以得到這個錯誤/警告。我相信如果一個參數沒有在URL中定義,它應該返回空值而不是給出錯誤/警告消息。

我知道這是可以通過增加

error_reporting(E_ALL^E_NOTICE);

壓制錯誤和警告,但我不想這樣做。

這個頁面在我們公司的web服務器上工作得很好,但在我們的客戶端web服務器上不起作用。

這是怎麼發生的?

如何解決這個問題?

+0

標籤'不request'是假的我其實已經是類型:'$ _REQUEST'。 爲什麼'$ _REQUEST' TAG會在我們發佈時轉換爲'not'request''? – 2010-01-29 06:53:14

回答

25

由於您試圖將$_REQUEST['c']$_REQUEST['c']不存在的內容進行比較,您正在收到該錯誤。

解決方法是在比較之前使用isset()。這將消除警告,因爲如果$_REQUEST['c']不存在,則不會發生比較。

if(isset($_REQUEST['c']) && $_REQUEST['c']!="") 
{ 
$pidis=(int)($_REQUEST['c']); 
} 

這是一個E_NOTICE級別的錯誤,而你的error reporting水平將影響誤差是否顯示漲不跌。您的客戶端的服務器已打開E_NOTICE級別的錯誤報告,這就是它出現在那裏的原因。

總是使用E_ALL進行開發是一個好主意,以便在將代碼移動到其他服務器之前可以捕獲這種錯誤。

1

當您嘗試使用不存在的變量或不存在的數組元素時,PHP將發出通知(這不是錯誤:只是一個通知)

這只是爲了幫助你,你不應該掩蓋這些注意事項:他們在這裏幫助你 - 例如,幫助你檢測變量名中的拼寫錯誤。

使用數組索引,如果它並不總是存在之前,您應該測試,如果它在這裏使用isset

if (isset($_REQUEST['c']) && $_REQUEST['c']!="") { 
    // ... 
} 
5

相反isset()的你也可以使用:array_key_exists()

兩種方法的區別在於isset()也檢查變量的值是否爲null。如果它是null那麼isset返回falsearray_key_exists()總是返回true如果密鑰存在(不管哪個值)。例如:

$array = array('c' => null); 

var_dump(isset($array['c']))); // isset() returns FALSE here 
var_dump(array_key_exists($array['c']); //array_key_exists() returns TRUE 

根據上下文,區分這一點很重要。在你的情況下,我認爲這並不重要,因爲(我猜)請求參數永遠不會是null(除了手動覆蓋它)。

5

另一個解決方案是使用以下命令:

$pidis = isset($_REQUEST['c']) ? $_REQUEST['c'] : ''; 

還可以,如果你喜歡返回不是空洞的值,通過將最後一組單引號內的默認值,例如

$pidis = isset($_REQUEST['c']) ? $_REQUEST['c'] : 'Default Value'; 

或返回不同的變量類型,例如整數:

$pidis = isset($_REQUEST['c']) ? $_REQUEST['c'] : 34;