Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL][PHP] Odczyt danych z bazy, formowanie tresci wiadomosci i wysylka mailem
Forum PHP.pl > Forum > Przedszkole
php__amator
Witajcie,

Jak codzien, kolejna porcja glupawych pytan z nadzieja na uzyskanie odpowiedzi.

Panowie .... i Panie, wiem jak z formularza wygenerowac tresc i wyslac wiadomosc na maila ale jak sie ma ta operacja do zbioru danych z bazy ?
Jak odczytac i umiescic wymagane informacje do wyslania ?

Odczytac wiem jak, nie wiem tylko jak zbudowac - i tu zdradze ze radze sobie juz z budowaniem np tabelek i umieszczaniem danych w tych tabelach, czy przygotowanie danych do umieszczenia wiadomosci wyglada podobnie ?

Mam nadzieje, ze dostatecznie jasno sie opisalem ?

Poradzcie cos.

Przyszlo mi do glowy cos takiego, zeby zdeklarowac jakas zmienna powiedzmy $linia = $tresc.$a ($row[''].$row'[''].$row['']); umiescic to w petli podcas odczytu z bazy w efekcie czego otrzymamy okreslona ilosc linii z kolejnymi numerami, te z kolei zmienne umieszcze w tresci wiadomosci.

Ale czy to zadziala ..... nie wiem smile.gif
ale moze macie jakies sprawdzone metody ?

Czy zamiast tego wygenerowac poprostu plik np html i wysylac go jako zalacznik ?
Co radzicie ?
SmokAnalog
Cytat(phpamator @ 28.11.2013, 14:33:49 ) *
Czy zamiast tego wygenerowac poprostu plik np html i wysylac go jako zalacznik ?

Oj nie, to jest zły pomysł.

Tak naprawdę najładniej byłoby mieć plik PHP, który zawierałby treść HTML maila i potem jego treść przekazać do funkcji mail np. przez file_get_contents. Jeśli chcesz wszystko mieć w jednym pliku, to elegancko byłoby zrobić to z buforowaniem, czyli coś na ten kształt:
  1. <?php ob_start() ?>
  2. <html>
  3. <head>
  4. ...
  5. </head>
  6. <body>
  7. ...
  8. </body>
  9. </html>
  10. <?php $message = ob_get_clean();
  11. mail($to, $subject, $message);
php__amator
Hejka Smoku,

Nooo fajnie, tylko jak umiescic w tresci wiadomosci te dane, z reszta sobie poradze tylko nie wiem jak wygenerowac te wlasnie tresc.

w zasadzie to mam nawet skrypt ktory napisalem kiedys kiedys kiedys i dzialal ale jako formularz z opcja wysylki na maila.
Nie wiem tylko jak utworzyc i zapakowac dane z bazy do tego maila.
Kurcze powtarzam sie smile.gif

Uzycie file_get_contents mialo by wyciagnac tresc z pliku wygenerowanego i wyslac jak rozumiem ?

Wyjasnij prosze

Poczytalem wlasnie o file_get_contents, nie glupie smile.gif

i w sumie chyba tego sie uczepie na chwile i bede testowal.

Nie wiem po co to robie tak naprawde, bo zamiast automatycznie sprawdzac i wysylac, wystarczy odpalic system zalogowac sie i sprawdzic stany smile.gif

No ale mam takich leniwcow i chcialbym dac im to na talerzu, codziennie prosto na maila wszystkie stany pomiedzy '0' a np. '15' co by wiedzialy gamonie ile czego jest a i sobie ulatwic zycie bo lataja i zawracaja glowe, czlowiek pograc nie moze spokojnie.


SmokAnalog
file_get_contents pobiera po prostu zawartość pliku i ją zwraca. Jeśli to plik PHP, to oczywiście przed zwróceniem zostanie zinterpretowany przez serwer i dostaniesz to, co serwer wypluje.

Pracowałeś kiedyś z bazami danych? Bo tutaj pobranie wyników będzie się odbywało tak jak zwykle, normalnie.
php__amator
Cytat(SmokAnalog @ 28.11.2013, 17:50:50 ) *
file_get_contents pobiera po prostu zawartość pliku i ją zwraca. Jeśli to plik PHP, to oczywiście przed zwróceniem zostanie zinterpretowany przez serwer i dostaniesz to, co serwer wypluje.

Pracowałeś kiedyś z bazami danych? Bo tutaj pobranie wyników będzie się odbywało tak jak zwykle, normalnie.


No wlasnie, doczytalem na ten temat co nieco.

Jeszcze nie wiem jak tego uzyc ale .... zaraz sie naucze smile.gif

To jest moje zapytanie do bazy i generowanie tabeli z interesujacymi mnie elementami. Dziala generalnie jak tego potrzebuje

chociaz pewnie nie jest skonstruowane jak byc powinno. Niemniej rzuc okiem, dla wprawnego programatora smile.gif to pewnie bulka z maslem.

Ja niestety moge jedynie nazwac siebie "poczatkujacympoczatkujacym" albo #noobie.

I tak sie dziwie, ze wogole dziala to co do tej pory wyprodukowalem smile.gif SAM smile.gif



  1. $wiersz = 1;
  2.  
  3. $tresc = ("<tr><td>".$row['item_id'].$row['model_id'].$row['model_number'].$row['quantity'].$row['size_id'].'</td></tr>');
  4.  
  5. $data = (date('j M Y, G:i:s'));
  6.  
  7. echo 'Wiadomosc do: '.$username." stany magazynowe<br>".$data;
  8.  
  9. echo '<table border="0" cellpadding="5">';
  10.  
  11. $result = mysql_query("SELECT DISTINCT model_id, model_number, size_id, quantity FROM stock WHERE item_id = 'Computer' ORDER BY model_id");
  12. if (!$result) {
  13. die("Database query failed: " . mysql_error());
  14. }
  15. while ($row = mysql_fetch_array($result)) { $id = $row['id'];$total = $total + $row['quantity'];
  16.  
  17. if ($row['quantity'] <=5 ) {echo $line.$nr;$nr == $nr ++; echo '<tr class="tr"><td align="right">'.$row['id'].'</td><td>'.$row['model_id'].' '.$row['model_number'].'</td><td width="40px" nowrap align="right"><b>'.$row['size_id'].'</b></td><td width="40px" nowrap align="right"><b>'.$row['quantity'].'</b></td><td nowrap width="80px" align="right"> on stock</td>'.'</tr>';}
  18.  
  19. else { }
  20.  
  21. }
  22. echo '<tr bgcolor="#09b"><td></td><td><b>RAZEM: </b></td><td><b>'.$total.'</b></td><td></td><td></td></tr></table>';


Uzycie w zapytaniu DISTINCT mialo mi zbierac takie same elementy i grupowac ale chyba moje pojecie na temat jego uzycia jeszcze nie jest dostateczne bo cos nie specjalnie pokazuje to jak trzeba smile.gif
Np mam przedmiot DC7700 i moge go sobie zobaczyc w kilku miejscach smile.gif zamiast w jednym.

Fajnie byloby najpierw odczytac (wszystko), pogrupowac (poniewaz mam wiele rekordow z tymi samymi przedmiotami ale w roznych miejscach i ich ilosci sa rozne ale to wciaz ten sam produkt wiec powinienem je zliczac zeby mi nie pokazywalo pozycji ktore defacto wcale zerowe nie sa smile.gif ), i dopiero sprawdzic stany ale jeszcze nie wiem jak to zrobic smile.gif wiem natomiast pare innych rzeczy smile.gif



Turson
Tak na przyszłość polecam pisać bardziej przejrzysty kod. W tym celu używaj tabulatora i oddzielaj warunki czy else
SmokAnalog
Nie do końca rozumiem co chcesz zrobić.
php__amator
Krok po kroku Panie Smoku smile.gif

1. odczyt danych z bazy w którym pobierane sa tylko te ktorych stan jest bliski '0'
2. utworzenie tresci wiadomosci ze zgromadzonych danych w formie tabeli
3. wysłanie pod wskazany adres e-mail.

To chcę zrobić smile.gif
pedro84
Krok po kroku, Panie PHPAmatorze smile.gif

1. odczyt danych
2. pętelka, utworzenie sobie tabeli (w HTML), zapisanie tegoż wyniku do zmiennej
3. wysyłamy mail, gdzie $message to będzie zmienna z Twoim wygenerowanym HTMLem.

Tak zrób smile.gif
php__amator
No i zasadniczo wiem ... prawie jak to zrobić. Jak wrzucić do zmiennej tyle danych ?
pedro84
Np. metodą łopatologiczną:
  1. $output = '<table>';
  2.  
  3. // pętelka
  4.  
  5. $output .= '</table>';
SmokAnalog
Albo tak jak radziłem wcześniej - osobny plik i file_get_contents lub buforowanie i ob_start.
php__amator
Droga 'pedra84' wydaje mi sie bardziej znajoma smile.gif
dzisiaj, bo wczoraj nie bardzo mialem czas zajmowalem sie mocapowaniem smile.gif po testuje wszystkie trzy metody i zobaczymy smile.gif

Bede w kontakcie ...
SmokAnalog
Cytat(phpamator @ 29.11.2013, 09:54:43 ) *
Droga 'pedra84' wydaje mi sie bardziej znajoma smile.gif

Bardziej znajoma, to prawda. Ale upychanie HTML-a do zmiennych jest uznawane za niezbyt elegancką metodę, o wiele lepszą kontrolę nad kodem masz, kiedy pliki z HTML (+ wstawkami PHP wypisującymi pewne wartości) trzymasz osobno. Możesz dzięki temu łatwo edytować tę treść bez obawy, że zepsujesz skrypt.
php__amator
w sumie ...

pedro masz pelna skrzynke, nie mozna wyslac niczego na PW
pedro84
Cytat(phpamator @ 29.11.2013, 09:54:43 ) *
Droga 'pedra84' wydaje mi sie bardziej znajoma smile.gif

Jest to rozwiązanie teoretycznie lepsze dla początkującego, ale wcale nie idealne.

Cytat(SmokAnalog @ 29.11.2013, 10:00:23 ) *
Bardziej znajoma, to prawda. Ale upychanie HTML-a do zmiennych jest uznawane za niezbyt elegancką metodę, o wiele lepszą kontrolę nad kodem masz, kiedy pliki z HTML (+ wstawkami PHP wypisującymi pewne wartości) trzymasz osobno. Możesz dzięki temu łatwo edytować tę treść bez obawy, że zepsujesz skrypt.

Ano jest. Uznałem jednak, że dla początkującego będzie łatwiejsza do przyswojenia. A czasem, nawiasem mówiąc, po prostu się tak robi, żeby było szybciej, ale przy mniejszej ilości HTMLa.

Cytat(phpamator @ 29.11.2013, 15:32:36 ) *
pedro masz pelna skrzynke, nie mozna wyslac niczego na PW

Dzięki za info, nie zauważyłem nawet smile.gif
php__amator
Hejka,
Zrobiłem chyba wszystko jak należy ale w efekcie otrzymuję tylko linie z ostatnim rekordem.
Nie buduje mi wiadomości ze wszystkimi liniami których powinno być około 30 sad.gif

Help
com
pokaż jak zrobiłeś to pomożemy bo wróżek nie ma wink.gif
php__amator
  1.  
  2. echo $output = '<table border="0" cellpadding="5">';
  3. $result = mysql_query("SELECT * FROM stock WHERE item_id = 'Computer' ORDER BY model_id");
  4. if (!$result) {
  5. die("Database query failed: " . mysql_error());
  6. }
  7. while ($row = mysql_fetch_array($result)) { $id = $row['id'];$total = $total + $row['quantity'];
  8. if ($row['quantity'] <=10 ) {$nr == $nr ++; $output =('<tr class="tr"><td align="right">'.$row['id'].'</td><td width="40px" nowrap align="left"><b>'.$row['brand_id'].'</b></td><td>'.$row['model_id'].' '.$row['model_number'].'</td><td width="40px" nowrap align="right"><b>'.$row['size_id'].'</b></td><td width="40px" nowrap align="right"><b>'.$row['quantity'].'</b></td><td nowrap width="80px" align="right"> on stock</td>'.'</tr>');} else {}}
  9.  
  10. $output .= '</table>';
  11. echo 'Here: '.$output;


mowiąc szczerze to nie wiem jak do zmiennej dodawać kolejne rekordy. bo przecież każda kolejna pętla wywala poprzednie i zapisuje w zmiennej stan bieżący prawda \?

Więc jak to zrobić ?
com
staraj się dbać o czytelność swojego kodu bo łatwo się w nim nam pogubić a co dopiero Tobie.. sadze ze chodzi Ci o to:
  1. $output .= '<tr class="tr"><td align="right">'.$row['id'].'</td><td width="40px" nowrap align="left"><b>'.$row['brand_id'].'</b></td><td>'.$row['model_id'].' '.$row['model_number'].'</td><td width="40px" nowrap align="right"><b>'.$row['size_id'].'</b></td><td width="40px" nowrap align="right"><b>'.$row['quantity'].'</b></td><td nowrap width="80px" align="right"> on stock</td>'.'</tr>';
php__amator
nom, to mam umieszczone w pętli i oczekuję, że za każdym razem dopisana będzie kolejna linia kodu do zmiennej co w efekcie da mi zmienną a w niej zawartość w postaci tali i tę zmienną wrzucę do wiadomości a nastepnie wyślę mailem smile.gif
com
nie dopisywanie .=
a nawiasy to swoją droga, są nie potrzebne wink.gif

btw pisz nowe posty a starych nie usuwaj bo robi się to nie czytelne wink.gif

hmm?

No jak zmienisz = na .= to będzie dopisywało smile.gif

ta lina bez echo:
  1. echo $output = '<table border="0" cellpadding="5">';


smile.gif
php__amator
ooooo kurcze, ta jedna "kropeczka" wystarczyła żeby to zadziałało questionmark.gif?
nie wiedziałem smile.gif
ale kino, dzięki.

Mam jeszcze jeden problem z którym nie wiem jak sobie poradzić otóż wyszukuję w bazie stany zerowe ale i tu uwaga
w bazie znajduje sie po kilka pozycji tego samego i najpierw potrzebował bym zliczyć wszystkie takie same a dopiero potem wyszukać te zerowe.
Jak to zrobić ?

DISTINCT ?
COUNT ?
czy trzeba zbudować najpierw tablice po zliczać i dopiero dalej ?

com
miałeś to nawet tam użyte, dla $output .= '</table>'; wink.gif ale widzę zastosowałeś tylko rozwiązanie pedro84 bez jego analizy smile.gif

Co do tego problemu to opisz to troszkę jaśniej smile.gif
php__amator
Potrzebuję powiedzmy codziennie sprawdzać stany magazynowe i wybierać te artykuły których ilość jest mniejsza niż np 10.
W bazie mam wiele rekordów np:
rekord 13 DELL Optiplex 755 120 sztuk
rekord 24 DELL Optiplex 755 35 sztuk
rekord 134 DELL Optiplex 755 0 sztuk

zapytasz dlaczego nie sa od razu dodane .... wyjasniam - bo znajduja sie w roznych miejscach, na roznych paletach itd.
ponadto pochodzą z róznych dostaw.

jasno widać że stan jest znacznie przekraczający 10 smile.gif
ale moja formuła znajduje że mam na stanie DELL Optiplex 755 w ilości zero bo takowy rekord istnieje
Więc musi najpierw pododawać wszystkie znalezione w bazie i dopiero wtedy jeśli faktyczna suma wszystkich maszyn DELL Optiplex byłaby mniejsza niż 10 wywalić mi na liste.

Nie zamotałem za bardzo questionmark.gif


nie wiem, czy mogę w jednym zapytaniu do bazy wykonać te wszystkie operacje ?
pedro84
Żałuję jednak, że Ci ten pomysł podałem, sieczkę robisz, w dodatku bezmyślnie troszeczkę.

Masz, moim zdaniem, zasadniczy błąd projektowy w tej bazie - te rekordy są zduplikowane, a nie powinny.

Widzę parę rozwiązań:
- przeprojektowanie bazy w jakiś sensowny sposób
- dodanie triggera po insercie, który będzie te duplikaty łączył i usuwał
- ustawienie zadanie cron do takich samych celów jak powyższe.

Nie wiem za bardzo co tworzysz, widzę, że coś związanego ze stanami magazynowymi. Powiem Ci tylko tyle, że tak kombinując sprawisz, że to co spłodzisz nie będzie miało ani rąk, ani nóg.
com
Trochę masz źle rozplanowaną bazę w takim razie smile.gif Najlepiej zrobić to tak, że do jednej tabeli wrzucić wszystkie te artykuły czyli Dell Optiplex 755 a potem połączyć z drugą za pomocą relacji gdzie będziesz miał np taka strukturę
Kod
ID           ID_ART                                 ILOSC
(auto_in)  nr rekordu z tabeli artykuly              120 itd

i na pewno przyda Ci się zapytanie w tym stylu http://stackoverflow.com/questions/6709747...ng-sum-of-count smile.gif wtedy to nie jest Ci potrzebne smile.gif

Albo w zasadzie ponieważ pewnie potrzebujesz mieć informacje o stanie na danej palecie to najlepiej w tabeli artykuły wrzucaj sumę, a w tej drugiej tabeli tak jak napisałem, wtedy zachowasz ten stan a będziesz miał to czytelne i łatwe do późniejszej obróbki smile.gif
php__amator
na tym mniej wiecej polega nauka, ponieważ wszystko czego się nauczyłem do tej pory to mozolne przbijanie się przez różnorodne problemy oczywiście czasem z waszą pomocą ale cisnę do przodu biorąc sobie do serca wszystkie podpowiedzi i krytyki.
Jeśli uważasz, że powinno to wyglądać inaczej .... może mogło by ale w mojej specyficznej sytuacji nie może smile.gif
Dlaczego ?
Dlatego, że magazyn mam spoooooory i muszę mieć stany w taki własnie sposób podane.
mam na przykład 5 palet komputerów, Rozstawione w różnych miejscach i do każdego z tych miejsc przypisana jest "lokalizacja" w postaci kodu i numeru palety.
nie moge ich łączyć i muszę wiedzieć ile jest na której palecie.

Tak wiem, debilne troche to moje tłumaczenie ale tak jest i nie mogę tego zmienić smile.gif

Dlatego kombinuję jak to zrobić, żeby do określenia stanów faktycznych zliczać bez wnikania gdzie są. Nie mogę zrobić czegoś takiego jak:
jeden rekord a w nim informacja - ten model jest tu, tu i gdzieś tam smile.gif
Musze mieć konkretnie ile i gdzie się znajdują.

Masz jakiś koncept ?
com
spójrz wyżej bo chyba rozwiązałem to w czasie opisywania twojego problemu wink.gif
php__amator
No coś mi świta, dodam tabele w której wpisze zsumowane i z niej bede robił stany, czy o to ci chodziło ?


Cytat(pedro84 @ 30.11.2013, 23:46:30 ) *
Żałuję jednak, że Ci ten pomysł podałem, sieczkę robisz, w dodatku bezmyślnie troszeczkę.

Masz, moim zdaniem, zasadniczy błąd projektowy w tej bazie - te rekordy są zduplikowane, a nie powinny.

Widzę parę rozwiązań:
- przeprojektowanie bazy w jakiś sensowny sposób
- dodanie triggera po insercie, który będzie te duplikaty łączył i usuwał
- ustawienie zadanie cron do takich samych celów jak powyższe.

Nie wiem za bardzo co tworzysz, widzę, że coś związanego ze stanami magazynowymi. Powiem Ci tylko tyle, że tak kombinując sprawisz, że to co spłodzisz nie będzie miało ani rąk, ani nóg.


Nie upieram się, że zaprojektowałem TO coś jak należy, nie jestem znawcą tematu. Z doświadczenia jednak wiem, że nawet najlepsze prokdukty posiadają wieeeeele niedoróbek i praca nad doprowadzeniem ich do możliwie rozsądnego działania zajmuje czasem ..... dużo czasu. I chyba nie muszę ci tego bardziej szczegółowo tłumaczyć. Pracowałem dla pewnej firmy z Wrocławia i miałem z ich produktem tyle problemów że hej a "to przecież zawodowcy byli" smile.gif
Więc nie czepiajcie się mnie amatora Zrobiłem to jak wydawało mi się możliwie dobrze od strony użytkowej.
Nie masz czego żałować, wręcz przeciwnie. Powinieneś raczej być zadowolony, że pomogłeś i bardzo za to dziękuję, nie tylko tobie zresztą a i pozostałym osobom które udzielają się w tym temacie.

Ale ponieważ jak już wcześniej pisałem "moja baza" to nie jest produkt na sprzedaż tylko do użytku wewnętrznego wiec po primo: ma działać i odpowiedać moim wymogom a nie jakimś szablonom czy utartym schematom - i działa choć może narazie nie robi jeszcze wszystkiego.
Po secundo specyfika mojej firmy jest taka a nie inna i nie zamierzam budować czegoś co nie spełni mopich oczekiwań,
a tercio nie jestem programistą tylko php amatorem jak wskazuje na to moj nick ... so ...
Szukam, czytam, pytam i staram sie zrobić tak jak chcę i jak mi pasuje.

A tak "baj de łej", nie jest to jedynie baza, to także system informacyjny o produktach, każdy z nich ma bowiem szczegółowy opis techniczny, przydatne uwagi w temacie rozwiązywania problemów. Jednym słowem taki kombajn z którego korzystają ludzie w mojej firmie i jak narazie się sprawdza smile.gif
Pracownik HelpDesk'u może jeśli potrzebuje, znaleźć informacje dotyczące urządzenia, dowiedzieć się jakie są najczęściej występujące usterki i ich objawy oraz jak je usunąć i takie tam.

Problem z którym się borykam to właśnie to wyszukiwanie stanów ilościowych które to są dość istotne dla działu sprzedaży aby wiedzieli na bieżąco co jest a co się właśnie kończy i o pomoc tylko w tej kwestii proszę.

Zasadniczo już tak jak w tej chwili pracuje od biedy może być.
Przez weekend nie bardzo miałem czas ale pewnie jutro trochę popracuję
Może znajde jakieś możliwości usprawnienia tego co już istnieje.
com
tworzysz dwie tabele do jednej wpisujesz wszystkie artykuły czyli id nazwa model typ stan_ogolny, tworzysz druga tabele do nie wpisujesz stan w danym magazynie i ma strukturę taka id id_art_tab1 stan itd i wtedy masz to co chciałeś bo z tabeli 1 masz sumę wszystkiego a w tabeli 2 masz stan magazynowy.... ale żeby było to aktualne to przy zmianie stanu na magazynie odejmujesz tez od stanu ogólnego/dodajesz różnice w zależności od operacji która wykonujesz..
php__amator
O hej com,
Tak właśnie zamierzam zrobić. Dodam tabele ze stanami ogolnymi przypisanymi do poszczegolnych item_id
Faktem jest, troche powinienem zmienić, chociażby to, że np każdy rekord to item_id, brand_id, model_id model_number i pare jeszcze np typ procesora i jego szybkość ale te informacje są jakby mniej istotne. Najważniejsze są te pierwsze 4 smile.gif aaale powinienem je połączyć w jedno to by sporo ułatwiło, szczególnie przy wyszukiwaniu. To oczywiście tylko moje "zdaje mi się" bo może wogóle sposób w jaki mam rozwiązane wyszukiwanie moze być w/g tych utartych schematów idiotyczny smile.gif
Ale co tam, działa jak tego chciałem i to jest najważniejsze.
A tak na marginesie, szukam własnie jakiegoś dobrego przykładu jak powinna taka baza wyglądać. Jak dobrze zaprojektować pod wymagania np konkretnej działalności. Na co zwrócić uwagę, jakich rzeczy unikać itp.
Jak zbudować dobry system wyszukiwania danych.

Jest jeszcze parę rzeczy które chciałbym zmienić ale ponieważ dopiero zacząłem się uczyć to pewnie trochę potrwa smile.gif
Np jak zbudować dynamiczne rozwijane listy. Znaczy wiem jak ale taka forma mnie nie zadowala bo w php nie da się tak zrobić zeby jak wybiore z listy "brand" np "DELL" chciałbym żeby rozwijała się lista wszystkich rodzajów (platform - serwer/workstation/desktop) tej firmy, jak wybiore np "server" lista serwerów itd itd.
W JS da się to zrobić ale moja wiedza nie jest wystarczająca jak narazie smile.gif

No chyba że jest na to jakiś inny patent.

Ale to może poźniej smile.gif

Teraz zrobię test, mam zapasowy serwer z kopią wszystkiego i na nim moge trenować smile.gif


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-2025 Invision Power Services, Inc.