Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Problem z sumowaniem
Forum PHP.pl > Forum > PHP
smok55453
Witam. Mam znowu problem.
Mam taką oto tabelę:tabela
Która jest generowana przez taki kod:
  1. // Skrypty wyświetlające przepisy
  2. $result = mysql_query("select * from przepisy");
  3. if (!$result) {
  4. die('Query failed: ' . mysql_error());
  5. }
  6. else
  7. {
  8.  
  9. }
  10. //Nagłówki tabeli
  11. echo '<table cellpadding="4" border="1"';
  12. echo '<tr>';
  13. echo '<td>Wybierz przepis</td>';
  14. for ($i=1;$i < mysql_num_fields($result);$i++) {
  15. $meta = mysql_fetch_field($result, $i);
  16. $nameArray[$i] = $meta->name;
  17. echo '<td>'.$nameArray[$i].'</td>';
  18. }
  19. echo '<td>Ilość</td>';
  20. echo '</tr>';
  21.  
  22. //Nazwy dla selecta
  23. for ($j=1;$j < mysql_num_fields($result);$j++) {
  24.  
  25. $meta = mysql_fetch_field($result, $j);
  26. $nameArrays[$j] = $meta->name;
  27. }
  28. //Nazwy przepisów dla inputa
  29. $wynik = mysql_query("SELECT * FROM przepisy") or die('Błąd zapytania: '.mysql_error());
  30. if(mysql_num_rows($wynik) > 0) {
  31. $ilosc = 0;
  32. while($r = mysql_fetch_assoc($wynik))
  33. {
  34. $id = $r['ID'];
  35. $tablica_id_przepisow[$ilosc] = $id;
  36. $nazwa = $r['nazwa'];
  37. $tablica_nazw_przepisow[$ilosc] = $nazwa;
  38. $ilosc++;
  39. }
  40. }
  41.  
  42. //Wartosci pól
  43. $nazwy_pol_dla_selecta = implode(",",$nameArrays);
  44. $zapytanie_3 = "SELECT $nazwy_pol_dla_selecta FROM przepisy";
  45. $idzapytania = mysql_query($zapytanie_3);
  46. echo '<tr>';
  47. echo '<form action="" method="post" id="idForm">';
  48. $ilosc3 = 0;
  49. while ($wiersz = mysql_fetch_row($idzapytania))
  50. {
  51. echo '<td><center><input type="checkbox" name="formDoor[]" value="'.$tablica_id_przepisow[$ilosc3].'" onclick="" /></center></td>';
  52. echo '<td>'.$wiersz[0].'</td>';
  53. for($licz=1;$licz < mysql_num_fields($idzapytania);$licz++)
  54. {
  55. echo '<td>'.$wiersz[$licz].'</td>';
  56. }
  57.  
  58. echo '<td><input type="text" name="'.$tablica_nazw_przepisow[$ilosc3].'" value="0"/></td></tr><tr>';
  59. $ilosc3++;
  60. }

Teraz gdy użytkownik wejdzie na tę stronę, wybierze kilka przepisów i wpisze ilość to chciałbym aby po naciśnięciu przycisku Oblicz wyświetliła się tabela w która będzię wyglądała podobnie do tej: klik
z tym, że pod tymi nagłówkami ma się wyświetlić suma wszystkich potrzebnych produktów na daną ilość wszystkich wybranych przepisów. W jaki sposób mam się za to zabrać. Tylko proszę aby mi to wyjaśnić łopatologicznie.
com
daj kod który generuje Ci te tabelkę po wybraniu smile.gif
smok55453
Napisałem coś takiego. Ale nie działa. Wiem dlaczego ale nie umiem tego naprawić:
  1. //Sprawdzenie ile pól zostało zaznaczonych
  2. $o=0;
  3. foreach($_POST as $k=>$v)
  4. {
  5.  
  6. $tablica_nazw_licz[$o] = $k;
  7. $tablica_wartosci_licz[$o] = $v;
  8. $o++ ;
  9. }
  10. $aDoor = $_POST['formDoor'];
  11. if(empty($aDoor))
  12. {
  13.  
  14. }
  15. else
  16. {
  17. $N = count($aDoor);
  18. for($i=0; $i < $N; $i++)
  19. {
  20. $tablica_wybranych_pol[$i] = htmlspecialchars($aDoor[$i] );
  21. }
  22.  
  23. $tablica_wybranych_pol_dla_selecta = implode(",",$tablica_wybranych_pol); //ID pól dla selecta
  24. }
  25.  
  26. //Funkcja wyświetlająca nagłówki tabeli.
  27. echo 'W tabeli pokazana jest potrzebna ilość produktów dla wybranych placków w odpowiedniej ilości.<br>';
  28. echo '<table cellpadding="4" border="1"';
  29. echo '<tr>';
  30. for ($i=0;$i < mysql_num_fields($result);$i++) {
  31. $meta = mysql_fetch_field($result, $i);
  32. $nameArray[$i] = $meta->name;
  33. echo '<td>'.$nameArray[$i].'</td>';
  34. }
  35. echo '</tr>';
  36. // nazwy dla select sum
  37. for($i=0;$i<$N;$i++)
  38. {
  39. $result1 = mysql_query("select * from produkty where ID=".$tablica_wybranych_pol_dla_selecta[$i]);
  40. $meta = mysql_fetch_field($result1, $i);
  41. $nameArrayss[$i] = $meta->name;
  42. }
  43.  
  44. //Tworzenie tablicy wartosci dla wybranych pól
  45. echo '<tr>';
  46. for($i=0;$i < $N;$i++)
  47. {
  48. $sum = mysql_query("select sum(".$nameArrayss[$i].") from przepisy where ID=".$tablica_wybranych_pol_dla_selecta[$i]."") or die('Błąd zapytania: '.mysql_error());
  49. while ($wiersz = mysql_fetch_row($sum))
  50. {
  51. echo '<td>'.$wiersz[$i].'</td>';
  52. }
  53. }
  54. echo '</tr>';
  55. echo '</table>';
com
co znajduje sie w $_POST['formDoor']; ?
smok55453
Formularz z polami typu checkbox:
  1. while ($wiersz = mysql_fetch_row($idzapytania))
  2. {
  3. echo '<td><center><input type="checkbox" name="formDoor[]" value="'.$tablica_id_przepisow[$ilosc3].'" onclick="" /></center></td>';
  4. echo '<td>'.$wiersz[0].'</td>';
  5. for($licz=1;$licz < mysql_num_fields($idzapytania);$licz++)
  6. {
  7. echo '<td>'.$wiersz[$licz].'</td>';
  8. }
  9.  
  10. echo '<td><input type="text" name="'.$tablica_nazw_przepisow[$ilosc3].'" value="0"/></td></tr><tr>';
  11. $ilosc3++;
  12. }
com
priv smile.gif
smok55453
Mam trzy tablice np:
Tablica 1:
0 => 3
1 => 2
2 => 1
3 => 0
4 => 0
5 => 0
6 => 0
7 => 0

Tablica 2:
0 => 4
1 => 1
2 => 3
3 => 0
4 => 8
5 => 0
6 => 0
7 => 0

Tablica 3:
0 => 2
1 => 3
2 => 4
3 => 0
4 => 0
5 => 1
6 => 0
7 => 0

Jakiego skryptu mam użyć aby sumy pól np: (Tablica1[0 => 3] + Tablica2[0 => 4] + Tablica3[0 =>2]) zapisać do nowej tablicy?
Aby było że suma[0] = 9 tak jak to wychodzi z powyższego działania
SpiritCode
Może zwykły for?
  1. $suma = array();
  2. for($i=0;$i<=7;$i++)
  3. {
  4. $suma[$i] = $tablica1[$i]+$tablica2[$i]+$tablica3[$i];
  5. }
smok55453
Tylko że ilość tablic zmienia sie zależnie od liości przepisów w bazie
SpiritCode
To może coś takiego?
http://ideone.com/D6xM7B
Wtedy nie ma znaczenia ile masz tablic. Tylko te tablice muszą być w jednej tablicy (ciekawe jak bardzo do brzmi bez sensu)

edit: mała poprawka
zamień
  1. $i<=sizeof($tab)

na
  1. $i<sizeof($tab)
smok55453
Dałem i wyświetla się coś takiego:

Array ( [0] => 0 )

co nie jest tablicą kilku tablic

to kod:
  1. foreach($tablica_wierszy as $tab)
  2. {
  3. for($i=0;$i<sizeof($tab); $i++)
  4. {
  5. if(isset($suma[$i]))
  6. {
  7. $suma[$i]+=$tab[$i];
  8. }
  9. else
  10. {
  11. $suma[$i]=$tab[$i];
  12. }
  13. }
  14. }
SpiritCode
Pokaż z deklaracją $tablica_wierszy
smok55453
  1. //Tworzenie tablic z wartosciami pól
  2. $nazwy_pol_dla_selecta = implode(",",$nameArrays);
  3. $idzapytania = mysql_query("SELECT $nazwy_pol_dla_selecta FROM przepisy");
  4. $ilosc3 = 0;
  5. $xxx = $k+1;
  6. while ($wiersz = mysql_fetch_row($idzapytania))
  7. {
  8. for($licz=1;$licz < mysql_num_fields($idzapytania);$licz++)
  9. {
  10. if($licz % 8 == 0)
  11. {
  12. $wiersz1[$ilosc3] = $wiersz[$licz].$wiersz1;
  13. }
  14. else
  15. {
  16. $wiersz1[$ilosc3] = $wiersz[$licz];
  17. }
  18. $ilosc3++;
  19. }
  20. }
  21.  
  22. //Tworzenie tablicy dla tablic wartości pól
  23. $ile_przepisow2 = $ile_przepisow - 1;
  24. for($i=0;$i <= $ile_przepisow2;$i++)
  25. {
  26. for($ii=0;$ii < $k;$ii++)
  27. {
  28. $tablica_wierszy[$i] = $tablica_wierszy.$wiersz[$ii];
  29. }
  30. }
  31.  
  32. //Tworzenie tablicy pod sumowanie
  33. foreach($tablica_wierszy as $tab)
  34. {
  35. for($i=0;$i<sizeof($tab); $i++)
  36. {
  37. if(isset($suma[$i]))
  38. {
  39. $suma[$i]+=$tab[$i];
  40. }
  41. else
  42. {
  43. $suma[$i]=$tab[$i];
  44. }
  45. }
  46. }
SpiritCode
nie widzę deklaracji tablicy $suma
smok55453
zapomniałem o niej. Dodałem i dalej to samo
SpiritCode
w linii 33 daj var_dump($tablica_wierszy) i pokaż
smok55453
array(4) { [0]=> string(5) "Array" [1]=> string(5) "Array" [2]=> string(5) "Array" [3]=> string(5) "Array" }
SpiritCode
To jest tablica stringów wink.gif

edit:
  1. for($i=0;$i <= $ile_przepisow2;$i++)
  2. {
  3. for($ii=0;$ii < $k;$ii++)
  4. {
  5. $tablica_wierszy[$i] = $tablica_wierszy.$wiersz[$ii];
  6. }
  7. }

co to jest?
smok55453
a jak mam zapisać ten kod:
  1. $ile_przepisow2 = $ile_przepisow - 1;
  2. for($i=0;$i <= $ile_przepisow2;$i++)
  3. {
  4. for($ii=0;$ii < $k;$ii++)
  5. {
  6. $tablica_wierszy[$i] = $tablica_wierszy.$wiersz[$ii];
  7. }
  8. }

żeby mi stworzył odpowiednią tablica?

edit.

To niby miał być kod który stworzy mi tablice z wartościami z innej tablicy. Tej:

  1. $nazwy_pol_dla_selecta = implode(",",$nameArrays);
  2. $idzapytania = mysql_query("SELECT $nazwy_pol_dla_selecta FROM przepisy");
  3. $ilosc3 = 0;
  4. $xxx = $k+1;
  5. while ($wiersz = mysql_fetch_row($idzapytania))
  6. {
  7. for($licz=1;$licz < mysql_num_fields($idzapytania);$licz++)
  8. {
  9. if($licz % 8 == 0)
  10. {
  11. $wiersz1[$ilosc3] = $wiersz[$licz].$wiersz1;
  12. }
  13. else
  14. {
  15. $wiersz1[$ilosc3] = $wiersz[$licz];
  16. }
  17. $ilosc3++;
  18. }
  19. }
SpiritCode
Jesli $wiersz ma strukturę taką jak pisałeś, czyli:
Cytat
Tablica 3:
0 => 2
1 => 3
2 => 4
3 => 0
4 => 0
5 => 1
6 => 0
7 => 0

to wystarczy Ci $tablica_wierszy[] = $wiersz

edit: pokaż jak w linii 21 wygląda $wiersz var_dump($wiersz)
smok55453
bool(false)

edit.

Przeczytaj sobie pierwszy post tego tematu to będziesz wiedział o co mi chodzi z tymi tablicami
SpiritCode
Ale ja to czytałem smile.gif
skąd wziąłeś taki zapis?
  1. $tablica_wierszy[$i] = $tablica_wierszy.$wiersz[$ii];

"." jest używana do łączenia stringów.

w tym przypadku łączysz tablicę zamienioną na string.

Więc po pierwsze. Musisz poprawnie dodać rekordy do tablicy
a potem wykonać pętle taką np. jak Ci pokazałem.
smok55453
A podpowiesz jak mam to zapisać aby działało?
SpiritCode
Priv
smok55453
SpiritCode

Musiałem tutaj napisać bo wykorzystałem jakiś limit wiadomości prywatnych na dzień.

zrobiłem tak jak pisałeś i gdy wyświetlę tablice_wartości wyświetla się to:

Kod
array(1) { [0]=> array(10) { [0]=> string(1) "1" [1]=> string(7) "Pierogi" [2]=> string(1) "3" [3]=> string(1) "2" [4]=> string(1) "1" [5]=> string(1) "1" [6]=> string(1) "0" [7]=> string(1) "0" [8]=> string(1) "0" [9]=> string(1) "0" } }


Czyli dobra tablica ale zawiera tylko jeden przepis
SpiritCode
Pokaż to zapytanie
smok55453
Kod
$my_res = mysql_query("SELECT * FROM przepisy WHERE id IN(".$tablica_wybranych_pol_dla_selecta.")");
SpiritCode
inaczej.
  1. var_dump("SELECT * FROM przepisy WHERE id IN(".$tablica_wybranych_pol_dla_selecta.")");
smok55453
Jednak działa.
Zapomniałem, że muszę wybrać kilka pól żeby mi utworzyło kilka tablic.

Tylko teraz jak zapisać aby mi pobierało dane z tej tabeli ale dopiero od trzeciej kolumny,
bo mam tak id,nazwa,(tutaj lista produktów jako kolejne kolumny)

i chce zrobić aby mi pobierało wartości dopiero od trzeciej kolumny
SpiritCode
Możesz po pobraniu zapuścić pętle w której zrobisz unset na te dwie kolumny. Lub pobawić się manipulacją zapytaniem
smok55453
A jak zrobić ten unset?
SpiritCode
robisz tak:
  1. for($i=0;$i<sizeof($tablica_wartosci);$i++)
  2. {
  3. unset($tablica_wartosci[$i][0]);
  4. unset($tablica_wartosci[$i][1]);
  5. }

Powinno poskutkować wink.gif
smok55453
czyli mam całą pętle nową wstawić tą co napisałeś?
SpiritCode
Wiesz. Jak chcesz możesz kombinować z zapytaniem SQL
smok55453
tylko tam chyba ma być $tablica_wierszy a nie $tablica_wartosci prawda?
SpiritCode
No tak tak wink.gif
smok55453
dobra pobrało mi te wartości już bez nazw i id ale jak wyświetla sume to dwa pierwsze wyrażenia w tablicy to są dwa zera.


Kod
Array ( [0] => 0 [1] => 0 [2] => 8 [3] => 6 [4] => 3 [5] => 1 [6] => 0 [7] => 0 )


czyli mam też zrobić unset na $suma?
SpiritCode
Nie nie. Na suma nie musisz. Wydaje sie byc ok
smok55453
Tylko ci się wydaje:
Kod
Array ( [0] => 0 [1] => 0 [2] => 8 [3] => 6 [4] => 3 [5] => 1 [6] => 0 [7] => 0 )


i według tej tablicy wychodzi tak:

suma id = 0, suma nazw = 0, suma jajek = 8, suma rodzynek = 6, suma karmelu = 3, suma mleka = 1, suma wody = 0, suma cukru = 0,

a ja mam jeszcze dwa pola mieć w tym: kako i maka

Jak zrobić aby na początku nie było sumy dla id i sumy dla nazw tylko się całość przesunęła i zaczęła liczyć od kolumny jajka?

Tabela teraz wygląda tak: ttt

A powinna tak:tttt

EDIT.





Już sobie poradziłem. Dziękuje za pomoc i życzę wszystkim aby ten nowy nadchodzący rok był jak najlepszy biggrin.gif




EDIT jeszcze raz biggrin.gif

Jednak napotkałem odrazu kolejny problem:
mam tą tabele: klik
po prawej stronie mam pola w które użytkownik wprowadz ile razy ma zamiar upiec danego placka.
Na dole wyświetla mi się tylko suma produktów na placki ale tylko jak ilość placka = 1. A ja chciałbym zrobić aby się wyświetliła suma na kilka placków



EDIT Again.

Nikt mi nie pomógł, więc to mnie zmotywowało do pracy i sam to napisałem. Już skończyłem projekt więc nie będę pisał w tym temacie.
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.