# 2 Tabellen einer MySQL-Datenbank auf einmal updaten



## wallis (27. Oktober 2011)

Hallo Freunde,

ich habe zwei Tabellen in meiner Datenbank ("adressen" und "magazine") welche ich gleichzeitig updaten möchte.

Folgendermaßen sieht mein UPDATE-Befehl aus:


```
$sql = "UPDATE adressen SET
	Firma = '".$firma."',
	Branche = '".$branche."',
	
	Vorname = '".$vorname."',
	Nachname = '".$nachname."',
	Strasse = '".$strasse."',
	Hausnummer = '".$hausnummer."',
	PLZ = '".$plz."',
	Ort = '".$ort."',

	Festnetz = '".$festnetz."',
	Mobil = '".$mobil."',
	Email = '".$email."',
	Homepage = '".$homepage."',
	
	Termine = '".$termine."',
	Empfehlung = '".$empfehlung."',
	Notiz = '".$notiz."', 
	Ergebnis = '".$ergebnis."';
	
	AR_Sprockhovel = '".$ar_sprockhovel."',
	AR_Hattingen = '".$ar_hattingen."',
	AR_Witten = '".$ar_witten."',
	AR_Bochumsued = '".$ar_bochumsued."'
	
WHERE ID = ".$id;
```

Allerdings sollen auch folgende Werte in eine andere Datenbank mit dem Namen "magazine" geupdatet werden.


```
AR_Sprockhovel = '".$ar_sprockhovel."',
AR_Hattingen = '".$ar_hattingen."',
AR_Witten = '".$ar_witten."',
AR_Bochumsued = '".$ar_bochumsued."'
```

Ist das machbar? Wenn ja wie geht das?#

Ich bitte um eine ausführliche Hilfestellung. Vielen vielen Dank******


----------



## tombe (27. Oktober 2011)

Also eine gekürzte Version könnte so aussehen:


```
UPDATE adressen, magazine SET adressen.Firma = '{$firma}', adressen.Branche = '{$branche}', adressen.AR_Sprockhovel = '{$ar_sprockhovel."}', adressen.AR_Hattingen = '{$ar_hattingen}', magazine.AR_Sprockhovel = '{$ar_sprockhovel."}', magazine.AR_Hattingen = '{$ar_hattingen}' WHERE adressen.ID = {$id} OR magazine.ID = {$id}
```

Ungetestet und ohne Gewähr !


----------



## wallis (27. Oktober 2011)

Hallo TOMBE,

danke für deine Hilfe, doch leider macht er kein UPDATE.


```
$sql = "UPDATE adressen, magazine SET
	adressen.Firma = '".$firma."',
	adressen.Branche = '".$branche."',
	
	adressen.Vorname = '".$vorname."',
	adressen.Nachname = '".$nachname."',
	adressen.Strasse = '".$strasse."',
	adressen.Hausnummer = '".$hausnummer."',
	adressen.PLZ = '".$plz."',
	adressen.Ort = '".$ort."',

	adressen.Festnetz = '".$festnetz."',
	adressen.Mobil = '".$mobil."',
	adressen.Email = '".$email."',
	adressen.Homepage = '".$homepage."',
	
	adressen.Termine = '".$termine."',
	adressen.Empfehlung = '".$empfehlung."',
	adressen.Notiz = '".$notiz."', 
	adressen.Ergebnis = '".$ergebnis."';
	
	magazine.AR_Sprockhovel = '".$ar_sprockhovel."',
	magazine.AR_Hattingen = '".$ar_hattingen."',
	magazine.AR_Witten = '".$ar_witten."',
	magazine.AR_Bochumsued = '".$ar_bochumsued."'
	
WHERE adressen.Id = ".$id." OR magazine.Id = ".$id;
```

Die Variablen erhalte ich per POST und diese sehen so aus:

```
$id = $_GET['id']; 

$sql = "SELECT * FROM adressen ORDER BY id ASC"; 
$ausgabe = mysql_query($sql); 
$data = mysql_fetch_array($ausgabe); 

//** VARIABLEN ZUR UEBERGABE IN DIE DATENBANK AUS FORUMLAR FUELLEN  **//

$id = $_POST["id"]; 
$firma = $_POST["Firma"];
$branche = $_POST["Branche"]; 

$vorname = $_POST["Vorname"]; 
$nachname = $_POST["Nachname"]; 
$strasse = $_POST["Strasse"]; 
$hausnummer = $_POST["Hausnummer"]; 
$plz = $_POST["PLZ"]; 
$ort = $_POST["Ort"]; 

$festnetz = $_POST["Festnetz"]; 
$mobil = $_POST["Mobil"]; 
$email = $_POST["Email"]; 
$homepage = $_POST["Homepage"];

$termine = $_POST["Termine"]; 
$empfehlung = $_POST["Empfehlung"]; 
$notiz = $_POST["Notiz"]; 
$ergebnis = $_POST["Ergebnis"];

$ar_sprockhoevel = $_POST["AR_Sprockhoevel"];
$ar_hattingen = $_POST["AR_Hattingen"];
$ar_witten = $_POST["AR_Witten"];
$ar_bochumsued = $_POST["AR_Bochumsued"];
```

Aber daran kann es doch nicht liegen? Was mache ich denn eigentlich mal wieder falsch?


----------



## tombe (27. Oktober 2011)

Gut das ich geschrieben habe "ungetestet" habe nämlich entdeckt das da ein böser Fehler enthalten ist.

Du musst bei WHERE die Bedingungen mit *AND* verknüpfen nicht mit OR. Sonst werden alle Datensätze geändert (sofern der Rest der Anweisung stimmt).

Geh einfach mal her und lass dir den Inhalt von $sql mit echo am Bildschirm ausgeben. Dann schaust du dir das an und prüfst auf Fehler.
Wenn du keinen Fehler finden kannst, kopiere die Ausgabe und füge sie z.B. bei phpmyAdmin ein und führe die Abfrage dort aus. Da sollte dann ein Fehler angezeigt werden.


Gut das ich geschrieben habe "ungetestet" habe nämlich entdeckt das da ein böser Fehler enthalten ist.

Du musst bei WHERE die Bedingungen mit *AND* verknüpfen nicht mit OR. Sonst werden alle Datensätze geändert (sofern der Rest der Anweisung stimmt).

Geh einfach mal her und lass dir den Inhalt von $sql mit echo am Bildschirm ausgeben. Dann schaust du dir das an und prüfst auf Fehler.
Wenn du keinen Fehler finden kannst, kopiere die Ausgabe und füge sie z.B. bei phpmyAdmin ein und führe die Abfrage dort aus. Da sollte dann ein Fehler angezeigt werden.


*STOPP, habe den Fehler gefunden:*


```
adressen.Ergebnis = '".$ergebnis."';
magazine.AR_Sprockhovel = '".$ar_sprockhovel."',
```

Du darfst das hier nicht mit ";" abschließen. Es muss mit Komma weitergehen:


```
adressen.Ergebnis = '".$ergebnis."',
magazine.AR_Sprockhovel = '".$ar_sprockhovel."',
```


----------



## wallis (27. Oktober 2011)

Hab's gerade mit dem "AND" getestet. Leider auch nichts... vermute wo anders einen Fehler, kann aber keinen sehen.

Kannst du mir kurz sagen, wie  und wo ich die Ausgabe mit echo erstellen soll. Bin da leider nicht ganz so im Thema... Danke!


----------



## tombe (27. Oktober 2011)

Also das echo schreibst du einfach nach der Zeile wo du die SQL-Anweisung zusammen stellst und an die Variable $sql übergibst.

Lies aber nochmal meinen obigen Beitrag, da steht drin was falsch ist!


----------



## wallis (27. Oktober 2011)

Es passiert leider immer noch nichts.

Wenn ich in dem UPDATE Befehl...


```
magazine.AR_Sprockhovel = '".$ar_sprockhovel."',
magazine.AR_Hattingen = '".$ar_hattingen."',
magazine.AR_Witten = '".$ar_witten."',
magazine.AR_Bochumsued = '".$ar_bochumsued."'
```

... rausnehme dann funktioniert es einwandfrei.

Wo kann es noch dran liegen?


----------



## Maniac (27. Oktober 2011)

Du solltest deine POST-Übergaben auch maskieren:

```
$empfehlung = mysql_real_escape_string($_POST['Empfehlung']);
```

Und das bei allen POST-Variablen

Und wenn dir das zu viel schreibarbeit ist, dann kannste das Post-Array in einer Schleife durchgehen und die Werte maskieren:


```
$newPostArray = array();

foreach($_POST as $Key => $value){
    if(!empty($value)) $newPostArray[$Key] = mysql_real_escape_string($value);
}
```

Ist nicht für Arrays im POST-Array gedacht. Da müsste man ein Funktion bauen Stichwort "Iteration".


----------



## tombe (27. Oktober 2011)

Wie oben bereits geschrieben, lass dir den Inhalt von $sql mit echo ausgeben. Das kopierst du dann a) hier rein und b) in phpmyAdmin!

UND c) auf das hören was Maniac schreibt !!


----------



## tombe (27. Oktober 2011)

Habe mal die Anweisung kopiert und die Variablen mit irgendwelchen Werten gefüllt. Der einzige Fehler den ich so finden konnte war das Semikolon.

Übernimm mal diese Zeilen so und ersetze deinen Codeabschnitt damit:



```
$sql = "UPDATE adressen, magazine SET
    adressen.Firma = '".$firma."',
    adressen.Branche = '".$branche."',
    adressen.Vorname = '".$vorname."',
    adressen.Nachname = '".$nachname."',
    adressen.Strasse = '".$strasse."',
    adressen.Hausnummer = '".$hausnummer."',
    adressen.PLZ = '".$plz."',
    adressen.Ort = '".$ort."',
    adressen.Festnetz = '".$festnetz."',
    adressen.Mobil = '".$mobil."',
    adressen.Email = '".$email."',
    adressen.Homepage = '".$homepage."',
    adressen.Termine = '".$termine."',
    adressen.Empfehlung = '".$empfehlung."',
    adressen.Notiz = '".$notiz."',
    adressen.Ergebnis = '".$ergebnis."',
    magazine.AR_Sprockhovel = '".$ar_sprockhovel."',
    magazine.AR_Hattingen = '".$ar_hattingen."',
    magazine.AR_Witten = '".$ar_witten."',
    magazine.AR_Bochumsued = '".$ar_bochumsued."'
WHERE adressen.Id = ".$id." AND magazine.Id = ".$id;

echo $sql;
```

Was natürlich noch falsch sein könnte und hier keiner weiß ob du gültige Werte übergibst. Eventuell ein Zeichen wo nur eine Zahl erlaubt wäre oder ähnliches!?


----------



## wallis (27. Oktober 2011)

Danke Leute!

Ich habe jetzt den Fehler gefunden! ;-)

Die Echo-Ausgabe von "$sql" zeigte mir, das ein "e" fehlte... 

War:

```
magazine.AR_Sprockhovel = '".$ar_sprockhovel."',
```

Soll:

```
magazine.AR_Sprockhoevel = '".$ar_sprockhoevel."',
```

Danke für die Hilfe!

Zum Tip von Maniac:
Muss einfach nur meine POST Variablen mit deinem Besipiel ersetzen? Was erreiche ich damit?


----------



## Maniac (27. Oktober 2011)

Wenn man Userinagaben in die Datenbank schreibt und nicht maskiert, wäre es möglich Schabernack zu treiben mit der DB. Du kannst mein Beispiel so verwenden für diese eine von dir beschriebene Situation. Dies funktioniert allerdings nur wenn es ein 1-Dimensionales Array ist.


----------



## wallis (27. Oktober 2011)

Okay vielen Dank für die Hilfen!

Ich werde es gleich direkt umsetzen******

Danke nochmal******


----------



## wallis (27. Oktober 2011)

Nochwas...

Jetzt habt ihr mir so gut geholfen! ;-)

Kann ich auch in zwei Datenbanken gleichzeitig etwas eintragen?

So funktioniert es leider nicht:


```
if ($_POST['submit'])
{	
$sql = 'INSERT INTO adressen, magazine (
		Firma,
		Vorname,
		Nachname,
		Strasse,
		Hausnummer,
		Ort,
		PLZ,
		Branche,
		Mobil,
		Festnetz,
		Email,
		Homepage,
		Notiz,
		Empfehlung,
		Ergebnis,
		Termine,
		AR_Sprockhoevel,
		AR_Hattingen,
		AR_Witten,
		AR_Bochumsued
		)
	VALUES (
		"'.$_POST['adressen.Firma'].'",
		"'.$_POST['adressen.Vorname'].'",
		"'.$_POST['adressen.Nachname'].'",
		"'.$_POST['adressen.Strasse'].'",
		"'.$_POST['adressen.Hausnummer'].'",
		"'.$_POST['adressen.Ort'].'",
		"'.$_POST['adressen.PLZ'].'",
		"'.$_POST['adressen.Branche'].'",
		"'.$_POST['adressen.Mobil'].'",
		"'.$_POST['adressen.Festnetz'].'",
		"'.$_POST['adressen.Email'].'",
		"'.$_POST['adressen.Homepage'].'",
		"'.$_POST['adressen.Notiz'].'",
		"'.$_POST['adressen.Empfehlung'].'",
		"'.$_POST['adressen.Ergebnis'].'",
		"'.$_POST['adressen.Termine'].'",
		"'.$_POST['magazine.AR_Sprockhoevel'].'",
		"'.$_POST['magazine.AR_Hattingen'].'",
		"'.$_POST['magazine.AR_Witten'].'",
		"'.$_POST['magazine.AR_Bochumsued'].'")';
		
mysql_query($sql); 
  echo "<script type='text/javascript'>location.href='index.php?go=ok';</script>";
}
```


----------



## Maniac (27. Oktober 2011)

Nein das ist nicht möglich. Hierzu musst du 2 Insert-Statements absetzen.


----------



## wallis (27. Oktober 2011)

Wie sieht das aus? Hab jetzt schon wieder zuviel ausprobiert... :-/

Kann man ein Art "elseif-Abfrage" machen?


```
if ($_POST['submit'])
{	
$sql1 = 'INSERT INTO adressen (
		Firma,
		Vorname,
		Nachname,
		Strasse,
		Hausnummer,
		Ort,
		PLZ,
		Branche,
		Mobil,
		Festnetz,
		Email,
		Homepage,
		Notiz,
		Empfehlung,
		Ergebnis,
		Termine )
	VALUES (
		"'.$_POST['Firma'].'",
		"'.$_POST['Vorname'].'",
		"'.$_POST['Nachname'].'",
		"'.$_POST['Strasse'].'",
		"'.$_POST['Hausnummer'].'",
		"'.$_POST['Ort'].'",
		"'.$_POST['PLZ'].'",
		"'.$_POST['Branche'].'",
		"'.$_POST['Mobil'].'",
		"'.$_POST['Festnetz'].'",
		"'.$_POST['Email'].'",
		"'.$_POST['Homepage'].'",
		"'.$_POST['Notiz'].'",
		"'.$_POST['Empfehlung'].'",
		"'.$_POST['Ergebnis'].'",
		"'.$_POST['Termine'].'")';
}
elseif
{
$sql2 = 'INSERT INTO magazine (
		AR_Sprockhoevel,
		AR_Hattingen,
		AR_Witten,
		AR_Bochumsued )	
	VALUES (
		"'.$_POST['AR_Sprockhoevel'].'",
		"'.$_POST['AR_Hattingen'].'",
		"'.$_POST['AR_Witten'].'",
		"'.$_POST['AR_Bochumsued'].'")';
}
```


----------



## Maniac (27. Oktober 2011)

Das Würde bedeuten wenn dein Formular abgesendet wurde, trägt er es in die eine Tabelle ein, wenn das Formular nicht abgesendet wurde, dann in die andere. Ist das dein Ziel?
MAch doch einfach 2 Inserts:


```
$sql1 = "INSERT INTO tabelle1 (fields) VALUES (values)";
$sql2 = "INSERT INTO tabelle2 (fields) VALUES (values)";

mysql_query($sql1) or die(mysql_error());
mysql_query($sql2) or die(mysql_error());
```


----------



## wallis (28. Oktober 2011)

Und wie baue ich das in meine "IF-Schleife" ein?

So...


```
if ($_POST['submit'])
{	
$sql1 = 'INSERT INTO adressen (
		Firma,
		Vorname,
		Nachname,
		Strasse,
		Hausnummer,
		Ort,
		PLZ,
		Branche,
		Mobil,
		Festnetz,
		Email,
		Homepage,
		Notiz,
		Empfehlung,
		Ergebnis,
		Termine )
	VALUES (
		"'.$_POST['Firma'].'",
		"'.$_POST['Vorname'].'",
		"'.$_POST['Nachname'].'",
		"'.$_POST['Strasse'].'",
		"'.$_POST['Hausnummer'].'",
		"'.$_POST['Ort'].'",
		"'.$_POST['PLZ'].'",
		"'.$_POST['Branche'].'",
		"'.$_POST['Mobil'].'",
		"'.$_POST['Festnetz'].'",
		"'.$_POST['Email'].'",
		"'.$_POST['Homepage'].'",
		"'.$_POST['Notiz'].'",
		"'.$_POST['Empfehlung'].'",
		"'.$_POST['Ergebnis'].'",
		"'.$_POST['Termine'].'")';

$sql2 = 'INSERT INTO magazine (
		AR_Sprockhoevel,
		AR_Hattingen,
		AR_Witten,
		AR_Bochumsued )	
	VALUES (
		"'.$_POST['AR_Sprockhoevel'].'",
		"'.$_POST['AR_Hattingen'].'",
		"'.$_POST['AR_Witten'].'",
		"'.$_POST['AR_Bochumsued'].'")';
		
mysql_query($sql); 
  echo "<script type='text/javascript'>location.href='index.php?go=ok';</script>";
}
```

...gehts leider nicht. :-(


----------



## saftmeister (28. Oktober 2011)

Mach doch mal aus der Zeile


```
mysql_query($sql);
```

ein


```
mysql_query($sql) or die( mysql_error() ); // << Fehler-Anzeige aktivieren
```

Schreib außerdem vor die folgende Zeile


```
if ($_POST['submit'])
```

noch das hier:


```
error_reporting(E_ALL | E_STRICT);
ini_set('display_errors', 1);
```

Edit: Da fehlt außerdem noch eine Zeile:


```
mysql_query($sql) or die( mysql_error() ); // << Fehler-Anzeige aktivieren
// und das zweite Statement ausführen
mysql_query($sql2) or die( mysql_error() ); // << Fehler-Anzeige aktivieren
```


----------

