Varför får jag “ undefined_index ” fel?

Höger, jag slår mitt huvud mot en vägg här. Jag är säker på att det är något otroligt enkelt men jag får alltjämt odefinierade indexfel på alla av dessa variabler.

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 } 

Jag får detta för varje variabel:

Obs : Odefinierat index: släkt i […] sf-species-profiles.php på rad 207

Några idéer?

Kommentarer

  • vilken rad kod är rad 207?
  • $ genus = $ custom [" släkt "] [0];

Svar

Det ” ett vanligt PHP-fel, vanligtvis när du försöker komma åt en arraymedlem med en icke-existerande nyckel;

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

Du bör först söka efter nyckeln med isset( $array["foobar"] );

UPPDATERING: I det här fallet skulle jag chucka i en slinga som ställer in variablerna för dig, kontrollerar fo r indexet i processen.

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 

Kommentarer

  • Föreslår du att jag använder isset på varje linje, som (pseudo) isset ($ custom [genus]) > $ genus = $ custom [genus]? Visst att ' är ett helvetes långvarigt sätt att göra saker. Jag var under intrycket (och det här är första gången jag ' har stött på detta problem) att använda isset på $ post då också $ custom skulle innebära att dessa variabler inte är ' t set / don ' t existerar om det inte finns data i $ post?
  • Inte alls – men på något sätt, du ska aldrig anta att X finns. Se mitt uppdaterade svar 🙂

Svar

Du ringer redan isset () varje gång du skriver ut data till skärmen.

Varför inte bara hoppa över den här delen:

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

och gör detta när du skriver ut en ingång:

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

De extra variabeltilldelningarna behövs inte och orsakar att meddelanden genereras här.

BTW …

Du måste undkomma din utskrift innan den skrivs ut i en form:

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

Kommentarer

  • Ja , Jag bryr mig inte ' förrän jag ' har arbetskod .. 🙂 Jag funderade på att göra det som du ' har föreslagit, men jag ' är lite av en kodestetikfreak och kära Herre som ser ful ut! Tack.
  • Jag antar att vi är annorlunda än … Jag ' bryr mig inte om att skriva ut på skärmen såvida inte jag slipper data och jag introducerar aldrig onödigt komplexitet får koden att se " vacker ".
  • LOL! IMHO Jag tycker att hackade webbplatser med farmaceutiska länkar i sidfoten är fulare än den koden. 😉
  • Don ' tänka inte på att $custom["genus"][0] vara " fulare " än $genus. @mfields ' -koden är annars exakt samma som din, men den får ' inte tillbaka ett fel. Skriv så mycket kod som du behöver för att få ett jobb gjort, inte mer, inte mindre .
  • Heh, som EAMann påpekar, det är inte ' t det undkommande som jag ser som ful – det ' s $ custom [" släkt "] [0] snarare än $ genus som jag hänvisade till. Jag ' föreslår verkligen inte att jag ' inte skulle slippa data eftersom det gjorde det ful .. 🙂

Svar

Ett alternativ, som har kommit ut ur en Twitter-diskussion om detta inlägg, är att ändra hur du hämtar dina data. get_post_custom() returnerar en rad matriser och är vad som orsakar huvudvärk . Jag rekommenderar att du använder get_post_custom_values() istället:

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 } 

Ett bättre alternativ till anpassade värden är att använda anpassad meta. Du kan definiera dessa som unika, och när du får tillbaka den anpassade metan ur DB: n kommer du att ha ett värde snarare än en indexerad matris med bara en medlem. Bara något att tänka på.

Kommentarer

  • Tack EAMann. Jag ' Jag ska undersöka anpassade värden / meta när jag kommer hem och fundera över det tillvägagångssättet.

Lämna ett svar

Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *