Zwei Arrays vergleichen und auswerten

atlantyz

Erfahrenes Mitglied
Hallo zusammen,

ich hänge mal wieder an einem Problem fest und weiß grad nicht, wie ich es angehen soll, denke ich hab mal wieder einen Denkfehler:

Also ich hab zwei Arrays. In dem einen stehen Werte aus einem Formular, die per POST geschickt wurden, in dem anderen stehen die Spaltenüberschriften meine SQL- Tabelle.

Nun habe ich folgendes Problem: in dem Formular gibt es Checkboxen (ca. 30 Stück). Wenn sie deaktiviert werden, soll eine "0" in die Datenbank geschrieben werden, bei Aktivierung eine "1". Bei Aktivierung ist das kein Problem, da ich ja in mein Array ein "on" geschrieben bekomme. Wenn die Checkbox deaktiviert ist, bekomme ich den Checkbox- Namen ja erst gar nicht übermittelt.

Da es so viele sind und ich nicht alle prüfen will ob es sie gibt oder nicht, war die Idee die vorhandenen Spaltenüberschriften meiner Tabelle auszulesen (bis auf 3 Felder sind die identisch mit den Formularfeldnamen) und dann zu prüfen, ob es das Feld eig. geben sollte oder nicht.

Und da hänge ich einfach fest.

Ich hab mal folgendes gebastelt:

PHP:
	$spalten = array();
	
	db_connect();
	$sqlab = "Describe mod_stamm_anb";
	$ergab = mysql_query($sqlab);
	mysql_close();
	while ($spalte = mysql_fetch_assoc($ergab)) {
		$spalten[$spalte["Field"]] = "";
	}
	
	$werte = array();
	$i = 0;
	foreach($_POST as $variable) {
		
		$name = array_keys($_POST);
		if (array_key_exists($name[$i], $spalten)) {
		if(strpos($name[$i], "check") || strpos($name[$i], "speichern")) {
			$i=$i+1;
			continue;
		}		
		if ($variable == "on") {
			$variable = "1";
		} else {
			$variable = htmlentities($variable, ENT_QUOTES, 'UTF-8');
		}
		$werte[$name[$i]] = $name[$i]. "= '".$variable."'";
		}
		$i=$i+1;
		
	}

	
	$timestamp = time();
	$sql = "UPDATE mod_stamm_anb SET ".implode(', ',$werte)." WHERE id = '".$_POST["id_speichern"]."'";

Ich hab jetzt schonmal alle Werte, die sowohl übermittelt (POST) als auch in der Tabelle vorhanden sind. Aber wie bekomme ich jetzt noch die heraus, die nur in der Tabelle sind und eben nicht übermittelt wurden (also praktisch den ELSE- Zweig der unteren Foreach- Schleife)? Oder gehe ich das ganze schon falsch an?

Ich bitte um Hilfe.
 
Kannst du nicht bei den Feldern der Tabelle einfach den Wert 0 als Standard hinterlegen? Wenn die Checkbox dann nicht markiert wurde, wird eben dieser Standardwert im Feld gespeichert.
 
Zuletzt bearbeitet:
Nein, es kann ja sein, dass die Felder vorher den Wert 1 hatten, dann deaktiviert werden und dann den Wert 0 bekommen sollen (Kundendaten werden überarbeitet)
 
So, neuer Tag, neues Glück: ich habe heute eine Möglichkeit gefunden, wie ichs machen kann:
ich habe die Felder der Tabelle ausgelesen und als Keys ins Array gespeichert, jeweils mit dem Wert 0. Meine POST- Werte überschreiben dann entweder (wenn vorhanden) diesen Wert 0 oder eben nicht. So habe ich alle fehlenden, die nicht übermittelt wurden auf 0 und alle, die es gibt und die einen Wert haben, nehmen den gesendeten Wert an.
 
Und damit du das ganze ohne Schlaufe machen kannst:
PHP:
//Eingabe simulieren
$_GET = array(
    'submit'=> 'submit',
    'field2' => 1,
    'name' => 'Hallo welt'
);

//Felder auflisten
$fields = array('field1', 'field2', 'field3');
// Array drehen (Feldnamen werden zu Schlüssel) und den Wert 0 zuweisen
$default = array_fill_keys($fields, 0);
//Aus dem Get die Parameter ausfiltern, die vorgängig definiert wurden (Bei diesem Beispiel fällt submit und name raus)
$valuesFromGet = array_intersect_key($_GET, $default);
//Mit dem Merge die Werte des Default-Arrays mit denen aus get überschreiben
$result = array_merge($default, $valuesFromGet);
print_r($result);
Code:
Array
(
    [field1] => 0
    [field2] => 1
    [field3] => 0
)

Nachtrag:
Wenn man nicht nur 0 als default ahben will und zur Sicherheit die PHP-Funktion filter_input_array() verwenden will, habe ich vor geraumer Zeit mal eine Funktion filterInputDefaults() erstellt.
PHP:
<?php
/**
 * filterInputDefaults
 * erweitert filter_input_array um 'default'
 * Siehe dazu auch die Doku zu filter_input_array
 * http://ch2.php.net/manual/de/function.filter-input-array.php
 * @param   int $type       Einer von INPUT_GET, INPUT_POST, INPUT_COOKIE, INPUT_SERVER, INPUT_ENV, INPUT_SESSION oder INPUT_REQUEST
 * @param   array $args
 * @return  array
 */
function filterInputDefaults($type, $whitelist ){    
    $myInputs = filter_input_array($type, $whitelist);
    array_walk($myInputs, create_function('&$item, $key, $args', '$item = (is_null($item) && is_array($arg=$args[$key])) ? $arg["default"] : $item;'), $whitelist);
    return $myInputs;
}    
?>
-> Ich werd das wahrscheinlich demnächst als Tutorial-Codeschnipsel hier eröffnen
 
Zurück