Miért kapok a Földön “ undefined_index ” hibákat?

Jól van, itt verem a fejem a falhoz. Biztos vagyok benne, hogy valami hihetetlenül egyszerű, de továbbra is meghatározatlan indexhibákat kapok ezeknek a változóknak.

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 } 

Ezt minden változóhoz megkapom:

Megjegyzés : Meghatározatlan index: nemzetség az […] sf-species-profiles.php-ben a 207. soron

Van ötlet?

Megjegyzések

  • melyik kódsor a 207. sor?
  • $ genus = $ custom [" nemzetség "] [0];

Válasz

It ” gyakori PHP hiba, általában amikor egy tömb tagot nem létező kulccsal próbál meg elérni;

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

Először ellenőrizze a kulcsot a isset( $array["foobar"] );

FRISSÍTÉS: Ebben az esetben megráznék egy ciklusban, amely beállítja az Ön számára a változókat, ellenőrizve a fo-t r az index a folyamat során.

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 

Megjegyzések

  • Azt javasolja, hogy használjam az vonal, például (ál) isset ($ custom [genus]) > $ genus = $ custom [genus]? Bizonyára ez ' egy pokolian hosszú szellemű dolog. Az volt a benyomásom (és most találkoztam először ' ezzel a problémával), hogy a $ post, majd a $ custom isset használata azt jelentené, hogy ezek a változók nem ' t set / don ' nem létezik, hacsak nincs adat a $ postban?
  • Egyáltalán nem – de akárhogy is, akkor soha nem szabad feltételezni, hogy létezik X. Tekintse meg frissített válaszomat 🙂

Válasz

Minden alkalommal, amikor nyomtatja a adatokat a képernyőre.

Miért ne hagyná ki ezt a részt:

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

és ezt tegye meg, amikor bemenetet nyomtat:

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

Az extra változó-hozzárendelésekre nincs szükség, és itt értesítéseket generálnak.

BTW …

El kell kerülnie a kimenetet, mielőtt azt formában kinyomtatná:

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

Megjegyzések

  • Igen , Nem fáradok el menekülni, amíg ' működőképes kódot kaptam .. 🙂 Azt fontolgattam, hogy úgy csinálom, ahogy te ' tettem javaslatot, de én ' egy kis kódesztétikai őrült és csúnyán néző kedves Uram! Köszönöm.
  • Azt hiszem, akkor különbözünk egymástól … Nem ' nem fárasztom a képernyőn történő nyomtatást, hacsak nem kerülök el az adatok elől, és soha nem vezetek be feleslegeset komplexitás tegye a kódot kinézetre " csinos ".
  • LOL! IMHO szerintem a láblécben található gyógyszerészeti linkekkel feltört webhelyek csúnyábbak ennél a kódnál. 😉
  • Don ' ne akassza fel, hogy $custom["genus"][0] " csúnyább ", mint $genus. A @mfields ' kód egyébként pontosan megegyezik a tiéddel, de nem nyert ' t hibát. Írjon annyi kódot, amennyire szüksége van a munka elvégzéséhez, se többet, se nem kevesebbet.
  • Heh, amint az EAMann rámutat, ez nem ' t a menekülés, amelyet csúfnak látok – ez ' s $ custom [" nemzetség "] [0], nem pedig a $ genus, amire utaltam. Én ' m egészen biztosan nem azt sugallom, hogy nem menek ' el az adatok elől, mert csúnyává tették .. 🙂

Válasz

Egy alternatíva, amely a bejegyzés Twitter-beszélgetéséből származik, megváltoztatja a hogyan megkapja az adatait. get_post_custom() tömbtömböt ad vissza, és ez okoz fejfájást . Javaslom a get_post_custom_values() használatát:

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 } 

Az egyéni értékek jobb alternatívája az egyéni meta használata. Ezeket egyedinek definiálhatja, majd amikor az egyéni metát visszakapja a DB-ből, akkor egy értéke lesz, nem pedig egy indexelt tömb, amelynek csak egy tagja van. Csak valamit érdemes figyelembe venni.

Megjegyzések

  • Köszönet EAMann-nak. I ' Ll az egyéni értékeket / metát kutatom, amikor hazaérek, és fontolóra veszem ezt a megközelítést.

Vélemény, hozzászólás?

Az email címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöltük