Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] formularz select w pętli while
Forum PHP.pl > Forum > Przedszkole
evangelion
Witam.
Piszę aplikację do zarządzania zleceniami i w pewnym momencie stanąłem w martwym punkcie.
Założenie było takie, że aplikacja pobiera wprowadzone wcześniej rekordy z bazy danych i wyświetla je w poszczególnych polach tabeli. Każdy wiersz oprócz danych miał mieć także formularz select. Użyłem do tego tej samej pętli która wyświetla rekordy , żeby mieć selecta w każdym wierszu. Problem polega na tym, iż działa tylko select pierwszego wiersza, a chciałbym , żeby każdy select działał niezależnie w każdym wierszu powiedzmy , że początkowo miałby zmieniać kolory tła w wierszu dla poszczególnego statusu zlecenia.
  1. while($wynik = mysql_fetch_assoc($zapytanie)){
  2. echo '<tr id="row"><td>'.$wynik['zlecenie'].'</td><td>'.$wynik['imie'].'</td><td>'.$wynik['nazwisko'].'</td><td>'.$wynik['telefon'].'</td><td>'
  3. .'<select>
  4. <option value="-">status</option>
  5. <option value="1">przyjeto</option>
  6. <option value="2">realizacja</option>
  7. <option value="3">zrealizowano</option>
  8. <option value="4">zapłacono</option>
  9. </select>
  10. </td></tr>';
  11. }


Będę wdzięczny za podpowiedź.
patwoj98
Bardzo rzuca się w oczy używanie przestarzałych metod MYSQL_* . Poczytaj o MYSQLI.


  1. while($wynik = mysql_fetch_assoc($zapytanie)){
  2. echo '<tr id="row"><td>'.$wynik['zlecenie'].'</td><td>'.$wynik['imie'].'</td><td>'.$wynik['nazwisko'].'</td><td>'.$wynik['telefon'].'</td><td>'
  3. .'<form action="" method="POST"><select>
  4. <option value="-">status</option>
  5. <option value="1">przyjeto</option>
  6. <option value="2">realizacja</option>
  7. <option value="3">zrealizowano</option>
  8. <option value="4">zapłacono</option>
  9. </select></form>
  10. </td></tr>';
  11. }


Spróbuj tak jak powyżej, powinno działać.
evangelion
Dzięki poczytam o mysqli. Co do skryptu działa, lecz tak jak się obawiałem w tym układzie każdy formularz zmienia kolor wszystkim wierszom tabeli.
  1. $kolor = $_POST['kolory'];
  2.  
  3. while($wynik = mysql_fetch_assoc($zapytanie)){
  4. echo '<tr style="background-color:'.$kolor.'"><td>'.$wynik['zlecenie'].'</td><td>'.$wynik['imie'].'</td><td>'.$wynik['nazwisko'].'</td><td>'.$wynik['telefon'].'</td><td>'
  5. .'<form method="POST"><select name="kolory">
  6. <option value="-">status</option>
  7. <option value="red">przyjeto</option>
  8. <option value="green">realizacja</option>
  9. <option value="blue">zrealizowano</option>
  10. <option value="orange">zapłacono</option>
  11. </select>
  12. <input type="submit" value="zatwierdź">
  13. </form>
  14. </td></tr>';
  15. }

teraz zastanawiam się jak zrobić żeby powiedzmy select w wierszu 3 zmienił kolor tylko dla wiersza trzeciego tu jest główny problem.
nospor
To przekazuj w formie rowniez ID wiersza dla ktorego ma byc zmiana i po klopocie
patwoj98
A jak ma nie zmieniać? Przecież zmienną definiujesz przed pętlą, a potem wywołujesz tę samą zmienną w każdym obiegu. Poza tym, wartość w zmiennej $_POST['kolory'] będzie zawsze taka sama, nawet jeśli będzie w pętli. Tak jak pisał nospor, podaj ID, albo jak chcesz to zrób tak:

  1. $kolor = $_POST['kolory'];
  2. $i=0; //tak programistycznie ;)
  3. $td = '<td>'.$wynik['zlecenie'].'</td><td>'.$wynik['imie'].'</td><td>'.$wynik['nazwisko'].'</td><td>'.$wynik['telefon'].'</td><td>'
  4. .'<form method="POST"><select name="kolory">
  5. <option value="-">status</option>
  6. <option value="red">przyjeto</option>
  7. <option value="green">realizacja</option>
  8. <option value="blue">zrealizowano</option>
  9. <option value="orange">zapłacono</option>
  10. </select>
  11. <input type="submit" value="zatwierdź">
  12. </form>
  13. </td></tr>';
  14.  
  15. while($wynik = mysql_fetch_assoc($zapytanie)){
  16. if($i=="Tu numer wiersza w którym ma być ten kolor"){
  17. echo '<tr style="background-color:'.$kolor.'">'.$td;
  18. }
  19. else{
  20. echo '<tr style="background-color:'.$otherColor.'">'.$td;
  21. }
  22. $i++;
  23. }


Też powinno śmigać, ale z palca więc literówki mogą byćsmile.gif
evangelion
Trochę śmigało i trochę nie, ale nie wiem czy mnie dobrze zrozumieliście. To jeszcze raz. Założenie aplikacja wyświetla wiersze z danymi: numer zlecenia, imię, nazwisko, tytuł, opis itd. Każde zlecenia wyświetla się w nowym wierszu => każdy wiersz ma forma select => wybranie statusu zlecenia powoduje zmianę koloru tylko w tym wierszu w którym został użyty select. Czyli mam 10 zleceń wprowadzonych do bazy, wybieram pierwsze zmieniam status na przyjęto podświetla się na zielono, wybieram drugie zmieniam status w trakcie realizacji świeci się na czerwono wybieram trzecie zmieniam status zrealizowano świeci się na niebiesko itd. przyporządkowanie id czy też numeru zlecenia który też jest unikalny i umieszczenie go w pętli while powoduje powielenie jednego tylko numeru. działało dla wszystkich select wybierz tylko jedne wiersz. Myślałem być może o czymś takim każdy formularz select ma własne id i każde zlecenia ma własne id. Zmiana statusu zmienia kolor w wierszu w którym użyto formularza select wtedy i tylko wtedy , gdy id wiersza jest identyczne jak id forma select.
ps. To bardzo miłe , że mój post uzyskał odpowiedzi, szczerze nawet nie liczyłem. graduated.gif
nospor
No to wlasnie ci napisalem: przekazuj w formie ID wiersza/zlecenia czy co ty tam masz. Po wyslaniu forma, zmieniasz status tego rekordu na podstawie ID. A potem wyswietlajac na podstawie statusu kolorujesz
patwoj98
Czy Ty chcesz, aby ono się zmieniało jeżeli ktoś wybierze coś w select czy po przeładowaniu ?
evangelion
Teraz to już po przeładowaniu. Podpowiedzi pewnie dobre ale nie na mój poziom. Jestem na etapie gdzie formularz przesyła również id zlecenia. Problem mam z pozostałymi zdaniami "Po wyslaniu forma, zmieniasz status tego rekordu na podstawie ID. A potem wyswietlajac na podstawie statusu kolorujesz"
Nie wiem czy jakieś warunki, czy pętla czy zapytanie sql z where. Czarna dziura.
patwoj98
Nie lepiej Ci w takim razie oddać zlecenia dla freelancera? Nie wiesz co robić, a podpowiedzi już są konkretne. Albo daj freelancerowi, albo napisz po prostu krok po kroku co ma się dziać.
salfunglandyare
A takie coś?
  1. echo '<tr style="background-color:'.$wynik['status'].'"><td>'.$wynik['zlecenie'].'</td><td>'.$wynik['imie'].'</td><td>'.$wynik['nazwisko'].'</td><td>'.$wynik['telefon'].'</td><td>'
evangelion
Oddać? To nie jest zlecenie komercyjne, ani nawet zlecenie. Piszę to sam dla nauki języka php. Początki są trudne, tak jak ze wszystkim. Natomiast będę siedział przy tym dopóki nie zadziała chodź by nie wiem ile czasu miałoby mi to zająć.
Mimo wszystko dziękuje za podpowiedzi.

Uparty jak osioł thumbsupsmileyanim.gif . Jeszcze nie przekazuje statusu zlecenia do bazy co w późniejszym czasie pewnie będzie konieczne tak jak pobieranie kolorów z tabeli. Na razie mam tyle
  1. <?php
  2.  
  3. //Łączenie się z bazą danych i tabelą
  4. $conect = mysql_connect('host','baza','hasło') or die ('<h2><Padł serwer</h2>');
  5.  
  6. mysql_query("SET NAMES utf8");
  7. mysql_query("SET CHARACTER SET utf8");
  8. mysql_query("SET collation_connection = utf8_polish_ci");
  9.  
  10. $db = mysql_select_db('moja baza') or die ('Padła baza');
  11.  
  12. $zapytanie = mysql_query('select * from Klient');
  13.  
  14.  
  15. //--Blok nadawania numerow zlecen
  16.  
  17. //nadawanie numeru zlecenia
  18. $data = date('Ym');
  19.  
  20. //zwieksza wartosc o 20
  21. $liczba = "20";
  22.  
  23. //laczy date z liczba
  24. $nr_zlecenia = $data.$liczba;
  25.  
  26. //sprawdza ilosc wierszy w bazie
  27. $ilosc_wierszy = mysql_num_rows($zapytanie);
  28.  
  29. //sumuje numer zlecenia zwieksza o ilosc wierszy w bazie i zwieksza o 1
  30. $zlecenie_id = $nr_zlecenia + $ilosc_wierszy + 1;
  31.  
  32. //-------------------------------
  33.  
  34. $kolor = $_POST['kolory'];
  35. $id = $_POST['id'];
  36.  
  37. while($wynik = mysql_fetch_assoc($zapytanie)){
  38. echo '<tr style="background-color:'.$kolor.'"><td>'.$wynik['zlecenie'].'</td><td>'.$wynik['imie'].'</td><td>'.$wynik['nazwisko'].'</td><td>'.$wynik['telefon'].'</td><td>'
  39. .'<form method="POST"><select name="kolory">
  40. <option value="-">status</option>
  41. <option value="red">przyjeto</option>
  42. <option value="green">realizacja</option>
  43. <option value="blue">zrealizowano</option>
  44. <option value="orange">zapłacono</option>
  45. </select>
  46. <input type="hidden" name="id" value="'.$wynik['id'].'">
  47. <input type="submit" value="zatwierdź">
  48. </form>
  49. </td></tr>';
  50. }
  51.  
  52.  
  53. echo $id;
  54.  
  55. //-----------------------------------
  56.  
  57. //Obsługa formularza
  58.  
  59. $imie = $_POST['imie'];
  60. $nazwisko = $_POST['nazwisko'];
  61. $telefon = $_POST['telefon'];
  62.  
  63. //Walidacja formularza
  64. $imie_s = strlen($imie);
  65. $nazwisko_s = strlen($nazwisko);
  66. $telefon_s = strlen($telefon);
  67.  
  68. if ($imie_s > 0 && $nazwisko_s > 0 && $telefon_s > 0){
  69. mysql_query("insert into `Klient`(`id`,`zlecenie`, `imie`, `nazwisko`, `telefon`) values ('','$zlecenie_id','$imie','$nazwisko','$telefon')");
  70. }
  71. else{
  72. echo "<h3 class=\"alert\">Wprowadź dane</h3>";
  73. }
  74.  
  75.  
  76. mysql_close($conect);
  77. ?>


Krok po kroku: zmieniam status zlecenia w wierszu trzecim i zmienia się kolor w wierszu trzecim i tak juz zostaje póki nie zmienie mu statusu na jakiś inny. zmieniam ststus z wierszu 10 analogicznie - pewnie tak jak działają niektóre programy do zarządzania zleceniami.
wchodzę sobie za dwa dni do aplikacji i patrzę ach te dwa mam na żółto czyli są do zrealizowania, te cztery na zielono czyli przyjęto do realizacji, następne osiem żółte czyli w tarskcie realizacji. itd.

To co napisałem przesyła w tej chwili numer id w zależności w jakim wierszu użyje forma - czyli zmieniam coś w wierszu z id 10 wyrzuca mi 10. Tak logicznie gdyby każdemu tr przyporządkować id = ID z bazy danych i na tej podstawie wykonać zmianę koloru tylko w tym wierszu w którym dane id jest zgodne z id wiersza w którym forma użyłem.
To tak nad tym myślę.
salfunglandyare
Jeśli chcesz zmienić status po przeładowaniu, to raczej zapisuj go do bazy, na jakiejś podstawie musisz to robić. Jeśli chcesz bezpośrednio, musisz posiłkować się js. Nie wiem, czy korzystasz z jQuery, na wszelki wypadek kod w czystym JS:
  1. var colorChanger = {
  2. init : function(){
  3. var tr = document.getElementsByTagName('TR');
  4. for(var x=0; x<tr.length; x++){
  5. var myTR = tr[x];
  6. var select = myTR.getElementsByTagName('select');
  7. for(var i=0; i<select.length;i++){
  8. var mySELECT = select[i];
  9. if(mySELECT.getAttribute('name') == 'kolory'){
  10. mySELECT.onchange = function(e){
  11. var tr = this.parentNode.parentNode.parentNode;
  12. tr.style.backgroundColor = this.value;
  13. }
  14. }
  15. }
  16. }
  17. }
  18. };
  19. colorChanger.init();


//Edit: jsfiddle: https://jsfiddle.net/uargqf5n/
evangelion
"No to wlasnie ci napisalem: przekazuj w formie ID wiersza/zlecenia czy co ty tam masz. Po wyslaniu forma, zmieniasz status tego rekordu na podstawie ID. A potem wyswietlajac na podstawie statusu kolorujesz"

Zrobione temat do zamknięcia.
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.