Skocz do zawartości

Pętla foreach nie wyświetla pierwszej pozycji z pliku xml


kaoso

Rekomendowane odpowiedzi

Chcę wyświetlać 3 najczęściej klikane produkty.

Wyciągam z bazy danych 3 najczęściej klikane wartości. Pobiera pola "url". Tutaj wszystko gra - w tablicę daje te o które mi chodzi.

Gdy po wartościach "url" wyciągam pętlą z pliku xml 3 produkty do których te url-e prowadzą - omija pierwszy - czyli ten z indeksem 0 tablicy. 2 pozostałe wyświetla. Wynikiem są 2 produkty, pierwszy najczęściej klikany nie jest wyświetlany.

// łączenie z bazą danych
$dbh = new PDO(..., USER, PASS);
function pokazTop(){
global $dbh;
$query = $dbh->query('SELECT url FROM nazwa_tabeli ORDER BY ilosc_klikniec_w_url DESC LIMIT 3');
$top = $query -> fetch(PDO::FETCH_ASSOC); // próbowałem nie tylko z ...ASSOC
$query -> closeCursor();

// w tym momencie var_dump($top); wyświetla mi ładnie 3 url-e o które mi chodzi numerowane od 0,1,2

foreach($top as $id){
foreach($offer->xpath('/products/product[TDProductId="'.$id['url'].'"]') as $value){
 // powyższą pętlą zaciągam w dane z pliku xml do dalszej obróbki po podanym url linka z bazy danych
 // następnie wywołuję funkcję pokazującą dane url-e ubrane w html itd. poprzez zwykłe echo np.:
 // echo $value->TDProductId;
 // wyświetla poprawnie drugi i trzeci produkt, pierwszy omija
}
}
}

gdzie url to postać liczbowa np. 3645 (4 lub 5 cyfrowa liczba)

Kombinowałem z ...ASSOC i ...COLUMN ale to samo, w końcu wyciągam wartość url a indeks w tablicy nie gra mi roli. Podejrzewam że druga pętla foreach gubi pierwszy produkt. Nie za mocny jestem z pętli, może ktoś coś podpowie? To pewnie jakiś banał a nie mogę wychwycić tego... Może jakoś złączyć te pętle w jedną? O jakiejś właściwości tego rodzaju pętli nie wiem/zapomniałem?

Proszę o jakieś sugestie :)

50% kod rabatowy na Hosting WWW, SSD, SEO lub serwer VPS - tylko do 28 listopada - info pw (seohost.pl)

Odnośnik do komentarza
Udostępnij na innych stronach

Zainteresuj się złączeniami języku SQL.

HTTP 200 usługi IT -> Dariusz Janicki | Realizacja serwisów www oraz oprogramowania w PHP / C# / Golang / Node.js / MySQL/ Laravel
Komory normobaryczne - normobaria.tech Wykonawca montażu i instalacji komory normobarii

Odnośnik do komentarza
Udostępnij na innych stronach

@Mion rozumiem że chodzi Ci o "join" itd. tylko że tutaj nie mam 2 tabel a 1 bazę danych MySQL i jeden plik XML. Z bazy wyciągam "url" na podstawie którego już z pliku XML wyławiam to co chcę wyświetlić użytkownikowi.

Z bazy MySQL ładnie wyciągam to co potrzebuję czyli 3 wyniki o które mi chodzi, ale jak już druga pętla "foreach" wyciąga z pliku XML odpowiednie produkty to "gubi" pierwszy.

Nie będę tworzył drugiej bazy danych na podstawie pliku XML bo jest on 2 razy dziennie aktualizowany i znowuż 2 razy dziennie pakować go do bazy to nie wiem... wolałbym na podstawie pobranego "url" szukać po XMLu tylko gubi mi pierwszy wynik. Coś mi świta w głowie, miałem kiedyś podobną sytuację z 3 lata temu i nie pamiętam jak to rozwiązałem :(

Odświeżę sobie jointy ;) może na coś wpadnę co mi przypomni obejście problemu.

50% kod rabatowy na Hosting WWW, SSD, SEO lub serwer VPS - tylko do 28 listopada - info pw (seohost.pl)

Odnośnik do komentarza
Udostępnij na innych stronach

A sprawdzałeś, czy w tym XMLu znajdują się wszystkie 3 urle?

Bo na pierwszy rzut oka to bym powiedział, że skoro z bazy wyciągnął trzy, a po drodze zgubił jednego, to tutaj jest coś na rzeczy:

foreach($offer->xpath('/products/product[TDProductId="'.$id['url'].'"]') as $value){

Może spróbuj sobie wyprintować to, czego szukasz i zobacz, czy to występuje w XMLu.

Odnośnik do komentarza
Udostępnij na innych stronach

var_dump pokazywał że z bazy wyciąga co chcę, potem jak piszesz pętla gubi... nic sprawdzę kolejny raz może jakimś dziwnym trafem z xml znikł mi ten url? Bo był na pewno - to pierwsze co sprawdzałem :) Sprawdzę wieczorem to dam znać może się mimo wyłączenia aktualizacji na komputerze lokalnym jednak zassało mi świeży plik w trakcie testów już po tym jak spojrzałem że ten url istnieje a nie zauważyłem tego...

EDIT:

@dziki_rysio_997 faktycznie z xml znikł ten produkt choć w bazie istnieje... zaktualizowało mi plik bez mojej wiedzy (testując skrypt miałem wyłączoną funkcję aktualizacji ale się "od komentowała" gdy cofałem w edytorze jakąś zmianę widocznie...). Muszę załatać bug by po aktualizacji xml nie szukało nieaktualnych produktów i powinno być ok. Dzięki za sugestie, byłem pewien że istnieje w xml-u bo sprawdzałem ręcznie a tu masz :)

50% kod rabatowy na Hosting WWW, SSD, SEO lub serwer VPS - tylko do 28 listopada - info pw (seohost.pl)

Odnośnik do komentarza
Udostępnij na innych stronach

faktycznie z xml znikł ten produkt choć w bazie istnieje.
Jak widać sam sobie tworzysz problemy. Bo nie widzę sensu przechowywać w bazie i zrzucać je do pliku XML.

Możesz to zrobić w ten sposób , że plik XML generowany jest dynamicznie w odpowiedzi na zadanie HTTP. Jeśli żądań HTTP tego źródła w XML jest naprawdę dużo do tego wygenerowania danych XML jest kosztowne możesz po wygenerowaniu zapisać w CACHE i przy każdym kolejnym wywołaniu sprawdzić pod kątem zmian w tabeli źródłowej bazy danych i jeśli takowe są wygenerować nowy -> zapisać -> wysłać do OUT i cykl się powtarza ...

HTTP 200 usługi IT -> Dariusz Janicki | Realizacja serwisów www oraz oprogramowania w PHP / C# / Golang / Node.js / MySQL/ Laravel
Komory normobaryczne - normobaria.tech Wykonawca montażu i instalacji komory normobarii

Odnośnik do komentarza
Udostępnij na innych stronach

"Jak widać sam sobie tworzysz problemy. Bo nie widzę sensu przechowywać w bazie i zrzucać je do pliku XML." - a po czym niby wnioskujesz że tak robię? Nic takiego nie pisałem. Mam plik XML z produktami od dostawcy. Wyświetlam sobie jego zawartość na www. Dla potrzeb stworzenia tzw. TOP10 i statystyk zrobiłem licznik kliknięć - dla ułatwienia w MySQL trzymam id produktów i ilość kliknięć. Nie rób domysłów ;) Raczej idę w stronę by sobie ułatwić a nie utrudnić, a że czasem się pogubię to już ludzka sprawa :)

"Możesz to zrobić w ten sposób , że plik XML generowany jest dynamicznie w odpowiedzi na zadanie HTTP. Jeśli żądań HTTP tego źródła w XML jest naprawdę dużo do tego wygenerowania danych XML jest kosztowne możesz po wygenerowaniu zapisać w CACHE i przy każdym kolejnym wywołaniu sprawdzić pod kątem zmian w tabeli źródłowej bazy danych i jeśli takowe są wygenerować nowy -> zapisać -> wysłać do OUT i cykl się powtarza ..." - ok, dzięki za wskazówki :) może się przyda na przyszłość. Na szczęście nie muszę tworzyć XMLi tylko je przetwarzam. Licznik zrobiłem w MySQL bo to lepsze rozwiązanie niż SQLite w przypadku gdy często będzie zapis.

Problem powstał jak to bywa z niedopatrzenia - klikając cofnij, dziabłem o 1 raz za dużo i od komentowało mi aktualizację pliku XML czego nie zauważyłem bo kodu kilka ekranów :) Już wszystko gra. Bugi wyłapane. Teraz biorę się za layout stronki.. resztę bajerów stworzę kiedy indziej :)

50% kod rabatowy na Hosting WWW, SSD, SEO lub serwer VPS - tylko do 28 listopada - info pw (seohost.pl)

Odnośnik do komentarza
Udostępnij na innych stronach

Zarchiwizowany

Ten temat przebywa obecnie w archiwum. Dodawanie nowych odpowiedzi zostało zablokowane.

  • Ostatnio przeglądający   0 użytkowników

    • Brak zarejestrowanych użytkowników przeglądających tę stronę.
×
×
  • Dodaj nową pozycję...

Powiadomienie o plikach cookie

Umieściliśmy na Twoim urządzeniu pliki cookie, aby pomóc Ci usprawnić przeglądanie strony. Możesz dostosować ustawienia plików cookie, w przeciwnym wypadku zakładamy, że wyrażasz na to zgodę. Warunki użytkowania Polityka prywatności