Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: zmiana danych w bazie
Forum PHP.pl > Forum > Przedszkole
Aga_
Witam, mam problem ze zmianą pól w bazie, dla wielu rekordów. Wyświetlam w formularzu rekordy z bazy i dla każdego z nich chce zmieniać jedno pole. Nie wiem jak powiązać to pole z rekordem, skoro w formularzu nie wpisuje danych i do zmiennej wrzucam pustą wartość.
Wyświetlam imie i nazwisko i chce zmienic nieobecnosci. Proszę o pomoc smile.gif Niżej zamieszczam fragment kodu:
  1. <form method=post action=pierwsza.php?action=zmien > 
  2. <table width="80%" border="0" align="center" bgcolor="#FAEBD7" >
  3. <tr>
  4. <td height=30 align=center> <font color="#FFA500"><b> Imie: </b></td>
  5. <td height=30 align=center> <font color="#FFA500"><b> Nazwisko: </b></td>
  6. <td height=30 align=center> <font color="#FFA500"><b> Grupa: </b></td>
  7. <td height=30 align=center> <font color="#FFA500"><b> Ilość nieobecnosci w ubiegłym miesiącu: </b></td>
  8. </tr>
  9.  
  10. <?php
  11.  $connect=mysql_connect('localhost','root','root') or die ('Przykro nam ale nie mogę połączyć się z bazą!');
  12. mysql_select_db("rejestracja");
  13.  
  14.  
  15. $query="SELECT * FROM dzieci where grupa=1 ORDER BY 'nazwisko'";
  16. $result=mysql_query($query)or die (mysql_error());
  17.  
  18. while ($row=mysql_fetch_array($result))
  19. {
  20. echo "<tr>";
  21. echo "<td height=30> ".$row["imie"]."</td>n";
  22. echo "<td height=30> ".$row["nazwisko"]."</td>n";
  23. echo "<td height=30 align=center> ".$row["grupa"]."</td>n";
  24. echo "<td height=30 align=center> <input type=tekst name=nieobecnosci> poprzednio: ".$row["nieobecnosci"]."<br>n";
  25. echo "<div align='center'><input type=submit value='zmien'></div>";
  26. echo "</tr>";
  27. }
  28. mysql_free_result ($result);
  29. ?>
  30. </table>
  31. </form>
  32.  
  33. <?php
  34.  
  35. if ($_REQUEST['action'] == zmien) zmien();
  36.  
  37. function zmien()
  38. {
  39. $imie = $_POST['imie'];
  40. $nazwisko = $_POST['nazwisko'];
  41. $nieobecnosci = $_POST['nieobecnosci'];
  42.  
  43. //sprawdzenie czy pole nieobecnosci są wypełnione
  44. //if 
  45. //($nieobecnosci == '')
  46. //echo "pola nieobecnosci musza byc wypelnione";
  47. //else
  48.  
  49. //zapisanie do bazy
  50. $query = "UPDATE dzieci SET nieobecnosci = '$nieobecnosci'
  51. WHERE nazwisko = '$nazwisko' ";
  52. $result = mysql_query($query) or die (mysql_error());
  53.  
  54. echo "<table><tr><td align=center>",$nieobecnosci,"Lista została zmienona :)<br></a></td></tr></table>";
  55. }
MatheW
Nie bardzo Cię rozumiem. Ty chcesz żeby na jedej stronie zmieniać pole nieobecności dla wielu uczniów?

Jeżeli tak to ja to zrobiłbym tak, że przy polu "nieobecności" dopisałbym nazwisko ucznia czyli
Kod
<input type=tekst name=nieobecnosci_$row["nazwisko"]>

Potem sprawdziłbym czy pola te są wypełnione (czyli funkcją empty). Jeżeli tak to wysłać należy do bazy, jeżeli nie to kolejny rekord (wszystko w pętli.

PS. Jeżeli robisz echo w cudzysłowach (") to nie musisz stosować kropek dla zmiennych. Robi się tak dla apostrofów (') co jest szybszą metodą.
Gość
Mozna jeszcze zrobic za pomoca przekazywania tablicy wszystkich nieobecnosci przez POST i potem przy uzyciu foreach iterowac po tej tablicy. Tylko do tego trzeba jeszcze dodac jakis atrybut hidden okreslajacy danego ucznia (np. id), zeby podczas update wiedziec do jakiego ucznia dana nieobecnosc sie odnosi (bo u ciebie nie przekazujesz POSTem nazwiska ani imienia, a w UPDATE masz WHERE nazwisko='$nazwisko').
Jak ci sie uda to napisac to zapostuj tutaj, bo z checia zobacze jak to rozwiazalas.
Aga_
nie chodzi mi o odhaczenie nieobecności tylko wprowadzenie ilości dni nieobecności dla poszczególnych dzieci...... Lista dzieci i kolumna z polem "ilość nieobecności" przy każdym nazwisku. Pomóżcie....... sad.gif
KG-
Po pierwsze masz źle zaprojektowaną bazę, jeśli miałabyś pole (będące nota bene kluczem głównym) `id` dla każdego ucznia, to ułatwiłoby Ci to choćby zmianę rekordów (no i byłoby lepsze ponieważ porównywanie wartości liczbowych jest szybsze niż ciągów znaków).

Po drugie pole:
  1. <?php
  2. echo "<td height=30 align=center> <input type=tekst name=nieobecnosci> poprzednio: ".$row["nieobecnosci"]."<br>n";
  3. ?>


proponuję zamienić na (po prowadzeniu pola id

  1. <?php
  2. echo '<td height="30" align="center"><input type="text" name="nieobecnosci['.$row['id'].']" VALUE="'.$row['nieobecnosci'].'"><br>';
  3. ?>

dodanie pola VALUE spowoduje, że do pola tekstowego wpisywana będzie na starcie wartość tego pola z bazy co jest chyba lepszym rozwiązaniem niż podawanie obok poprzedniej wartości.

Po trzecie jeśli już chcesz mieć osobny przycisk submit dla każdego pola to powinien on wyglądać mniej więcej tak:
  1. <?php
  2. echo '<div align="center"><input type="submit" value="zmien" name="submit['.row['id'].']"></div>';
  3. ?>


Co spowoduje że każdemu przyciskowi i polu przypisanie zostanie id ucznia którego dane chcemy zmienić.
Przykładowy kod obsługujący formularz mógłby wyglądać następująco:
  1. <?php
  2. foreach ($_POST['submit'] as $id => $v) {
  3. if (!empty($v) && !empty($_POST['nieobecnosci'][$id])) {
  4. $query = 'UPDATE `dzieci` SET `nieobecnosci`='.intval($_POST['nieobecnosci'][$id]).' WHERE `id`='.$id.' LIMIT 1;';
  5. $result = mysql_query($query) or die (mysql_error());
  6. }
  7. }
  8. ?>


Jak jeszcze coś jest niejasne to pytaj.
Gość
@KG - nie mozna przeciez kliknac 2 przyciskow submit na jednej stronie za jednym razem, wiec wedlug mnie iterowanie po tablicy $_POST['submit'] jest zbedne.
Ja to bym zrobil mniej wiecej tak (na podstawie Twojego kodu):
  1. <?php
  2. echo '<td height="30" align="center"><input type="text" name="nieobecnosci['.$row['id'].']" VALUE="'.$row['nieobecnosci'].'"><br>';
  3.  
  4. echo '<div align="center"><input type="submit" value="zmien" name="submit"></div>';
  5. ?>

i pozniej :
  1. <?php
  2. if (isset($_POST['submit'])) {
  3.  foreach ($_POST['nieobecnosci] as $id => $value) {
  4.  $query = 'UPDATE `dzieci` SET `nieobecnosci`='.$value.' WHERE `id`='.$id.' LIMIT 1;';
  5.  $result = mysql_query($query) or die (mysql_error());
  6. }
  7. }
  8.  
  9.  
  10. }
  11. ?>
KG-
Tak i nie.

Twój przykład zakłada istnieje jednego przycisku submit który następnie iteruje po wszystkich polach nieobecności i wpisuje je do bazy.

Z treści i kodu z pierwszego postu wywnioskowałem, że formularz składa się z wielu przycisków submit umieszczonych przy każdym polu tekstowym i wciśnięcie danego przycisku aktualizuje tylko dane pole, a konkretnie to które stało obok wciśniętego przycisku.

Zgadzam się że tylko jeden przycisk może zostać wciśnięty, ale cała tablica $_POST['submit'] o której piszesz składa się tak naprawdę tylko z jednego pola (lub nie składa się z żadnego w przypadku gdy akcja jest inna niż wyslanie formularza przez POST), właśnie tego, które określa jaki przycisk był wciśnięty.

Robimy więc foreach z dwóch powodów:
1) jeśli formularz nie został wysłany tylko odczytany to tablica będzie pusta i kod dodawania do bazy nie wykona się
2) robiąc foreach mamy pewność że używamy właściwego klucza do wstawienia odpowiedniego pola do bazy pod odpowiednim id.

Można oba powyższe cele osiągnąć jeszcze na inne sposoby ale to było najprostsze i najbardziej intuicyjne co przyszło mi do głowy.
Aga_
Idealnieby by było, gdyby był jeden przycisk "zmień" tak zakładałam na początku, ale nie poradziłam sobie i zaczęłam kombinować :/ (jestem początkująca)
Zabieram się do przerabiania kodu wg Waszych rad. Dzięki
KG-
Z Twojego wcześniejszego kodu (fragment):
Cytat
while ($row=mysql_fetch_array($result))
{
echo "<div align='center'><input type=submit value='zmien'></div>";
}


Można jednoznacznie wywnioskować że dla każdego rekordu pobranego z tablicy będzie osobny przycisk. W przypadku jednego przycisku submit musisz umieścić go za pętlą while i w takim przypadku kod sprawdzający z postu #6 (po poprawieniu jednej literówki) powinien przynieść oczekiwane rezultaty.
Aga_
Z Waszą pomocą zrobiłam tak jak zakładałam na samym początku, jeden "zmień" i zapisuje wszystkie rekordy.

Bardzo dziękuję za pomoc smile.gif
Gość
A moglabys caly kod Twoj tutaj wkleic ? Dla potomnych smile.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.