Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Pobieranie rekordów.
Forum PHP.pl > Forum > Przedszkole
Kużdo
Witam. Jestem początkującym (wprawdzie dopiero zacząłem się uczyć php i obsługi mysql) i mam pewien problem. Otóż muszę wykonać stronę prezentującą pewne wyniki z bazy danych. W bazie jest tabela "tabela1" w której znajdują się takie pola: "id" "dzien" "a" "b" "c" "d". Przykładowe rekordy to:
1) "1" "13.05" "a1" "b1" "c1" "d1"
2) "2" "16.06" "a2" "b2" "c2" "d2"
3) "3" "13.05" "a3" "b3" "c3" "d3"

Znalazłem w sieci skrypt wypisujący dane ale nie odpowiada mi to w jaki sposób są wyświetlane dane.
Skrypt:
  1. <?php
  2. $connection = @mysql_connect('localhost', 'root', 'haslo')
  3. or die('Brak połączenia z serwerem MySQL');
  4. $db = @mysql_select_db('tabela1', $connection)
  5. or die('Nie mogę połączyć się z bazą danych');
  6.  
  7. $wynik = mysql_query("SELECT * FROM tabela1")
  8. or die('Błąd zapytania');
  9.  
  10. if(mysql_num_rows($wynik) > 0) {
  11. echo "<table cellpadding=\"2\" border=1>";
  12. while($r = mysql_fetch_assoc($wynik)) {
  13. echo "<tr>";
  14. echo "<td>".$r['id']."</td>";
  15. echo "<td>".$r['a']."</td>";
  16. echo "<td>".$r['b']."</td>";
  17. echo "<td>".$r['c']."</td>";
  18. echo "<td>".$r['d']."</td>";
  19. echo "</tr>";
  20. }
  21. echo "</table>";
  22. }
  23.  
  24. ?>

Niestety kod ten wyświetla mi dane inaczej niż chciałbym i nie potrafię napisać odpowiedniego. Dane są wyświetlane poziomo a chciałbym żeby były wyświetlane pionowo.

Tak są wyświetlane:
1 a1 b1 c1 d1
2 a2 b2 c2 d2
3 a3 b3 c3 d3

A chciałbym tak:
1 2 3
a1 a2 a3
b1 b2 b3
c1 c2 c3
d1 d2 d3

Dodatkowo chciałbym żeby na samym końcu była wyświetlana suma ze wszystkich rekordów. Nie wiem także jak zrobić żeby zamiast id w ostatnim wpisie wyświetlił się napis SUMA.
SUMA
a1+a2+a3
b1+b2+b3
c1+c2+c3
d1+d2+d3

Chciałbym także żeby dane były wyświetlane dopiero po wybraniu konkretnego dnia (powinny ukazywać się tylko dane z jednego dnia; suma rekordów miałaby być także sumą z konkretnego dnia). Czy ktoś pomoże mi napisać taki skrypt? Z góry dziękuję. Jeśli coś niezrozumiale napisałem, przepraszam i spróbuję wyjaśnić o co mi chodzi.

//EDIT

Wymyśliłem że jeden rekord mogę zapisać w jednej komórce a każdą daną oddzielić enterem.
  1. <?php
  2. $connection = @mysql_connect('localhost', 'root', 'haslo')
  3. or die('Brak połączenia z serwerem MySQL');
  4. $db = @mysql_select_db('tabela1', $connection)
  5. or die('Nie mogę połączyć się z bazą danych');
  6.  
  7. $wynik = mysql_query("SELECT * FROM tabela1")
  8. or die('Błąd zapytania');
  9.  
  10. if(mysql_num_rows($wynik) > 0) {
  11. echo "<table cellpadding=\"2\" border=1><tr>";
  12. while($r = mysql_fetch_assoc($wynik)) {
  13. echo "<td>";
  14. echo $r['id']."<br />";
  15. echo $r['a']."<br />";
  16. echo $r['b']."<br />";
  17. echo $r['c']."<br />";
  18. echo $r['d']."<br />";
  19. echo "</td>";
  20. }
  21. echo "</tr></table>";
  22. }
  23. ?>


