Waarom krijg ik in vredesnaam “ undefined_index ” -fouten?

Juist, ik “sla hier met mijn hoofd tegen een muur. Ik weet zeker dat het iets ongelooflijk eenvoudigs is, maar ik krijg steeds ongedefinieerde indexfouten op alle van deze variabelen.

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 } 

Ik krijg dit voor elke variabele:

Opmerking : Undefined index: genus in […] sf-species-profiles.php on line 207

Enig idee?

Opmerkingen

  • welke coderegel is regel 207?
  • $ genus = $ custom [" genus "] [0];

Antwoord

Het ” een veel voorkomende PHP-fout, meestal wanneer u probeert toegang te krijgen tot een arraylid met een niet-bestaande sleutel;

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

U moet eerst de sleutel controleren met isset( $array["foobar"] );

UPDATE: In dit geval zou ik in een lus die de variabelen voor u instelt, waarbij fo wordt gecontroleerd r de index in het 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 

Reacties

  • Suggereer je dat ik isset op elke regel, zoals (pseudo) isset ($ custom [genus]) > $ genus = $ custom [genus]? Dat ' is beslist een helse, langdradige manier om dingen te doen. Ik had de indruk (en dit is de eerste keer dat ik ' dit probleem tegenkwam) dat het gebruik van isset op $ post en dan ook $ custom zou betekenen dat die variabelen ' t set / don ' t bestaan tenzij er gegevens in $ post staan?
  • Helemaal niet – maar hoe dan ook, jij mag nooit aannemen dat X bestaat. Zie mijn bijgewerkte antwoord 🙂

Answer

Je belt al isset () elke keer dat je de gegevens naar het scherm.

Waarom sla je dit deel niet gewoon over:

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

en doe dit als je een invoer afdrukt:

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

De extra variabeletoewijzingen zijn niet nodig en zorgen ervoor dat hier mededelingen worden gegenereerd.

Tussen haakjes …

U moet uw uitvoer escapen voordat deze in een formulier wordt afgedrukt:

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

Opmerkingen

  • Ja , Ik ' niet de moeite nemen om te ontsnappen totdat ik ' werkcode heb .. 🙂 Ik overwoog om het te doen zoals jij ' ve gesuggereerd, maar ik ' ben een beetje een code-esthetiek freak en lieve Heer die er lelijk uitziet! Dank je.
  • Ik denk dat we anders zijn dan … ik ' niet druk op het scherm af, tenzij ik de gegevens ontsnapte en ik nooit onnodige complexiteit laat code er " mooi uitzien ".
  • LOL! IMHO Ik denk dat gehackte sites met farmaceutische links in de voettekst lelijker zijn dan die code. 😉
  • Laat ' niet hangen op $custom["genus"][0] zijnde " lelijker " dan $genus. @mfields ' code is verder exact hetzelfde als de jouwe, maar ' zal geen foutmelding geven. Schrijf zoveel code als je nodig hebt om een klus te klaren, niet meer, niet minder .
  • Heh, zoals EAMann opmerkt, het is niet ' t de ontsnapping die ik als lelijk beschouw – het ' s $ custom [" geslacht "] [0] in plaats van $ genus waarnaar ik verwees. Ik ' suggereer zeker niet dat ik ' niet aan gegevens zou ontsnappen omdat het lelijk werd .. 🙂

Antwoord

Een alternatief, dat is voortgekomen uit een Twitter-discussie over dit bericht, is om hoe je “je gegevens aan het ophalen bent. get_post_custom() retourneert een reeks arrays en is wat je hoofdpijn bezorgt . Ik zou aanraden om in plaats daarvan get_post_custom_values() te gebruiken:

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 } 

Een beter alternatief voor aangepaste waarden zou zijn om aangepaste meta te gebruiken. U kunt deze als uniek definiëren, en wanneer u de aangepaste meta terug uit de database haalt, heeft u één waarde in plaats van een geïndexeerde array met slechts één lid. Gewoon iets om te overwegen.

Opmerkingen

  • Bedankt EAMann. Ik ' ll onderzoek aangepaste waarden / meta wanneer ik thuiskom en overweeg dan die aanpak.

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *