Perché diavolo ricevo “ undefined_index ” errori?

Bene, sto sbattendo la testa contro un muro qui. Sono sicuro che sia qualcosa di incredibilmente semplice ma continuo a ricevere errori di indice indefiniti su tutti di queste variabili.

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 } 

ottengo questo per ogni variabile:

Avviso : Indice non definito: genere in […] sf-species-profiles.php on line 207

Qualche idea?

Commenti

  • quale riga di codice è la 207?
  • $ genus = $ custom [” genus “] [0];

Risposta

It ” è un errore PHP comune, di solito quando si tenta di accedere a un membro dellarray con una chiave inesistente;

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

Dovresti prima controllare la chiave con isset( $array["foobar"] );

AGGIORNAMENTO: In questo caso, manderei in un ciclo che imposta le variabili per te, controllando fo r lindice nel 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 

Commenti

  • Mi stai suggerendo di usare isset su ogni riga, come (pseudo) isset ($ custom [genus]) > $ genus = $ custom [genus]? Sicuramente questo ‘ è un modo diabolicamente prolisso di fare le cose. Avevo limpressione (e questa è la prima volta che ‘ ho riscontrato questo problema) che lutilizzo di isset su $ post e poi anche $ custom significherebbe che quelle variabili non sono ‘ t set / don ‘ t esiste a meno che non ci siano dati in $ post?
  • Niente affatto, ma in ogni caso tu non dovrebbe mai presumere che esista X. Vedi la mia risposta aggiornata 🙂

Risposta

Stai già chiamando isset () ogni volta che stampi il dati sullo schermo.

Perché non saltare questa 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 farlo quando si stampa un input:

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

Le assegnazioni di variabili extra non sono necessarie e stanno causando la generazione di avvisi qui.

BTW …

Devi eseguire lescape delloutput prima che venga stampato in 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 ); } ?>" /> 

Commenti

  • Sì , ‘ non mi preoccupo di scappare finché ‘ non ho un codice funzionante .. 🙂 Ho pensato di farlo nel modo in cui ‘ lho suggerito, ma ‘ un po un maniaco dellestetica del codice e caro Signore che sembra brutto! Grazie.
  • Immagino che siamo diversi allora … Non ‘ mi preoccupo di stampare sullo schermo a meno che i dati non siano sfuggiti e non introduco mai non necessari la complessità fa sembrare il codice ” carino “.
  • LOL! IMHO penso che i siti compromessi con link farmaceutici nel piè di pagina siano più brutti di quel codice. 😉
  • Non ‘ non rimanere bloccato se $custom["genus"][0] è ” uglier ” di $genus. Il codice @mfields ‘ è per il resto esattamente uguale al tuo, ma ‘ non restituirà un errore. Scrivi tutto il codice necessario per portare a termine un lavoro, né più né meno .
  • Heh, come sottolinea EAMann, non è ‘ t la fuga che considero brutta: è ‘ s $ custom [” genus “] [0] invece di $ genus a cui mi riferivo. ‘ certamente non sto suggerendo che ‘ t sfuggire ai dati perché li ha resi brutti .. 🙂

Risposta

Unalternativa, emersa da una discussione su Twitter su questo post, è cambiare come stai ottenendo i tuoi dati. get_post_custom() restituisce un array di array ed è ciò che ti causa mal di testa . Ti consiglio di utilizzare 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 } 

Unalternativa migliore ai valori personalizzati sarebbe lutilizzo di meta personalizzati. Puoi definirli come unici, quindi quando estrai il meta personalizzato dal DB avrai un valore anziché un array indicizzato con un solo membro. Solo qualcosa da considerare.

Commenti

  • Grazie EAMann. ‘ cercherò valori / meta personalizzati quando torno a casa, quindi contemplo questo approccio.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *