2010-12-20 107 views
2

我在此代碼的第3,6和7行中收到未定義索引「id」的通知。我想不通,我做錯了什麼:未定義的索引錯誤(PHP)

if (isset($_POST['action']) && $_POST['action'] == 'save') { 
    foreach ($options as $value) { 
     if(($value['type'] === "checkbox" or $value['type'] === "multiselect") and is_array($_REQUEST[ $value['id'] ])) 
      { $_REQUEST[ $value['id'] ]=implode(',',$_REQUEST[ $value['id'] ]); //This will take from the array and make one string 
      } 
     $key = $value['id']; 
     $val = $_REQUEST[$key]; 
     $settings[$key] = $val; 
    } 

我想這是解決一個小的事情,但還沒有與任何東西我已經試過所有的運氣。我做的一件事是運行var_dump($ key),有時$ key是空的,有時不是。所以我假設它與此有關。順便說一下,這是WordPress主題的選項頁面的一部分。這是作爲「保存」功能的一部分運行的代碼。

如果調試模式關閉,腳本實際上可以正常工作,但是當調試模式打開時,當點擊選項頁面上的保存按鈕時,彈出這些通知。預先感謝任何見解,並讓我知道是否需要發佈更多代碼以提供更多上下文。

編輯:我已經在pastebin中發佈了選項頁面。它的長。它包含t13lo的修復程序。該問題的代碼是在線1957感謝:http://pastebin.com/NGX6qzgr

+0

我認爲你應該從我這裏得到一個退步,第一行是什麼? – ajreal 2010-12-20 17:37:11

+0

對不起,我不明白「一行是幹什麼」的意思......我做錯了什麼?你問第一行是什麼?它應該是保存選項......我也是編程新手,所以如果我做了一些非常愚蠢的事情,請告訴我! – orbit82 2010-12-20 17:39:23

+0

@ orbit82 - isset'? – ajreal 2010-12-20 17:40:58

回答

1

您可以更改第3行:

if (($value['type'] === "checkbox" || $value['type'] === "multiselect") && isset($_REQUEST['id']) && is_array($_REQUEST[ $value['id'] ])) 

然而,在你的foreach你的代碼的其餘部分似乎取決於$value['id']。此值並不總是被設置,因此它可能使這些線路:

$key = $value['id']; 
$val = $_REQUEST[$key]; 
$settings[$key] = $val; 

不着邊際的話$value['id']未設置。如果是這種情況,將當前在foreach中的所有代碼放在if (isset($value['id'])) {之內可能是合適的。

您需要進一步分析和理解代碼(以及需要做)以確定正確的邏輯。

+0

感謝您的建議,@ webbiedave和@Mathias E,但它沒有任何作用。我得到相同的錯誤... – orbit82 2010-12-20 17:48:12

+0

@ orbit82:我編輯過。 – webbiedave 2010-12-20 17:50:56

+0

非常感謝您的建議。我嘗試將foreach塊放在if(isset [$ value ['id'])中,並且在停止這些錯誤的同時,不管是否設置,這些選項都不再保存到數據庫中。有沒有辦法來檢查是否已經設置了一個選項,但無論如何保存它?爲什麼在沒有isset檢查的情況下它能夠正常工作,但是它不適用於isset檢查? – orbit82 2010-12-20 18:16:09

0

試試這個:

if(($value['type'] === "checkbox" || $value['type'] === "multiselect") && isset($value['id']) && is_array($_REQUEST[ $value['id'] ])){ ... 
+0

3次後期... – 2010-12-20 17:40:31

1

不知道你的代碼是假設做,但基於您已經發布了什麼給這個一杆..(更換顯然只是的foreach循環的一部分代碼)..

foreach ($options as $value) { 
    if(!isset($value['id'])) 
     continue; 
    if(!isset($_REQUEST[$value['id']])) { 
     $settings[$value['id']] = ''; 
     continue; 
    } 
    if($value['type'] === "checkbox" || $value['type'] === "multiselect") { 
     // No isset check here, the top conditional catches non-set items 
     if(is_array($_REQUEST[$value['id']])) 
      $_REQUEST[$value['id']] = implode(',', $_REQUEST[$value['id']]); 
    } 
    $settings[$value['id']] = $_REQUEST[$value['id']]; 
} 

應該做完全像以前一樣,有異常檢查瓦爾首先設置,在$設置數組中的值也設置爲空字符串時匹配$ _REQUEST VAR ISN」 t設置..(假設我跟着什麼代碼正在做的是)..

編輯:繼意見討論中,我已經更新上面的代碼中,應該確定在1957年線這是有道理的,該鍵不爲你的代碼中設置的通知,並非所有的數組項$options實際上是選項,一些是指在你的主題的選項頁面上獲得輸出的標題/選項卡(無論什麼)(所以在上面的循環中跳過它們是有意義的)。

我認爲這樣可以解決您的問題,但是我曾經說過,我認爲指出該函數中的代碼並不理想,整個存儲機制看起來並沒有很好地整體消毒。我傾向於建議將該頁面所需的功能設置爲manage_options,因此它至少在管理員被限制到可以實施替換之前(建議應該在單獨的問題中,並且理想地在WPSE上)。

+0

哇,謝謝這個差不多的作品! if(!isset($ _REQUEST [$ value ['id']])){ $ settings [$ value ['id']] =除非我保存,我得到一個警告, ''; 繼續; } 該代碼是WordPress主題選項面板的一部分。這部分代碼負責將選項保存到數據庫。通過調試模式保存時,通知顯示。 – orbit82 2010-12-20 20:26:43

+0

好吧,那麼可以很容易地修復,但選項保存正確嗎? – t31os 2010-12-20 22:13:50

+0

嘿,感謝您的幫助,但我解決了這個問題!我會用修復程序更新問題! – orbit82 2010-12-21 18:54:40