Pourquoi diable ai-je des erreurs “ undefined_index ”?

Bien, je me cogne la tête contre un mur ici. Je suis sûr que cest quelque chose dincroyablement simple mais jobtiens toujours des erreurs dindex indéfinies sur tout de 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 } 

Jobtiens ceci pour chaque variable:

Remarque : Index non défini: genre dans […] sf-species-profiles.php en ligne 207

Des idées?

Commentaires

  • quelle ligne de code est la ligne 207?
  • $ genus = $ custom [ » genus « ] [0];

Réponse

It  » une erreur PHP courante, généralement lorsque vous essayez daccéder à un membre du tableau avec une clé inexistante;

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

Vous devez dabord vérifier la clé avec isset( $array["foobar"] );

MISE À JOUR: Dans ce cas, je voudrais chuck dans une boucle qui configure les variables pour vous, en vérifiant fo r lindex 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 

Commentaires

  • Proposez-vous que jutilise isset sur chaque ligne, telle que (pseudo) isset ($ custom [genus]) > $ genus = $ custom [genus]? Cette ‘ est sûrement une façon infernale de faire les choses. Javais limpression (et cest la première fois que je ‘ ai rencontré ce problème) quutiliser isset sur $ post puis aussi $ custom signifierait que ces variables ne sont pas ‘ t set / don ‘ t exister à moins quil y ait des données dans $ post?
  • Pas du tout – mais de toute façon, vous ne doit jamais supposer que X existe. Voir ma réponse mise à jour 🙂

Réponse

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

Pourquoi ne pas simplement 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 provoquent la génération davis ici.

BTW …

Vous devez échapper à votre sortie avant quelle ne soit imprimée sous la forme:

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

Commentaires

  • Ouais , Je ne ‘ pas la peine de méchapper jusquà ce que ‘ ait un code fonctionnel .. 🙂 Jai envisagé de le faire comme vous ‘ jai suggéré, mais je ‘ un peu un monstre de code-esthétique et cher Seigneur qui a lair moche! Merci.
  • Je suppose que nous sommes différents alors … Je ne ‘ pas la peine d’imprimer à l’écran sauf si les données sont échappées et je n’introduis jamais inutile la complexité donne au code un aspect  » joli « .
  • LOL! IMHO Je pense que les sites piratés avec des liens pharmaceutiques dans le pied de page sont plus laids que ce code. 😉
  • Ne ‘ t être raccroché sur $custom["genus"][0] étant  » uglier  » que $genus. Le code @mfields ‘ est sinon exactement le même que le vôtre, mais il ne retournera ‘ une erreur. Écrivez autant de code que nécessaire pour faire un travail, ni plus, ni ni moins .
  • Hé, comme le souligne EAMann, ce n’est pas ‘ t la fuite que je considère comme moche – elle ‘ s $ custom [ » genre « ] [0] plutôt que $ genus auquel je faisais référence. Je ‘ ne suggère certainement pas que je ‘ t échapper aux données parce que cela les rendait moche .. 🙂

Réponse

Une alternative, issue dune discussion Twitter sur ce post, consiste à changer comment vous « récupérez vos données. get_post_custom() renvoie un tableau de tableaux et ce qui vous cause des maux de tête . Je recommanderais dutiliser à la place 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 } 

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

Commentaires

  • Merci EAMann. Je ‘ rechercherai des valeurs personnalisées / meta quand je rentrerai à la maison, puis envisagerai cette approche.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *