Неопределенные ошибки индекса (PHP) - PullRequest
2 голосов
/ 20 декабря 2010

Я получаю уведомления о неопределенном индексе "id" в строках 3, 6 и 7 в этом коде. Я не могу понять, что я делаю неправильно:

    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 имеет значение null, а иногда - нет. Так что я предполагаю, что это связано с этим.

Кстати, это часть страницы настроек для темы WordPress. Это код, который выполняется как часть функции «сохранить».

Сценарий фактически работает правильно, если режим отладки выключен, но когда режим отладки включен, эти уведомления появляются при нажатии кнопки сохранения на странице параметров. Заранее спасибо за любые идеи и дайте мне знать, если мне нужно опубликовать больше кода, чтобы дать больше контекста.

РЕДАКТИРОВАТЬ: я разместил страницу параметров в pastebin. Это долго. Содержит исправления t13lo. Код проблемы находится на линии 1957. Спасибо: http://pastebin.com/NGX6qzgr

Ответы [ 3 ]

1 голос
/ 20 декабря 2010

Понятия не имею, что должен делать ваш код, но, основываясь на том, что вы опубликовали, попробуйте ... (очевидно, заменяя только часть цикла 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']];
}

Должен действовать точно так же, как и раньше, за исключением того, что сначала устанавливаются переменные, при этом также следует устанавливать значение в массиве $ settings в пустую строку, когда не задано соответствующее переменное $ _REQUEST .. (при условии, что я ' следуя тому, что код делает правильно, то есть) ..

РЕДАКТИРОВАТЬ: После обсуждения в комментариях я обновил код выше, что должно исправить уведомление в строке 1957. Имеет смысл, чтобы этот ключ не был установлен для вашего кода, не все элементы массива в $options на самом деле являются параметрами, некоторые ссылаются на заголовки / вкладки (что угодно), которые выводятся на страницу параметров вашей темы (поэтому имеет смысл пропустить их в цикле выше).

Я думаю, что это решит вашу проблему, но, сказав, что я считаю важным отметить, что код в этой функции не идеален, весь механизм сохранения выглядит не очень хорошо очищенным в целом. Я был бы склонен предложить установить для этой страницы требуемую возможность manage_options, поэтому она ограничена администраторами, по крайней мере, до тех пор, пока не будет произведена замена (предложения, по которым должен быть отдельный вопрос, и в идеале *) 1014 * ПРМЭ ).

1 голос
/ 20 декабря 2010

Вы можете изменить строку 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 голосов
/ 20 декабря 2010

попробуйте это:

if(($value['type'] === "checkbox" || $value['type'] === "multiselect" ) &&  isset($value['id']) && is_array($_REQUEST[ $value['id'] ])){ ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...