web-dev-qa-db-fra.com

Pourquoi diable ai-je des erreurs "d'index non défini"?

D'accord, je me cogne la tête contre un mur ici. Je suis sûr que c'est quelque chose d'incroyablement simple mais je continue à avoir des erreurs d'index non définies sur toutes ces variables.

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
}

Je reçois ceci pour chaque variable:

Notice: Index non défini: genre dans [...] sf-especes-profiles.php à la ligne 207

Des idées?

4
dunc

Il s'agit d'une erreur courante PHP, généralement lorsque vous essayez d'accéder à un membre du tableau avec une clé inexistante.

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

Vous devriez d'abord vérifier la clé avec isset( $array['foobar'] );

UPDATE: Dans ce cas, je voudrais lancer une boucle qui configure les variables pour vous, en vérifiant l'index dans le processus.

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

Vous appelez déjà isset () chaque fois que vous imprimez les données à l'écran.

Pourquoi ne pas sauter cette partie:

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

et le faire lorsque vous imprimez une entrée:

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

Les affectations de variables supplémentaires ne sont pas nécessaires et entraînent la génération d’avis ici.

BTW ...

Vous devez échapper à votre sortie avant son impression dans un formulaire:

<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

Une alternative, issue d’une discussion Twitter sur ce post, est de changer comment vous obtenez vos données. get_post_custom() retourne un tableau de tableaux et est ce qui vous cause des maux de tête. Je recommanderais d'utiliser get_post_custom_values() à la place:

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
}

Une meilleure alternative aux valeurs personnalisées serait d'utiliser des méta personnalisées. Vous pouvez les définir comme uniques. Lorsque vous récupérerez la méta personnalisée de la base de données, vous obtiendrez une valeur plutôt qu'un tableau indexé avec un seul membre. Juste quelque chose à considérer.

2
EAMann