Notice - Undefined index

Arbeite im Moment an einem kleinem CMS bei dem man über den Adminbereich das Layout der Seite verändern kann (CSS). Was auch ansich soweit funktioniert. Nur bin ich jetzt am Suchen einer vernünftigen Lösung um die Notices aus dem Formular zu beseitigen.
Wie im folgenden Template-Auszug habe ich die Variablen
$field[body_field2] -> body steht in dem Fall für den html-Tag <body> und über field2 wird aus der DB die CSS-Eigenschaft background bezogen
$field[body_field3fixed] -> body steht in dem Fall für den html-Tag <body> und über field3 wird aus der DB die CSS-Eigenschaft background-attachment bezogen und fixed in dem Fall für das select
usw. -> sind noch sehr viele solcher Variablen.

style.tpl (nur ein Auszug)
HTML:
<td style="vertical-align:top"><table cellpadding="4" cellspacing="1" border="0" width="100%">
	  <tr>
	    <td>Link zum Hintergrundbild: </td>
		<td><input name="body_field2" type="text" size="30" value="$field[body_field2]" /></td>
	  </tr>
	  <tr>
		<td>Anlage: </td>
		<td><select name="body_field3">
		  <option></option>
		  <option value="fixed"$field[body_field3fixed]>fest</option>
		  <option value="scroll"$field[body_field3scroll]>rollen</option>
		</select></td>
	  </tr>
	  <tr>
		<td>Wiederholen: </td>
		<td><select name="body_field4">
		  <option></option>
		  <option value="repeat-y"$field[body_field4repeaty]>nur vertikal</option>
		  <option value="repeat-x"$field[body_field4repeatx]>nur horizontal</option>
		  <option value="no-repeat"$field[body_field4norepeat]>keine Wiederholung</option>
		</select></td>

Über 2 DB-Tabellen werden die Werte für die Variablen $field[......] ausgelesen. In der ersten befinden sich sämtliche html-Tags, Klassen und ID's (z.B. body) die ich verwende mit den evtl. schon zugeordeten CSS-Eigenschaften.
In der zweiten Tabelle sind sämtliche CSS-Eigenschaften (z.B. background, color, etc.)
Ein Eintragin der ersten Tabelle (style) könnte wie folgt aussehen:
cssname -> body
cssattr -> background-image:url("./images/background.gif"); color:#efefef;

und die zweite (stylecss)
cssid -> 2 (ist die field-id)
cssname -> background-image
cssattr -> 2 (steht für die Aktion die durchgeführt werden soll)

hier die style.php (Auszug)
PHP:
$field = "";
$result = mysql_query("SELECT cssname, cssattr FROM style");
  while($row = mysql_fetch_array($result)){
	$bodycss = explode(";",$row['cssattr']);
	foreach($bodycss as $key){
	  $arr = explode(":", $key);
	  $arr[0] = trim($arr[0]);
	  $result2 = mysql_query("SELECT cssid, cssacpaus FROM stylecss WHERE cssname = '".$arr[0]."'");
	  $row2 = mysql_fetch_assoc($result2);
	  $cssacpaus = $row2['cssacpaus'];
	  $fieldname = $row['classname']."_field".$row2['cssid'];
	  if(!empty($arr[1])) {
	    switch ($cssacpaus) {
		  case 1: 
			$field[$fieldname] = $arr[1];
		  break;
		  case 2:
		    $field[$fieldname] = preg_replace('/url\(".\/(.*?)"\)/Usi', '$1', $arr[1]);
		  break;
		  case 3: 
			$arr[1] = preg_replace('/(.*?)\-(.*?)/Usi', '$1$2', $arr[1]);
			$field[$fieldname.$arr[1]] = " selected=\"selected\"";
		  break;
		  case 4:
			if($arr[1] == "0 auto 0 0") $field[$fieldname."left"] = " selected=\"selected\"";
			if($arr[1] == "0 0 0 auto") $field[$fieldname."right"] = " selected=\"selected\"";
		  break;
	    }
	  }
	}
  }

So und jetzt brauch ich einen Tipp/Denkanstoß/Lösungsvorschlag
gibt es für die Variable z.B. $field[body_field2] in der DB einen Eintrag, dann gibt es keine Notice (logisch). Ist allerdings nichts angegeben, kommt die
Notice: Undefined index: body_field2
bzw. wenn das komplette Formular leer ist
Notice: Uninitialized string offset: 0 (ebenfalls klar warum)
Nur wie kann ich diese Notices beheben ohne für jedes Feld einzeln, folgendes zu schreiben:
PHP:
if(!isset($field['body_field2'])) $field['body_field2'] = "";
if(!isset($field['body_field3fixed'])) $field['body_field3fixed'] = "";
//usw.
 
Ich hab deinen Text jetzt nur überflogen, da mir das um die Uhrzeit etwas viel zum lesen war.. ;)

Wenn ich das jedoch richtig sehe müsstest du an dieser Stelle die Bedingung einbauen:
PHP:
$fieldname = $row['classname']."_field".$row2['cssid']; 

if ( !isset( $field[$fieldname] ) ) continue;

if(!empty($arr[1])) {

Falls nicht, wäre interessant zu wissen in welcher Zeile der Notice überhaupt geworfen wird.
 
vollständige Notice:
Undefined index: body_field2 in C:\xampp\htdocs\mmdespro\admin\style.php(57) : eval()'d code on line 45

Zeile 57 in der style.php ist die Ausgabe des Templates
PHP:
eval("dooutput(\"".gettemplate("style")."\");");
und Zeile 45 ist im Template style.tpl
HTML:
<input name="body_field2" type="text" size="30" value="$field[body_field2]" />
Die Notice tritt natürlich auch in den weiteren Zeilen auf in denen kein Wert aus der DB gelesen werden kann und somit nicht vorhanden sind
 
Wah, nimm bitte das eval() da raus, denn eval ist evil. Diese Zeile kannst du doch auch so verwenden:
PHP:
dooutput(gettemplate("style"));
 
Ich bin auch jetzt noch der Meinung, dass die Bedingung an die von mir vorgeschlagene Stelle muss, evtl. noch etwas erweitert.
PHP:
if ( !isset( $field[$fieldname] ) || !isset( $arr[1] ) ) continue;
 
@ deluxe
Nein leider nicht. Kann auch nicht - es befindet sich kein Wert in der DB um $fieldname und $arr[0] zu belegen.
Ist im Formular das Inputfeld nicht ausgefüllt, wird auch nichts in die DB geschrieben.

Beispiel leeres Inputfeld (body_field2):
cssname -> body
cssattr ->

Beispiel ausgefülltes Inputfeld (body_field2):
cssname -> body
cssattr -> background-image:url("./images/background.gif");

Habs aber jetzt etwas anders geregelt beim Abspeichern - wird nichts eingetragen ins Inputfeld, wird trotzdem das CSS-Attribute hineingeschrieben nur ohne Wert.
cssname -> body
cssattr -> background-image:;
So habe ich wenigstens die Notices für die normalen Inputfelder beseitigt
Und dann reicht auch an der von dir vorgeschlagenen Codestelle ein einfaches
PHP:
$field[$fieldname] = "";
Jetzt habe ich nur noch die Notices aus den Selectfeldern. Bin aber am überlegen ob ich noch eine weitere Tabelle oder Spalte anlege mit den Auswahlmöglichkeiten zu den jeweiligen CSS-Attributen.
 
Zurück