Probleme mit 'undefined index'

L.B.

Ensign
Registriert
Juni 2010
Beiträge
209
Hallo Zusammen,

ich entwickle momentan ein Theme für WordPress und habe ein kleines Problem mit der Fehlermeldung ''Undefined index:.." innerhalb einer Funktion, die für das Speichern von Optionen in der Datenbank zuständig ist. Sobald die Funktion aufgerufen wird (Klick auf den "Speichern-Button"), tritt der Fehler auf und der Browser gibt die Meldung "Notice: Undefined index: id in C:\xampp\htdocs\wp-content\themes\LB-Projects\admin\theme_functions.php on line 27" aus. Im Snippet unten entspricht Zeile 27 der 10. Zeile. Hier habe ich auch schon mit der Funktion isset() herumprobiert, bisher allerdings ohne Erfolg.

PHP:
function LB_add_admin() {
      
	global $themename, $shortname, $options;
		  
	if( isset( $_GET['page'] ) == basename(__FILE__) ) {
		  
		if( 'save' == isset( $_REQUEST['action'] ) ) {
		  
			foreach ($options as $value) {
				update_option( $value['id'], $_REQUEST[ $value['id'] ] );
			}  
		  
			foreach ($options as $value) {  
				if( isset( $_REQUEST[ $value['id'] ] ) ) { 
					update_option( $value['id'], $_REQUEST[ $value['id'] ]  );
				} 
				else { 
					delete_option( $value['id'] ); 
				} 
			}  
		  
			header("Location: admin.php?page=theme_functions.php&saved=true");  
			die;  
		  
		}  
		
		else if( 'reset' == isset( $_REQUEST['action'] ) ) {  
		  
			foreach ($options as $value) {  
				delete_option( $value['id'] ); 
			}  
		  
			header("Location: admin.php?page=theme_functions.php&reset=true");  
			die;  
		  
		}  
	}

	add_theme_page( __('Theme Options', 'lbprojects'), __('Theme Options', 'lbprojects'), 'administrator', basename(__FILE__), 'LB_admin');  
}

Der gesamte Code für die Admin-Seite sieht folgendermaßen aus:

PHP:
<?php
/*
*
*	theme_functions.php
*
*	LB-Projects Theme
*	Autor: Lukas Bommes
*	Copyright (C) Lukas Bommes
*
*/

function LB_add_init() {
	wp_enqueue_style("theme_functions", get_template_directory_uri() . "/admin/theme_functions.css");
	wp_enqueue_script("theme_functions", get_template_directory_uri() . "/admin/js/theme_functions.js");
}

//Funktionen für das Admin-Panel
function LB_add_admin() {
      
	global $themename, $shortname, $options;
		  
	if( isset( $_GET['page'] ) == basename(__FILE__) ) {
		  
		if( 'save' == isset( $_REQUEST['action'] ) ) {
		  
			foreach ($options as $value) {
				update_option( $value['id'], $_REQUEST[ $value['id'] ] ); 
			}  
		  
			foreach ($options as $value) {  
				if( isset( $_REQUEST[ $value['id'] ] ) ) { 
					update_option( $value['id'], $_REQUEST[ $value['id'] ]  ); 
				} 
				else { 
					delete_option( $value['id'] ); 
				} 
			}  
		  
			header("Location: admin.php?page=theme_functions.php&saved=true");  
			die;  
		  
		}  
		
		else if( 'reset' == isset( $_REQUEST['action'] ) ) {  
		  
			foreach ($options as $value) {  
				delete_option( $value['id'] ); 
			}  
		  
			header("Location: admin.php?page=theme_functions.php&reset=true");  
			die;  
		  
		}  
	}

	add_theme_page( __('Theme Options', 'lbprojects'), __('Theme Options', 'lbprojects'), 'administrator', basename(__FILE__), 'LB_admin');  
}

function LB_admin() {
      
	global $themename, $shortname, $options;  
	$i=0;
	$z=0;
      
	if( isset( $_REQUEST['saved'] ) ) echo '<div id="message" class="updated fade"><p><strong>' . $themename . ' ' . __('settings saved.', 'lbprojects') . '</strong></p></div>';  
	if( isset( $_REQUEST['reset'] ) ) echo '<div id="message" class="updated fade"><p><strong>' . $themename . ' ' . __('settings reset.', 'lbprojects') . '</strong></p></div>';  
      
	?>
	<div class="wrap rm_wrap">
	
		<h2><?php echo $themename; __('Options', 'lbprojects'); ?></h2>  
		  
		<div class="rm_opts">
		
			<form method="post">
			
				<?php foreach ($options as $value) {
				
					switch ( $value['type'] ) {  
					  
					case "open": ?>
					
					<?php break;
					  
					case "close": ?>
					
						</div><!-- rm_opts -->
					
						</div><!-- wrap rm_wrap -->
			
						<br />
			  
					<?php break;
			  
					case "title": ?>
					
						<p><?php _e('Below options allow easy configuration of the', 'lbprojects'); ?> <?php echo $themename;?> <?php _e('Theme.', 'lbprojects'); ?></p>  
					  
					<?php break;
					  
					case 'text': ?>  
					  
						<div class="rm_input rm_text">  
							<label for="<?php echo $value['id']; ?>"><?php echo $value['name']; ?></label>  
							<input name="<?php echo $value['id']; ?>" id="<?php echo $value['id']; ?>" type="<?php echo $value['type']; ?>" value="<?php if( get_option( $value['id'] ) != "") { echo stripslashes(get_option( $value['id'])  ); } else { echo $value['std']; } ?>" />  
						<small><?php echo $value['desc']; ?></small><div class="clearfix"></div>  
						  
						</div> 
						
					<?php break;   
					  
					case 'textarea': ?>  
					  
						<div class="rm_input rm_textarea">  
							<label for="<?php echo $value['id']; ?>"><?php echo $value['name']; ?></label>  
							<textarea name="<?php echo $value['id']; ?>" type="<?php echo $value['type']; ?>" cols="" rows=""><?php if( get_option( $value['id'] ) != "") { echo stripslashes(get_option( $value['id']) ); } else { echo $value['std']; } ?></textarea>  
							<small><?php echo $value['desc']; ?></small><div class="clearfix"></div>  
						</div>  
					  
					<?php break;
					  
					case 'select': ?>  
					  
						<div class="rm_input rm_select"> 
							<label for="<?php echo $value['id']; ?>"><?php echo $value['name']; ?></label>
							<select name="<?php echo $value['id']; ?>" id="<?php echo $value['id']; ?>">  
							<?php foreach ($value['options'] as $option) { ?>  
									<option <?php if(get_option( $value['id'] ) == $option) { echo 'selected="selected"'; } ?>><?php echo $option; ?></option><?php } ?>  
							</select>
							<small><?php echo $value['desc']; ?></small><div class="clearfix"></div>  
						</div>
						
					<?php break;
					  
					case "checkbox": ?>  
					  
						<div class="rm_input rm_checkbox">  
							<label for="<?php echo $value['id']; ?>"><?php echo $value['name']; ?></label> 
							<?php if(get_option($value['id'])){ $checked = "checked=\"checked\""; }else{ $checked = "";} ?>  
							<input type="checkbox" name="<?php echo $value['id']; ?>" id="<?php echo $value['id']; ?>" value="true" <?php echo $checked; ?> />  
							<small><?php echo $value['desc']; ?></small><div class="clearfix"></div>  
						</div>
						
					<?php break;
					
					case "colorpicker":
					
						$z++; ?>
					  
						<script type="text/javascript">
							jQuery(document).ready(function($){
								$('#color_picker_color<?php echo $z; ?>').farbtastic('#<?php echo $value['id']; ?>');	
							});
						</script>
						
						<div class="rm_input rm_colorpicker">
							<label for="<?php echo $value['id']; ?>"><?php echo $value['name']; ?></label>
							<input type="text" id="<?php echo $value['id']; ?>" name="<?php echo $value['id']; ?>" value="<?php if( get_option( $value['id'] ) != "") { echo get_option($value['id']); } else { echo '#ffffff'; } ?>" />
							<small><?php echo $value['desc']; ?></small><div class="clearfix"></div>
							<div id="color_picker_color<?php echo $z; ?>" class="rm_color-picker"></div>
						</div>
						
					<?php break;

					case "section":  
					  
						$i++; ?>
					  
						<div class="rm_section">				
							<div class="rm_title">
								<h3><img src="<?php echo get_template_directory_uri(); ?>/admin/images/trans.png" class="inactive" alt="""><?php echo $value['name']; ?></h3>
								<span class="submit"><input name="save<?php echo $i; ?>" type="submit" value="Save changes" /></span><div class="clearfix"></div>
							</div> 
							<div class="rm_options">
					  
					<?php break;  
					  
					}
				} ?> 
	 
				<input type="hidden" name="action" value="save" />
				
			</form>
			
			<form method="post">
			
				<p class="submit">  
				<input name="reset" type="submit" value="Reset" />  
				<input type="hidden" name="action" value="reset" />  
				</p>
				
			</form>
			
		</div><!-- rm_options -->
      
<?php  
}

//Initialisieren
add_action('admin_init', 'LB_add_init');
add_action('admin_menu', 'LB_add_admin');
?>

Habt ihr eine Idee, wie ich den Fehler beseitigen könnte?
Danke schonmal. ;)
L.B.
 
Steht doch da, dass er den Index id nicht finden kann und Indizes gibts in Arrays.
Code:
$id = isset( $value['id'] ) ? $value['id'] : 0;
update_option( $id, $_REQUEST[ $id ] );
 
Danke für deine Antwort. :)
Ich habe mal deine Lösung probiert, nur bekomme ich jetzt die Fehlermeldung "Notice: Undefined offset: 0 in C:\xampp\htdocs\wp-content\themes\LB-Projects\admin\theme_functions.php on line 29" (in der Zeile befindet sich die Funktion update_options()).
Dieselbe Fehlermeldung habe ich übrigens auch bekommen, wenn ich beide $value['id'] mit einem isset() versehehen habe, was ja im Endeffekt deinem Code entspricht.
 
Ja du musst den Standardwert entsprechend setzen oder halt einfach den Block überspringen. Nur weil ich eine 0 als Standardwert gesetzt habe, heißt es ja noch nicht, dass bei dir die 0 in Ordnung geht.
 
Aber wenn ich den Wert auf 0 setzte (was meines Erachtens Sinn macht), sofern er vorher noch nicht festgelegt wurde, bekomme ich ja wieder eine Fehlermeldung. Wenn ich etwas anderes setze (z.B. einen leeren String, wird wieder die Fehlermeldung "undefinded index" ausgegeben.

Das Problem scheint ja daraus zu resultieren, dass beim Speichern alle insgesamt ~60 Optionen als Argument an update_option() übergeben werden, auch die Optionen, die noch nicht definiert sind. Ein Standardwert würde also durchaus Sinn machen. Nur wie realisiere ich das, ohne dass wieder Fehler auftreten?
 
Ich kenne die Datenstruktur nicht, deswegen kann ich dir nicht sagen was dort stehen muss. Lass dir doch mal ausgeben was alles in $options steht und dann überspring den Block ö.ä.

Du könntest auch einfach das error_level anpassen, aber der Weg ist dann doch ein wenig unsauber.
 
hmm, köönnte sich der undefined index nicht auf auch das $_REQUEST objekt beziehen?
Wenn jetzt in $value['id'] eine 0 steht, aber $_REQUEST den key nicht hat wird das auch einen undefined index error erzeugen.

das würde erklären wieso 0 als standartwert nen fehler schmeißt, k.a. wie php dait umgeht, $_REQUEST ist ja i.d.r. assoziativ, ob man da dann trotzdem mit einem nummerischen index zugreifen kann.....

sonst klassisch debuggen und alles einmal dumpen was vorhanden ist, ggf. einen php debugger auf'm sever installieren, nutze gerne den netbeans debugger (kann man natürlich nur aus netbeans heraus nutzen, ist aber eine super IDE für web apps).

so siehst ja was für indizes vorhanden sind und wo es knallt.
 
Zuletzt bearbeitet:
Danke für eure Mühe. Ich habe es jetzt hinbekommen, indem ich mit einer einfachen if-Bedingung mithilfe von isset() prüfe, ob der Wert gesetzt ist oder nicht. Ist das der Fall, wird er in die DB geschrieben. Wenn er nicht gesetzt ist, wird er auch nicht geschrieben. Fazit: Keine Fehlermeldungen mehr. :)

PHP:
if( isset( $value['id'] ) && isset( $_REQUEST[ $value['id'] ] ) ) {
	update_option( $value['id'], $_REQUEST[ $value['id'] ] );
}
 

Ähnliche Themen

Antworten
5
Aufrufe
3.708
M
Antworten
6
Aufrufe
2.283
mustermen
M
U
Antworten
16
Aufrufe
3.114
U
Zurück
Oben