Sortowanie wyników po pobraniu z bazy

0

Witam . mój problem dotyczy sortowania , jestem samoukiem w php , ale ten problem przerósł mnie całkowicie i nie wiem jak go rozwiazać
kod wygląda w ten sposób

 <?php

 $zapytanie = "SELECT * FROM mieszana WHERE faktura_zaplacona=0 ORDER by id";
        $wypisz = mysql_query($zapytanie);
        while($row = mysql_fetch_array($wypisz))
        {
         $id = $row['id'];
         $nabywca = $row['nabywca'];
         $nr_faktury = $row['nr_faktury'];
         $cena_brutto_pl = $row['cena_brutto_pln'];
		 $data_sprzedazy = $row['data_sprzedazy'];
		 $termin_platnosci = $row['termin_platnosci'];
		 $cena_brutto_euro = $row['cena_brutto_euro'];
		  $data= $row['data_wystawienia'];	
				$vato = $row['vat'];	
										

$ile_dni = $termin_platnosci;
	
	 $nowa_data=strtotime("+ ".$ile_dni." day",strtotime($data));
	 
	 $data_platnosci= date("d.m.Y", $nowa_data);
	
 $data_wydarzenia = $data_platnosci;
 $liczba_dni_do_wydarzenia = ZwrocLiczbeDniDoWydarzenia ($data_wydarzenia);
 $liczba_dni_do_wydarzenia_plus_trzy= $liczba_dni_do_wydarzenia+2;
 if ($liczba_dni_do_wydarzenia < 0)
  $ile_dni_do_terminu_platnosci="<span class='red'>Termin płatnosci już minął $data_platnosci</span>";
 else
   $ile_dni_do_terminu_platnosci="<span class='green'>$liczba_dni_do_wydarzenia_plus_trzy</span> dni";
 
		echo("<div class='flex'>");
				$lp=1;
				//$l_p=+1;
		$lp=1+$l_p++;
	
		echo ("<div class='l_p'>$lp</div><div class='firma'>$nabywca</div><div class='cena'>$kwota_do_zaplaty_brutto</div><div class='termin_platnosci'>$ile_dni dni- ($data_platnosci)</div><div class='pozostalo'>$ile_dni_do_terminu_platnosci</div>");
		

		  echo("<div class='clear'></div>");
		  
		}
		
		
		function ZwrocLiczbeDniDoWydarzenia ($data_wydarzenia) {
    $data_aktualna = date("d.m.Y");
 
    $liczba_sekund_dla_wydarzenia = StrToTime($data_wydarzenia);
    $liczba_sekund_dla_aktualnej_daty = StrToTime($data_aktualna);
 
    $liczba_sekund_miedzy_datami = $liczba_sekund_dla_wydarzenia 
                     - $liczba_sekund_dla_aktualnej_daty;
    if ($liczba_sekund_miedzy_datami<0)
      
		   return -1;
	  
    $liczba_sekund_w_dniu = 60 * 60 * 24;
    $liczba_dni_miedzy_datami = 
          Floor ($liczba_sekund_miedzy_datami/$liczba_sekund_w_dniu);
 
    return $liczba_dni_miedzy_datami;
 }



		 ?>
  

w kodzie jest linijka

 echo ("<div class='l_p'>$lp</div><div class='firma'>$nabywca</div><div class='cena'>$kwota_do_zaplaty_brutto</div><div class='termin_platnosci'>$ile_dni dni- ($data_platnosci)</div><div class='pozostalo'>$ile_dni_do_terminu_platnosci</div>"); 

Tam jest zmienna

 $ile_dni_do_terminu_platnosci 

i to w/g niej chcę sortować wyniki

1

dużo prościej będzie posortować to w bazie. Tutaj (w sensie w PHP) żeby to posortować musiałbyś najpierw ściągnąć wszystkie dane do jakiejś tablicy, posortować ją i dopiero wyświetlać

1

To jest dobry przyklad tego jak nie pisac kodu.
1.Pomieszana logika z widokiem.
2.Brak wciec.
3.Jakies echo '' ktore nic nie robi.
4. Przestarzale mysql_query.
5. Polskie nazwy zmiennych jak i tabeli.
6. Nieusuniete komentarze.
7. Coś nie widzę zmiennej $l_p
8. Przy instrukcjach IF - nie stosujesz klamerek (a powinno je się stosować nawet dla pojedynczej instrukcji)
9. Brak instrukcji switch przy sprawdzaniu $vato, ewentualnie można lepiej pogrupować te ify -> if($vato=='1' OR $vato=='2')...
10. Jeśli w bazie termin platnosci jest pobierany jako ilość dni - to troszkę chybiony pomysł, nie prościej zapisać tam od razu konkretną datę?
11. $liczba_dni_do_wydarzenia_plus_trzy - a dodajesz dwójkę....
12. Nic nie mówiące nazwy zmiennych $c/$d
13. Sumowanie robisz w phpie za pomocą arraya a potem array_sum... nie lepiej skorzystać z mysql'owej funkcji SUM?
14. Zmienne typu $sumaa_netto / $suma/ $sumaa .... to można ładniej nazwać.
15. Używałbym funkcji strtotime zamiast StrToTime (chodzi formę zapisu nazwy funkcji)
16. Gdy wyświetlasz jakieś rekordy - wg mnie nie ma sensu do każdego z nich dawać oddzielny prosty formularz tak jak to zrobiłeś. Możesz dać linka np 'action=deleteInvoice&invoiceId='.$id

Miej szacunek dla czytajacych i popraw to jakos. A co do pytania - po co sortowac po pobraniu? Skoro mozna dac order w zapytaniu, ktore nie jest przeciez skomplikowane. Wg mnie robisz tam jakieś niepotrzebne obliczenia, zamiast przemyśleć to i utworzyć optymalną tabelę w bazie.

1
axelbest napisał(a):

To jest dobry przyklad tego jak nie pisac kodu.
1.Pomieszana logika z widokiem.
2.Brak wciec.
3.Jakies echo '' ktore nic nie robi.
4. Przestarzale mysql_query.
5. Polskie nazwy zmiennych jak i tabeli.
6. Nieusuniete komentarze.
7. Coś nie widzę zmiennej $l_p
8. Przy instrukcjach IF - nie stosujesz klamerek (a powinno je się stosować nawet dla pojedynczej instrukcji)
9. Brak instrukcji switch przy sprawdzaniu $vato, ewentualnie można lepiej pogrupować te ify -> if($vato=='1' OR $vato=='2')...
10. Jeśli w bazie termin platnosci jest pobierany jako ilość dni - to troszkę chybiony pomysł, nie prościej zapisać tam od razu konkretną datę?
11. $liczba_dni_do_wydarzenia_plus_trzy - a dodajesz dwójkę....
12. Nic nie mówiące nazwy zmiennych $c/$d
13. Sumowanie robisz w phpie za pomocą arraya a potem array_sum... nie lepiej skorzystać z mysql'owej funkcji SUM?
14. Zmienne typu $sumaa_netto / $suma/ $sumaa .... to można ładniej nazwać.
15. Używałbym funkcji strtotime zamiast StrToTime (chodzi formę zapisu nazwy funkcji)
16. Gdy wyświetlasz jakieś rekordy - wg mnie nie ma sensu do każdego z nich dawać oddzielny prosty formularz tak jak to zrobiłeś. Możesz dać linka np 'action=deleteInvoice&invoiceId='.$id

Miej szacunek dla czytajacych i popraw to jakos. A co do pytania - po co sortowac po pobraniu? Skoro mozna dac order w zapytaniu, ktore nie jest przeciez skomplikowane. Wg mnie robisz tam jakieś niepotrzebne obliczenia, zamiast przemyśleć to i utworzyć optymalną tabelę w bazie.

1.Jest to mój własny kod , działa , wyświetla prawidłowo , więc jest ok, jest na użytek mój własny ,więc nazwy zmiennych są takie jakie są i nie mają nic dorzeczy
2.zapytanie order by nie zda egzaminu ponieważ liczba dni się zmienia wraz upływem czasu .
3. Przejście na PDO nie jest w tej chwili priorytetem
4. To czy piszę z małej litery , czy z dużej nie ma wpływu na działanie kodu , oraz na rozwiązanie mojego problemu .
5. Usunąłem kilka linijek , które nie są związane z problemem .
6. Jeżeli jest jakaś zmienna , która się nazywa "...plus_trzy" i po niej jest +2 , to też nie jest istotne w tej chwili .
7 ma pobrać dane obliczyć wynik i dodać do tego 2 lub 3 , nieistotne ile i posortować , tu tkwi problem , jak widać kolega "abrakadaber" podsunął jakieś rozwiązanie , reszta jakieś bzdety typu poczytaj o ob_start() i ob_get_clean() które na pewno tego nie posortują . Ech gdzie te wspaniałe fora , gdzie można było otrzymać pomoc , dzisiaj to już tylko sami hejterzy napiszą coś , aby napisać , ale rozwiązać zagadki to nikt nie potrafi .
8." Sumowanie robisz w phpie za pomocą arraya a potem array_sum... nie lepiej skorzystać z mysql'owej funkcji SUM?" , SUM nie działa u mnie , nie wiem dlaczego , może to wina jakiś ustawień na localu nie to jest w tej chwili problemem ,nieistotne . Jeżeli to ma byc na użytek mój własny to moze być w takiej formie jakiej jest , Może nie jest to czysty i przejrzysty kod ,kiedys się wezmę pewnie za optymalizację , ale na razie problemem jest sortowanie końcowych wyników ,
Kolego Twoja odpowiedź wyglądała podobnie do tego , Jak by ktoś miał problem ze zbyt dużą zawartością tłuszczu w maśle , a ty mu sugerujesz ,ze nie takiego noża uzywa do smarowania i nie tą ręką smaruje .

0

1.Jest to mój własny kod , działa , wyświetla prawidłowo , więc jest ok, jest na użytek mój własny ,więc nazwy zmiennych są takie jakie są i nie mają nic dorzeczy

Czystość kodu ma duże znaczenie teraz uczysz się złych nawyków, zwiększasz niepotrzebnie ryzyko popełnienia błędu, co gorsza znalezienia go i poprawienia.

0

tak ma duże znaczenie masz rację , tylko ważne jest dla mnie teraz jego działanie , później sobie go wyczyszczę. I tak, Przejdę później na PDO , ale niech najpierw robi on to co chcę .

1

To ja jeszcze dopytam się o punkt 2. Jak w Twojej bazie jest zapisywany termin platnosci?
Btw moje uwagi mają też ukryte drugie dno:) - zauważ że wszystkie rzeczy które napisałęm, dążą do tego aby Twój kod był czytelny. To z kolei przełoży się na to że będziesz miał ten kod ładnie odseparowany, opakowany, nazwany. To przełoży się na to że de facto będziesz miał mniej kodu, a tym samym łatwiej będzie Ci wybadać gdzie jest błąd. Sam kiedyś też pisałem w dosyć podobnym stylu co Ty:) a potem dotarło do mnie czym jest clean code itp itd.

0

do bazy danych wprowadzana jest:

  1. data w formacie 11.11.2016 w postacie nie time , a varchar . Ta wartość jest później drukowana na fakturze .
  2. termin płatności w postaci cyfry 20 , lub 30 itd. Ta wartość jest również wyświetlana na fakturze. są to wartości które się nie zmieniają i są jak na każdej fakturze stałe.

Następnie pobieram wszystkie dane z bazy danych i wyświetlam sobie w postaci czytelnej , kogo dotyczy , jaki towar był uwzględniony itd itd. i się wszystko ładnie wyświetla , mogę sobie ją podejrzeć , mogę odznaczyć ,że zapłacona i takie tam inne informacje , które mi są potrzebne . Termin płatności jako tako się nie zmienia względem daty wystawienia faktury, natomiast zmienia się on z upływem czasu i do tego użyłem funkcji

 function ZwrocLiczbeDniDoWydarzenia  

. Dlaczego tej funkcji?? A dlatego ,że jestem "noga" z funkcji i poszperałem trochę po starych forach , i udało mi się znaleźć coś co liczy wg moich potrzeb.

$liczba_dni_do_wydarzenia_plus_trzy= $liczba_dni_do_wydarzenia+2;

nie ważne jak to się nazywa , musi dodać wartość "2" do wyniku końcowego . Dlaczego ?? Ponieważ faktura jest wysyłana pocztą , a z reguły klient w/g umowy płaci w terminie licząc od dnia otrzymania dokumentów , więc dodałem 2 dni (domyślnie , czas przesyłki pocztowej), żeby wartości, które mi się wyświetlają były jak najbardziej realne , i to wszystko mi się wyświetla . Tylko nie umiem tego posortować w/g $liczba_dni_do_wydarzenia_plus_trzy

 właśnie tej wartości .
1
  1. Date w bazie przechowuj lepiej jako datetime - dzięki czemu będziesz mógł swobodniej operować na tej kolumnie za pomocą funkcji mysql'a.

  2. Termin płatności przechowuj także jako datę - potem będzie Ci łatwiej policzyć np ile dni upłynęło od tej daty, a ilość dni jaka upłynęła od złożenia/opłacenia/przeterminowania platnosci faktury i tak dasz radę wyliczyć.

  3. W phpie bardzo łatwo można operować na datach http://php.net/manual/en/datetime.add.php - więc w razie czego unikniesz nadmiarowego kodu i ładnie uprościsz wtedy ten mechanizm z dwójką.

0
macius42 napisał(a):

tak ma duże znaczenie masz rację , tylko ważne jest dla mnie teraz jego działanie , później sobie go wyczyszczę. I tak, Przejdę później na PDO , ale niech najpierw robi on to co chcę .

Wstawiasz kod który jest nieistotny dla problemu, niesformatowany, z nieczytelnymi nazwami zmiennych i opisujesz problem i nawet nie prosisz o pomoc.

Czego od nas oczekujesz? Współczucia? To nie jest płatny helpdesk w korpo tylko forum w którym ludzie udzielają się za darmo i wcale nie mają takiego obowiązku.
Doceń to że ktoś Ci zwraca uwagę dot. Twojego kodu, bo może dzięki temu się czegoś nauczysz.
Bałaganiarstwo w kodzie to najłatwiejszy sposób na ukrycie błędów.

macius42 napisał(a):

Tam jest zmienna

 $ile_dni_do_terminu_platnosci 

i to w/g niej chcę sortować wyniki

To jest oczywista bzdura bo:
a) nie sortuje się nigdy wg zmiennej a raczej wg atrybutu elementu struktury lub bezpośrednio wg elementu struktury.
Tutaj nie masz żadnej struktury do posortowania, więc nie ma co sortować.

b) ta zmienna zawiera kod HTML:

$ile_dni_do_terminu_platnosci="<span class='green'>$liczba_dni_do_wydarzenia_plus_trzy</span> dni";
  1. Nie umiesz / nie chcesz używać w SQL-u "order-by". Nie wnikam dlaczego,ale aby to posortować zapisz wyniki w array i posortuj istniejącymi funkcjami.

Przykłady:
http://stackoverflow.com/questions/1597736/how-to-sort-an-array-of-associative-arrays-by-value-of-a-given-key-in-php
http://www.w3schools.com/php/php_arrays_sort.asp

1 użytkowników online, w tym zalogowanych: 0, gości: 1