3miel
11.08.2007, 14:08:03
Witam,
mam tabele w swoim panelu administracjnym, ktora wyswietlam normalnie przez zapytanie MySQL i wszystko jest ok. Ale teraz zrobilem tak ze do kazdego rekordu przy wyświetlaniu jest select, przez ktory chce zmieniac np kolor( czarny, czerwony, niebieski, zielony itp. itd.)... i chce zeby to sie zapisalo w bazie.
I problem polega na tym, że jak zmianie jeden (dopisana akcja ze automatycznie sie wysyla formularz) to przekazuja się dane z wszystkich slectów (name="kolor[]" value="id_wersa").
Jak to zrobić, żeby przesyłały się dane tylko zjednego selecta?
Próbowałem tworzyć tyle formularzy ile jest wersow, ale nie dziala, tzn nie dziala zagniezdzanie formularzy bo mam jeden ogolny formularz dla calej tabeli (checkboxy zeby usunac wiecej rekordow...) i poprostu ten glowny nie dziala.
Macie jakies pomysły?
Civil
11.08.2007, 16:24:16
Na gorąco: chyba nie da się zrobić tak, że wysyła się tylko część formularza, te dane i tak pójdą - ale można zrobić tak, że nie zostaną wzięte pod uwagę. Ostatnio robiłem coś podobnego i rozwiązałem to tak, że po prostu pobieram z bazy aktualne wartości i sprawdzam - jeżeli wysłana wartość selectu jest taka sama jak w bazie - to nie ma UPDATE, jeżeli jest różna to jest udpate. W tym celu ponazywałem sobie selecty w zależności od id rekody typu name="select_$r[id]" i pozniej pobrałem wartości ze wszystkich rekordów i porównywałem
<?php
$nowa_wartosc=${"select_$aktualna[id]"};
if($aktualna[wartosc]!=$nowa_wartosc)
{
UPDATE
}
else
{
NIE MA UPDATU
}
?>
Nie wiem, czy o takie rozwiązanie Ci chodzi.
3miel
11.08.2007, 16:51:41
Hmm rozumiem o co ci chodzi, ale to chyba nie jest zbyt optymalnie. Narazie mam zrobione tak, że zmieniają sie wszystkie wersy, a jesli sa takie same to poprostu zapisuje się ta sama wartosc i nic się nie zmiania.
Tylko pytanie co jest bardziej zoptymalizowane? Twoja wersja czy moja? Bo kazde SELECT pozniej IF to tez troche zajmuje pamieci...
Dlateog szukam calkiem innego rozwiązania...
Civil
12.08.2007, 00:24:46
Hmm jest jeszcze jeden sposób, po prostu przekazujesz do przetwarzania formularza IDeki rekordów który wyświetlasz.
Każde przeładowanie pętli robi
$ideki.="$costam[id]|";
I później taki ciąg przy przetwarzaniu explodujesz, wyciągasz id i pobierasz tylko te ID, które były w tabelce i tylko z nimi porównujesz. Bo wiadomo, że coś czego nie było w danej tabelce się nie zmieniło.
loonger
12.08.2007, 22:41:25
możesz dać dla każdego wiersza tabeli dać inputa hidden z bieżącą wartością i później sprawdzać czy wartość selecta jest taka sama, jeśli nie updejtować ją.
Civil
13.08.2007, 14:40:02
Cytat(loonger @ 12.08.2007, 23:41:25 )

możesz dać dla każdego wiersza tabeli dać inputa hidden z bieżącą wartością i później sprawdzać czy wartość selecta jest taka sama, jeśli nie updejtować ją.
To bez sensu, bieżąca wartość będzie przecież w select.
loonger
13.08.2007, 17:25:48
pisząc 'bieżąca' miałem na myśli 'aktualnie ustawiona w bazie'.
3miel
14.08.2007, 12:54:05
No tak z tym to juz bym sobie poradzil, ale chodzi mi konkretnie o przekazanie tylko jednej wartosci, albo przkazanie wszystkich z zaznaczeniem od razu tej zmienionej, żeby nie bylo tyle zapytan do MySQL i porownan, bo to zle wpływa na czas generowania strony i obciaza serwer.
loonger
14.08.2007, 13:05:34
robiąc to w zaproponowany przeze mnie sposób unikasz zbędnych zapytań. robiąc formularz sprawdzasz wszystkie wartości bo ustawiasz selecty na odpowiednich wartościach. także oprócz tego dodajesz inputa hidden np o nazwie wartosc_poczatkowa[id_wiersza_w_tabeli]. po wysłaniu formularza sprawdzasz w pętli dla każdego wiersza czy wartość selecta jest taka sama jak wartość hiddena, jeśli nie to znaczy że została zmieniona czyli trzeba ją updejtować.
3miel
16.08.2007, 01:05:18
no racja bardzo dobry pomysł @loonger. dziekuje
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.