いったいなぜ“ undefined_index ”エラーが発生するのですか?

そうです、ここの壁に頭をぶつけています。信じられないほど単純なことだと思いますが、すべてで未定義のインデックスエラーが発生し続けます

function meta_genus_species() { global $post; if (isset($post)) { $custom = get_post_custom($post->ID); } if (isset($custom)) { $genus = $custom["genus"][0]; $species = $custom["species"][0]; $etymology = $custom["etymology"][0]; $family = $custom["family"][0]; $common_names = $custom["common_names"][0]; } ?> <label>Genus:</label> <input name="genus" value="<?php if(isset($genus)) { echo $genus; } ?>" /> <label>Species:</label> <input name="species" value="<?php if(isset($species)) { echo $species; } ?>" /> <p><label>Etymology:</label><br /> <textarea cols="50" rows="5" name="etymology"><?php if(isset($etymology)) { echo $etymology; } ?></textarea></p> <label>Family:</label> <input name="family" value="<?php if(isset($family)) { echo $family; } ?>" /> <label>Common Names:</label> <input name="common_names" value="<?php if(isset($common_names)) { echo $common_names; } ?>" /> <?php } 

すべての変数についてこれを取得します:

注意:未定義のインデックス:207行目の[…] sf-species-profiles.phpの属

何かアイデアはありますか?

コメント

  • 207行目のコード行はどれですか?
  • $ genus = $ custom [" genus "] [0];

回答

それ “一般的なPHPエラー。通常、存在しないキーを使用して配列メンバーにアクセスしようとすると、

$array = array( "hello" => "world" ); echo $array["foobar"]; // undefined index 

最初に

更新:この場合、チャックします変数を設定するループで、foをチェックしますrプロセス中のインデックス。

foreach ( array( "genus", "species", "etymology", "family", "common_names" ) as $var ) $$var = isset( $custom[ $var ][0] ) ? $custom[ $var ][0] : ""; echo $genus; // prints value of $custom["genus"][0] if set, otherwise empty 

コメント

  • すべてにissetを使用することを提案していますか(pseudo)isset($ custom [genus])> $ genus = $ custom [genus]などの行?確かに、それは'は地獄のように長い道のりです。 $ postでissetを使用し、次に$ customを使用すると、これらの変数がiv id =ではないことを意味するという印象を受けました('がこの問題に遭遇したのはこれが初めてです)。 “9d6711ae97″>

t set / don ' $ postにデータがない限り存在しませんか?

  • まったくありませんが、どちらにしても、あなたはXが存在すると想定してはなりません。更新された回答を参照してください:)
  • 回答

    印刷するたびにisset()を呼び出していますデータを画面に表示します。

    この部分をスキップしないのはなぜですか:

    if (isset($custom)) { $genus = $custom["genus"][0]; $species = $custom["species"][0]; $etymology = $custom["etymology"][0]; $family = $custom["family"][0]; $common_names = $custom["common_names"][0]; } 

    入力を出力するときにこれを実行します:

    <label>Genus:</label> <input name="genus" value="<?php if( isset( $custom["genus"][0] ) ) { print $custom["genus"][0]; } ?>" /> 

    追加の変数割り当ては不要であり、ここで通知が生成されます。

    BTW …

    フォームに出力する前に、出力をエスケープする必要があります。

    <label>Genus:</label> <input name="genus" value="<?php if(isset($genus)) { echo esc_attr( $genus ); } ?>" /> <label>Species:</label> <input name="species" value="<?php if(isset($species)) { echo esc_attr( $species ); } ?>" /> <p><label>Etymology:</label><br /> <textarea cols="50" rows="5" name="etymology"><?php if(isset($etymology)) { echo esc_textarea( $etymology ); } ?></textarea></p> <label>Family:</label> <input name="family" value="<?php if(isset($family)) { echo esc_attr( $family ); } ?>" /> <label>Common Names:</label> <input name="common_names" value="<?php if(isset($common_names)) { echo esc_attr( $common_names ); } ?>" /> 

    コメント

    • そうです。 、'動作するコードを取得するまで、わざわざエスケープすることはありません。'動作するコードを取得します。 id = “9d6711ae97″>

    提案しましたが、私は'ちょっとしたコード美学フリークで、醜い主よ!ありがとうございます。

  • 私たちは違うと思います… 'データがエスケープされ、不要なものを導入しない限り、画面に印刷する必要はありません。複雑さにより、コードが"きれいに見えるようになります"。
  • LOL!私見フッターに医薬品のリンクがあるハッキングされたサイトは、そのコードよりも醜いと思います。 ;)
  • ' $custom["genus"][0]が"$genusよりもdiv> uglier "。 @mfields 'コードはそれ以外はまったく同じですが、'エラーは返されません。仕事を成し遂げるために必要なだけのコードを書いてください。それ以上、以下ではありません。
  • EAMannが指摘しているように、それは私が醜いと思うエスケープ-it ' s $ custom [" genus "] [0]。 'データが醜いので、'データをエスケープしないことを示唆しているわけではありません。:)
  • 回答

    この投稿でのTwitterのディスカッションから生まれた別の方法は、方法データを取得しています。 get_post_custom() は配列の配列を返し、これが問題の原因です。 。代わりに get_post_custom_values() を使用することをお勧めします:

    function meta_genus_species() { global $post; $genus = get_post_custom_values( "genus", $post->ID ); $species = get_post_custom_values( "species", $post->ID ); $etymology = get_post_custom_values( "etymology", $post->ID ); $family = get_post_custom_values( "family", $post->ID ); $common_names = get_post_custom_values( "common_names", $post->ID ); ?> <label>Genus:</label> <input name="genus" value="<?php if(isset($genus[0])) { echo esc_attr( $genus[0] ); } ?>" /> <label>Species:</label> <input name="species" value="<?php if(isset($species[0])) { echo esc_attr( $species ); } ?>" /> <p><label>Etymology:</label><br /> <textarea cols="50" rows="5" name="etymology"><?php if(isset($etymology[0])) { echo esc_attr( $etymology ); } ?></textarea></p> <label>Family:</label> <input name="family" value="<?php if(isset($family[0])) { echo esc_attr( $family ); } ?>" /> <label>Common Names:</label> <input name="common_names" value="<?php if(isset($common_names[0])) { echo esc_attr( $common_names ); } ?>" /> <?php } 

    カスタム値のより良い代替手段は、カスタムメタを使用することです。これらを一意として定義すると、カスタムメタをDBから取り戻すときに、メンバーが1つしかないインデックス付き配列ではなく、1つの値が得られます。考慮すべき点があります。

    コメント

    • EAMannに感謝します。'家に帰ったらカスタム値/メタを調べて、そのアプローチを検討します。

    コメントを残す

    メールアドレスが公開されることはありません。 * が付いている欄は必須項目です