Dlaczego na Ziemi dostaję “ undefined_index ” błędy?

Racja, walę głową w ścianę. Jestem pewien, że to coś niesamowicie prostego, ale wciąż dostaję niezdefiniowane błędy indeksu we wszystkich tych zmiennych.

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 } 

Otrzymuję to dla każdej zmiennej:

Uwaga : Undefined index: genus in […] sf-species-profiles.php on line 207

Jakieś pomysły?

Komentarze

  • który wiersz kodu to linia 207?
  • $ genus = $ custom [" rodzaj "] [0];

Odpowiedz

It ” to częsty błąd PHP, zwykle gdy próbujesz uzyskać dostęp do elementu tablicy z nieistniejącym kluczem;

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

Najpierw powinieneś sprawdzić klucz za pomocą isset( $array["foobar"] );

AKTUALIZACJA: W tym przypadku rzuciłbym w pętli, która ustawia zmienne za Ciebie, sprawdzając fo r indeksu w trakcie.

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 

Komentarze

  • Czy sugerujesz, żebym używał isset na każdym linia, na przykład (pseudo) isset ($ custom [genus]) > $ genus = $ custom [genus]? Z pewnością ' to piekielnie długotrwały sposób na robienie rzeczy. Odniosłem wrażenie (i po raz pierwszy ' napotkałem ten problem), że użycie isset w $ post, a następnie $ custom oznaczałoby, że te zmienne nie są ' t set / don ' nie istnieje, jeśli nie ma danych w $ post?
  • Wcale nie – ale tak czy inaczej, nigdy nie należy zakładać, że X istnieje. Zobacz moją zaktualizowaną odpowiedź 🙂

Odpowiedź

Już dzwonisz do isset () za każdym razem, gdy drukujesz dane na ekran.

Dlaczego po prostu nie pominąć tej części:

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

i zrobić to podczas drukowania danych wejściowych:

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

Dodatkowe przypisania zmiennych nie są potrzebne i powodują tutaj generowanie powiadomień.

Przy okazji …

Musisz zmienić wyjście, zanim zostanie wydrukowane w postaci:

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

Komentarze

  • Tak , Nie ' nie zawracam sobie głowy ucieczką, dopóki ' nie dostanę działającego kodu .. 🙂 Rozważałem zrobienie tego tak, jak ty ' zasugerowałem, ale ' mam trochę maniaka estetyki kodu i drogi Panie, który wygląda brzydko! Dziękuję.
  • Myślę, że wtedy jesteśmy inni … Nie ' nie zawracam sobie głowy drukowaniem na ekranie, chyba że dane zostaną usunięte i nigdy nie wprowadzam niepotrzebnych złożoność sprawia, że kod wygląda " całkiem ".
  • LOL! IMHO Myślę, że zaatakowane witryny z linkami farmaceutycznymi w stopce są brzydsze niż ten kod. 😉
  • Nie ' nie rozłączaj się na $custom["genus"][0] będąc " brzydszy " niż $genus. Poza tym kod @mfields ' jest dokładnie taki sam jak Twój, ale nie ' nie zwrócił błędu. Napisz tyle kodu, ile potrzebujesz, aby wykonać zadanie, nie więcej, nie mniej .
  • Hej, jak wskazuje EAMann, to nie jest ' t ucieczka, którą uważam za brzydką – to ' s $ custom [" rodzaj "] [0] zamiast $ genus, o którym mówiłem. ' z całą pewnością nie sugeruję, że nie ' nie uniknę danych, ponieważ sprawiły, że były brzydkie .. 🙂

Odpowiedź

Alternatywą, która wyszła z dyskusji na Twitterze w tym poście, jest zmiana sposobu otrzymujesz swoje dane. get_post_custom() zwraca tablicę tablic i właśnie to powoduje bóle głowy . Zalecałbym zamiast tego używanie 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 } 

Lepszą alternatywą dla wartości niestandardowych byłoby użycie niestandardowej meta. Możesz zdefiniować je jako unikalne, a gdy otrzymasz niestandardową metę z powrotem z bazy danych, będziesz mieć jedną wartość zamiast indeksowanej tablicy z tylko jednym elementem. Tylko coś do rozważenia.

Komentarze

  • Dziękuję EAMann. ' Będę badał niestandardowe wartości / meta, kiedy wrócę do domu, a następnie rozważę takie podejście.

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *