Avatar billede JacoDK Nybegynder
28. december 2011 - 20:17 Der er 8 kommentarer og
1 løsning

Ideer til indlæsning af json

Hej Eksperter,

Jeg henter data fra en json fil, som indeholder en masse forskellige json array, hvilket gør den tager lang tid at læse ind i mysql.

Dertil vil jeg hører om i kender en smartere eller lettere måde at indlæse json på ? :)


<?php

    if ( $_GET['do'] === 'update' )
    {
        $socket = json_decode( file_get_contents("http://www.hjemmeside.dk/json.aspx?user=".$username."&pass=".$password.""), true );
            for ( $i=0; $i<count($socket); $i++ )
                {
                    if ( $getExist = $mysqli->prepare('SELECT count(JSON_ID) FROM `table` WHERE JSON_ordre=?') )
                        {
                            $getExist->bind_param('s', $socket[$i]['ID']);
                            $getExist->execute();
                            $getExist->store_result();
                            $getExist->fetch();
                           
                            if ( $getExist->num_rows > 0 )
                            {
                                if ( $insertDokument = $mysqli->prepare('INSERT INTO `table` SET `JSON_ordre` = ?, `JSON_Account` = ?, `JSON_title` = ?, `JSON_customer` = ?, `JSON_username` = ?, `JSON_total` = ?, `JSON_date` = ?') )
                                    {
                                        $priceSocket = json_decode(file_get_contents("http://www.hjemmeside.dk/json.aspx?user=".$username."&pass=".$password."&get=".$socket[$i]['ID']), true);

                                        $insertDokument->bind_param('sssssss', $socket[$i]['ordre'], $socket[$i]['account'], $socket[$i]['title'], $socket[$i]['customer'], $socket[$i]['username'], $priceSocket['total'], date('Y-m-d H:i:s', (str_replace(array('/Date(',')/'),"",$priceSocket['date'])/1000)));
                                        $insertDokument->execute();
                                    }
                            }
                            else
                            {
                                // STOP INSERTING THEN REACHING ALREADY EXISTS
                                $i = count($socket);
                            }
                            }
                }
    }

?>


Som i kan se har jeg prøvet at stoppe forespørgslen ($i = count($socket);) når den rammer et ID den kender, da alle ID står fortløbende. Dette er for at gøre processen hurtigere, men det virker ikke rigtig.
Avatar billede olebole Juniormester
28. december 2011 - 22:48 #1
<ole>

Der er to primære årsager til at bruge prepared statements. Den ene er, at gentagne kald bliver mere effektive, da man kan nøjes med at oprette et statement én gang og derefter kalde DB'en med dette statement mange gange.

Opret, såvidt det overhovedet er muligt, dine statements udenfor løkken. Det vil i hvertfald gøre koden langt mere effektiv.

Jeg går udfra som givet, at kolonnen JSON_ordre er indekseret - ellers bør du absolut indeksere den!

/mvh
</bole>
Avatar billede JacoDK Nybegynder
29. december 2011 - 17:09 #2
Hej Ole,

Jeg er desværre ikke så teknisk på dette her, kan jeg få dig til at smidde et hurtig eksempel?
Avatar billede olebole Juniormester
29. december 2011 - 18:20 #3
Jeg forstår ikke rigtig, hvad du mener med, at du vil stoppe forespørgslen - eller hvorfor - men sådan kunne du flytte dine statements udenfor løkken og genbruge dem ved hvert kald:


    if ( $_GET['do'] === 'update' )
    {
        $socket = json_decode( file_get_contents("http://www.hjemmeside.dk/json.aspx?user=".$username."&pass=".$password), true );
        $getExist = $mysqli->prepare('SELECT count(JSON_ID) FROM `table` WHERE JSON_ordre=?');
        $insertDokument = $mysqli->prepare('INSERT INTO `table` SET `JSON_ordre` = ?, `JSON_Account` = ?, `JSON_title` = ?, `JSON_customer` = ?, `JSON_username` = ?, `JSON_total` = ?, `JSON_date` = ?');
       
            for ( $i=0; $i<count($socket); $i++ )
                {
                    if ( $getExist )
                        {
                            $getExist->bind_param('s', $socket[$i]['ID']);
                            $getExist->execute();
                            $getExist->store_result();
                            $getExist->fetch();
                           
                            if ( $getExist->num_rows > 0 )
                            {
                                if ( $insertDokument )
                                    {
                                        $priceSocket = json_decode(file_get_contents("http://www.hjemmeside.dk/json.aspx?user=".$username."&pass=".$password."&get=".$socket[$i]['ID']), true);

                                        $insertDokument->bind_param('sssssss', $socket[$i]['ordre'], $socket[$i]['account'], $socket[$i]['title'], $socket[$i]['customer'], $socket[$i]['username'], $priceSocket['total'], date('Y-m-d H:i:s', (str_replace(array('/Date(',')/'),"",$priceSocket['date'])/1000)));
                                        $insertDokument->execute();
                                    }
                            }
                            else
                            {
                                // STOP INSERTING THEN REACHING ALREADY EXISTS
                                $i = count($socket);
                            }
                            }
                }
    }

Avatar billede JacoDK Nybegynder
29. december 2011 - 20:22 #4
Tak, det hjalp på hastigheden :)

Grunden til at jeg vil afslutte min løkke med $i = count($socket);, hvilket der ikke virker er som følgende:

Alle de IDér der hentes fra filen er fortløbende, hvilket gør at når den rammer et id som allerede er i databasen, så eksistere de sidste også. Altså

230 - UKENDT, INDSÆT DATABASE
223 - UKENDT, INDSÆT DATABASE
222 - UKENDT, INDSÆT DATABASE
190 - KENDT, STOP LØKKE
179 - KENDT, MEN LØKKEN ER STOPPET
170 - KENDT, MEN LØKKEN ER STOPPET
150 - KENDT, MEN LØKKEN ER STOPPET
101 - KENDT, MEN LØKKEN ER STOPPET
Avatar billede olebole Juniormester
30. december 2011 - 16:08 #5
Så skal du vel bare skrive:

// STOP INSERTING THEN REACHING ALREADY EXISTS
break;
Avatar billede JacoDK Nybegynder
31. december 2011 - 12:39 #6
Tusind tak :)

Du må gerne smide et svar, og godt nytår! ;D
Avatar billede olebole Juniormester
31. december 2011 - 14:15 #7
Selvtak - men ellers tak, jeg samler ikke point. Læg selv et svar og accepter det, så tråden lukkes. Og godt Nytår til dig  =)
Avatar billede JacoDK Nybegynder
31. december 2011 - 14:30 #8
Tusind tak :)
Avatar billede delvis-begynder Nybegynder
31. december 2011 - 15:59 #9
#7 -
Jeg ville nu også gerne give point til #7's gode forslag, som også var lærerrige for mig.
Så derfor Rigtig GODT NYTÅR 2012 herfra.

Det er et DEJLIGT lærerigt Site, jeg håber inderligt det forbliver med gode administratorer.

Beklager dog at jeg selv er "alt" for sjælden aktiv! - Undskyld!
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
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

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