Daten von DB eintragen, einlesen, nachbearbeiten

Hallo zusammen,

ich programmiere derzeit ein Programm zur Kundendatenauswertung und benötige bei folgendem Sachverhalt Hilfe.

Die Mitarbeiter loggen sich in die Programmoberfläche ein und geben dort ihre persönlichen Daten wie Name, Anschrift etc. ein. Als Primärschlüssel dient eine fest vorgegebene Benutzer ID.
Die Daten werden in Textfelder eingegeben und dann in der Datenbank gespeichert. Wenn diese noch nicht existieren, dann werden diese als neuer Datensatz angelegt.

Bei erneutem Einloggen in das Programm wird die Datenbank nach bereits eingegebenen Daten der Mitarbeiter gesucht, diese gleich in die Textfelder eingelesen und ihm angezeigt. So kann er diese bei Bedarf gleich ändern und aktualisieren. Das muss natürlich ebenfalls in der Datenbank aktualisiert werden.

Bis jetzt habe ich eine Verbindung zur Datenbank über $mysqli hergestellt, die Benutzer ID, welche als Primärschlüssel dient und fest vorgegeben ist, aus der Datenbank selektiert, die Textfelder erstellt und die Befehle INSERT zur Speicherung der Daten in die Datenbank vorbereitet.

Sieht dann zum Teil so aus.

#SQL-Befehl für Dateneintrag in Variable speichern
$eintrag= „INSERT INTO betreuer (id_betreuer, vorname_betreuer, nachname_betreuer ,strasse_betreuer, nr_betreuer,
plz_betreuer, ort_betreuer, mail_betreuer) VALUES (NULL, ‚{$_POST[‚vorname_betreuer‘]}‘, ‚{$_POST[‚nachname_betreuer‘]}‘,
‚{$_POST[‚strasse_betreuer‘]}‘, ‚{$_POST[‚nr_betreuer‘]}‘, ‚{$_POST[‚plz_betreuer‘]}‘, ‚{$_POST[‚ort_betreuer‘]}‘,
‚{$_POST[‚mail_betreuer‘]}‘)“;

#Datenbank nach bereits eingegebenen Anwenderdaten durchsuchen und in $benutzerfeld speichern:
#Dann die Daten in die $_POST Variablen speichern, damit diese in den Textfelder angezeigt werden.
#{$benutzerfeld_typo[„uid“] ist die Primärschlüssel ID.
if ($benutzersatz=$mysqli->query(„SELECT * FROM betreuer WHERE id_betreuer = ‚{$benutzerfeld_typo[„uid“]}‘;“))
{
#Wenn Daten in DB eingetragen sind
$betreuerfeld=$benutzersatz->fetch_array();
$_POST[‚vorname_betreuer‘]=$betreuerfeld[‚vorname_betreuer‘];
$_POST[‚nachname_betreuer‘]=$betreuerfeld[‚nachname_betreuer‘];
$_POST[‚strasse_betreuer‘]=$betreuerfeld[‚strasse_betreuer‘];
$_POST[‚nr_betreuer‘]=$betreuerfeld[‚nr_betreuer‘];
$_POST[‚plz_betreuer‘]=$betreuerfeld[‚plz_betreuer‘];
$_POST[‚ort_betreuer‘]=$betreuerfeld[‚ort_betreuer‘];
$_POST[‚mail_betreuer‘]=$betreuerfeld[‚mail_betreuer‘];
}
else
{}

#Textfeld (Beispiel):
" method=„post“>
Ihr Vorname:

Doch leider komme ich jetzt nicht mehr weiter. Wie kann ich ermitteln, ob ein Datensatz nur aktualisiert oder neu angelegt werden muss? Wie kann ich herausfinden, welche Attribute in dem Datensatz fehlen und nachgetragen werden müssen? Ist es überhaupt möglich die komplette Datenverarbeitung im gleichen Formular verarbeiten zu lassen oder soll diese ausgelagert werden? Und zwar so, dass das Programm selbstständig erkennt, ob die Daten aktualisiert oder neu angelegt werden müssen.

Gruß und herzlichen Dank!

Hi,
mach dir das Leben einfacher. Diese Fallunterscheidungen machen den Code nur kompliziert und deine DB wird nicht so hoch frequentiert sein.

Versuche zuerst ein Insert zu machen. Das geht mit dem gleich Primärschlüssel nicht. DB meldet Fehler -> Kannst du ignorieren wenn du danach immer ein Update machst. Falls du einen neuen Datensatz hast wird der dann hinterher eben noch mal aktualisiert - was solls.

Oder du wertest den Insert-Fehler aus und machst dann nur dann ein Update wenn der Fehler auftrat. Dies ist anzuraten wenn der Primärschlüssel ein autoincrement-Wert ist, was du aber nicht hast.

Aktualisieren tust du immer alle Daten. Warum soll man auswerten welches Feld nun geändert worden ist?

Gruss
Joey

Danke!
Danke für den Tipp!

Ich versuche es dennoch mal mit einer foreach Schleife und werden dann die Eingabewerte über die $_POST Variable abgleichen.

Trotzdem danke!

Gruß

Die Lösung
Hallo nochmal,

hab’s nun so gelöst wie du das gemeint hast.

if ($_POST){
$mysqli->query($eintrag) OR $mysqli->query($update);

}

Also wird einfach probiert, ob ein INSERT Befehl ausgeführt werden kann oder ein UPDATE der Datenbank möglich ist.

Gruß

Hallo,

das kann MySQL auch. Dazu gibt es eine MySQL-Erweiterung zum SQL-Standard namens REPLACE INTO. Damit wird zuerst ein INSERT versucht und falls wg. einem bereits vorhandenen Key nicht möglich ist ein UPDATE gemacht.

http://dev.mysql.com/doc/refman/5.1/de/replace.html

Viele Grüße
Patrick

Vielen Danke für den Tipp!

Hallo,
das ist nicht ganz richtig.

Es wird ein Insert gemacht, bei Fehler wird der Record gelöscht und dann wird abermals ein Insert gemacht.

Je nach dem wie die Tabellen aufgebaut sind, verliert man aber möglicherweise Informationen.

Daher muss man sehr gut wissen wann man es einsetzt.

Gruss
Joey