Hvorfor får jeg “ undefined_index ” feil?

Ikke sant, jeg slår hodet mitt mot en vegg her. Jeg er sikker på at det er noe utrolig enkelt, men jeg får stadig udefinerte indeksfeil på alle av disse variablene.

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:

Merk : Udefinert indeks: slekt i […] sf-species-profiles.php på linje 207

Noen ideer?

Kommentarer

  • hvilken kodelinje er linje 207?
  • $ genus = $ custom [" slekt "] [0];

Svar

Det » en vanlig PHP-feil, vanligvis når du prøver å få tilgang til et array-medlem med en ikke-eksisterende nøkkel;

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

Du bør først se etter nøkkelen med isset( $array["foobar"] );

OPPDATERING: I dette tilfellet ville jeg chuck i en løkke som setter opp variablene for deg, sjekker fo r indeksen i prosessen.

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 bruker isset på hver linje, for eksempel (pseudo) isset ($ custom [genus]) > $ genus = $ custom [genus]? Sikkert at ' er en helvetes langvarig måte å gjøre ting på. Jeg var under inntrykk (og dette er første gang jeg ' har opplevd dette problemet) at bruk av isset på $ post, og også $ custom vil bety at disse variablene ikke er ' t set / don ' t eksisterer med mindre det er data i $ post?
  • Ikke i det hele tatt – men uansett, du skal aldri anta at X eksisterer. Se det oppdaterte svaret mitt 🙂

Svar

Du ringer allerede til isset () hver gang du skriver ut data til skjermen.

Hvorfor ikke bare hoppe over denne 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]; } 

og gjøre dette når du skriver ut en inngang:

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

De ekstra variabeltildelingene er ikke nødvendige og forårsaker merknader her.

BTW …

Du må unnslippe utdataene dine før de skrives 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 , Jeg gidder ikke ' å rømme til jeg ' har fått arbeidskode .. 🙂 Jeg tenkte å gjøre det slik du ' har foreslått, men jeg ' er litt av en kode-estetikkfreak og kjære Lord som ser stygg ut! Takk.
  • Jeg antar at vi er forskjellige da … Jeg ' gidder ikke skrive ut på skjermen med mindre jeg slipper dataene og jeg introduserer aldri unødvendig kompleksitet får koden til å se " pen ".
  • LOL! IMHO Jeg synes hackede nettsteder med farmasøytiske lenker i bunnteksten er styggere enn den koden. 😉
  • Ikke ' Ikke heng deg på at $custom["genus"][0] er " styggere " enn $genus. @mfields ' -koden er ellers nøyaktig den samme som din, men den vil ' ikke returnere en feil. Skriv så mye kode som du trenger for å få gjort en jobb, ikke mer, ikke mindre .
  • Heh, som EAMann påpeker, det er ikke ' t det rømming som jeg ser på som stygt – det ' s $ custom [" slekt "] [0] i stedet for $ slekten som jeg refererte til. Jeg ' antyder absolutt ikke at jeg ikke ville ' ikke unnslippe data fordi det gjorde det stygt .. 🙂

Svar

Et alternativ, som har kommet ut av en Twitter-diskusjon på dette innlegget, er å endre hvordan du får dataene dine. get_post_custom() returnerer en rekke matriser og er det som forårsaker hodepine . Jeg vil anbefale å bruke 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 tilpassede verdier ville være å bruke tilpasset meta. Du kan definere disse som unike, og når du får den tilpassede metaen ut av DB-en, vil du ha en verdi i stedet for en indeksert matrise med bare ett medlem. Bare noe å vurdere.

Kommentarer

  • Takk EAMann. Jeg ' Jeg vil undersøke egendefinerte verdier / meta når jeg kommer hjem, så tenk på den tilnærmingen.

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *