Avatar billede nemlig Professor
09. februar 2023 - 15:51 Der er 1 kommentar og
1 løsning

(PHP og MySQL) Import af el-forbrug og gemme data i DB

Hejsa.
Jeg har i PHP lavet et lille script som henter forbrugsdata pr. time fra en elmåler.
Jeg henter typisk data for 2 dage – dvs. 2 x 24 poster.
Dataene har jeg lagt i et array(), som jeg har navngivet $import.
De hentede data og ”print_r()” af arrayet kan ses her:
https://kalendersystem.dk/el.php

Jeg vil gerne gemme dataene i DB. Jeg har lavet en lille tabel således:
CREATE TABLE `elmaaler` (
  `id` int NOT NULL,
  `time` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
  `value` decimal(8,1) NOT NULL DEFAULT '0.0' )

Udfordring:
Jeg henter de 2-foregående dages værdier hver eftermiddag. Nogle gange er de ønskede data forsinkede, men så får jeg dem med i næste dags kørsel.
Når jeg skal gemme de 48 poster i DB, så skal jeg kun gemme de data, som ikke er gemt i forvejen i DB.

Eksempel:
Jeg henter onsdag eftermiddag el-data for mandag og tirsdag, men i DB kan jeg allerede om tirsdagen have gemt el-data for søndag og mandag. Det vil sige, at jeg onsdag eftermiddag allerede har dataene for mandag i DB, og dermed skal jeg kun gemme data for tirsdag.
Jeg håber jeg kan få lidt input til, hvordan jeg kan gennemløbe arrayet, men kun gemme de poster, hvor der ikke i forvejen er gemt noget i DB.
Avatar billede arne_v Ekspert
09. februar 2023 - 16:12 #1
Jeg kan tænke på to måder:

1)

SELECT MAX(time) FROM elmaaler

og indsæt kun de målinger som er efter den.

Metoden duer ikke hvis der er flere samtidige brugere som kører det script, men det lyder ikke som om at det er et problem.

2)

Unikt indeks på time feltet.

Forsøg at indsætte alle målinger og fang INSERT fejl p.g.a. duplicate key og forsæt til næste måling.

Det kan håndtere samtidige brugere og kan sågar klare huller i listen.

Men det spilder nogle resourcer. Dog næppe et problem for 24/48 rækker.
Avatar billede nemlig Professor
09. februar 2023 - 16:59 #2
Super godt Arne.

2 gode forslag, som jeg kan arbejde videre med.
Og der er ikke flere samtidige brugere - jeg styrer programafviklingen via et cronjob, som kører 1 gang i døgnet.

Tusinde tak.
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