MySQL-Problemchen->INSERT über M:N-Relation

Davicito

Erfahrenes Mitglied
Hallo,
ich benötige mal Eure Hilfe in Sachen INSERT... ON DUPLICATE KEY UPDATE...

In meiner Datenbank gibt es mehrere N zu M (N:M) Relationen und habe bereits schon eine Select-Abfrage formuliert, hinbekommen
SQL:
...
SELECT
        anr.*,
        ma.Personal_ID,                                 
        ma.Vorname,
        ma.Nachname,
        ma.Straße,
        ma.PLZ,
        ma.Ort,
        ma.Telefon,
        ma.Handy,
        ma.Email,
        date_format(ma.Geburtsdatum,'%d.%m.%Y') AS Geb_formated,
        kn.Kunden,
        n.Laender,
        n.Counter
    FROM 
        anrede AS anr,
        nationalitaet AS n,                                  
        mitarbeiter AS ma
        INNER JOIN( einsatzort AS eo
                          INNER JOIN 
                            Kunden AS kn
                        ON
                            eo.Kunden_ID = kn.Kunden_ID)
                        ON 
                            ma.Personal_ID = eo.Personal_ID
    WHERE
          ma.Anrede_ID = anr.Anrede_ID 
        AND
              ma.Nationalitaet_ID = n.Counter 
        AND
         ma.Vorname = ".@$_POST['vn']."
        AND
         ma.Nachname = ".@$_POST['nn']."
...
nun möchte ich aber nach Abändern der Daten Ein Update über die gleiche Relation durchführen... aber 1 zu 1, kann ich das nicht übernehmen, wie ich das bei der SELECT-Anweisung gemacht habe.

ich mache das immer separat mit
SQL:
UPDATE 
    mitarbeiter AS ma, anrede AS anr
SET 
    ma.Anrede_ID = '".$_POST["anr"]."',
    ma.Vorname = '".$_POST["vn"]."',
    ma.Nachname = '".$_POST["nn"]."',
    ma.Straße = '".$_POST["str"]."',
    ma.PLZ = '".$_POST["plz"]."',
    ma.Ort = '".$_POST["ort"]."',
    ma.Telefon = '".$_POST["tel"]."',
    ma.Handy = '".$_POST["mobi"]."',
    ma.Email = '".$_POST["mail"]."',
    ma.Geburtsdatum = str_to_date('".$_POST['geb']."','%d.%m.%Y'),
    ma.Nationalitaet_ID = '".$_POST["nation"]."'
WHERE
    ma.Anrede_ID = anr.Anrede_ID
    AND
    Vorname = ".$_POST['vn']."
    AND
    Nachname = ".$_POST['nn']."
SQL:
UPDATE
    einsatzort
SET 
    Personal_ID = ".$tmpID.", 
    Kunden_ID = ".$_POST[$key]

Nun habe ich dynamisch neue Selectboxen in PHP erzeugt und würde gerne zusätzlich mit
INSERT INTO... SET... ON DUPLICATE KEY UPDATE... arbeiten und das ebend über eine M:N-Relation
und hab folgendes gebastelt, was aber leider nicht funktioniert!

SQL:
INSERT INTO 
      mitarbeiter AS ma, 
      anrede AS anr
  SET 
      ma.Anrede_ID = '".$_POST["anr"]."',
      ma.Vorname = '".$_POST["vn"]."',
      ma.Nachname = '".$_POST["nn"]."',
      ma.Straße = '".$_POST["str"]."',
      ma.PLZ = '".$_POST["plz"]."',
      ma.Ort = '".$_POST["ort"]."',
      ma.Telefon = '".$_POST["tel"]."',
      ma.Handy = '".$_POST["mobi"]."',
      ma.Email = '".$_POST["mail"]."',
      ma.Geburtsdatum = str_to_date('".$_POST['geb']."','%d.%m.%Y'),
      ma.Nationalitaet_ID = '".$_POST["nation"]."'
FROM    
      INNER JOIN(einsatzort AS eo
                    INNER JOIN 
                            Kunden AS kn
                        ON
                            eo.Kunden_ID = kn.Kunden_ID)
                        ON 
                            ma.Personal_ID = eo.Personal_ID
 WHERE
      ma.Anrede_ID = anr.Anrede_ID
  AND
      Vorname = ".$_POST['vn']."
  AND
      Nachname = ".$_POST['nn']." 
  ON DUPLICATE KEY UPDATE 
     ma.Personal_ID=LAST_INSERT_ID(ma.Personal_ID)

Da taucht folgende Fehlermeldung auf:
Notice: Undefined variable: update in C:\xampp\htdocs\MA-Update.php on line 126
Error:
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'AS ma, anrede AS anr SET ma.Anrede_ID = ' at line 2

Ich hab kein Schimmer, wo ich nun die beiden INNER JOINS hin tun muss, damit es auch geht. Habt ihr ne Idee?

Gruß.
 
Hi Timestamp,
danke Dir für den hilfreichen Tipp mit mysql_real_escape_string()! Da hab ich nicht dran gedacht, was es da für Konsequenzen nach sich ziehen könnte.

Der PHP-Code ist einwandfrei! Aber hier mal für Dich:
SQL:
SELECT
        anr.*,
        ma.Personal_ID,                                 
        ma.Vorname,
        ma.Nachname,
        ma.Straße,
        ma.PLZ,
        ma.Ort,
        ma.Telefon,
        ma.Handy,
        ma.Email,
        date_format(ma.Geburtsdatum,'%d.%m.%Y') AS Geb_formated,
        kn.Kunden,
        n.Laender,
        n.Counter
    FROM 
        anrede AS anr,
        nationalitaet AS n,                                  
        mitarbeiter AS ma
        INNER JOIN( einsatzort AS eo
                          INNER JOIN 
                            Kunden AS kn
                        ON
                            eo.Kunden_ID = kn.Kunden_ID)
                        ON 
                            ma.Personal_ID = eo.Personal_ID
    WHERE
          ma.Anrede_ID = anr.Anrede_ID 
        AND
              ma.Nationalitaet_ID = n.Counter 
        AND
         ma.Vorname = ".@$_POST['vn']."
        AND
         ma.Nachname = ".@$_POST['nn']."

PHP:
$result_dat = mysql_query(" s. SQL-Anweisung, oben") OR die(...);
	
$row_dat = mysql_fetch_object($result_dat) OR die(...);
					
echo'<form name="update" action="menu.php?page=MA-Update.php" method="POST">';									
	$result_anr = mysql_query("SELECT 
							       *
							 FROM 
							 	anrede
						   ") OR die("Fehler: ".mysql_error()); 
											  
	echo"Anrede:<br>";		
	echo'<select size="1" maxlength="20" name="anr"><br>';
	echo'<option value='.$row_dat->Anrede_ID.'>'.$row_dat->Anrede.'</option>';							  
	while($row_anr= mysql_fetch_object($result_anr)) 						 		
		echo '<option value="'.$row_anr->Anrede_ID.'">'.$row_anr->Anrede.'</option>';						
	echo'</select>';		
	
        echo'<br>Vorname:<br>';
	echo'<input type="text"  name="vn" value="'.$row_dat->Vorname.'"><br>';			
	...

       $result_kunden = mysql_query("SELECT 
								kn.Kunden_ID,
								kn.Kunden,
								kn.VZ
						 	FROM 
						 		kunden AS kn
							 ") OR die("Fehler: ".mysql_error()); 
											 
	echo'Einsatzort:';
	mysql_data_seek($result_dat,0);						
	$i = 1;							 
	while($row_kn = mysql_fetch_object($result_dat))
	{								
		mysql_data_seek($result_kunden,0);			
		echo'<select name="'."einOrt".$i++.'" >';														
		echo '<option value='.$row_kn->Kunden_ID.'>'.$row_kn->Kunden.'</option>';															
		while($row_kunden = mysql_fetch_object($result_kunden)) 								 		
			echo '<option value='.$row_kunden->Kunden_ID.'>'.$row_kunden->Kunden.'</option>';								
		echo'</select><br>';														
	}						
	
        mysql_data_seek($result_kunden,0);
		
	echo'<select name"selectID1" onChange="knAuswahlFeld(this)">';
	echo'<option> </option>';							
             while($row_kunden = mysql_fetch_object($result_kunden))							 		
		echo '<option value='.$row_kunden->Kunden_ID.'>'.$row_kunden->Kunden.'</option>';							
	echo'</select>';												
	
       $result_nation = mysql_query("SELECT 
								n.Counter, 
								n.Laender 
							FROM 
								Nationalitaet AS n
							 ") OR die("Fehler: $anreden <br>".mysql_error());
				
	echo'Nationalität:<br>';
	echo'<select size="1" maxlength="20" name="nation"><br>';						
	echo'<option value='.$row_dat->Counter.'>'.$row_dat->Laender.'</option>';								
		while($row_nation= mysql_fetch_object($result_nation)) 						 		
			echo '<option value='.$row_nation->Counter.'>'.$row_nation->Laender.'</option>';						
	echo'</select><br>';

	echo '<input type="submit" name="modify" value="Ändern"/>';
echo'</form>';
Die Sicherheit durch mysql_real_escape_string(), werde ich noch einbauen. Läuft momentan eh nur offline, das Gnaze!

Gruß

PS. Ich hab da noch mal ne Frage so neben bei... Wenn ich jetzt 10 M:N-Relationen habe - also eine sehr große Datenbank-Struktur besitze - est es da nicht eher besser mehrere SELECT-, INSERT- bzw. UPDATE-Abfragen formuliere, oder ist es eher besser, wenn ich das alles in nur ein SELECT bzw. INSERT zu schreiben, wegen der Performance?

Lieben Dank im Voraus, für Eure Hilfen!
 
Zuletzt bearbeitet:
Zurück