Datensatz mit neuer ID duplizieren (kopieren, klonen)
lima-city → Forum → Programmiersprachen → PHP, MySQL & .htaccess
beispiel
benutzer
code
datenbank
datensatz
fehler
fehlermeldung
feld
limit
ordern
person
problem
set
stehen
syntax
tabelle
update
verbindung
versuchen
zeile
-
Hallo Zusammen,
Ich möchte eine genaue Kopie eines in der Datenbank angelegten Satzes.
Ich hatte mir vorgestellt das ich über eine Masterseite auf eine Detailseite gehe.
Nachdem die Detailseite angezeigt ist möchte ich mit einem Button (z.B. KOPIEREN) den genauen Datensatz in die Datenbank abspeichern.
<HTML> <HEAD> <TITLE>Eine Datenbank auswählen und Tabelle</TITLE> </HEAD> <BODY> <?php // Die Parameter für die Datenbank-Verbindung festlegen $servername = "localhost"; $benutzer = "root"; $passwort = ""; // Versuchen, die DB-Verbindung herzustellen if ($verbindung = mysql_connect ($servername, $benutzer, $passwort)) { echo "Die Verbindung mit der Datenbank auf <B>$servername</B> wurde aufgebaut.<P>"; } else { echo "Der Verbindungsversuch zur DB ist fehlgeschlagen! " . mysql_error(); exit(); } $datenbank = "hallo_welt"; // Die Datenbank auswählen if (!mysql_select_db ($datenbank)) { echo "Die Datenbank konnte nicht ausgewählt werden: " . mysql_error(); exit(); } else { echo "Die Datenbank <B>$datenbank</B> wurde ausgewählt.<P>"; } CREATE TEMPORARY TABLE tmp SELECT * FROM $datenbank WHERE id = $_POST['$row_DetailRS1['ID']']; UPDATE tmp SET id = NULL; INSERT INTO $datenbank SELECT * FROM tmp; // Die Verbindung zur Datenbank schließen mysql_close ($verbindung); ?> </BODY> </HTML>
bekomme aber diesen Felder:
Parse error: syntax error, unexpected 'TEMPORARY' (T_STRING) in C:\xampp\htdocs\system\beispiele\beispiele\dkopieren.php on line 31
Irgenwie scheine ich auf dem "SCHLAUCH" zu stehen bzw. habe "TOMATEN" auf den Augen.
Im voraus vielen Dank für Eure Hilfe
ekiam -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
Wenn du das so in deiner PHP-Datei stehen hast, dann kann es nur zu einem Parse Error kommen.
CREATE TEMPORARY TABLE tmp SELECT * FROM $datenbank WHERE id = $_POST['$row_DetailRS1['ID']']; UPDATE tmp SET id = NULL; INSERT INTO $datenbank SELECT * FROM tmp;
Lies dir doch noch mal genau durch, wie du eine MySQL Anweisung in PHP schreibst.
Mal so als Gedankenstütze mysql_query wäre da wohl nicht ganz so verkehrt. -
was wahr ist, ist wahr, du solltest deine sql's via php verarbeiten. und ich weiß es nicht, wie die einstellungen bei xampp sind in punkto temporary tables. hier heißt es: keine 'temporary tables' auf lima-city!
beweismittel (eingeloggt auf lima via cli):
fall_1
fall_2mysql> CREATE TEMPORARY TABLE db_xxxxxx_n.tmp SELECT * from db_xxxxxx_n.piwik_user; ERROR 1044 (42000): Access denied for user 'USERxxxxxx'@'%' to database 'db_xxxxxx_n'
nachher steht (bei mir ) in der tabellemysql> CREATE TABLE db_xxxxxx_n.tmp SELECT * from db_xxxxxx_n.piwik_user; Query OK, 1 row affected (0.07 sec) Records: 1 Duplicates: 0 Warnings: 0
die thematik habe ich schon da im forum geklärt(, aber niemand will mir glauben [man darf mich wieder mal mit minuspunkt abstrafen - danke] ;)mysql> select * from db_xxxxxx_n.tmp; +-----------+----------+-----------+-----------------------+------------+---------------------+ | login | password | alias | email | token_auth | date_registered | +-----------+----------+-----------+-----------------------+------------+---------------------+ | anonymous | ******* | anonymous | anonymous@example.org | anonymous | 2013-08-04 17:38:30 | +-----------+----------+-----------+-----------------------+------------+---------------------+ 1 row in set (0.05 sec)
Beitrag zuletzt geändert: 16.2.2014 2:11:28 von czibere -
Hallo Zusammen,
nachdem mir all-in1 einen Hinweis gegeben hat (ich weiss immer noch nicht warum mir mir so ein Missgeschick passiert ist), habe ich immer noch folgendes Problem:
Ich lese aus einer MYSQL-Tabelle einen Datensatz aus und schreibe diesen in ein ARRAY.
Suche anschließend den letzten Datensatz ($sql2 = "SELECT * FROM personen ORDER BY personen.ID DESC LIMIT 1";)
Möchte jetzt zwei Datenfelder ändern und den Datensatz in die DB zurückschreiben (ID habe ich um 1 erhöht)
Aber es will einfach nicht funktionieren.
Kann mir bitte jemand anhand eines Beispiels erklären wie man so etwas hinbekommt.
Vielen Dank im voraus
Gruß
EKIAM -
Hallo meron,
die ID = Auto-Increment definiert.
Die Fehlermeldung lautet:
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 '13;12;Jonny;Jonny;Walker;Walker;1900;1900;Texas;Texas;0;0' at line 1
Der Code (einige Codezeilen erscheinen unsinnig, aber das sind Tests von mir!)
<HTML> <HEAD> <TITLE>Daten kopieren</TITLE> </HEAD> <BODY> <p> </p> <?php // Die Parameter für die Datenbank-Verbindung festlegen $servername = "localhost"; $benutzer = "root"; $passwort = ""; // Versuchen, die DB-Verbindung herzustellen if ($verbindung = mysql_connect ($servername, $benutzer, $passwort)) { echo "Die Verbindung mit der Datenbank auf <B>$servername</B> wurde aufgebaut.<P>"; } else { echo "Der Verbindungsversuch zur DB ist fehlgeschlagen! " . mysql_error(); exit(); } $datenbank = "hallo_welt"; $tabelle = "personen"; // Die Datenbank auswählen if (!mysql_select_db ($datenbank)) { echo "Die Datenbank konnte nicht ausgewählt werden: " . mysql_error(); exit(); } else { echo "Die Datenbank <B>$datenbank</B> wurde ausgewählt.<P>"; } // Welche Tabelle(n) befinden sich in der Datenbank $sql300 = "SHOW TABLES FROM $datenbank"; $result100 = mysql_query($sql300); if (!$result100) { echo "DB Fehler, konnte Tabellen nicht auflisten\n"; echo 'MySQL Fehler: ' . mysql_error(); exit; } while ($row = mysql_fetch_row($result100)) { echo "Tabelle: {$row[0]}\n"; }; $sql2 = "SELECT * FROM personen ORDER BY personen.ID DESC LIMIT 1"; $result = mysql_query($sql2) OR die(mysql_error()); $zeile = mysql_fetch_array ($result); // print_r($zeile); $zae = 0; $zae = $zeile[0]; $zae = $zae+1; $zeile[0] = $zae; $e_interessen = implode(";",$zeile); echo "<pre>"; print_r ( $zeile ); mysql_query("Insert into personen select id, vorname, Nachname, geburtsjahr, geburtsort, nummer from $e_interessen") OR die("<br> Error INTO: <br>".mysql_error()); // Die Verbindung zur Datenbank schließen mysql_close ($verbindung); ?> <a href="master100.php" target="_self"> Zur Anzeige </a> </BODY> </HTML>
Vielen Dank im voraus
Gruß
Ekiam
Beitrag zuletzt geändert: 21.2.2014 7:37:44 von ekiam -
Guten morgen
Ich bin gerade nicht an meinem PC um dies zu verifizieren, aber sollte es nicht folgendermassen heissen:
INSERT INTO personen (deine Felderliste) VALUES ($e_interessen)
Das implode muss zudem mit ',' aufgelöst werden, des weiteren muss natürlich Text und Datums in '' gesetzt werden.
Wenn die Spalte id Autoincrement definiert ist, sollte mysql beim insert automatisch die letzte Nummer+1 eintragen, somit kannst du das ID Feld aus dem Query löschen.
Hoffe ich konnte weiterhelfen.
Gruess -
Hallo meron,
Ja Du hastest Recht.
Vielen Dank dafür.
Aber wenn ich versuche den Datensatz einzufügen kommt die Fehlermeldung:
Column count doesn't match value count at row 1
Gut wirst Du jetzt sagen da stimmen die Anzahl der Felder nicht überein (zu wenig / zu viel)
Ich habe es überprüft. Komme aber zu dem Ergebnis, dass wenn ich mir das implode-Ergebnis anschaue zu folgendem Ergebnis:
14,13,Max,Max,Mustermann,Mustermann,1940,1940,Kleve,Kleve,301,301
Wieso ist dort alles doppelt????
Vielen Dank im voraus
Gruß
Ekiam -
Hi
das Problem wird wohl dein Limit Befehl sein, der erste Datensatz den du selektierst ist die 0, gibst du nur eine Zahl beim LIMIT an entspricht das (siehe http://dev.mysql.com/doc/refman/5.1/de/select.html) 0- angegebene Zahl und somit 2 Datensätze.
Korrekt wäre also SELECT ... LIMIT 0,1
Das Skript kopiert aber immer nur den letzten Eintrag, ist das korrekt?
Zudem scheint das Id Problem noch nicht gelöst (Id aus Insert-Statement entfernen, sonst könnte es bei reger Benutzung deines Skripts zu einem Problem führen ...)
Gruess
Meron -
Hallo meron,
vielen Dank für Deine Antwort.
Leider bekomme ich das nicht hin.
Ich habe mir die Seite durchgelesen und Deinen Rat befolgt. Aber ich bekomme immer noch zwei Datensätze angezeigt!
Gruß
Ekiam -
Hi
Wie lautet denn nun dein $sql2?
Wenn der wiefolgt aussieht, dürften eigentlich nicht mehr zwei Datensätze selektiert werden:
$sql2 = "SELECT * FROM personen ORDER BY personen.ID DESC LIMIT 0,1";
Wenn doch dann probiere einmal das folgende (ich nehme an personen.ID ist in der Spalte eindeutig):
$sql2 = "SELECT * FROM personen WHERE personen.ID = gewünschteID ORDER BY personen.ID DESC LIMIT 0,1";
Aber poste doch sonst nocheinmal dein Quellcode denn du nun hast (bin nämlich noch gespannt wegen dem ID-Problem und den '' wie du das gelöst hast).
Und am besten auch deine Tabellenstruktur (also was für Felder sind darin enthalten und ein paar Beispieldatensätze, dann kann ich mir dies etwas besser vorstellen
Aber grundsätzlich: das Skript ist nicht mehr wirklich portabel und da stellt sich die Frage, warum du dies nicht einfach direkt ausprogrammierst halt nur für diese ein Tabelle?
Gruess
Meron -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage