Proč na Zemi dostávám chyby “ undefined_index ”?

Správně, tady si bouchám hlavu o zeď. Jsem si jistý, že je to něco neuvěřitelně jednoduchého, ale stále dostávám nedefinované chyby indexu u všech z těchto proměnných.

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 } 

Získávám to pro každou proměnnou:

Upozornění : Nedefinovaný index: rod v […] sf-species-profiles.php na řádku 207

Nějaké nápady?

Komentáře

  • který řádek kódu je řádek 207?
  • $ genus = $ custom [" rod "] [0];

Odpověď

To “ běžná chyba PHP, obvykle při pokusu o přístup k členu pole s neexistujícím klíčem;

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

Nejprve byste měli zkontrolovat klíč pomocí isset( $array["foobar"] );

UPDATE: V tomto případě bych upoutal ve smyčce, která nastavuje proměnné za vás, kontrola fo r v procesu.

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 

Komentáře

  • Navrhujete, abych použil isset na každém řádek, například (pseudo) isset ($ custom [rod]) > $ genus = $ custom [rod]? Určitě to je ' pekelně dlouhý způsob, jak dělat věci. Byl jsem pod dojmem (a toto je poprvé, co jsem ' narazil na tento problém), že použití isset na $ post pak také $ custom by znamenalo, že tyto proměnné nejsou ' t set / don ' neexistuje, pokud v $ post nejsou data?
  • Vůbec ne – ale v každém případě vy nikdy bychom neměli předpokládat, že X existuje. Zobrazit moji aktualizovanou odpověď 🙂

Odpověď

Již voláte isset () pokaždé, když tisknete data na obrazovku.

Proč tuto část prostě nevynechat:

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

a udělat to při tisku vstupu:

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

Přiřazení dalších proměnných nejsou nutná a způsobují generování upozornění zde.

BTW …

Před výstupem ve formátu musíte uniknout:

<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 ); } ?>" /> 

Komentáře

  • Ano , ' neobtěžuji se s útěkem, dokud nedostanu ' pracovní kód .. 🙂 Uvažoval jsem, že to udělám tak, jak to id = „9d6711ae97″>

navrhl jsem, ale ' jsem trochu zběsilý estetický a drahý Pane, který vypadá ošklivě! Děkuji.

  • Myslím, že jsme odlišní, než … Neobtěžuji tisk
  • tiskem na obrazovku, pokud nebudu unikat data a nikdy nezavádím zbytečné díky složitosti vypadá kód " hezký ".

  • LOL! IMHO si myslím, že napadené stránky s farmaceutickými odkazy v zápatí jsou ošklivější než ten kód. 😉
  • Ne ' nezavěšujte se na $custom["genus"][0] " ošklivější " než $genus. Kód @mfields ' je jinak úplně stejný jako váš, ale ' nevrátí chybu. Napište tolik kódu, kolik potřebujete k dokončení práce, nic víc, nic méně .
  • Heh, jak zdůrazňuje EAMann, není to ' t útěk, který považuji za ošklivý – je to ' s $ custom [" rod "] [0] spíše než $ genus, o kterém jsem mluvil. ' Určitě nenavrhuji, že bych ' neunikl datům, protože to ošklivě .. 🙂
  • Odpověď

    Alternativou, která vyplynula z diskuse na Twitteru o tomto příspěvku, je změna jak získáváte svá data. get_post_custom() vrací řadu polí a způsobuje vám bolesti hlavy . Místo toho bych doporučil použít 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 } 

    Lepší alternativou k vlastním hodnotám by bylo použití vlastních meta. Můžete je definovat jako jedinečné, takže když dostanete vlastní meta zpět z DB, budete mít spíše jednu hodnotu než indexované pole pouze s jedním členem. Něco, co je třeba zvážit.

    Komentáře

    • Díky EAMann. ' budu zkoumat vlastní hodnoty / meta, až se vrátím domů, a uvažuji o tomto přístupu.

    Napsat komentář

    Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *