Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP][MySQL]Tworzenie tabeli z godzinami pracy dla każdego z pracowników
Forum PHP.pl > Forum > Przedszkole
bongo48
Cześć wszystkim,

chciałbym stworzyć tabele z godzinami dla każdego z pracownika (możliwość wglądu jak i zapisu godzin pracy). Stworzylem system rejestracji i logowania.
Stworzyłem tabele z poszczególnymi datami, ale potrzebuję przypisać do poszczególnej daty, godziny pracy pracownika i nazwa projektu. Chciałbym, żeby pracownik miał możliwość zapisu swoich godzin pracy. Utknąłem po przypisaniu mojej tabeli z sql w tablicy.

Proszę o jakieś wskazówki jak się za to zabrać. Z góry dzięki bardzo

tutaj co chciałbym osiągnąć:

moja tabela w mysql "Kalendarz"
id | date | project | login

a tutaj to co dotychczas udało mi się stworzyć
  1. <?php
  2. $data=array();
  3. $query = "SELECT * FROM kalendarz";
  4. $result = $polaczenie->query($query);
  5. while($row = mysqli_fetch_assoc($result))
  6. {
  7. $data[] = $row;
  8. }
  9.  
  10. // assigning variables for dates
  11. $dzis = date('Y-m-d');
  12. $period = new DatePeriod(
  13. new DateTime('2017-05-01'),
  14. new DateInterval('P1D'),
  15. new DateTime('2017-05-31')
  16. );
  17.  
  18. foreach( $period as $date) {
  19. $array[] = $date->format('d-m-Y');
  20. }
  21. $count_days = count($array);
  22. // creating each row
  23. echo "<table border='1'>";
  24. echo "<tr>";
  25. echo "<th>TEMAT</th>>";
  26. $temat = "project_name";
  27. for ($j = 0; $j < $count_days; $j++) {
  28. echo "<th>$array[$j]</th>";
  29. }
  30. echo "</tr>";
  31. echo "</table>";
  32. ?>
b4rt3kk
Z czym konkretnie masz problem? Z utworzeniem odpowiedniej tabeli w bazie danych? Z prezentacją danych? Ze zbudowaniem formularza?
bongo48
Raczkuje dopiero w php, docelowo będę musiał się zmierzyć z każdym z tego co napisałeś. Lecz, krok po kroku. Tworzenie tabel w sql zostawię na później, teraz chciałbym stworzyć formularz, który prezentuje dane, lecz można wpisywać tam też godziny, których do tej pory nikt nie wpisał.

Do rzeczy, udało mi się coś takiego sklecić :

  1. ```
  2. // assigning variables for dates
  3. $dzis = date('Y-m-d');
  4. $period = new DatePeriod(
  5. new DateTime('2017-05-01'),
  6. new DateInterval('P1D'),
  7. new DateTime('2017-05-31')
  8. );
  9.  
  10. foreach( $period as $date) { $array[] = $date->format('d-m-Y'); }
  11. $liczba_dni = count($array);
  12.  
  13.  
  14. echo "<table border='1'>";
  15. echo "<tr>";
  16. for ($j = 0; $j < $liczba_dni; $j++)
  17. {
  18. echo "<th>$array[$j]</th>";
  19. echo "</tr>";
  20. $my_date = date('Y-m-d', strtotime ($array[$j]));
  21. $query = "SELECT hours FROM calendar where login= '$_SESSION[user]' and date = '$my_date' ORDER BY date";
  22. $result = $polaczenie->query($query);
  23. while ($row = mysqli_fetch_assoc($result))
  24. {
  25. $hour = $row["hours"];
  26. echo "<tr><td>";
  27. echo $hour;
  28. echo "</td></tr>" ;
  29. }
  30.  
  31. }
  32. ```


Tylko że tworzy to się w jednej kolumnie, a ja chciałbym żeby to było tak jak na screenie: daty a pod spodem godziny. Masz jakiś pomysł na to?

Pozdrawiam
bostaf
Jesteś na dobrym tropie, ale proponowałbym, żebyś zaczął od początku:
  • Najpierw zaprojektuj tą tabelę, z kilkoma przykładowymi wierszami, gołym HTMLem.
  • Dopiero potem dodaj pętle PHP tak, żeby uzyskać dokładnie taką samą tabelę.

Na razie nie ruszaj SQLa, chodzi o to, żebyś najpierw zrozumiał jak wykorzystać pętle do narysowania tabeli ze zmienną liczbą wierszy. Bo ta wiedza pomoże Ci zrozumieć, w jaki sposób skonstruować zapytanie SQL po to, żeby uzyskać wynik który można wykorzystać podczas dynamicznego generowania tabeli.
Dopiero jak będziesz potrafił zrobić tą tabelę samym PHP, zacznij wypełniać ją danymi z bazy.

W taki sposób sam więcej zrozumiesz, a i pytania które będziesz zadawał na forum będą konkretniejsze.
bongo48
Dzięki bostaf! Zobacz co dzięki Twoim wskazówkom udało mi się sklecić. Co o tym myślisz? Teraz muszę tylko pogrupować projektem i stworzyć kolumnę "Nazwa Projektu".
  1. echo "<table border='1'>";
  2. echo "<tr>";
  3. for ($j = 0; $j < $liczba_dni; $j++)
  4. {
  5. echo "<th>$array[$j]</th>";
  6. }
  7. echo "</tr><tr>";
  8. for ($j = 0; $j < $liczba_dni; $j++)
  9. {
  10. $my_date = date('Y-m-d', strtotime ($array[$j]));
  11. $query = "SELECT * FROM calendar where login= '$_SESSION[user]' and date = '$my_date' ORDER BY date";
  12. $result = $polaczenie->query($query);
  13. while ($row = mysqli_fetch_assoc($result))
  14. {
  15. $hour = $row["hours"];
  16. $date = $row["date"];
  17.  
  18. }
  19. if($date!=$my_date){
  20. echo "<td>";
  21. echo "0";
  22. echo "</td>";
  23. }
  24. else
  25. {
  26. echo "<td>";
  27. echo $hour;
  28. echo "</td>";
  29. }
  30. }
Kshyhoo
Upominam o właściwe bb-code dla kodu PHP. Trzeci raz poprawiłem....
bostaf
Cytat(bongo48 @ 11.05.2017, 01:08:01 ) *
Co o tym myślisz?

Ja mam lekkie problemy ze wzrokiem więc mogę się mylić, ale ta Twoja tabela w ogóle nie jest podobna do tej z obrazka. Co o tym myślisz? wink.gif
bongo48
Może nie kolorystycznie, ale format spoko. Wyszło mi coś takiego teraz:


Jest super. Kolejny orzech do zgryzienia, jak wysłać dane z formularza do tabeli? Wszystkie zmienne są : $_SESSION[user], $my_date, $project[$i].
Trzeba teraz zabrać dane z inputa i zapisać w tablicy. Masz pomysł jak to ugryźć?

To co teraz mam:
  1. echo "<table border='1'>";
  2. echo "<tr>";
  3. echo "<th>Nazwa Projektu</th>";
  4. for ($j = 0; $j < $liczba_dni; $j++)
  5. {
  6. echo "<th>$array[$j]</th>";
  7. }
  8. echo "</tr><tr>";
  9.  
  10. //search for projects in table
  11. $query = "SELECT project_name FROM calendar where login= '$_SESSION[user]' ";
  12. $result = $polaczenie->query($query);
  13. while ($row = mysqli_fetch_array($result,MYSQLI_ASSOC))
  14. {
  15. $project []= $row['project_name'];
  16. }
  17.  
  18. //loop with all projects
  19. $count_of_projects = count($project);
  20. for ($i = 0; $i<$count_of_projects; $i++)
  21. {
  22. echo "<td> $project[$i] </td>";
  23.  
  24.  
  25. for ($j = 0; $j < $liczba_dni; $j++)
  26. {
  27.  
  28. $my_date = date('Y-m-d', strtotime ($array[$j]));
  29. $query = "SELECT * FROM calendar where login= '$_SESSION[user]' and date = '$my_date' and project_name ='$project[$i]'ORDER BY date ";
  30. $result = $polaczenie->query($query);
  31.  
  32. while ($row = mysqli_fetch_assoc($result))
  33. {
  34. $hour = $row["hours"];
  35. $date = $row["date"];
  36.  
  37. }
  38. if($date!=$my_date)
  39. {
  40. echo "<td>";
  41. echo "<form><input type=number value='0' step='0.5' min=0 max='24'</form>";
  42. echo "</td>" ;
  43. }
  44. else
  45. {
  46. echo "<td>";
  47. echo "<form><input type=number value='$hour' step='0.5' min=0 max='24'</form>";
  48. echo "</td>" ;
  49. }
  50. }
  51. echo "</tr>";
  52. $hour=0;
  53. }
  54. echo "</tr></table>";

Kshyhoo
Moim zdaniem, nie potrzebnie tworzysz formularz dla każdego zdarzenia. Powinien być jeden a samo zdarzenie zmienną.
bostaf
Cytat(bongo48 @ 11.05.2017, 16:34:46 ) *
Masz pomysł jak to ugryźć?

Kilka, ale zabawa polega na tym, że Ty rzucasz pomysłami a my krytykujemy wink.gif

Cytat(Kshyhoo @ 11.05.2017, 17:21:58 ) *
Moim zdaniem, nie potrzebnie tworzysz formularz dla każdego zdarzenia. Powinien być jeden a samo zdarzenie zmienną.

Dokładnie. Bo jednocześnie może być przesłany tylko jeden formularz, a o to tutaj chyba chodzi.
@bongo48 Jeśli nie miałeś wcześniej do czynienia z formularzami to teraz musisz poćwiczyć na boku, bo inaczej tego swojego formularza nie ogarniesz.
Zrób sobie prosty formularzyk, daj dump $_POST na końcu i analizuj co się dzieje, jaką formę przybiera tablica $_POST w różnych warunkach:
  1. <form method="post">
  2. <input type="number" name="nazwa_pola_1" />
  3. <input type="number" name="nazwa_pola_2" />
  4. <input type="submit" />
  5. </form>
  6. <pre>
  7. <?php
  8. var_dump($_POST);

Zobacz co się dzieje jeśli nazwiesz kilka inputów np. "nazwa_pola[]" albo "nazwa_pola[abc][]" ...
Dodawaj coraz więcej inputów i analizuj...
To powinno Cię naprowadzić na rozwiązanie.
bongo48
Oki dzięki za radę. Wymyśliłem coś takiego:
  1. echo "<form action='' method='post'>";
  2.  
  3. echo "<input type='number' name='hours_to_save[$my_date][$project[$i]]'/>";
  4.  
  5. echo "<input type='submit'/>";
  6.  
  7. echo "</form>";


Drukuje mi to w ten sposób:
  1. array(30) {
  2. ["2017-05-01"]=>
  3. array(3) {
  4. ["kompan"]=> string(1) "2"
  5. ["5 ogrodow"]=> string(1) "3"
  6. ["karolowo"]=> string(1) "4"
  7. }


Logiczne wg mnie, ale przeszukałem Google i nie mogę znaleźć, jak przypisać konkretny index np. data => ["2017-05-01"] => array(3) { nazwa_projektu => "["kompan"]"} ...itd.
W tej postaci (bez index-ów) nie ma sposobu, żeby wysłać do tabeli w mysql - przynajmniej nie znalazłem.
bostaf
A narysuj tu przykład takiej tablicy, jaką chciałbyś uzyskać. Tylko czytelnie plz, np:
Kod
array(30) {
    ["2017-05-01"]=>
        array(3) {
            ["kompan"]    => string(1) "2"
            ["5 ogrodow"] => string(1) "3"
            ["karolowo"]  => string(1) "4"
    },
    ...
}
bongo48
Byłoby coś takiego, jeżeli jestem w błędzie to powiedz - będę szukał czegoś innego. Chciałbym dodać index do każdej ze zmiennych...
  1. array(30) {
  2. ["data"] => "2017-05-01"=>
  3. array(3) {
  4. ["project"] => "kompan" =>
  5. array(1) { ["hours"] => string(1) "2"
  6.  
  7. ["project"] =>"5 ogrodow" =>
  8. array(1) { ["hours"] => string(1) "3"
  9.  
  10. ["project"] => "karolowo" =>
  11. array(1) { ["hours"] => string(1) "4"
  12. },
  13. ...
  14. }
  15.  


może lepiej by było stworzyć coś takiego? Tylko nie wiem jak pobrać zmienną z formularza. Wtedy bym zrobił ręcznie tą tablice pod formularzem...

  1. array(30) {
  2. ["data"] => "2017-05-01"=>
  3. array(3) {
  4. ["project"] => "kompan" , ["hours"] => string(1) "2"
  5.  
  6. ["project"] =>"5 ogrodow" , ["hours"] => string(1) "3"
  7.  
  8. ["project"] => "karolowo" , ["hours"] => string(1) "4"
  9. },
  10. ...
  11. }
  12.  


bostaf
Cytat(bongo48 @ 12.05.2017, 11:32:27 ) *
W tej postaci (bez index-ów) nie ma sposobu, żeby wysłać do tabeli w mysql - przynajmniej nie znalazłem.

Z każdej postaci da się przesłać do bazy. Zmienia się tylko sposób wyciągania danych z tablicy. Zawsze trzeba będzie iterować, ale na różne sposoby.

I wszystkie te pomysły na strukturę tablicy które podałeś są OK.

Nie wiem czy to nie jest zbyt skomplikowane dla Ciebie jeszcze. Poćwicz naprawdę z jakimś prostym formularzem na początek - spróbuj te dwa inputy z tego przykładowego formularza który narysowałem poprzednio zapisać w bazie. Zmieniaj "name" i znów próbuj zapisywać. Poćwicz też iterowanie po wielowymiarowych tablicach.
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.