Avatar billede Morten Professor
16. april 2021 - 08:30 Der er 17 kommentarer og
1 løsning

Ustabilt php script, virker for det meste Hjælp :)

Hej

Jeg har været igang med at lave et php script med hjælp her inde fra. det virker fint for det meste og får ikke memory fejl, men nogle gange køre den ikke loopet færdig, så stopper den pludselig.
Kan ikke se fejlen kan i?
Koden:
global $wpdb;
    $con = $wpdb->__get('dbh');
        $stmt1 = $con->prepare("SELECT ID, post_type FROM nw_posts WHERE post_type = 'product'");
        $stmt1->execute();
        $rs1 = $stmt1->get_result();
        $lng = $rs1->num_rows+200;
        $sql = "SELECT distinct ID ,post_id, post_type, meta_key, meta_value, post_title, guid, post_modified, post_parent FROM **_postmeta
        INNER JOIN **_posts ON post_id = ID WHERE post_type ='product' AND meta_key in ( '_sku') GROUP BY post_title LIMIT ".$lng." ";
    $rs = $con->query($sql);

    $array = array();
    $brand = "";
    $meta_stock = "";
    $xml_file=fopen("***_nyhedsbrev.xml","w");
    $xml = "<?xml version='1.0' encoding='UTF-8'?>\n";
    $xml .= "<items>\n";
    $i = 0;
    while ($value = $rs->fetch_array(MYSQLI_ASSOC)) {
        $array[] = $value;
        $i++;
        $product = wc_get_product($value['ID']);
        $stock = $product->get_stock_status();
        if ($stock == 'instock') {
            if ($value['meta_key'] == "_sku") {
                global $meta_sku;
                $meta_sku = $value['meta_value'];
            }
            if (is_array(get_the_terms($value['ID'], 'product_brand'))) {
                foreach (get_the_terms($value['ID'], 'product_brand') as $item) {
                    global $brand;
                    $brand = $item->name;
                }
            }
            if (is_array(get_the_terms($value['ID'], 'product_cat'))) {
                foreach (get_the_terms($value['ID'], 'product_cat') as $item) {
                    global $koenet;
                    $koenet = $item->parent;
                }
            }
            global $koen;
            $koen = $koenet;

            $image = get_the_post_thumbnail_url($value['ID']);
            if (is_array(get_the_terms($value['ID'], 'product_cat'))) {
                foreach (get_the_terms($value['ID'], 'product_cat') as $term) {
                    if ($term->parent == 0) {
                        $koen = $term->name;
                    }
                }
            }
            $post_title = $value['post_title'];

            $guid = get_permalink($value['ID']);

            $post_modified = $value['post_modified'];

            $post_parent = $value['post_id'];

            $product = wc_get_product($value['ID']);
            if ($product->is_type('variable')) {


                // Min variation price
                $regular_price = $product->get_variation_regular_price(); // Min regular price
                $sale_price = $product->get_variation_sale_price(); // Min sale price
                if($regular_price == $sale_price) {
                    $meta_regular_price = $product->get_variation_regular_price(); // Min regular price
                    $meta_sale_price = "";
                } elseif ($sale_price != $regular_price) {
                    $meta_regular_price = $product->get_variation_regular_price(); // Min regular price
                    $meta_sale_price = $product->get_variation_sale_price(); // Min sale price
                }
                elseif ($sale_price == false) {
                    $meta_regular_price = $product->get_variation_regular_price(); // Min regular price

                }
            }
            if ($stock == "outofstock") {
                $meta_stock = 0;
            } elseif ($stock == "instock") {
                $meta_stock = 1;
            }
            global $meta_sku;
            $xml = "<item>\n"; // start Item
            $xml .= "<ExternalId>". $meta_sku. "</ExternalId>\n";
            $xml .= "<Modified>". $post_modified. "</Modified>\n";
            $xml .= "<Name>". htmlspecialchars($post_title, ENT_QUOTES) ."</Name>\n";
            $xml .= "<ImageLink>". $image ."</ImageLink>\n";
            $xml .= "<AdditionalImageLink>". $image. "</AdditionalImageLink>\n";
            $xml .= "<Link>". $guid ."</Link>\n";
            $xml .= "<Gender>". $koen ."</Gender>\n";
            $xml .= "<Brand>". htmlspecialchars($brand, ENT_QUOTES) ."</Brand>\n";
            $xml .= "<InStock>". $meta_stock ."</InStock>\n";
            $xml .= "<ItemGroupId>". $post_parent . "</ItemGroupId>\n";
            $xml .= "<RegularPrice>". $meta_regular_price ."</RegularPrice>\n";
            $xml .= "<SalePrice>". $meta_sale_price . "</SalePrice>\n";
            $xml .= "</item>\n";
            fwrite($xml_file, $xml);
        }


    }

    $xml .= "</items>";
    fwrite($xml_file, $xml);
    fclose($xml_file);

Jeg valgte at lave den uden XMLwirter da det blev mere stabilt, og blev udført.
Men har stadig nogle problemer.

Med venlig hilsen
Morten
Avatar billede acore Ekspert
16. april 2021 - 09:48 #1
Hej igen,

Der kunne gøres en del for at rydde op i din kode - eksempelvis:

- slet array() som du ikke bruger - det er foreslået før - slet også $i som du heller ikke bruger
- erstat alle foreach(...) med
if (is_array(get_the_terms($value['ID'], 'product_brand'))) $ brand = array_key_last(get_the_terms($value['ID'], 'product_brand'));
- der er en fejl i din kode - du udskriver det sidste element to gange og du udskriver ikke de to første linier til din xml fil (
- dit check på stock er unødvendigt
- og sikkert mere

Men mon det er der, problemet er?

Er du sikker på, at dine queries er rigtige?

I det første query tæller du op hvor mange rækker der er, og så begrænser du antallet af rækker i det andet query til det plus 200 rækker. Det kan jeg ikke se logikken i. Som jeg også har været inde på før, skal du ikke bare slette det første query helt og fjerne LIMIT i det andet?
Avatar billede Morten Professor
16. april 2021 - 10:25 #2
Hej

Fedt det vil jeg lige rode med takker :)
Avatar billede Morten Professor
16. april 2021 - 10:44 #3
if (is_array(get_the_terms($value['ID'], 'product_brand')))
                $brand = array_key_last(get_the_terms($value['ID'], 'product_brand'));
Får jeg kun et "0" af.
Er der noget jeg glemmer??
Avatar billede acore Ekspert
16. april 2021 - 10:47 #4
Sorry, det skal være

if (is_array(get_the_terms($value['ID'], 'product_brand')))
                $brand = array_key_last(get_the_terms($value['ID'], 'product_brand'))->name;
Avatar billede Morten Professor
16. april 2021 - 11:01 #5
Øv det virker ikke det kunne have været fedt at undgå nogle foreach.
Når det nu kun er en gang jeg skal brug det
Avatar billede acore Ekspert
16. april 2021 - 11:03 #6
Så må du finde ud af hvor/hvorfor det fejler
Avatar billede Morten Professor
16. april 2021 - 11:05 #7
Kan jeg nøjes med en break. så løber den kun en gang
Avatar billede Morten Professor
16. april 2021 - 11:08 #8
Nej det dur ikke
Avatar billede Morten Professor
16. april 2021 - 11:10 #9
Jo det dur havde sat den forkert.
Men vil det give noget?
Avatar billede acore Ekspert
16. april 2021 - 11:13 #10
Ja
Avatar billede Morten Professor
16. april 2021 - 11:17 #11
Super.
Så har jeg ryddet op ser det fint ud?

global $wpdb;
    $con = $wpdb->__get('dbh');
        $sql = "SELECT distinct ID ,post_id, post_type, meta_key, meta_value, post_title, guid, post_modified, post_parent FROM **_postmeta
        INNER JOIN **_posts ON post_id = ID WHERE post_type ='product' AND meta_key in ( '_sku') GROUP BY post_title";
    $rs = $con->query($sql);


    $xml_file=fopen("*****_nyhedsbrev.xml","w");
    $xml = "<?xml version='1.0' encoding='UTF-8'?>\n";
    $xml .= "<items>\n";
    fwrite($xml_file, $xml);

    while ($value = $rs->fetch_array(MYSQLI_ASSOC)) {
        $array[] = $value;

        $product = wc_get_product($value['ID']);
        $stock = $product->get_stock_status();

        if ($stock == 'instock') {
            if ($value['meta_key'] == "_sku") {
                global $meta_sku;
                $meta_sku = $value['meta_value'];
            }



            if (is_array(get_the_terms($value['ID'], 'product_brand'))) {
                foreach (get_the_terms($value['ID'], 'product_brand') as $item) {
                    global $brand;
                    $brand = $item->name;
                    break;
                }
            }


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


            if (is_array(get_the_terms($value['ID'], 'product_cat'))) {
                foreach (get_the_terms($value['ID'], 'product_cat') as $term) {
                    if ($term->parent == 0) {
                        $koen = $term->name;
                        break;
                    }
                }
            }
            $post_title = $value['post_title'];

            $guid = substr(get_permalink($value['ID']), strlen(get_option('home')));
            $image = substr(get_the_post_thumbnail_url($value['ID']), strlen(get_option('home')));

            $post_modified = $value['post_modified'];

            $post_parent = $value['post_id'];

            $product = wc_get_product($value['ID']);
            if ($product->is_type('variable')) {


                // Min variation price
                $regular_price = $product->get_variation_regular_price(); // Min regular price
                $sale_price = $product->get_variation_sale_price(); // Min sale price
                if($regular_price == $sale_price) {
                    $meta_regular_price = $product->get_variation_regular_price(); // Min regular price
                    $meta_sale_price = "";
                } elseif ($sale_price != $regular_price) {
                    $meta_regular_price = $product->get_variation_regular_price(); // Min regular price
                    $meta_sale_price = $product->get_variation_sale_price(); // Min sale price
                }
                elseif ($sale_price == false) {
                    $meta_regular_price = $product->get_variation_regular_price(); // Min regular price

                }
            }

                $meta_stock = 1;

            global $meta_sku;
            $xml = "<item>\n"; // start Item
            $xml .= "<ExternalId>". $meta_sku. "</ExternalId>\n";
            $xml .= "<Modified>". $post_modified. "</Modified>\n";
            $xml .= "<Name>". htmlspecialchars($post_title, ENT_QUOTES) ."</Name>\n";
            $xml .= "<ImageLink>"."https://umame.dk". $image ."</ImageLink>\n";
            $xml .= "<AdditionalImageLink>"."https://umame.dk". $image. "</AdditionalImageLink>\n";
            $xml .= "<Link>"."https://umame.dk". $guid ."</Link>\n";
            $xml .= "<Gender>". $koen ."</Gender>\n";
            $xml .= "<Brand>". htmlspecialchars($brand, ENT_QUOTES) ."</Brand>\n";
            $xml .= "<InStock>". $meta_stock ."</InStock>\n";
            $xml .= "<ItemGroupId>". $post_parent . "</ItemGroupId>\n";
            $xml .= "<RegularPrice>". $meta_regular_price ."</RegularPrice>\n";
            $xml .= "<SalePrice>". $meta_sale_price . "</SalePrice>\n";
            $xml .= "</item>\n";




            fwrite($xml_file, $xml);

        }
        flush();

    }

    $xml .= "</items>";
    fwrite($xml_file, $xml);
    fclose($xml_file);
Avatar billede olsensweb.dk Ekspert
16. april 2021 - 14:15 #12
#0
>$sql = "SELECT distinct ID ,post_id,
alle rækker vil være forskællige da du har ID (primær nøgle) med, distinct får ikke fjernet nogle rækker

>GROUP BY post_title
hvad var det lige arne_v skrev i https://www.computerworld.dk/eksperten/spm/1036982?k=8378430

citat
I standard SQL må der kun være group by felter og aggregerede funktioner i selet listen.

SELECT a,b,MIN(c),MAX(d) FROM x GROUP BY a,b

er OK.

...
...
Derfor: følg standard SQL for GROUP BY.
/citat


prøv dit sql i phpmyadmin, og når du får det output du forvendter, kan du gå vidre til php delen, dit sql er alfa og omega
Avatar billede Morten Professor
16. april 2021 - 17:00 #13
Hej

Jeg har prøvet dette i phpmyadmin
og dette resultat fik jeg og det er godt.
5933 i alt, Forespørgsel tog 0.3243 sekunder.)
SELECT ID ,post_id, post_type, post_date, meta_key, meta_value, post_title, guid, post_modified, post_parent FROM ****_postmeta INNER JOIN ****_posts ON post_id = ID WHERE post_type ='product' AND meta_key in ( '_sku') GROUP BY post_title ORDER BY post_date DESC
Avatar billede Morten Professor
16. april 2021 - 17:02 #14
Så det er mit script der er noget med. Men så er det bare hvad det er da gør at den ikke får det hele med.
Avatar billede Morten Professor
16. april 2021 - 17:20 #15
Jeg får 4.044 ud. også selvom jeg har koblet min stock funktion af Så skulle ellers alt komme ud. de 5933
Avatar billede Morten Professor
16. april 2021 - 17:46 #16
Jeg får på min test siden 5.461 ud. Men det er ikke dem alle.
Avatar billede Morten Professor
17. april 2021 - 03:02 #17
Hej igen

Jeg har prøvet lidt nyt eller sådan da men i forhold til at få opbygget filen.
Jeg har gjort så den skulle hente data igennem array_chunk og så lave flere filer, i håb på det vil hjælpe på det, men nej den siger (Allowed memory size of 268435456 bytes exhausted)

Min kode:

global $wpdb;
    $con = $wpdb->__get('dbh');
    $sql = "SELECT ID, post_id, post_type, post_date, meta_key, meta_value, post_title, guid, post_modified, post_parent FROM **_postmeta
        INNER JOIN **_posts ON post_id = ID WHERE post_type ='product' AND meta_key in ( '_sku') GROUP BY post_title ORDER BY post_date DESC";
    $rs = $con->query($sql);
    $rows = $rs->num_rows;


    $array = array();
    while ($valueOutput = $rs->fetch_array(MYSQLI_ASSOC)) {
        $array[] = $valueOutput;

    }
    $total_rows = $rows;
    $length = 800;
    $count_array = $total_rows / $length;
    $array_count_result = round($count_array);

    $splitArray = array_chunk($array, $length, true);
    $xml_file = fopen("umame_nyhedsbrev.xml", "w");
    $xml = "<?xml version='1.0' encoding='UTF-8'?>\n";
    $xml .= "<items>\n";
    fwrite($xml_file, $xml);

    for($i = 0; $i < $array_count_result; $i++) {
        $xml_file = fopen("***_nyhedsbrev[$i].xml", "w");

    foreach ($splitArray[$i] as $value) {


        if ($value['meta_key'] == "_sku") {
            global $meta_sku;
            $meta_sku = $value['meta_value'];
        }


        if (is_array(get_the_terms($value['ID'], 'product_brand'))) {
            foreach (get_the_terms($value['ID'], 'product_brand') as $item) {
                global $brand;
                $brand = $item->name;
                break;
            }
        }


        if (is_array(get_the_terms($value['ID'], 'product_cat'))) {
            foreach (get_the_terms($value['ID'], 'product_cat') as $item) {
                global $koenet;
                $koenet = $item->parent;
                break;
            }
        }


        if (is_array(get_the_terms($value['ID'], 'product_cat'))) {
            foreach (get_the_terms($value['ID'], 'product_cat') as $term) {
                if ($term->parent == 0) {
                    $koen = $term->name;
                    break;
                }
            }
        }
        $post_title = $value['post_title'];
        $product = wc_get_product($value['ID']);
        $guid = substr($product->get_permalink(), strlen(get_option('home')));
        $image = substr(get_the_post_thumbnail_url($value['ID']), strlen(get_option('home')));

        $post_modified = $value['post_modified'];
        $post_parent = $value['post_id'];


        if ($product->is_type('variable')) {


            // Min variation price
            $regular_price = $product->get_variation_regular_price(); // Min regular price
            $sale_price = $product->get_variation_sale_price(); // Min sale price
            if ($regular_price == $sale_price) {
                $meta_regular_price = $product->get_variation_regular_price(); // Min regular price
                $meta_sale_price = "";
            } elseif ($sale_price != $regular_price) {
                $meta_regular_price = $product->get_variation_regular_price(); // Min regular price
                $meta_sale_price = $product->get_variation_sale_price(); // Min sale price
            } elseif ($sale_price == false) {
                $meta_regular_price = $product->get_variation_regular_price(); // Min regular price

            }
        }

        $stock = $product->get_stock_status();
        if ($stock == 'instock') {
            $meta_stock = 1;
        } else {
            $meta_stock = 0;
        }

        global $meta_sku;
        $xml = "<item>\n"; // start Item
        $xml .= "<ExternalId>" . $meta_sku . "</ExternalId>\n";
        $xml .= "<Modified>" . $post_modified . "</Modified>\n";
        $xml .= "<Name>" . htmlspecialchars($post_title, ENT_QUOTES) . "</Name>\n";
        $xml .= "<ImageLink>" . "https://umame.dk" . $image . "</ImageLink>\n";
        $xml .= "<AdditionalImageLink>" . "https://***.dk" . $image . "</AdditionalImageLink>\n";
        $xml .= "<Link>" . "https://***.dk" . htmlspecialchars($guid, ENT_QUOTES) . "</Link>\n";
        $xml .= "<Gender>" . $koen . "</Gender>\n";
        $xml .= "<Brand>" . $brand . "</Brand>\n";
        $xml .= "<InStock>" . $meta_stock . "</InStock>\n";
        $xml .= "<ItemGroupId>" . $post_parent . "</ItemGroupId>\n";
        $xml .= "<RegularPrice>" . $meta_regular_price . "</RegularPrice>\n";
        $xml .= "<SalePrice>" . $meta_sale_price . "</SalePrice>\n";
        $xml .= "</item>\n";


        fwrite($xml_file, $xml);



    }
        sleep(2);
    flush();

    }
    $xml .= "</items>";
    fwrite($xml_file, $xml);
    fclose($xml_file);



Med venlig hilsen
Morten
Avatar billede Morten Professor
18. april 2021 - 22:25 #18
JUBIII fandt ud af noget fedt med SQL join inner join left
Nu behøver jeg ikke at have så mange row
Så nu kan jeg lave flere colums med mit selvvalgte navne med lige det jeg har brug for.
Dejligt i fik trykket med mig på maven :oP
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