Jednak wtedy nie wiem jak oddzielić poszczególne wiersze aby było to czytelne (pól w bazie jest około 60 więc przy wypisywaniu ich poziomo trzeba przewijać stronę w poziomie co nie pasuje... jednak nie wiem jak oddzielić poszczególne wiersze w wypisie pionowym żeby było to wszystko czytelne gdzie rekordów jest około 40 na jeden dzień).
JoShiMa
W pętli zapisuj rekordy do tabel a następnie wyświetlaj zawartość tabeli

  1. <?php
  2. $ilosc_rekordow = mysql_num_rows($wynik);
  3. if($ilosc_rekordow > 0)
  4.  while($r = mysql_fetch_assoc($wynik)) {//przypisanie wartości do tablic pod odpowiednimi kluczami hasza $wynik
  5. $wynik['id'][] = $r['id'];
  6. $wynik['a'][] = $r['a'];
  7. $wynik['b'][] = $r['b'];
  8. $wynik['c'][] = $r['c'];
  9. $wynik['d'][] = $r['d'];
  10.  }
  11.  $table = '';
  12.  foreach($wynik as $klucz => $warto&#347;ć){//pętla leci po haszu $wynik
  13.  $wiersz = '';
  14.  for($i=0;$i<$ilosc_rekordow;$i++){//Dla każdego klucza analizuje i przygotowuje do wyświetlenia tablicę składając pola jako wiersz tabeli
  15. $wiersz .= "<td>$wynik[$klucz][$i]</td>";
  16. if($klucz != 'id'){//oblicznie sumy dla wszystkich kluczy poza 'id'
  17.  $suma = array_sum($wynik[$klucz]);
  18.  $wiersz .= "<td>$suma</td>";
  19. }
  20.  }
  21.  $table .= "<tr>$wiersz</tr>";//gotowy wiersz otacza odpowiednimi znacznikami i dodaje do poprzednich
  22.  }
  23.  echo "<table>$table</table>";//Wyświetla gotową tabelę
  24. }
  25. ?>


Mam nadzieję, że nie narobiłam błędów składniowych. W każdym razie nie sprawdziłam tego kodu. Naucz się najpierw konstruować kawałek kodu a potem go wyświetlać. Jest to często wygodniejsze niż wyświetlanie na bierząco. Daje to więcej możliwości.
kszychu
Nie ten dział, przenoszę.
Kużdo
Brakowało chyba jednego { przy pierwszym IF... Oto cały plik ze skryptem:
  1. <?php
  2. require "connect.php";
  3. connect();
  4.  
  5. // zapytanie do bazy danych
  6. $wynik = mysql_query("SELECT * FROM skladki")
  7. or die("Błąd w zapytaniu!");
  8.  
  9. $ilosc_rekordow = mysql_num_rows($wynik);
  10. if($ilosc_rekordow > 0){ // tutaj chyba brakowało {
  11.  while($r = mysql_fetch_assoc($wynik)) {//przypisanie wartości do tablic pod odpowiednimi kluczami hasza $wynik
  12. $wynik['nick'][] = $r['nick'];
  13. $wynik['kasa'][] = $r['kasa'];
  14. $wynik['cb'][] = $r['cb'];
  15. $wynik['cc'][] = $r['cc'];
  16. $wynik['cd'][] = $r['cd'];
  17.  }
  18.  $table = '';
  19.  foreach($wynik as $klucz => $wartosc){//pętla leci po haszu $wynik
  20.  $wiersz = '';
  21.  for($i=0;$i<$ilosc_rekordow;$i++){//Dla każdego klucza analizuje i przygotowuje do wyświetlenia tablicę składając pola jako wiersz tabeli
  22. $wiersz .= "<td>$wynik[$klucz][$i]</td>";
  23. if($klucz != 'nick'){//oblicznie sumy dla wszystkich kluczy poza 'id'
  24.  $suma = array_sum($wynik[$klucz]);
  25.  $wiersz .= "<td>$suma</td>";
  26. }
  27.  }
  28.  $table .= "<tr>$wiersz</tr>";//gotowy wiersz otacza odpowiednimi znacznikami i dodaje do poprzednich
  29.  }
  30.  echo "<table>$table</table>";//Wyświetla gotową tabelę
  31. }
  32. ?>

Ale gdzieś musi być błąd jeszcze bo wyskakują mi takie błędy:
CODE
Warning: Cannot use a scalar value as an array in C:\xampp\htdocs\przemo\tabela1.php on line 12

Warning: Cannot use a scalar value as an array in C:\xampp\htdocs\przemo\tabela1.php on line 13

Warning: Cannot use a scalar value as an array in C:\xampp\htdocs\przemo\tabela1.php on line 14

Warning: Cannot use a scalar value as an array in C:\xampp\htdocs\przemo\tabela1.php on line 15

Warning: Cannot use a scalar value as an array in C:\xampp\htdocs\przemo\tabela1.php on line 16

Warning: Cannot use a scalar value as an array in C:\xampp\htdocs\przemo\tabela1.php on line 12

Warning: Cannot use a scalar value as an array in C:\xampp\htdocs\przemo\tabela1.php on line 13

Warning: Cannot use a scalar value as an array in C:\xampp\htdocs\przemo\tabela1.php on line 14

Warning: Cannot use a scalar value as an array in C:\xampp\htdocs\przemo\tabela1.php on line 15

Warning: Cannot use a scalar value as an array in C:\xampp\htdocs\przemo\tabela1.php on line 16

Warning: Invalid argument supplied for foreach() in C:\xampp\htdocs\przemo\tabela1.php on line 19

Zgaduję że błędy się powtarzają bo rekordów w bazie jest na razie tylko 2 przykładowe... Przeszukałem kursy PHP i czytałem o tablicach ale i tak nie wiem co może być źle... Proszę żeby ktoś sprawdził czy nie ma gdzieś błędu w pliku bo ja jak na razie nie znalazłem...
JoShiMa
Zmienna $wynik przed pętlą while jest już raz używana więc zmień nazwę tablicy w pętlach while i foreach na inną
  1. <?php
  2. while($r = mysql_fetch_assoc($wynik)) {//przypisanie wartości do tablic pod odpowiednimi kluczami hasza $wynik
  3. $xxx['nick'][$i] = $r['nick'];
  4. $xxx['kasa'][$i] = $r['kasa'];
  5. $xxx['cb'][$i] = $r['cb'];
  6. $xxx['cc'][$i] = $r['cc'];
  7. $xxx['cd'][$i] = $r['cd'];
  8.  
  9.  }
  10. ?>


A poza tym możesz dać zabezpieczenie zabezpieczenie:

  1. <?php
  2. if($xxx){
  3.  foreach($xxx as $klucz => $wartosc){//pętla leci po haszu $wynik
  4.  $wiersz = '';
  5.  for($i=0;$i<$ilosc_rekordow;$i++){//Dla każdego klucza analizuje i przygotowuje do wyświetlenia tablicę składając po
    la jako wiersz tabeli
  6. $wiersz .= "<td>$wynik[$klucz][$i]</td>";
  7. if($klucz != 'nick'){//oblicznie sumy dla wszystkich kluczy poza 'id'
  8.  $suma = array_sum($wynik[$klucz]);
  9.  $wiersz .= "<td>$suma</td>";
  10. }
  11.  }
  12.  $table .= "<tr>$wiersz</tr>";//gotowy wiersz otacza odpowiednimi znacznikami i dodaje do poprzednich
  13.  }
  14. }
  15. ?>

Uchroni Cię przed uruchamianiem tej pętli jeśli z jakiegoś powodu nie utworzy się tablica $xxx

I faktycznie zjadłam tę klamrę smile.gif
cojack
  1. <?php
  2. @ $db = new mysqli('localhost', 'login', 'haslo', 'baza_danych')
  3.  
  4. if (mysqli_connect_error())
  5. {
  6. echo 'Błąd, nie mogę ustawnowić połączenie z bazą danych'
  7. }
  8.  
  9. $zapytanie = "SELECT * FROM tabela1 WHERE data=".$zmienna_z_data." ORDER BY ID";
  10. $wynik = $db->query($zapytanie);
  11.  
  12. $ile_znalezionych = wynik->num_rows;
  13.  
  14. if ($ile_znalezionych)
  15. {
  16. $wiersz = $wynik->fetch_object();
  17. echo '<table cellpadding='2' border='1'>\n<tr>\n';
  18. for ($i = 0; i<$ile_znalezionych; i++)
  19. {
  20. echo '<td>"'.wiersz->id.'"</td>\n';
  21. }
  22. echo '</tr>\n<tr>\n';
  23. for ($i = 0; i<$ile_znalezionych; i++)
  24. {
  25. echo '<td>"'.wiersz->a.'"</td>\n';
  26. }
  27. echo '</tr>\n<tr>\n';
  28. for ($i = 0; i<$ile_znalezionych; i++)
  29. {
  30. echo '<td>"'.wiersz->b.'"</td>\n';
  31. }
  32. echo '</tr>\n<tr>\n';
  33. for ($i = 0; i<$ile_znalezionych; i++)
  34. {
  35. echo '<td>"'.wiersz->c.'"</td>\n';
  36. }
  37. echo '</tr>\n<tr>\n';
  38. for ($i = 0; i<$ile_znalezionych; i++)
  39. {
  40. echo '<td>"'.wiersz->d.'"</td>\n';
  41. }
  42. echo '</tr>\n<tr>\n';
  43. echo '<td>Suma:</td><td>"'.object_sum +=wiersz->a.'"</td><td>"'.object_sum +=wiersz->b.'"</td><td>"'.object_sum +=wiersz->c.'"</td><td>"'.object_sum +=wiersz->d.'"</td>';
  44. echo '</tr>\n</table>';
  45. }
  46. $wynik->free();
  47. ?>


poprawiłem z <= na <
JoShiMa
taka ilość pętli? Po jakie licho? Kod nieelegancki i nieoptymalny. Blech...
cojack
Każdy pisze jak umie.

@EIDT \/ będę się starał, ale na pewno nie będę pisał proceduralne.
JoShiMa
To trzeba się rozwijać a nie pisać byle jak, byle pisać aaevil.gif
Kużdo
JoShiMa nie wiem czy dobrze złączyłem te dwa kody jakie podałaś, ale tym razem wyskoczył mi tylko jeden błąd...

Warning: Invalid argument supplied for foreach() in C:\xampp\htdocs\przemo\tabela1.php on line 20

A plik teraz wygląda tak:
  1. <?php
  2. require "connect.php";
  3. connect();
  4.  
  5. // zapytanie do bazy danych
  6. $wynik = mysql_query("SELECT * FROM skladki")
  7. or die("Błąd w zapytaniu!");
  8.  
  9. $ilosc_rekordow = mysql_num_rows($wynik);
  10. if($ilosc_rekordow > 0){ // tutaj chyba brakowało {
  11.  while($r = mysql_fetch_assoc($wynik)) {//przypisanie wartości do tablic pod odpowiednimi kluczami hasza $wynik
  12. $xxx['nick'][$i] = $r['nick'];
  13. $xxx['kasa'][$i] = $r['kasa'];
  14. $xxx['cb'][$i] = $r['cb'];
  15. $xxx['cc'][$i] = $r['cc'];
  16. $xxx['cd'][$i] = $r['cd'];
  17.  }
  18.  $table = '';
  19.  if($xxx){
  20. foreach($wynik as $klucz => $wartosc){//pętla leci po haszu $wynik
  21.  $wiersz = '';
  22.  for($i=0;$i<$ilosc_rekordow;$i++){//Dla każdego klucza analizuje i przygotowuje do wyświetlenia tablicę składając pola jako wiersz tabeli
  23. $wiersz .= "<td>$wynik[$klucz][$i]</td>";
  24. if($klucz != 'nick'){//oblicznie sumy dla wszystkich kluczy poza 'id'
  25.  $suma = array_sum($wynik[$klucz]);
  26.  $wiersz .= "<td>$suma</td>";
  27. }
  28.  }
  29.  $table .= "<tr>$wiersz</tr>";//gotowy wiersz otacza odpowiednimi znacznikami i dodaje do poprzednich
  30.  }
  31.  echo "<table>$table</table>";//Wyświetla gotową tabelę
  32.  }
  33. }
  34. ?>


I dziękuję, że mi pomagacie... smile.gif

//EDIT

Na razie nie zmieniałem nazw tablic xxx, żeby nie namieszać haha.gif
help_mee
Wszędzie w manualach widzę że po funkcji się stawia spacebara a potem nawias tak samo ze znakiem "{"
JoShiMa
Tu nie zmieniłeś:
  1. <?php
  2. foreach($xxx as $klucz => $wartosc){
  3. ?>


help_mee Co kto lubi. Ja lubię zwartu kod. Lak się przyzwyczaiłam jeszcze w czasach kiedy programowałam w Pascalu i tak mi się łatwiej na kod patrzy, lepiej go widzę.
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.