Por que diabos estou recebendo “ undefined_index ” erros?

Certo, estou batendo minha cabeça contra uma parede aqui. Tenho certeza de que é algo incrivelmente simples, mas continuo recebendo erros de índice indefinido em todos dessas variáveis.

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 } 

Eu obtenho isso para cada variável:

Observe : Índice indefinido: gênero em […] sf-species-profiles.php na linha 207

Alguma idéia?

Comentários

  • qual linha de código é a linha 207?
  • $ genus = $ custom [” genus “] [0];

Resposta

Isso ” um erro comum de PHP, geralmente quando você tenta acessar um membro da matriz com uma chave inexistente;

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

Você deve verificar a chave primeiro com isset( $array["foobar"] );

ATUALIZAÇÃO: Nesse caso, eu jogaria em um loop que configura as variáveis para você, verificando r o índice no processo.

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 

Comentários

  • Você está sugerindo que eu use isset em todos linha, como (pseudo) isset ($ custom [genus]) > $ genus = $ custom [genus]? Certamente essa ‘ é uma maneira infernalmente prolixa de fazer as coisas. Fiquei com a impressão (e esta é a primeira vez que ‘ encontrei esse problema) que usar isset em $ post e $ custom significaria que essas variáveis não são ‘ t set / don ‘ não existe a menos que haja dados em $ post?
  • De forma alguma – mas de qualquer forma, você nunca deve supor que X existe. Veja minha resposta atualizada 🙂

Resposta

Você já está chamando isset () cada vez que está imprimindo o dados para a tela.

Por que não pular esta parte:

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

e fazer isso ao imprimir uma entrada:

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

As atribuições de variáveis extras não são necessárias e estão causando a geração de avisos aqui.

A propósito …

Você precisa escapar de sua saída antes que ela seja impressa em um formulário:

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

Comentários

  • Sim , Eu não ‘ não me incomodo de escapar até que ‘ tenha o código funcionando .. 🙂 Pensei em fazer do jeito que você ‘ Eu sugeri, mas eu ‘ sou um pouco louco por estética de código e querido Senhor que parece feio! Obrigado.
  • Acho que somos diferentes então … Eu não ‘ não me preocupo em imprimir na tela a menos que os dados sejam escapados e nunca introduza itens desnecessários complexidade faz o código parecer ” bonito “.
  • LOL! IMHO Acho que sites hackeados com links farmacêuticos no rodapé são mais feios que esse código. 😉
  • Não ‘ não se prenda a $custom["genus"][0] ser ” mais uglier ” do que $genus. @mfields ‘ código é exatamente igual ao seu, mas não ‘ não retornou um erro. Escreva a quantidade de código necessária para realizar um trabalho, nem mais, nem menos .
  • Heh, como EAMann aponta, não é ‘ o escape que considero feio – é ‘ s $ custom [” gênero “] [0] em vez de $ genus a que me referia. Eu ‘ certamente não estou sugerindo que não ‘ escaparia dos dados porque os tornavam feios .. 🙂

Resposta

Uma alternativa, que surgiu de uma discussão no Twitter nesta postagem, é mudar como você está obtendo seus dados. get_post_custom() retorna uma matriz de matrizes e é o que está causando dores de cabeça . Eu recomendaria usar get_post_custom_values() em vez disso:

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 } 

A melhor alternativa aos valores personalizados seria usar meta personalizada. Você pode defini-los como únicos, então, quando obter o meta personalizado de volta do banco de dados, você terá um valor em vez de uma matriz indexada com apenas um membro. Apenas algo a considerar.

Comentários

  • Obrigado EAMann. Eu ‘ pesquisarei valores / meta personalizados quando chegar em casa e considerarei essa abordagem.

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *