Coding | PHP

Undefined index bei nicht ausgewählten Checkbox-Werten

bracelet 971158 1920

Ein Beispiel (betrifft Seite mit Plugin-Einstellungen)
Nachfolgend wird die Aktivierung einer Option angeboten und danach gefragt, ob ihr Wert 1 ist. Wenn ja, wird sie als gewählt (checked) angezeigt.

<label for="service_pinterest">
<input name="smeOptions[general][services][pinterest]" type="checkbox" id="service_pinterest" value="1"<?php if($this->options['general']['services']['pinterest'] == 1) echo ' checked="checked"'; ?>>
Pinterest*
</label><br>

Das grundsätzliche Problem mit Checkboxen: Sind sie angehakt, werden sie mit dem Wert 1 gespeichert, und das sieht in einem Array mit Options so aus: [name-der-option] => 1. Ist die Option nicht angehakt, ist sie nach dem Speichern nicht vorhanden. Der Name der Option existiert folglich also gar nicht (es gibt dazu keinen Key), was sich im Debugmodus dann als Notice: Undefined index: auswirkt.

undefined index
Social Button Plugin mit “undefined index”-Fehler

Es gibt mehr als einen Weg, diesem Umstand zu begegnen, zum Beispiel indem man dem key wenn er nicht gesetzt ist, dennoch einen Wert zuweist (in der Form:
( isset($this->options['general']['services']['pinterest']) ? 'yes' : 'no' );,
doch dann genügt die Frage nach
isset($this->options['general']['services']['pinterest'])
nicht mehr um festzustellen, ob eine Einstellung wahr ist oder falsch (die Frage müsste dann so lauten
if ( $this->options['general']['services']['pinterest'] == 'yes' )).
Am Einfachsten ist es daher, einem etwaigen fehlenden Key vor dem Feld den Wert 0 zuzuweisen, der nur gültig ist, wenn die Option nicht gesetzt ist
if ( !isset( $this->options['general']['services']['pinterest'] ) ).

<label for="service_pinterest">
<?php if(!isset($this->options['general']['services']['pinterest'])) $this->options['general']['services']['pinterest'] = 0; ?>
<input name="smeOptions[general][services][pinterest]" type="checkbox" id="service_pinterest" value="1"<?php if($this->options['general']['services']['pinterest'] == 1) echo ' checked="checked"'; ?>>
Pinterest*
</label><br>

Zweites Beispiel (betrifft das Frontend)

In diesem Fall wurde gar nicht nach
isset( $this->options['general']['services']['pinterest'] )
gefragt, sondern nach dem Wert 1. Ist der Wert nicht 1, ist die Einstellung aber gar nicht gesetzt, und das wiederum führt ebenfalls zu einer Notice: Undefined index:.

<?php if($sme->options['general']['services']['google'] == 1): ?>
<a href="<?php echo $post->socialInfo['google']['shareUrl']; ?>" class="<?php echo $smeButtonStyle; ?>Google" rel="sme nofollow" data-service="google">
<i></i>
<?php if($sme->options['general']['label'] == 1): ?>Google+<?php endif; ?>
<span><?php echo $post->socialInfo['google']['count']; ?></span>
</a>
<?php endif; ?>

Der Fix

<?php if(isset($sme->options['general']['services']['google'])) : ?>
<a href="<?php echo $post->socialInfo['google']['shareUrl']; ?>" class="<?php echo $smeButtonStyle; ?>Google" rel="sme nofollow" data-service="google">
<i></i>
<?php if(isset($sme->options['general']['label'])) : ?>Google+<?php endif; ?>
<span><?php echo $post->socialInfo['google']['count']; ?></span>
</a>
<?php endif; ?>

weiter schmökern

Schreibe einen Kommentar

Bitte Kommentarfunktion nicht für Supportanfragen nutzen. Dem kann hier nicht entsprochen werden.

Deine E-Mail-Adresse wird nicht veröffentlicht.