Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [php][mysql]Sumowanie dynamicznych wartości przesłanych z formularza
Forum PHP.pl > Forum > Przedszkole
ocz85
Witam, chciałbym zsumować przesłane post'em wartości ceny radiobutton'ów i checkbox'ów. W moim przypadku są to parametry, kolory_n, kolory_t (radio) i akcesoria (checkbox'y).

Struktury tabel:

parametry:
id | checked | model | moc | pojemnosc | przyspieszenie | zuzycie | cena

kolory_n:
id | checked | kolor | opis | cena

kolory_t:
id | checked | kolor | opis | cena

akcesoria:
id | akcesoria | cena

wszystkie pola cena są float(10,2)

zapytanie mysql:
  1. $query_total = "(SELECT cena as cenap FROM parametry WHERE id = ".$parametry.")
  2. UNION (SELECT cena as cenakn FROM kolory_n WHERE id = ".$kn.")
  3. UNION (SELECT cena as cenakt FROM kolory_t WHERE id = ".$kt.")
  4. UNION (SELECT SUM(cena) as cenaa FROM akcesoria WHERE id IN (".$ids."))";

Pętla w php:
  1. <?php
  2. while($row_total = mysql_fetch_assoc($result_total)) {
  3. $p = $row_total['cenap'];
  4. $n = $row_total['cenakn'];
  5. $t = $row_total['cenakt'];
  6. $a = $row_total['cenaa'];
  7. $sum = $sum + $p + $n + $t + $a;
  8. echo $sum;
  9. ?>


I teraz przykład co się z tym dzieje:
Zaznaczam w poprzednim formularzu np:
  1. parametry 115300.00
  2. kolory_n 2842.00
  3. kolory_n 6755.00
  4. akcesoria 1444.00
  5. 2376.00

W wyniku wyświetla mi ciąg sum, zamiast poprawnej kwoty, np. tu wyświetli tak:
  1. 115300118142124897128717

czyli pierwsze 6 cyfr to cena parametry, drugie 6 cyfr to cena parametry+kolory_n, trzecie 6 cyfr to cena parametry+kolory_n+kolory_t,
czwarte 6 cyfr to cena parametry+kolory_n+kolory_t+akcesoria

Problem w tym, żeby wyświetlał tylko te "czwarte 6 cyfr", czyli w tym przypadku 128717
Pewnie błąd jest prosty, ale nie mogę go znaleźć, proszę o pomoc
remik09
zmien

  1. <?php
  2. while($row_total = mysql_fetch_assoc($result_total)) {
  3. ?>


na

  1. <?php
  2. while($row_total = mysql_fetch_array($result_total)) {
  3. ?>


nie mam mozliwosci treraz sprawdzic ale mysle ze to ten blad
ocz85
Niestety, to nic nie zmienia
Kicok
Odpal sobie to zapytanie w phpMyAdminie i zobacz co zwraca. Jeśli się nie mylę to oczekujesz jednego wiersza wyniku z czterema polami, a dostajesz cztery wiersze - każdy z jednym polem.

Poczytaj też trochę o UNION i podzapytaniach
ocz85
To zapytanie zwraca w formie stringu, np: 115300118142124897128717, czyli UNION jakgdyby doklejał kolejne działania, zamiast zwrócić tą sumę ostateczną 128717 i to jeszcze w formie float (tak jest w bazie, czyli 128717.00). Nadal nie wiem jak to zrobić...
Kicok
Cytat(ocz85 @ 4.04.2008, 20:46:28 ) *
To zapytanie zwraca w formie stringu, np: 115300118142124897128717


Ja się nie pytam co zwraca kod PHP, tylko twoje zapytanie. Jeśli masz takie opory przed wklejeniem zapytania do phpMyAdmina to odpal poniższy kod:
  1. <?php
  2.  
  3. // (...)
  4.  
  5. $query_total = "(SELECT cena as cenap FROM parametry WHERE id = ".$parametry.")
  6. UNION (SELECT cena as cenakn FROM kolory_n WHERE id = ".$kn.")
  7. UNION (SELECT cena as cenakt FROM kolory_t WHERE id = ".$kt.")
  8. UNION (SELECT SUM(cena) as cenaa FROM akcesoria WHERE id IN (".$ids."))";
  9.  
  10.  
  11. $result_total = mysql_query( $query_total ) or die( 'Błąd zapytania:<pre>' . $query_total . '</pre>Odpowiedź MySQL:<pre>' . mysql_error() . '</pre>' );
  12.  
  13. $deb_i = 0;
  14. echo '<br /><br />';
  15. echo 'Ile wierszy zwróciło zapytanie: ' . mysql_num_rows( $result_total ) . '<br />';
  16. echo 'Co zwraca zapytanie:<table border="1" cellpadding="2">';
  17. while( $row = mysql_fetch_assoc( $result_total ) )
  18. {
  19. if( $deb_i++ == 0 ) {
  20. echo '<tr><th>' . implode( '</th><th>', array_keys( $row ) ) . '</th></tr>';
  21. }
  22.  
  23. echo '<tr><td>' . implode( '</td><td>', $row ) . '</td></tr>';
  24. }
  25. echo '</table>';
  26.  
  27. ?>




PS. Jeśli faktycznie twoja baza zwraca jeden wiersz danych z jednym polem o treści: "115300118142124897128717" to pierwszy raz spotykam się z takim działaniem UNION ;]
ocz85
Zapytanie zwraca:

Ile wierszy zwróciło zapytanie: 4
Co zwraca zapytanie:
cenap
115300.00
2842.00
6755.00
3820.00

I teraz trzeba te 4 liczby jakoś zsumować... ale jak ?
Kicok
  1. <?php
  2.  
  3.  $sum = $sum + $row['cenap'];
  4.  
  5. ?>
ocz85
Ile wierszy zwróciło zapytanie: 4
Co zwraca zapytanie:128717
cenap
115300.00
2842.00
6755.00
3820.00
  1. <?php
  2. while( $row = mysql_fetch_assoc( $result_total ) )
  3. {
  4. if( $deb_i++ == 0 ) {
  5. echo '<tr><th>' . implode( '</th><th>', array_keys( $row ) ) . '</th></tr>';
  6. }
  7.  
  8. echo '<tr><td>' . implode( '</td><td>', $row ) . '</td></tr>';
  9. $sum = $sum + $row['cenap'];
  10. }
  11. echo $sum;
  12. ?>


Troche to dziwne że ta suma 128717 nie jest zwracana we float'cie, tak jak jej składniki... czy da się to poprawić ? Później tą sumę będę musiał wsadzić do bazy
Kicok
Cytat
Troche to dziwne że ta suma 128717 nie jest zwracana we float'cie


Jak to nie jest? Owszem, teraz widzisz zwykły INT, bo ceny w bazie danych zawsze kończą ci się: ".00". Zmień sobie na chwilę 115300.00 na 115300.55 to zobaczysz że działa jak należy.

Ten "zaokrąglony float" możesz spokojnie używać do obliczeń i wsadzania do bazy. A jak będziesz go chciał wyświetlić, to number_format" title="Zobacz w manualu PHP" target="_manual albo printf" title="Zobacz w manualu PHP" target="_manual/sprintf" title="Zobacz w manualu PHP" target="_manual
ocz85
Cytat(Kicok @ 5.04.2008, 14:22:44 ) *
Jak to nie jest? Owszem, teraz widzisz zwykły INT, bo ceny w bazie danych zawsze kończą ci się: ".00". Zmień sobie na chwilę 115300.00 na 115300.55 to zobaczysz że działa jak należy.

Ten "zaokrąglony float" możesz spokojnie używać do obliczeń i wsadzania do bazy. A jak będziesz go chciał wyświetlić, to [manual\]number_format\[/manual\] albo [manual\]printf\[/manual\]/[manual\]sprintf\[/manual\]


No faktycznie tongue.gif Rozumiem że ta suma po insercie do bazy "wejdzie" w pole float(10,2) ? Wielkie dzięki za pomoc biggrin.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.