Warum um alles in der Welt erhalte ich “ undefined_index ” Fehler?

Richtig, ich stoße hier mit dem Kopf gegen eine Wand. Ich bin mir sicher, dass es etwas unglaublich Einfaches ist, aber ich bekomme immer wieder undefinierte Indexfehler

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 } 

Ich erhalte dies für jede Variable:

Hinweis : Undefinierter Index: Gattung in […] sf-species-profile.php in Zeile 207

Irgendwelche Ideen?

Kommentare

  • Welche Codezeile ist Zeile 207?
  • $ genus = $ custom [“ Gattung „] [0];

Antwort

It “ Ein häufiger PHP-Fehler, normalerweise, wenn Sie versuchen, mit einem nicht vorhandenen Schlüssel auf ein Array-Mitglied zuzugreifen:

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

Sie sollten zuerst mit isset( $array["foobar"] );

UPDATE: In diesem Fall würde ich schmeißen in einer Schleife, die die Variablen für Sie einrichtet, überprüfen Sie fo r den Index im Prozess.

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 

Kommentare

  • Schlagen Sie vor, ich verwende isset für jeden Zeile wie (Pseudo) isset ($ custom [genus]) > $ genus = $ custom [genus]? Sicherlich ist ‚ eine höllisch langatmige Art, Dinge zu tun. Ich hatte den Eindruck (und dies ist das erste Mal, dass ich ‚ auf dieses Problem gestoßen bin), dass die Verwendung von isset auf $ post und dann auch $ custom bedeuten würde, dass diese Variablen nicht ‚ t set / don ‚ existiert nur, wenn Daten in $ post vorhanden sind?
  • Überhaupt nicht – aber so oder so, Sie sollte niemals annehmen, dass X existiert. Siehe meine aktualisierte Antwort 🙂

Antwort

Sie rufen bereits jedes Mal isset () auf, wenn Sie das drucken Daten auf den Bildschirm.

Warum nicht einfach diesen Teil überspringen:

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

und dies tun, wenn Sie eine Eingabe drucken:

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

Die zusätzlichen Variablenzuweisungen werden nicht benötigt und führen dazu, dass hier Benachrichtigungen generiert werden.

Übrigens …

Sie müssen Ihre Ausgabe maskieren, bevor sie in einer Form gedruckt wird:

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

Kommentare

  • Ja , ‚ macht sich nicht die Mühe zu fliehen, bis ich ‚ Arbeitscode habe .. 🙂 Ich habe darüber nachgedacht, es so zu machen, wie Sie ‚ habe vorgeschlagen, aber ich ‚ bin ein bisschen ein Code-Ästhetik-Freak und lieber Herr, der hässlich aussieht! Vielen Dank.
  • Ich denke, wir sind dann anders … Ich ‚ kümmere mich nicht darum, auf dem Bildschirm zu drucken, es sei denn, die Daten werden maskiert und ich führe sie niemals unnötig ein Komplexität lässt Code aussehen “ hübsch „.
  • LOL! IMHO Ich denke, gehackte Websites mit pharmazeutischen Links in der Fußzeile sind hässlicher als dieser Code. 😉
  • ‚ häng dich nicht auf, wenn $custom["genus"][0] “ hässlicher “ als $genus. @mfields ‚ Code ist ansonsten genau der gleiche wie Ihr Code, ‚ gibt jedoch keinen Fehler zurück. Schreiben Sie so viel Code, wie Sie benötigen, um einen Job zu erledigen, nicht mehr und nicht weniger.

Heh, wie EAMann betont, ist es nicht ‚ t die Flucht, die ich als hässlich betrachte – es ‚ ist $ custom [“ Gattung „] [0] anstelle der Gattung $, auf die ich mich bezog. Ich ‚ schlage mit Sicherheit nicht vor, dass ich ‚ Daten nicht entkommen würde, weil sie dadurch hässlich wurden .. 🙂

Antwort

Eine Alternative, die aus einer Twitter-Diskussion zu diesem Beitrag hervorgegangen ist, besteht darin, wie zu ändern em> Sie erhalten Ihre Daten. get_post_custom() gibt ein Array von Arrays zurück und verursacht Kopfschmerzen . Ich würde empfehlen, stattdessen get_post_custom_values() zu verwenden:

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 } 

Eine bessere Alternative zu benutzerdefinierten Werten wäre die Verwendung von benutzerdefinierten Metas. Sie können diese als eindeutig definieren. Wenn Sie das benutzerdefinierte Meta wieder aus der Datenbank entfernen, haben Sie einen Wert anstelle eines indizierten Arrays mit nur einem Mitglied. Nur etwas zu beachten.

Kommentare

  • Danke EAMann. Ich ‚ werde benutzerdefinierte Werte / Meta untersuchen, wenn ich nach Hause komme, und dann über diesen Ansatz nachdenken.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.