¿Por qué diablos recibo “ undefined_index ” errores?

Correcto, me estoy golpeando la cabeza contra una pared. Estoy seguro de que es algo increíblemente simple, pero sigo obteniendo errores de índice indefinidos en todos de estas 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 } 

Obtengo esto para cada variable:

Aviso : Índice no definido: género en […] sf-species-profiles.php en la línea 207

¿Alguna idea?

Comentarios

  • ¿Qué línea de código es la línea 207?
  • $ genus = $ custom [» genus «] [0];

Responder

Eso » Es un error común de PHP, generalmente cuando intenta acceder a un miembro de la matriz con una clave inexistente;

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

Primero debe verificar la clave con isset( $array["foobar"] );

ACTUALIZACIÓN: En este caso, tiraría en un bucle que configura las variables por usted, comprobando fo r el índice en el proceso.

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 

Comentarios

  • ¿Estás sugiriendo que use isset en cada línea, como (pseudo) isset ($ custom [genus]) > $ genus = $ custom [genus]? Seguramente esa ‘ es una forma terriblemente larga de hacer las cosas. Tenía la impresión (y esta es la primera vez que ‘ he encontrado este problema) de que usar isset en $ post y luego también $ custom significaría que esas variables no son ‘ t set / don ‘ ¿t existe a menos que haya datos en $ post?
  • Para nada, pero de cualquier manera, nunca debe suponer que X existe. Vea mi respuesta actualizada 🙂

Answer

Ya está llamando a isset () cada vez que imprime el datos a la pantalla.

¿Por qué no simplemente omitir 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]; } 

y hacer esto cuando imprima una entrada:

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

Las asignaciones de variables adicionales no son necesarias y están provocando que se generen avisos aquí.

Por cierto …

Necesita escapar de su salida antes de que se imprima en un formato:

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

Comentarios

  • Sí , No ‘ t me molesto en escapar hasta que ‘ tenga un código que funcione .. 🙂 Contemplé hacerlo de la manera que tú ‘ he sugerido, pero yo ‘ soy un fanático de la estética del código y ¡querido Señor que se ve feo! Gracias.
  • Supongo que somos diferentes entonces … No ‘ t me molesto en imprimir en la pantalla a menos que los datos se hayan escapado y nunca introduzca datos innecesarios La complejidad hace que el código se vea » bonito «.
  • ¡LOL! En mi humilde opinión, creo que los sitios pirateados con enlaces farmacéuticos en el pie de página son más feos que ese código. 😉
  • No ‘ t se cuelgue de $custom["genus"][0] siendo » más feo » que $genus. El código de @mfields ‘ es exactamente el mismo que el suyo, pero no ‘ devuelve un error. Escriba todo el código que necesite para hacer un trabajo, ni más, ni menos .
  • Je, como señala EAMann, no es ‘ t el escape que veo como feo – es ‘ s $ custom [» genus «] [0] en lugar de $ genus al que me refería. Yo ‘ ciertamente no estoy sugiriendo que yo no ‘ t escapar de los datos porque los hace feos .. 🙂

Respuesta

Una alternativa, que ha surgido de una discusión en Twitter sobre esta publicación, es cambiar cómo está obteniendo sus datos. get_post_custom() devuelve una matriz de matrices y es lo que le está causando dolores de cabeza . Recomendaría usar get_post_custom_values() en su lugar:

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 } 

Una mejor alternativa a los valores personalizados sería utilizar metadatos personalizados. Puede definirlos como únicos, luego, cuando recupere el meta personalizado de la base de datos, tendrá un valor en lugar de una matriz indexada con un solo miembro. Solo algo a considerar.

Comentarios

  • Gracias EAMann. Yo ‘ investigaré valores / metadatos personalizados cuando llegue a casa y luego contemplaré ese enfoque.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *