Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [php][mysql]Sumowanie dynamicznych wartości przesłanych z formularza, UNION
ocz85
post 4.04.2008, 13:40:52
Post #1





Grupa: Zarejestrowani
Postów: 9
Pomógł: 0
Dołączył: 31.03.2008

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post
remik09
post 4.04.2008, 17:10:10
Post #2





Grupa: Zarejestrowani
Postów: 102
Pomógł: 10
Dołączył: 25.12.2005
Skąd: Ruda Śląska

Ostrzeżenie: (0%)
-----


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

Ten post edytował remik09 4.04.2008, 17:10:51


--------------------
moj blog z glupotami
darmowe mp3

workstation: zendstudio 5.5.0 | EditPlus 3 | PHP/4.3.9 |
Go to the top of the page
+Quote Post
ocz85
post 4.04.2008, 17:18:53
Post #3





Grupa: Zarejestrowani
Postów: 9
Pomógł: 0
Dołączył: 31.03.2008

Ostrzeżenie: (0%)
-----


Niestety, to nic nie zmienia
Go to the top of the page
+Quote Post
Kicok
post 4.04.2008, 19:03:36
Post #4





Grupa: Zarejestrowani
Postów: 1 033
Pomógł: 125
Dołączył: 17.09.2005
Skąd: Żywiec

Ostrzeżenie: (0%)
-----


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


--------------------
"Sumienie mam czyste, bo nieużywane."
Go to the top of the page
+Quote Post
ocz85
post 4.04.2008, 19:46:28
Post #5





Grupa: Zarejestrowani
Postów: 9
Pomógł: 0
Dołączył: 31.03.2008

Ostrzeżenie: (0%)
-----


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ć...
Go to the top of the page
+Quote Post
Kicok
post 5.04.2008, 12:32:03
Post #6





Grupa: Zarejestrowani
Postów: 1 033
Pomógł: 125
Dołączył: 17.09.2005
Skąd: Żywiec

Ostrzeżenie: (0%)
-----


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 ;]

Ten post edytował Kicok 5.04.2008, 12:34:08


--------------------
"Sumienie mam czyste, bo nieużywane."
Go to the top of the page
+Quote Post
ocz85
post 5.04.2008, 12:53:51
Post #7





Grupa: Zarejestrowani
Postów: 9
Pomógł: 0
Dołączył: 31.03.2008

Ostrzeżenie: (0%)
-----


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 ?
Go to the top of the page
+Quote Post
Kicok
post 5.04.2008, 13:03:23
Post #8





Grupa: Zarejestrowani
Postów: 1 033
Pomógł: 125
Dołączył: 17.09.2005
Skąd: Żywiec

Ostrzeżenie: (0%)
-----


  1. <?php
  2.  
  3.  $sum = $sum + $row['cenap'];
  4.  
  5. ?>


Ten post edytował Kicok 5.04.2008, 13:03:36


--------------------
"Sumienie mam czyste, bo nieużywane."
Go to the top of the page
+Quote Post
ocz85
post 5.04.2008, 13:17:01
Post #9





Grupa: Zarejestrowani
Postów: 9
Pomógł: 0
Dołączył: 31.03.2008

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post
Kicok
post 5.04.2008, 13:22:44
Post #10





Grupa: Zarejestrowani
Postów: 1 033
Pomógł: 125
Dołączył: 17.09.2005
Skąd: Żywiec

Ostrzeżenie: (0%)
-----


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

Ten post edytował Kicok 5.04.2008, 13:23:24


--------------------
"Sumienie mam czyste, bo nieużywane."
Go to the top of the page
+Quote Post
ocz85
post 5.04.2008, 13:40:25
Post #11





Grupa: Zarejestrowani
Postów: 9
Pomógł: 0
Dołączył: 31.03.2008

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 14.08.2025 - 11:37