it-swarm.com.de

Warum um alles in der Welt erhalte ich undefinierte Indexfehler?

Richtig, ich stoße meinen Kopf hier gegen eine Wand. Ich bin mir sicher, dass es unglaublich einfach ist, aber ich bekomme immer wieder undefinierte Indexfehler für all diese Variablen.

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 bekomme das für jede Variable:

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

Irgendwelche Ideen?

4
dunc

Es ist ein häufiger PHP Fehler, normalerweise, wenn Sie versuchen, auf ein Arraymitglied mit einem nicht vorhandenen Schlüssel zuzugreifen.

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

Sie sollten zuerst mit isset( $array['foobar'] ); nach dem Schlüssel suchen

UPDATE: In diesem Fall würde ich in eine Schleife einspannen, die die Variablen für Sie einrichtet und dabei nach dem Index sucht.

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
5
TheDeadMedic

Sie rufen isset () bereits jedes Mal auf, wenn Sie die Daten auf dem Bildschirm drucken.

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 mache dies, wenn du eine Eingabe druckst:

<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 bewirken, dass hier Benachrichtigungen generiert werden.

Übrigens ...

Sie müssen Ihre Ausgabe schließen, bevor sie in einem Formular 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 ); } ?>" />
4
mfields

Eine Alternative, die aus einer Twitter-Diskussion zu diesem Beitrag hervorgegangen ist, besteht darin, wie 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 Metawerten. Sie können diese als eindeutig definieren. Wenn Sie das benutzerdefinierte Meta aus der Datenbank zurückerhalten, haben Sie einen Wert anstelle eines indizierten Arrays mit nur einem Mitglied. Nur etwas zu beachten.

2
EAMann