2010-12-20 16 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; 
    } 

私はこれを修正するための小さなものであると思っていますが、私が試したものを持つ任意の運を持っていませんでした。私がやったことの1つはvar_dump($ key)を実行し、時には$ keyがnullであり、時にはそうではありません。だから私はそれがこれと関係していると仮定している。

これは、WordPressテーマのオプションページの一部です。これは、「保存」機能の一部として実行されるコードです。

デバッグモードがオフになっているが、デバッグモードがオンの場合、オプションページの保存ボタンを押すと、これらの通知がポップアップします。どんな洞察をも前もってありがとう、より多くの文脈を与えるためにもっとコードを投稿する必要があるかどうか教えてください。

EDIT:pastebinにオプションページを掲載しました。それは長い。これにはt13loの修正が含まれています。

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

しかし、あなたのforeachの中にあなたのコードの残りの部分は$value['id']に依存しているようだ:あなたは、ライン3を変更することができますhttp://pastebin.com/NGX6qzgr

+0

私はあなたが私からdownvoteに値したと思う、第1行は何ですか? – ajreal

+0

申し訳ありませんが、私はあなたが何を意味するのか理解していません "行1は何ですか" ...私は何か間違っていましたか? 1行目は何をしているのですか?それはオプションを保存するはずだ...私はプログラミングに新しいので、私は本当に愚かな何かをした場合は、私に教えて! – orbit82

+0

@ orbit82 - 'isset'? – ajreal

答えて

1

:問題のコードは、ライン上で1957年のおかげです。 $value['id']が設定されていない場合

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

無関係な:それはこれらの行を行うことができるように、この値は常に設定されていません。その場合、foreachに現在あるコードのすべてをif (isset($value['id'])) {に入れることが適切かもしれません。

正しいロジックを判断するために、コードが何であるか(そして実行する必要がある)かをさらに分析して理解する必要があります。

+0

あなたの提案、@ webbiedaveと@Mathias Eに感謝しましたが、何の効果もありませんでした。私は同じエラーが発生します... – orbit82

+0

@ orbit82:私は編集しました。 – webbiedave

+0

お寄せいただきありがとうございます。私はif(isset [$ value ['id'])内にforeachブロックを置こうとしましたが、エラーが止まっている間も、オプションが設定されていてもデータベースに保存されなくなりました。オプションが設定されているかどうかを確認する方法はありますか、それでも保存する方法はありますか?なぜそれはissetチェックなしで正常に動作しますが、issetチェックでは機能しません。 – orbit82

0

これを試してみてください。

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

3秒遅れ... –

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']]; 
} 

VARSをチェックする例外を除いて、正確に前と同じように行う必要がありますが、空の文字列に$設定の配列の値を設定することで、最初に設定されている場合、一致する$ _REQUESTするvar ISN」 tを設定します。(コードが正しく実行していると仮定していると仮定します)..

編集:上記のコードを更新しました。これは、1957年の通知を修正するはずです。そのキーがコードに設定されていないことが理にかなっています。 $optionsは実際にはオプションですが、テーマのオプションページに出力されるheadings/tabs(何でも)を参照するものもあります(上記のループでスキップするのは理にかなっています)。

私はあなたの問題を解決すると思いますが、その機能のコードは理想的ではないことを指摘することが重要だと言いました。全体の保存メカニズムは全体的にうまく消毒されていません。そのページに必要な機能をmanage_optionsに設定することをお勧めします。そのような時間が来るまでは、管理者に限定されています(少なくとも、別の質問があり、理想的にはWPSE)。

+0

うわー、ありがとう、これはほとんど動作します!保存した場合を除き、この行でインデックスidが未定義であるという警告が表示されます。if(!isset($ _REQUEST [$ id [] id)]){ $ settings [$ value ['id']] = ''; 続行。 } コードはWordPressテーマオプションパネルの一部です。コードのこの部分は、データベースへのオプションの保存を担当します。この通知は、デバッグモードをオンにして保存すると表示されます。 – orbit82

+0

これは簡単に修正できますが、オプションは正しく保存されますか? – t31os

+0

お世話になりましたが、問題は解決しました。修正して質問を更新します! – orbit82

関連する問題