Avatar billede Morten Professor
02. april 2021 - 08:54 Der er 11 kommentarer

JSON fil bliver ikke færdig lavet, eller er det min while

Hej Eksperter

Jeg har været igang med at lave en xml file her for nylig, men hørt det er nemmere at håndtere en json file.

Jeg har så været i nogle problemer med memory, det fik jeg hjælp til at det virker rigtig godt.
Det jeg så har af problemer lige nu er at den ikke køre hele min while loop igennem. Der mangler mange rows.

Vil høre om i vil kigge på min kode se om i kan se noget.

global $wpdb;

    $con = $wpdb->__get('dbh');
    $stmt = $con->prepare("SELECT DISTINCT ID, post_date, ***_posts.guid, ***_posts.post_modified, ***_posts.post_parent, ***_posts.post_title, ***_posts.post_type, ***_postmeta.post_id, ***_postmeta.meta_value, ***_postmeta.meta_key
    FROM ***_posts INNER JOIN ***_postmeta ON ID = ***_postmeta.post_id WHERE post_type = 'product' and ***_postmeta.meta_key in ('_regular_price', '_sale_price', '_stock_status', '_wp_attached_file', '_sku')");
    $stmt->execute();
    $rs = $stmt->get_result();
    while($key = $rs->fetch_array(MYSQLI_ASSOC)) {



        $post_modified = $key['post_modified'];

        if ($key['post_parent'] > 0) {
            global $post_parent;
            $post_parent = $key['post_parent'];
        }

        if ($key['meta_key'] == "_regular_price") {
            global $meta_regular_price;
            $meta_regular_price = $key['meta_value'];

        }
        global $meta_regular_price;

        if ($key['meta_key'] == "_sale_price") {
            global $meta_sale_price;
            $meta_sale_price = $key['meta_value'];

        }
        global $guid;
        $guid = $key['guid'];

        if ($key['meta_key'] == "_stock_status") {
            global $post_type;
            $post_type = $key['post_type'];
            global $post_title;
            $post_title = $key['post_title'];
            global $meta_stock;
            if($key['meta_value'] == "outofstock") {
                $meta_stock = 0;
            } elseif($key['meta_value'] == "instock") {
                $meta_stock = 1;
            }

        }

        if ($key['meta_key'] == "brand") {
            global $post_type;
            $post_type = $key['post_type'];
            global $post_title;
            $post_title = $key['post_title'];
            global $product_brand;
            $product_brand = $key['value'];

        }


        if ($key['post_type'] == "product" && $key['meta_key'] == "_sku") {
            global $meta_sku;
            $meta_sku = $key['meta_value'];
            global $post_title;
            $post_title = $key['post_title'];
            $brand_name = get_the_terms($key['ID'], 'product_brand');

            foreach ($brand_name as $item) {
                global $brand;
                $brand = $item->name;

            }
            $koen = get_the_terms($key['ID'], 'product_cat');
            foreach ($koen as $item) {
                global $koenet;
                $koenet = $item->parent;
            }
            global $koen;
            $koen = $koenet;

            $terms = get_the_terms($key['ID'], 'product_cat');

            foreach ($terms as $term) {
                if ($term->parent == 0) {
                    global $koen;
                    $koen = $term->name;
                }
            }
        }

        if($key['meta_key'] == "_wp_attached_file") {
            global $meta_image_url;
            $meta_image_url = $key['meta_value'];
        }

        global $meta_regular_price, $meta_sale_price, $meta_image_url, $meta_sku, $post_title, $post_type, $meta_stock, $brand, $post_parent, $guid, $koen;


        $feed_nyhedsbrev[] = array(
                'ExternalId' => $meta_sku,
                'Modified' => $post_modified,
                'Name' => $post_title,
                'ImageLink' => get_home_url()."/" . $meta_image_url,
                'AdditionalImageLink' => get_home_url()."/" . $meta_image_url,
                'Link' => $guid,
                'Gender' => $koen,
                'Brand' => $brand,
                'InStock' => $meta_stock,
                'ItemGroupId' => $post_parent,
                'RegularPrice' => $meta_regular_price,
                'SalePrice' => $meta_sale_price,
            );
        }

    $json = json_encode($feed_nyhedsbrev);
    file_put_contents("******_nyhedsbrev.json", $json);
        $stmt->close();

Med venlig hilsen
Morten
Avatar billede acore Ekspert
02. april 2021 - 10:22 #1
Er du sikker på, at du ikke løber tør for memory? Du har hele filen i memory.
Avatar billede Morten Professor
02. april 2021 - 10:39 #2
Nå for den da bruger eller den anden metode.
$con = $wpdb->__get('dbh');
    $stmt = $con->prepare("SELECT ...");
    $stmt->execute();
    $rs = $stmt->get_result();
    while($key = $rs->fetch_array(MYSQLI_ASSOC))

Men kan det være det? den output ellers noget.
Men bare ikke det hele.

Hmm kan det være den join på sql'en
Avatar billede Morten Professor
02. april 2021 - 10:42 #3
hmm nu prøvede jeg uden join det samme sker
Avatar billede Morten Professor
02. april 2021 - 13:30 #4
Hej Acore

Kunne se hvad du mente har lavet gør det på denne måde nu
$fp = fopen('****_nyhedsbrev.json', 'w');
    fwrite($fp, json_encode($feed_nyhedsbrev));
    fclose($fp);
Kan det godt passe den ikke gør det samme.
Avatar billede olsensweb.dk Ekspert
02. april 2021 - 13:53 #5
lidt off topic
at json er xml pladsmæssigt er overlegen er der ikke tvivl om, men er du sikker på at brugeren kan læse json ??
så vidt jeg forstår er det et rss feed du vil lave, og rss er normalt xml baseret


https://www.jsonfeed.org/
https://github.com/manton/jsonfeed-wp

tool
https://rss2json.com/#rss_url=https%3A%2F%2Fgithub.com%2Fexpressjs%2Fexpress%2Freleases.atom
Avatar billede arne_v Ekspert
02. april 2021 - 16:22 #6
json_encode er ligesom DOM for XML - den opbygger i memory og udskriver det hele.

Det er et prpoblem med GB data.

PHP komme mig bekendt ikke med  en JSON ekvivalent for XmlWriter.

Men de findes. Google:
  PHP jsonwriter

Alternativt kan det nemt emuleres.

udskriv "["
udskriv json_encode af række i loop
udskriv "]"
Avatar billede Morten Professor
02. april 2021 - 17:00 #7
Hej
Jeg fik af vide af dem som står for nyhedsbrevet kan brug Json. Men hvis det er det der bliver et problem med min hentning af data skal jeg nok holde mig til der virker bedst.
Hvad vil i forslå der vil det være bedst med xml eller json. I forhold til den mængde data der skal ned i filen. Der er ca. 6600 produkter i databasen og ca. 27000 varianter.
Er nød til at hente data i varianterne da der kun er pris i dem. da lager optælling er i varianterne.

Har i en god ide til det?
Tak for i vil hjælpe mig.
Avatar billede arne_v Ekspert
02. april 2021 - 17:17 #8
JSON fylder mindre end XML.

Skal data processes i web browser er JSON bedre end XML.

Men skal data processes server side, så vil XML give modtageren flere muligheder.
Avatar billede arne_v Ekspert
02. april 2021 - 17:22 #9
Men uanset hvad så betyder data størrelsen at data skal processes en klump af gangen (stream) - ikke med det hele i memory på samme tid.

Input fra database:
- det indbyggede WP duer ikke
- fiske mysqli handle ud og bruge mysqli funktioner er ok
- alternativet med LIMIT til at fiske klumper ud ville også have været OK

Output til XML:
- DOMDcoument duer ikke
- XmlWriter (med flush) er OK

Outout til JSON:
- json_encode af det hel duer ikke
- trick med json_encode af en klump af gangen bør være OK
- en ekstern JSON writer bør også være OK
Avatar billede Morten Professor
02. april 2021 - 17:22 #10
Så det vil være nemmere med feks. ændringer i xml når en pris f.eks. ændre sig. har en modify på filen på diverse items i min xml fil. og har en unik _sku så jeg har noget at gå efter.
Er det den rigtig frem gang?
Avatar billede Morten Professor
02. april 2021 - 17:30 #11
Hov så ikke du havde lavet det nye indlæg

Spørgsmål til "Klumper af data af gangen"
Hvordan kan jeg gøre det?
Ved der er den limit men har ikke leget så meget med den da jeg kun har brugt det i side skift ikke i en loop på den måde. hvordan kan jeg gøre det?
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



IT-JOB

Cognizant Technology Solutions Denmark ApS

Senior Delivery Manager

Cognizant Technology Solutions Denmark ApS

Test Architect - Projects

Udlændinge- og Integrationsministeriet

Forretningsudvikler med fokus på digitalisering og AI