kaoso Opublikowano 19 Września 2013 Udostępnij Opublikowano 19 Września 2013 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 Więcej opcji udostępniania...
Mion Opublikowano 20 Września 2013 Udostępnij Opublikowano 20 Września 2013 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 Więcej opcji udostępniania...
kaoso Opublikowano 21 Września 2013 Autor Udostępnij Opublikowano 21 Września 2013 @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 Więcej opcji udostępniania...
dziki_rysio_997 Opublikowano 21 Września 2013 Udostępnij Opublikowano 21 Września 2013 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. Clusteric Auditor | Synonimizator tekstu Synoglota Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
kaoso Opublikowano 21 Września 2013 Autor Udostępnij Opublikowano 21 Września 2013 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 Więcej opcji udostępniania...
Mion Opublikowano 23 Września 2013 Udostępnij Opublikowano 23 Września 2013 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 Więcej opcji udostępniania...
kaoso Opublikowano 23 Września 2013 Autor Udostępnij Opublikowano 23 Września 2013 "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 Więcej opcji udostępniania...
Rekomendowane odpowiedzi
Zarchiwizowany
Ten temat przebywa obecnie w archiwum. Dodawanie nowych odpowiedzi zostało zablokowane.