2 Arrays mit Schleife prüfen

Steffen Giers

Erfahrenes Mitglied
Guten Abend,

Ich habe eine Frage bezüglich Arrays und Schleifen.

Ich möchte 2 Arrays miteinander vergleichen. Wenn Array_1 andere Werte (in den Tabellenfeldern der DB) hat wie Array_2, soll eine Schleife initialisiert werden, die Abfragt ob die Werte in den entsprechenden Feldern gleich sind. Wenn die Werte nicht dem Inhalt entsprechen sollen die passenden Datenbankeinträge abgeglichen werden.

Ich habe zwar eine schon funktionierende Version, diese allerdings ohne Schleife und mit ellenlangem Code...

Danke im vorraus...
Steffen
 
Zuletzt bearbeitet:
Steffen Giers hat gesagt.:
(...)Wenn Array_1 andere Werte (in den Tabellenfeldern der DB) hat wie Array_2, (...), die Abfragt ob die Werte in den entsprechenden Feldern gleich sind.(...)
Hallo Steffen,

wie du aus deinem Quote entnehmen kannst, ist die Aufgabenstellung etwas verwirrend,
zumindest hab ich sie nicht ganz verstanden.

Außerdem interessiert mich der Verwendungszweck, also wofür du das einsetzen willst.
Vielleicht ist diese Methode sogar uneffizient oder überflüssig.

Gib uns einfach noch mal besser Infos dazu.
 
Guten Morgen Jörg,

Danke das du dich meiner annimmst. ;)

Es geht um es genau zu sagen, um ein Formular in dem,dem User seine Persönlichen Daten angezeigt werden und vom ihm geändert werden können. Diese Daten kommen aus einer Mysql-Datenbank. Es ist denke ich ein Ähnliches Prinzip wie hier im Forum.

Am Anfang des Dokuments instanziere ich eine Klasse, die unter anderem die Verbindung zur Datenbank herstellt und alle Daten des Users in einem Array speichert ($row)

PHP:
$sql = new SQLq("SELECT *
    				 FROM `{pre}users`
 				 WHERE id='" .$_SESSION['id']. "'"); 
    $row = $sql->FetchArray(); 
    $sql->FreeClose();

Die einzelnen Formularfelder habe ich nach diesem Prinzip benannt um die Formulardaten ebenfalls in einem Array zu speichern (name="input[vorname]").
HTML:
   <label for="vorname" class="left">Vorname:</label>
   <input name="input[vorname]" value="<?php echo $row['vorname'];?>" class="input_design" /><br />

Wenn der User nun seine Daten in diesem Formular ändert und auf den Button "Ändern" klickt, soll eine Schleife initialisiert werden die beide Arrays, Zeile für Zeile mit einander vergleicht, und eventuelle änderungen mit den Daten in der Datenbank abgleicht.

Also wenn Peter Müller seinen Nachnamen im Formular ändert, soll geprüft werden ob ein Unterschied zu dem in der Datenbank gespeicherten besteht. Wenn ja dann den alten Datensatz entfernen und den neuen eintragen.
 
Du willst also folgenden Fall aus Performacegründen abfangen:
Der User schaut sich sein edit_profile an, drückt auf Absenden und hat nix geändert?

Also meiner Meinung nach kommt das so selten vor, das bringts doch nicht.
Da ist der Aufwand höher als der Nutzen.

Ich würde es einfach gleich eintragen, ohne Abgleich.
 
Die Funktion die Du suchst ist glaube ich

$changes=array_diff($input,$row);

In $changes stehen dann alles Einträge, die in input vorhanden sind, aber nicht in row, bzw. anders sind.
mit
if(count($changes)){
...Schleife
}

Kannst Du die dann abarbeiten.

P.s. Kann sein, dass Du die Parameter $input und $row vertauschen musst.


Marcus.
 
Ich dachte das es Sinnvoll wäre nicht unnötig Traffic zu erzeugen. Im Endeffekt ist ja auch nicht sooo wichtig das die Daten des Formulars mit denen in der DB verglichen werden. Das wäre zwar schön aber muss nicht.

Wichtiger wäre mir zu wissen ob sich denn da überhaupt einen Schleife lohnt? Meiner Meinung halte ich es für Sinnvoll. Allerdings habe ich nicht die Erfahrung um das beurteilen zu können. Bis dato brauchte ich sowas nicht. Und ich beschäftige mich erst mit einem Problem wenn es sich stellt.

Edit:

Diese funktion ist mir auch schon über den Bildschirm gelaufen habe ihr allerdings keine Wichtigkeit beigemessen. Aber bei genauerer Betrachtung... Ich guck mir das mal an. Danke für den Tip.
 
Zuletzt bearbeitet:
Die Schleife wird wohl nötig sein, da Du sonst nicht auf die Schlüssel des Arrays und deren Werte parallel zugreifen kannst.

PHP:
$c1=array();
while(list($k,$v)=each($changes)){
 $c1[]=$k."='".$v."'";
}
$sql="update ... set ".implode(',',$c1)." where ....";
 
Von dir ist doch auch das Tutorial das dieses Thema aufgreift, oder?

So in etwa?
PHP:
if (isset($PersDatChge)) {
 
 $input = $_REQUEST['input'];
 $changes = array_diff($input,$row);
 
 	if(count($changes)){
 		$c1=array();
 		while(list($k,$v)=each($changes)){
 			$c1[]=$k."='".$v."'";
 		}
 			$sql = new SQLq("UPDATE `{pre}users`		
 		    		    	 SET ".implode(',',$c1)." 
 		    		    	 WHERE id='" .$_SESSION['id']. "'");
 			$sql->Close();
 			
 			header("location: http://".$_SERVER['SERVER_NAME']."/usercenter.php");
 		}
 	}

$k und $v stehen für Key und Value des jeweiligen Eintrags ja? Woher weiß PHP das $k und $v eben dafür stehen?
 
Zuletzt bearbeitet:
Ja, das Tutorial ist von mir :)
PHP weiß nicht, das "k" und "v" für key und Value stehen. Du kannst die Variablen auch Karl und Heinz nennen, wenn Du willst. PHP ordnet lediglich der ersten Variable den Key des Arrays und der zweiten dessen Wert zu.
 
Danke an Jörg und shockshell,

So wie es oben gepostet wurde funktioniert es Einwandfrei. Werde mich nun etwas der Sicherheit der Inputs widmen. Will ja nicht das mir jemand die DB aushebelt.

Edit: Sowas dachte ich mir schon... ich halte es dann aber durchaus für Sinnvoll die entsprechenden Variablen nach ihrem Inhalt zu benennen. Ich danke dir ... wieder was gelernt. Ist übrigens ein gutes Tut... das hat mich zu meiner Schandtat überhaupt erst inspiriert.

Bye Steffen
 
Zuletzt bearbeitet:
Zurück