Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Wyciąganie danych z bazy a PHPmailer
Forum PHP.pl > Forum > PHP
ufo1990
Wyciągam z bazy poniższym zapytaniem użytkowników, którzy mają dane usługi. Czasem się zdarza że dany użytkownik ma kilka usług. Następnie robię pętle, w której finalnie wysyłana jest wiadomość do każdego z użytkowników jakie ma usługi. Poniższy kod ma jedną wadę ponieważ jeżeli użytkownik ma np. 3 usługi to otrzyma 3 e-maile z każdą usługą. Próbowałem zmienić zapytanie SQL dodając DISTINCT, następnie w pętli for zrobiłem foreach i teraz dany użytkownik faktycznie otrzymuje w jednym e-mailu informacje o wszystkich swoich usługach.

Problem pojawia się kiedy np. w bazie jest dwóch użytkowników to każdy z nich otrzyma informacje o wszystkich usługach, nie koniecznie o swoich więc nie wiem jak w pętli foreach przypisać usługi do danego użytkownika.

  1. SELECT Group_concat(p.email SEPARATOR ',') AS emails, Group_concat(s.service_name SEPARATOR ',') AS service_names FROM services s RIGHT JOIN persons p ON s.id_p = p.id


  1. $email_explode = explode(',',$row['emails']);
  2. for($i=0; $i<count($email_explode); $i++)
  3. $mail -> AddAddress($email_explode[$i]);
trueblue
Zamiast kombinować z GROUP_CONCAT, stwórz zapytanie wybierające email oraz nazwę usługi.
Następnie w PDO jest opcja trybu pobierania o nazwie PDO::FETCH_GROUP, będziesz miał pogrupowane nazwy usług per email.
Salvation
A jak to masz połączone w bazie? UserId <> ServiceId? To przecież możesz pogrupować to po UserId i dostaniesz listę ServicesIds.
ufo1990
Pogrupowie według UserId to jest rozwiązanie połowiczne ponieważ w query mam jeszcze takie zapytanie
  1. Group_concat(s.service_price SEPARATOR ',') as service_prices
więc później będzie problem z explode żeby zrobić np. warunek >0
nospor
w kodzie co pokazales nigdzie nie masz warunku > 0 wiec o co ci chodzi?
To co napisali poprzednicy to wszystko jest ok. Cos kombinujesz za bardzo
ufo1990
ok, faktycznie za mało informacji więc jeszcze raz mam zapytanie, w którym dodałem grupowanie
  1. SELECT Group_concat(p.email SEPARATOR ',') AS emails, Group_concat(s.service_name SEPARATOR ',') AS service_names, Group_concat(s.service_price SEPARATOR ',') AS service_prices FROM services s RIGHT JOIN persons p ON s.id_p = p.id GROUP BY p.id


Następnie w pętli mam $service_prices_explode = explode(',',$row['service_prices']); i chce zrobić warunek if($service_prices_explode>) echo $row['name']; ale jest problem ponieważ echo $row['service_prices']; nie zwróci całego ciągu udzielonego przecinkami.
nospor
Ale chaotycznie to opisujesz wszystko

Co to jest
if($service_prices_explode>) echo $row['name'];
?
Co to ma robic?
ufo1990
W dużym skrócie: Z bazy wyciągam userów którzy mają określone usługi do których jest przypisana jakaś kwota, następnie chce wyświetlić tylko tych użytkowników których jedna z usług ma wartość większą niż 0.
nospor
Po to jest HAVING

..... GROUP BY p.id HAVING SUM(s.service_price) > 0
ufo1990
Jakie to proste facepalmxd.gif Cały czas się skupiałem żeby obrobić to w php a wystarczyło tylko zapytanie zmodyfikować. Dzięki za pomoc.
nospor
Nastepnym razem proponuje od razu tez opisac co tak naprawde chcesz osiagnac, a nie opisujesz droge ktora ci sie wydaje ze jest wlasciwa. Zaoszczedzisz sobie i nam duzo czasu
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2024 Invision Power Services, Inc.