Avatar billede mccookie Seniormester
11. december 2017 - 09:58 Der er 7 kommentarer og
1 løsning

Stort array som skal ind i en database

Hej,

Jeg trækker et array som ser ud som følger (PRINT_R)

System 1] => OK
            [Adr 1] => OK
            [Adr 2] => OK
            [Adr 3] => OK
            [Adr 4] => OK

System 2] => OK
            [Adr 1] => OK
            [Adr 2] => FEJL
            [Adr 3] => OK
            [Adr 4] => OK
System 3] => OK
            [Adr 1] => FEJL
            [Adr 2] => OK
            [Adr 3] => OK
            [Adr 4] => OK

System 4] => OK
            [Adr 1] => OK
            [Adr 2] => OK

System 5] => OK
            [Adr 1] => OK

...
...
...

Date hentes fra et web api og tager ca. 50 sekunder at danne (Ovenstående er kun et saks) og det går som regel efter planen!.
Lige nu henter jeg det hjem via et Cronjob, når ALLE data er samlet i et array, deles de op og sendes til en database........ og det lykkes som sådant..... men jeg kan se i databasen at der er flere gange, hvor posterne lægges 2,3,4,5 eller flere gange i databasen...... og det bliver noget rod!

Da tingene er dynamisk og der løbende tilføjes systemer indtil vi når et max. på 40, så hentes al data og sorteres på følgende måde:

1)
System navn lægges i en database og er den oprettet hentes den primære nøgle, så de nye poster kan pege på den!

2)
Adresserne gemmes i en anden tabel og peger på systemnavnet

Action:

Alt køres igennem 2 for each løkker

for each (system as system_out) {

// Tjek om systemet allerede er oprettet
// Hvis Ja, så returnerer den pri key
// Ellers oprettes systemet!

for each (adr as adr_out {
// gem adressen i systemet og peg på system XX
}

}

Er der en smartere måde at håndterer denne proces? Jeg synes somme tider at kunne se, at posterne gemmes flere gange indenfor kort, som at scriptet går i stå, eller ikke får afleveret data.....
Avatar billede jakobdo Ekspert
11. december 2017 - 10:29 #1
Hvis du har et "systemid", kunne du måske kigge på:

https://dev.mysql.com/doc/refman/5.7/en/insert-on-duplicate.html
Avatar billede mccookie Seniormester
11. december 2017 - 10:40 #2
Umiddelbart har jeg et systemID og hvis ikke opretter jeg det.....
Men jeg kan ikke helt gennemskue denne funktion
INSERT ... ON DUPLICATE KEY UPDATE
Avatar billede moddi100 Seniormester
11. december 2017 - 10:57 #3
De felter som ikke må kunne forekomme to gange i databasen, skal du i database oprette som enten PRiMARY KEY eller UNIQUE KEY. Det vil bevirke at en insert ikke kan indsætte samme key igen, men til gengæld kan opdaterer rækken af den eksisterende. Keys kan oprettes ved hjælp af f.eks. phpMyAdmin.

Linket fra #1 skulle gerne vise eksempler herpå. Hvis det stadigvæk er uklart, må du prøve at beskrive lidt mere om hvad du prøver at opnå, samt hvordan din database ser ud.
Avatar billede mccookie Seniormester
11. december 2017 - 11:07 #4
Udfordringen er egentligt om jeg kunne smide data fra et Array in i min database på en smartere måde....

Alle poster på adresser, oprettes unikke, men jeg kan se at når jeg kører et job kl. 10.00, så opdaterer den databasen 1-4 gange.... så den smider 4 nye poster istedet for kun 1....

Derfor tænkte jeg om der var en smartere måde at gemme fra et array
Avatar billede moddi100 Seniormester
11. december 2017 - 11:11 #5
Nu ved jeg selvfølgelig ikke hvordan du sender dem ind. Men hvis de kommer ind 1-4 gange, så er der noget i vejen med den logik du har lavet. Køres dit program eventuelt flere gange?

For at kunne hjælpe dig mere, bliver vi nok nødt til at se noget kode.

Kopier alle relevante kodestykker ind på pastebin.com, og post linket her på forummet. Lad være med at kopierer koden direkte herind.
Avatar billede mccookie Seniormester
11. december 2017 - 11:45 #6
Avatar billede moddi100 Seniormester
11. december 2017 - 12:04 #7
Og hvordan ser saveData() ud? Jeg antager at systemerne ikke indsættes flere gange?

Men igen, prøv at logge hver gang dit script kaldes, for at se, om det ikke skyldes, at det kaldes flere gange. Dette kan gøre det:

// Opretter filen log.txt og tilføjer en linje til den med udførselstidspunkt.
// Jeg antager at du er på windows, derfor \r\n fremfor \n for linjeskift
file_put_contents('log.txt', date('Y-m-d H:i:s') . "\r\n", FILE_APPEND);
Avatar billede mccookie Seniormester
11. december 2017 - 22:48 #8
Fik fjernet nogle løkker og reduceret scriptet..... det dæmmede op for problemet.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester