MySQL - UPDATE und INSERT gleichzeitig?

Hallo Gemeinde,

eine kurze Frage: Ist es möglich, Daten, die aus einem Formular kommen, zum Teil als INSERT in eine - und zum anderen Teil als UPDATE in eine andere Tabelle zu schreiben?

Kurz zur Erklärung:

Ich möchte in eine Tabelle Anmeldungen für Kinobesuche eintragen.
Bei einer Neuanmeldung wähle ich zuerst die Schule aus, die in unserer Datenbank eingetragen ist. Diese Schule hat dann auch einen Ansprechpartner, der beim Eintragen der Schule mit hinzugefügt wurde. Das kann aber unter Umständen schon einige Zeit zurück liegen.

Wenn ich nun also diese Schule für einen neuen Kinobesuch eintragen möchte, dann wähle ich sie durch eine Drop-Down-Liste aus und werde danach auf ein weiteres Formular geleitet, indem ich nun die Zeit und das jeweilige Kino und all die Sachen, die dazu gehören, in eine Tabelle „Anmeldungen“ eintragen kann. Gleichzeitig erscheint aber neben den „neuen“ leeren Feldern für den „INSERT INTO Anmeldungen…“ auch das Feld „Ansprechpartner“ aus der Tabelle „Schulen“ , welches abhängig davon, welche Schule ich vorher ausgewählt habe, mit dem Ansprechpartner gefüllt bzw. ausgegeben wird. Wenn sich der Ansprechpartner aber seit der letzen Anmeldung (z.B: aus dem Vorjahr) nun geändert haben sollte, möchte ich hier nun also eine Änderung vornehmen und sie zum INSERT der neuen Daten in die „Anmeldungen“ gleichzeitig mittels UPDATE dann in die Tabelle der Schulen („UPDATE Schulen SET…“) eintragen lassen.

Mein Code sieht nämlich wie folgt aus und funktioniert aber nicht (daher wollt ich vorerst mal fragen, ob es überhaupt möglich ist). Es gibt keine Fehlermeldung nach dem Absenden des Formulars, aber die Daten aus den „UPDATE“ Feldern werden nicht in die Tabelle eingetragen, sondern nur die „INSERT“ Daten :
***********************************************

<?php require_once('../../Connections/connect.php'); ?><?php require_once('../../includes/func.php'); ?>

if (isset($_GET[„rid“])) { // Suche nach BackGoTo URL
mysql_select_db($database_connect, $connect);
$query_Seite = „SELECT * FROM Seite WHERE Seite.id=“.$_GET[„rid“];
$Seite = mysql_query($query_Seite, $connect) or die(mysql_error());
$row_Seite = mysql_fetch_assoc($Seite);
$BackGoTo = „…/index.php?id=“.$row_Seite[„id“]."&selectedNr=".$selectedNr."&VNr=".$VNr;
}
/*------------------------Leerzeichen entfernen----------------------*/
$Ansprech_Email = str_replace(" „, „“, $_POST[‚Ansprech_Email‘]);
$Ansprech_Telefon = str_replace(“ ", „“, $_POST[‚Ansprech_Telefon‘]);
/*-------------------------------------------------------------------*/

if ((isset($_POST[„MM_update“])) && ($_POST[„MM_update“] == „form1“)) {
$updateSQL = sprintf(„INSERT INTO Anmeldung (ref_PNr, ref_Schule, schueler, begleiter, rollis) VALUES (%s,%s,%s,%s,%s)“,
GetSQLValueString($_POST[‚PNr‘], „int“),
GetSQLValueString($_POST[‚Schule‘], „int“),
GetSQLValueString($_POST[‚Schueler‘], „int“),
GetSQLValueString($_POST[‚Begleiter‘], „int“),
GetSQLValueString($_POST[‚Rollis‘], „int“));

mysql_select_db($database_connect, $connect);
$Result1 = mysql_query($updateSQL, $connect) or die(mysql_error());

}
if ((isset($_POST[„MM_update“])) && ($_POST[„MM_update“] == „form1“)) {
$updateSchulen = sprintf(„UPDATE Schulen SET ansprech=%s, ansprech_email=%s, ansprech_telefon=%s, anmerkung=%s, WHERE schul_id=%s“,

GetSQLValueString($_POST[‚Ansprech‘], „text“),
GetSQLValueString($Ansprech_Email, „text“),
GetSQLValueString($Ansprech_Telefon, „text“),
GetSQLValueString($_POST[‚Anmerkung‘], „text“),

GetSQLValueString($_POST[‚Schule‘], „int“));

mysql_select_db($database_connect, $connect);
$Result2 = mysql_query($updateSchulen, $connect) or die(mysql_error());

header(sprintf(„Location: %s“, $BackGoTo));
}
?>

***********************************************
Danke für Eure Gedanken.
Gruß Estebu

P.S. Kann ich mir $updateSchulen auch irgendwo ausgeben lassen, damit ich mal sehen kann, was da eigentlich passiert? Ich wüsste nämlich nicht wie, denn das Script wird ja erst nach dem Klick auf „Submit“ ausgeführt und ich lande dann ja gleich wieder auf der vorherigen Seite…

Ich nehme an, dass die Datenbank zumindest soweit „normalisiert“ ist, dass jeder Ansprechpartner seine eigene ID hat und dann noch per FKSchulID der Schule zugewiesen ist.
Falls du eine n:1 Beziehung hast, also mehrere Ansprechpartner je Schule, kannst du entsprechend in deinem Formular eine Liste mit Ansprechpartnern zur Auswahl anzeigen, ansonsten verweis doch bei der Buchung einfach nur auf die ID der Schule und hol dir beim Auslesen entsprechend der 1:1-Beziehung Schule Ansprechpartner den jeweiligen heraus.
Oder noch besser, speicher trotzdem die ID des Ansprechpartners, falls dieser sich mal ändert. So kannst du bei alten Buchungen noch nachvollziehen wer der damalige Ansprechpartner war.
Jeder Ansprechpartner sollte natürlich eine eigene eindeutige ID haben (primary key, auto-increment)
Das ist sauberer, effektiver und einfacher zu verarbeiten, als bei jeder Buchung den Namen des Ansprechpartners herauszusuchen.

Falls dir der Vorschlag so nicht gefällt, sag bescheid.
Man kann’s so lösen wie ich verstanden habe, dass du es haben möchtest, aber das ist meiner Meinung nach unnötig verkompliziert.

Noch was, Zitat:
$query_Seite = „SELECT * FROM Seite WHERE Seite.id=“.$_GET[„rid“];

deineseite.php?rid=0;drop+table+Seite
Da kommt Freude auf.
Um sowas zu vermeiden, setz nicht direkt den Userinput in das SQL-Query ein.
Benutz etwa mysql_real_escape_string oder speziell in diesem Fall, wo es ein integer ist, reicht auch type-casting: (int)(@$_GET[‚rid‘])

Nun, soweit normalisiert ist es nicht, aber zu jeder Schule gibt es nur einen Ansprechpartner. Ändert sich dieser, wird der vorherige überschrieben. EIndeutig zugeordnet wird das ganze dann über die schul_id.
Danke auch, dass Du mich auf meine Sicherheitslücken hinweist, dem werde ich etwas später auch noch auf den Grund gehen, aber vorerst muss erstmal alles funktionieren.
Ich denke, Du hast aber mein Anliegen etwas missverstanden.

  1. Ich öffne mit eionem KLick auf „einfügen“ das Formular zum Einfügen einer neuen Schule für die jeweilige Veranstaltung. In diesem Formular sind freie Felder, die für den INSERT vorgesehen sind.

  2. Gleichzeitig werden in dem Formular auch Felder mit bereits vorhandenen Werten aus einer anderen Tabelle gefüllt, nämlich jeweils der Ansprechpartner der Schule, seiene Tel.-Nummer, Email etc.

  3. Die ersten 3 Felder werden nun als INSERT in Tabelle ANMELDUNG eingetragen

  4. Die letzten Felder mit den Einträgen des Ansprechpartners aus Tabelle SCHULEN sollen nun aber gleichzeitig in die Tabelle SCHULEN als UPDATE geschrieben werden.

Und das Ganze nun mit einem einzigen Formular.

Also müsste ich gleichzeitig einen INSERT-Befehl an ANMELDUNG und auch einen UPDATE-Befehl an SCHULEN abschicken.

Vielleicht ist es so nun besser erklärt?

Gruß Steffen

Auch wenn’s nicht 100% eine Antwort auf deine Frage ist, was spricht dagegen 2 Querys draus zu machen?
So hast du doch eine viel bessere übersicht, wenn du mal was anpassen musst, als wenn du später gar nicht mehr durchblickst

Ich danke Euch allen für Eure Hilfe. Ich habe den Fehler nun auch selbst gefunden, habe jede Zeile nochmals Wort für Wort, Zeichen für Zeichen nachgelesen und wie so oft war es „nur“ ein Schreibfehler - ein Komma zuviel! Jetzt klappt alles so, wie es soll!
Wer möchte, kann sich ja auch nochmal auf die Suche begeben…:wink:in Zeile bei $updateSchulen = sprintf werdet ihr sicher schnell fündig…

Gruß Steffen

Grundsätzlich ist es möglich, ja. Geht zwar performanter, aber das ist ja jetzt nicht deine Frage. Lass dir den Update-Query per echo ausgeben und teste ihn mal im phpMyAdmin. Dann siehst du, ob mit dem Query was nicht stimmt. (Dann siehst du auch, ob alle Formulardaten richtig ankommen).

Grüße

Ich denke mal dass die Frage bereits geklärt ist.
Tut mir leid das ich nicht zum Antworten gekommen bin.