De ce pe Pământ primesc “ undefined_index ” erori?

Așa este, mă lovesc cu capul de un perete aici. Sunt sigur că este ceva incredibil de simplu, dar continuu să primesc erori nedefinite de index pe toate dintre aceste variabile.

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 } 

Obțin acest lucru pentru fiecare variabilă:

Notificare : Indice nedefinit: gen în […] sf-species-profiles.php pe linia 207

Ai vreo idee?

Comentarii

  • care linie de cod este linia 207?
  • $ genus = $ personalizat [” gen „] [0];

Răspuns

It ” o eroare PHP comună, de obicei atunci când încercați să accesați un membru al matricei cu o cheie inexistentă;

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

Ar trebui să verificați mai întâi cheia cu isset( $array["foobar"] );

ACTUALIZARE: În acest caz, aș arunca într-o buclă care setează variabilele pentru dvs., verificând fo r indexul în proces.

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 

Comentarii

  • Sugerați să folosesc isset pe fiecare linie, cum ar fi (pseudo) isset ($ custom [genus]) > $ genus = $ custom [genus]? Cu siguranță că ‘ este un mod infernal de a face lucrurile cu un suflet lung. Am avut impresia (și aceasta este prima dată când ‘ am întâlnit această problemă) că folosind isset pe $ post, atunci și $ custom ar însemna că acele variabile nu sunt ‘ t set / don ‘ nu există decât dacă există date în $ post?
  • Deloc – dar în orice caz, tu nu ar trebui să presupunem că X există. Vedeți răspunsul meu actualizat 🙂

Răspuns

Sunăți deja isset () de fiecare dată când tipăriți date pe ecran.

De ce să nu omiteți această 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]; } 

și faceți acest lucru când imprimați o intrare:

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

Alocările de variabile suplimentare nu sunt necesare și determină generarea de notificări aici.

BTW …

Trebuie să scăpați de rezultatul dvs. înainte de a fi tipărit într-un formular:

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

Comentarii

  • Da , ‘ nu mă deranjez să scap până când ‘ am primit codul de lucru .. 🙂 Am contemplat să o fac așa cum ‘ am sugerat, dar eu ‘ sunt un ciudat de cod-estetic ciudat și dragă Lord care arată urât! Vă mulțumim.
  • Cred că suntem diferiți atunci … Nu ‘ mă deranjez să imprim pe ecran, cu excepția cazului în care datele sunt scăpate și nu introduc niciodată inutile complexitatea face codul să arate ” destul de „.
  • LOL! IMHO Cred că site-urile piratate cu linkuri farmaceutice în subsol sunt mai urâte decât acel cod. 😉
  • Nu ‘ nu te închide pe $custom["genus"][0] fiind ” mai urât ” decât $genus. @mfields ‘ codul este altfel exact același cu al dvs., dar nu a returnat o ‘ o eroare. Scrieți cât de mult cod aveți nevoie pentru a face o treabă, nu mai mult, nu mai puțin .
  • Heh, așa cum subliniază EAMann, nu este ‘ t evadarea pe care o văd urâtă – este ‘ s $ custom [” gen ] [0] mai degrabă decât $ gen la care mă refeream. ‘ cu siguranță nu sugerez că nu ‘ ar scăpa de date deoarece le-a făcut urât .. 🙂

Răspuns

O alternativă, care a ieșit dintr-o discuție pe Twitter pe această postare, este schimbarea cum vă> primiți datele. get_post_custom() returnează o serie de tablouri și este ceea ce vă provoacă dureri de cap . Aș recomanda utilizarea get_post_custom_values() în schimb:

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 } 

O alternativă mai bună la valorile personalizate ar fi utilizarea meta personalizate. Puteți să le definiți ca fiind unice, atunci când veți recupera meta personalizată din DB, veți avea o valoare mai degrabă decât o matrice indexată cu un singur membru. Doar ceva de luat în considerare.

Comentarii

  • Mulțumesc EAMann. ‘ voi cerceta valorile personalizate / meta când ajung acasă, apoi mă gândesc la această abordare.

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *