# MySQL Datensatz von einer Tabelle in die andere kopieren



## Michael81 (4. Juli 2011)

Hallo,

kaum ist das letzte Problem gelöst, steh ich 10 PHP Seiten später vor dem nächsten.
Ich habe in der Datenbank Zellenspiegel die Tabellen bestand  und bestandC0. 
So, jetzt möchte ich Person XYZ von bestand nach bestandC0 kopieren. Aber ich bekomm die Daten nicht kopiert. Es wird auch kein Fehler ausgegeben. Ich bekomm durch die if-schleife ausgegeben aktion war erfolgreich. Aber das war es auch weder die Daten werden kopiert noch zeigt der MySQL Timestam eine veränderung an.

Ich Poste die beiden PHP-Codes mal mit. Auch wenn die bestimmt nicht mehr sauber sind da ich inzwischen mehrere Versuche hinter mir habe. Ändern der Variabel, MySQL Update Befehl. Mein letzter Lösungsansatz war, den Datensatz aus der alten Tabelle auslesen und via update in der neuen einfügen. Aber wie gesagt, die Daten kommen nie an, auch wenn echo zeigt das alle varibel einen Inhalt haben. 

gefg_update.php:

```
<html>
<head>
<title>Gefangendaten &auml;ndern</title>
<link rel="stylesheet" type="text/css" href="html/gefg_update.css">  
</head>

<?php
//includieren von datein
include 'lib/error.php';
include 'lib/connect.php';

//Get in Variabel packen
$hr = $_GET['action'];   
//echo $hr; 



//Gefangenendaten anhand der Varibel aus Get action aus der Datanbank auslesen
$anzeigen = mysql_query("SELECT * FROM bestand WHERE haftraum='$hr'");
while($ausgabe = mysql_fetch_array($anzeigen)){
$var1 = $ausgabe['nachname'];
$var2 = $ausgabe['vorname'];
$var3 = $ausgabe['gebdatum'];
$var3 = $ausgabe['haftende'];
$var4 = $ausgabe['konfession'];
$var5 = $ausgabe['sm'];
$var6 = $ausgabe['Buchnummer'];
$var7 = $ausgabe['arbeitsplatz'];
  }
echo "</table>";
echo "</div>";



//links für untereiten
echo "<a href='mysql_querry/mysql_gefg_loeschen.php?var11=$hr&nn=$var1&vn=$var2'>Gefangendaten l&ouml;schen</a><br>"; 
 
echo "<form id='gefg_update' method='get' action='mysql_querry/mysql_gefg_verlegen.php'>";
echo "<label for='name'>Neuer Haftraum:</label> <input type='text' id='hr3' name='hr3'<br />";
echo "<input type='hidden' name='var11' value='$hr'>";
echo "<input type=submit value='weiter'name='weiter' /> <br />";
echo "</form>";

?>



<form id="gefg_update" method="post" action="<?php echo "mysql_querry/mysql_gefg_update.php?var11=$hr"?>">
  <label for="name">Nachname:</label> <input type="text" id="nachname" name="nachname" value="<?php echo $var1;?>"/><br />
  <label for="name">Vorname:</label> <input type="text"id="vorname" name="vorname" value="<?php echo $var2;?>" /><br />
  <label for="name">Geburtsdatum:</label> <input type="text" id="geburtsdatum" name="geburtsdatum" value="<?php echo $var3;?>"/><br />
  <label for="name">Buchnummer:</label> <input type="text"id="buchnummer" name="buchnummer" value="<?php echo $var6;?>" /><br />  
  <label for="name">Konfession:</label> <input type="text" id="konfession" name="konfession" value="<?php echo $var4;?>"/><br />
  <label for="name">SM:</label> <input type="text"id="sm" name="sm" value="<?php echo $var5;?>" /><br /> 
  <label for="name">Haftende:</label> <input type="text" id="haftende" name="haftende" value="<?php echo $var3;?>"/><br />
  <label for="name">Arbeitsplatz:</label> <input type="text"id="arbeitsplatz" name="arbeitsplatz" value="<?php echo $var7;?>" /><br />  
  <input type="submit" id="submit" />
</form>
```

mysql_gefg_verlegen.php:

```
<html>
<head>
<title>Gefangendaten verlegen</title>
<link rel="stylesheet" type="text/css" href="../html/gefg_update.css">  
</head>

<?php
//includieren von datein
include '../lib/error.php';
include '../lib/connect.php';

//Get in Variabel packen
$haftr=$_GET["var11"];
$haftrn=$_GET["hr3"];


//Abteilung und HR in Array speichern und zerlegen
$arr = str_split("$haftrn", 2);
$abteilung = $arr[0];
$haftraum = $arr[1];
//echo "$abteilung,<br> $haftraum";

//echo "Den Gefangenen von $haftr nach $haftrn veregen<br>"; 


//Gefangenendaten anhand der Varibel aus Get action aus der Datanbank auslesen
$anzeigen = mysql_query("SELECT * FROM bestand WHERE haftraum='$haftr'");
while($ausgabe = mysql_fetch_array($anzeigen)){
$var21 = $ausgabe['nachname'];
$var22 = $ausgabe['vorname'];
$var23 = $ausgabe['gebdatum'];
$var24 = $ausgabe['haftende'];
$var25 = $ausgabe['konfession'];
$var26 = $ausgabe['sm'];
$var27 = $ausgabe['Buchnummer'];
$var28 = $ausgabe['arbeitsplatz'];
  }
echo "</table>";
echo "</div>";


//Haftraum via Update bearbeiten
$sqlupdate1 = "UPDATE bestand$abteilung
              SET 
                  nachname='$var21', 
                  vorname='$var22',
                  gebdatum='$var23',
                  haftende='$var24',
                  konfession='$var25',
                  sm='$var26',
                  Buchnummer='$var27',
                  arbeitsplatz='$var28',
                  update_user='$ip $host'
              WHERE  
                  haftraum='$haftn'";  
echo $var21;
echo "bestand$abteilung$haftraum";
$update1 = mysql_query($sqlupdate1);

if ($update1 == TRUE){
echo "Die Gefangenendaten von $haftr $nachn,$vorna wurden erfolgreich verlegt<br><br>";
//header("Refresh: 3;URL=../div2_1.php");
echo mysql_error();    
   
}
else{
echo "Datensatz konnte nicht aktualisiert werden!<br>";
echo mysql_error();
//echo "mysql_errno()<br>";
} 




?>
```


----------



## goto; (5. Juli 2011)

Hallo,

sieht sehr merkwürdig aus.
Aber schau mal in der Zeile "WHERE haftraum='$haftn'"; ". Die Variable $haftn" wird nicht deklariert, schreibfehler?

Viele Grüße


----------



## Michael81 (5. Juli 2011)

Ja, du hattest recht. Ich habe ein kack "r" vergessen. Da ich immer wieder die variabel bei neuen versuchen mit Copy und Paste übernommen habe, war der Fehler ja immer wieder da.

Aber Danke schonmal. Ist mir nicht aufgefallen.


----------



## raiguen (6. Juli 2011)

> Person XYZ von bestand nach bestandC0 kopieren. Aber ich bekomm die Daten nicht kopiert.





> Mein letzter Lösungsansatz war, den Datensatz aus der alten Tabelle auslesen und via update in der neuen einfügen.


Mit UPDATE funktioniert das auch nicht  Weil der zu kopierende Datensatz ja NOCH nicht in der Zieltabelle vorhanden ist 

Aber mit INSERT INTO geht das:

```
INSERT INTO bestandC0(
                  nachname, 
                  vorname,
                  gebdatum,
                  haftende,
                  konfession,
                  sm,
                  Buchnummer,
                  arbeitsplatz,
                  update_user
                  )
SELECT ( nachname, 
         vorname,
         gebdatum,
         haftende,
         konfession,
         sm,
         Buchnummer,
         arbeitsplatz,
         '$ip $host'
         FROM bestand         
         WHERE haftraum='$hr');
```

Die Haftraumnr und die Userkennung ist natürlich vorher entsprechend auszulesen 
Alle anderen Datenfelder muss man nicht umständlicgh per PHP-Form auslesen um sie dann als neuen Datensatz in die Zieltabelle einzufügen. Es geht auch direkt auf Datenbankebene, wie oben gezeigt.

Um sich zu vergewissern, dass auch tatsächlich der neue Datensatz eingefügt wurde:

```
SELECT  nachname, 
         vorname,
         gebdatum,
         haftende,
         konfession,
         sm,
         Buchnummer,
         arbeitsplatz,
         update_user
         FROM bestandC0         
         WHERE haftraum='$hr'
```



> ... wurden erfolgreich verlegt


Das heisst letztlich: die Daten müssen von der Ursprungstabelle _bestand_ gelöscht werden  Natürlich erst dann, wenn man sich wie o.a. davon überzeugt hat, dass der neue Datensatz auch tatsächlich in der Zieltabelle vorhanden ist


----------



## Michael81 (6. Juli 2011)

Aber wenn ich das mit INSERT INTO mache, würde der wenn Haftraum schon belegt ist, doch abbrechen, oder habe ich da was falsches im Kopf.


----------



## raiguen (7. Juli 2011)

Momentan sehe ich das Feld 'Haftraum' in der Zieltabelle bestandC0 nicht...
Wenn dieses dennoch vorhanden ist und über dieses Feld ein UNIQUE-Key existiert, dann würde das INSERT in der Tat mit einer Fehlermeldung abbrechen...

Aber...wie gesagt: in Deinen bisherigen Scripts erkenne ich nicht so ohne Weiteres, ob in der Zieltabelle auch der Haftraum mit angegeben wird!?
Davon mal abgesehen, erscheint mir die Daten-/Tabellenstruktur doch ein bischen merkwürdig - wahrscheinlich mal wieder historisch gewachsen!? Eine Person von einer Tabelle in eine andere 'verlegen', wo eigentlich nur die Haftraumnr. geändert werden müsste...


----------



## Michael81 (9. Juli 2011)

Ach nur beim UNIQUE-Key? Das wußte ich nicht, ich wußte nur das man mit Insert nicht vorhandene Datensätze ändern kann. 
Das ganze ist zwar historisch gewachsen, aber das verlegen war immer geplant. Ich würde einfach für jede Abteilung ne eigene Tabelle haben. Da es sonst sehr schnell unübersichtlich wird.  Darin stehen ca. 720 Personen mit allen Daten. Die nicht verloren gehen dürfen duch irgendwelche dummen zufälle. 
In der Praxis kommt es aber vor das Gefangene von einem Haus in ein anderes Haus/Abteilung und Haftraum verlegt werden.Jede Abteilung hat so einen Bestandszettel. Somit finde ich den weg den leichtesten da in jeder Tabelle eine Abteilung mit jedem Haftraum vorbelegt ist.


----------



## raiguen (11. Juli 2011)

> in jeder Tabelle eine Abteilung mit jedem Haftraum vorbelegt


DIESE Information hatte ich bis dato nicht, so dass ich mit meinem INSERT()-Vorschlag da natürlich völlig daneben lag.



> historisch gewachsen,


Wie so oft... und daran soll wie immer nichts geändert werden...



> Ich würde einfach für jede Abteilung ne eigene Tabelle haben. Da es sonst sehr schnell unübersichtlich wird.


Nee-im Gegenteil: je mehr Tabellen mit identischem Inhalt (nur anderer Tabellenname), desto UNübersichtlicher wird das Ganze.
Was z.B. wennn ein Gefangener 'gesucht' ierden soll, sprich: in welcher Abteilung bzw in welchem Haftraum ist dieser untergebracht?..... Dann ist man umständlich und zeitaufreibend am Durchsuchen ALLER Tabellen...(Wenn man Glück hat, dann ist der Gesuchte gleich in der ersten Tabelle, wenn man Pech hat, dann in der letzten.)



> mit allen Daten. Die nicht verloren gehen dürfen duch irgendwelche dummen zufälle.


DAS ist bei jeder elektronischen Datenverarbeitung so 



> von einem Haus in ein anderes Haus/Abteilung und Haftraum verlegt werden.


Okay, ist ja auch nicht 'dramatisch'; man kann es natürlich umständlich von einer Tabelle in die andere machen - so wie momentan in der historisch gewachsenen Struktur.
Es geht aber auch anders, in dem durch eine vernünftige Tabellenstruktur mit den entsprechenden Relationen eine Verweistabelle gepflegt wird, die einfach zu handeln ist und Verlegungen(=Bestandsänderungen) schnell und unkompliziert durchgeführt werden(können).


----------

