Textdatei und MySQL updaten

freshman2017
Goto Top
Guten Abend,

mit u.s. PHP Skript befülle ich eine MySQL Tabelle mit einer Textdatei, bei der sich der Inhalt ergänzen bzw. auch ändern kann. Die DataID im Text File bleibt immer gleich.

Ich habe jetzt das Problem, dass immer wenn ich das Skript ausführe, werden die Daten immer wieder neu importiert und nicht, falls Datensätze bereits vorhanden sind, geupdatet.

Wie kann ich es hinbekommen, dass vorhandene Datensätze geupdatet und neue neu eingefügt werden?

PHP Skript:


Textfile:


Datenbankaufbau:

Content-Key: 2862695064

Url: https://administrator.de/contentid/2862695064

Ausgedruckt am: 02.07.2022 um 12:07 Uhr

Mitglied: manuel-r
manuel-r 22.05.2022 um 00:23:15 Uhr
Goto Top
Ist doch logisch. Du machst ja jedes Mal einen INSERT für jeden Datensatz. Egal ob er schon in der DB ist oder nicht.
Du musst die Spalte mit dem Index UNIQUE erstellen und dann beim Import entweder ein INSERT oder UPDATE machen. Je nachdem ob es den Eintrag schon gibt oder nicht: Stichwort ON DUPLICATE (auch Upsert genannt)

Manuel
Mitglied: freshman2017
freshman2017 22.05.2022 um 00:37:37 Uhr
Goto Top
Wie könnte es denn aussehen?
Was müsste ich genau anpassen?

Zitat von @manuel-r:

Ist doch logisch. Du machst ja jedes Mal einen INSERT für jeden Datensatz. Egal ob er schon in der DB ist oder nicht.
Du musst die Spalte mit dem Index UNIQUE erstellen und dann beim Import entweder ein INSERT oder UPDATE machen. Je nachdem ob es den Eintrag schon gibt oder nicht: Stichwort ON DUPLICATE (auch Upsert genannt)

Manuel

Mitglied: manuel-r
Lösung manuel-r 22.05.2022 um 00:45:43 Uhr
Goto Top
Eigentlich dachte ich es wäre kein Problem das mit der Suchmaschine deiner Wahl zu finden.
Du musst dein SQL-Statement anpassen

Siehe: https://dev.mysql.com/doc/refman/8.0/en/insert-on-duplicate.html

Manuel
Mitglied: freshman2017
freshman2017 22.05.2022 aktualisiert um 04:29:18 Uhr
Goto Top
Meinst Du so?



Zitat von @manuel-r:

Eigentlich dachte ich es wäre kein Problem das mit der Suchmaschine deiner Wahl zu finden.
Du musst dein SQL-Statement anpassen

Siehe: https://dev.mysql.com/doc/refman/8.0/en/insert-on-duplicate.html

Manuel

Mitglied: tk1234
tk1234 22.05.2022 um 09:00:35 Uhr
Goto Top
Moin,

Zitat von @freshman2017:

Meinst Du so?

Nein. In VALUES() gehört der Spaltenname deren neuer Wert verwendet werden soll also z.B. »name = VALUES(name)«. Aber: laut Handbuch ("Note"-Block bei ca. einem Drittel der Seite) ist die VALUES()-Variante ab MySQL 8.0.20 veraltet und es sollte die dort beschriebene Variante mit einem Alias für die neue Zeile verwendet werden.

Noch ein großes Aber: das ganze wird so nicht funktionieren: du hast keine der im INSERT verwendeten Spalten als UNIQUE definiert womit der "DUPLICATE KEY"-Fall nie eintritt. Du musst dataid in die id-Spalte schreiben oder dataid einen UNIQUE-Key verpassen. Und: warum liest du csv-Daten nicht als solche ein? Das ganze mit explode zu zerlegen ist fehleranfällig …

values('".$dataid."','".$name."','".$city."','".$postcode."','".$job_title."'),

Was hier allerdings völlig falsch bzw. gefährlich ist, ist die fehlende Behandlung des Kontextwechsels! Du darfst Werte nicht einfach so in den Query schreiben, verwende prepared Statements (mit PDO, das ist im Handling einfacher). Aber warum quälst du dich überhaupt mit Mysqli und baust den Query einfach so zusammen? Du wusstest es doch eigentlich mal besser

Gruß
Tobias
Mitglied: freshman2017
freshman2017 22.05.2022 um 13:05:38 Uhr
Goto Top
Hallo Tobias,

Wie würde denn aussehen, damit es so funktioniert wie gedacht?

Ich bekomme es leider nicht hin…

Beste Grüße

Zitat von @tk1234:

Moin,

Zitat von @freshman2017:

Meinst Du so?

Nein. In VALUES() gehört der Spaltenname deren neuer Wert verwendet werden soll also z.B. »name = VALUES(name)«. Aber: laut Handbuch ("Note"-Block bei ca. einem Drittel der Seite) ist die VALUES()-Variante ab MySQL 8.0.20 veraltet und es sollte die dort beschriebene Variante mit einem Alias für die neue Zeile verwendet werden.

Noch ein großes Aber: das ganze wird so nicht funktionieren: du hast keine der im INSERT verwendeten Spalten als UNIQUE definiert womit der "DUPLICATE KEY"-Fall nie eintritt. Du musst dataid in die id-Spalte schreiben oder dataid einen UNIQUE-Key verpassen. Und: warum liest du csv-Daten nicht als solche ein? Das ganze mit explode zu zerlegen ist fehleranfällig …

values('".$dataid."','".$name."','".$city."','".$postcode."','".$job_title."'),

Was hier allerdings völlig falsch bzw. gefährlich ist, ist die fehlende Behandlung des Kontextwechsels! Du darfst Werte nicht einfach so in den Query schreiben, verwende prepared Statements (mit PDO, das ist im Handling einfacher). Aber warum quälst du dich überhaupt mit Mysqli und baust den Query einfach so zusammen? Du wusstest es doch eigentlich mal besser

Gruß
Tobias