freshman2017
Goto Top

Textdatei und MySQL updaten

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:

$conn = mysqli_connect('localhost','root','','demo');  
 
if(!$conn)
{
    die(mysqli_error());
}

$open = fopen('employee-data.txt','r');  
 
while (!feof($open))
{
$getTextLine = fgets($open);
$explodeLine = explode(",",$getTextLine);  

list($dataid,$name,$city,$postcode,$job_title) = $explodeLine;

$qry = "insert into empoyee_details (dataid,name, city,postcode,job_title) values('".$dataid."','".$name."','".$city."','".$postcode."','".$job_title."')";  
mysqli_query($conn,$qry);
}
 
fclose($open);

Textfile:

1,Heber,Camrynborough,26728,Home Health Aide
2,Modesto,West Janet,15152-2683,Software Engineer

Datenbankaufbau:

CREATE TABLE `empoyee_details` (
`id` INT(11) NOT NULL AUTO_INCREMENT,
`dataid` VARCHAR(255) NULL DEFAULT NULL,
`name` VARCHAR(255) NULL DEFAULT NULL,
`city` VARCHAR(255) NULL DEFAULT NULL,
`postcode` VARCHAR(255) NULL DEFAULT NULL,
`job_title` VARCHAR(255) NULL DEFAULT NULL,
PRIMARY KEY (`id`)
);

Content-ID: 2862695064

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

Ausgedruckt am: 21.11.2024 um 21:11 Uhr

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
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
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
INSERT INTO tabelle ( ... ) VALUES ( ...) ON DUPLICATE KEY UPDATE  tabelle SET ...

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

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

$qry = "insert into empoyee_details (dataid,name,city,postcode,job_title) values('".$dataid."','".$name."','".$city."','".$postcode."','".$job_title."'),   
ON DUPLICATE KEY UPDATE dataid=VALUES('".$dataid."'),   
name=VALUES('".$name."'),   
city=VALUES('".$city."'),   
postcode=VALUES('".$postcode."'),   
job_title=VALUES('".$job_title."');  


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
INSERT INTO tabelle ( ... ) VALUES ( ...) ON DUPLICATE KEY UPDATE  tabelle SET ...

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

Manuel
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 wusstest es doch eigentlich mal besser

Gruß
Tobias
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 wusstest es doch eigentlich mal besser

Gruß
Tobias