Hvorfor får jeg “ undefined_index ” fejl i alverden?

Højre, jeg slår mit hoved mod en mur her. Jeg er sikker på, at det er noget utroligt simpelt, men jeg får stadig udefinerede indeksfejl på alle af disse 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 } 

Jeg får dette for hver variabel:

Bemærk : Udefineret indeks: slægt i […] sf-species-profiles.php on line 207

Er der nogen ideer?

Kommentarer

  • hvilken linje kode er linje 207?
  • $ genus = $ custom [" slægt "] [0];

Svar

Det ” en almindelig PHP-fejl, normalt når du prøver at få adgang til et array-medlem med en ikke-eksisterende nøgle;

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

Du bør først kontrollere nøglen med isset( $array["foobar"] );

UPDATE: I dette tilfælde ville jeg chuck i en sløjfe, der opsætter variablerne for dig, kontrollerer fo r indekset undervejs.

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

  • Foreslår du, at jeg bruger isset på hver linje, såsom (pseudo) isset ($ custom [slægt]) > $ genus = $ custom [slægt]? Sikkert at ' er en helvedes langvarig måde at gøre tingene på. Jeg var under det indtryk (og det er første gang, jeg ' har stødt på dette problem), at brug af isset på $ post, så ville også $ custom betyde, at disse variabler ikke er ' t set / don ' t findes, medmindre der er data i $ post?
  • Overhovedet ikke – men uanset hvad, du bør aldrig antage, at X findes. Se mit opdaterede svar 🙂

Svar

Du ringer allerede til isset () hver gang du udskriver data til skærmen.

Hvorfor ikke bare springe denne del over:

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

og gøre dette, når du udskriver en input:

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

De ekstra variabeltildelinger er ikke nødvendige og forårsager meddelelser, der genereres her.

BTW …

Du skal undslippe dit output, før det udskrives 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 , Jeg ' gider ikke at flygte, indtil jeg ' har fået arbejdskode .. 🙂 Jeg overvejede at gøre det som du ' har foreslået, men jeg ' er lidt af en kode-æstetisk freak og kære Lord, der ser grim ud! Tak.
  • Jeg gætter på, at vi er forskellige så … Jeg ' gider ikke at udskrive på skærmen, medmindre jeg slipper for dataene, og jeg introducerer aldrig unødvendige kompleksitet får koden til at se " smuk ".
  • LOL! IMHO Jeg synes, at hackede sider med farmaceutiske links i sidefoden er grimere end den kode. 😉
  • Don ' t hæng på, at $custom["genus"][0] er " grimere " end $genus. @mfields ' -koden er ellers nøjagtig den samme som din, men den vinder ' t at returnere en fejl. Skriv så meget kode som du har brug for for at få et job udført, ikke mere ikke mindre .
  • Heh, som EAMann påpeger, er det ikke ' t det undslippe, som jeg ser som grimt – det ' s $ custom [" slægt "] [0] snarere end $ slægten, som jeg henviste til. Jeg ' antyder bestemt ikke, at jeg ikke ville ' ikke undslippe data, fordi det gjorde det grimt .. 🙂

Svar

Et alternativ, der er kommet ud af en Twitter-diskussion om dette indlæg, er at ændre hvordan du får dine data. get_post_custom() returnerer en række arrays og er det, der forårsager dig hovedpine . Jeg vil anbefale at bruge get_post_custom_values() i stedet:

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 } 

Et bedre alternativ til brugerdefinerede værdier ville være at bruge tilpasset meta. Du kan definere disse som unikke, så når du får den brugerdefinerede meta tilbage fra DBet, har du en værdi i stedet for et indekseret array med kun ét medlem. Bare noget at overveje.

Kommentarer

  • Tak EAMann. Jeg ' Jeg undersøger brugerdefinerede værdier / meta, når jeg kommer hjem, og overvej den tilgang.

Skriv et svar

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *