Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL][PHP]Problem z edycją rekordu
Forum PHP.pl > Forum > Przedszkole
Zagiewa
Witam. Mam skrypt który wyświetla, dodaje, usuwa i edytuje rekordy z bazy. Problem mam tylko z edycją. Kod nie wypluwa błędu ale też nie zatwierdzał zmian i nie wiem czemu. Prosił bym o sprawdzenie, a dla ułatwienia wstawiam tylko fragmenty dotyczące edycji.

Więc tak. Najpierw łączę się z bazą i wyświetlam listę rekordów za pomocą poniższej pętli:
Kod
$i = 1;
while($wyswietl = mysql_fetch_array($result)) {

$id = $wyswietl['id'];
$nazwa = $wyswietl['nazwa'];

$lista .=<<<EOD
<tr>
<td>$i</td>
<td>$nazwa</td>
<td><a href="usun_kategorie.php?type=zmien&id=$id&nazwa=$nazwa">Zmień</a></td>
</tr>
EOD;
$i++;
}


Gdy kliknę w link "zmien" uruchamia się strona z formularzem:
Kod
<form action="usun_kategorie.php?opcja=edit" method="post">
<input type="text" name="nowa_nazwa" size="20">
<input type="submit" name="wyslij" value="Dodaj">
</form>


Gdy wyślę nową nazwę wpisaną w formularzu otwiera się jeszcze raz ta sama strona z tym, że użyłem instrukcji warunkowej if która dokona zmian w rekordzie:
Kod
if(isset($_GET['opcja']) == edit) {

$edytuj = "UPDATE kategorie SET nazwa = '" . $_GET['nowa_nazwa'] . "' WHERE id = '" . $_GET['id'] . "'";
$result = mysql_query($edytuj) or
die("Edycja kategorii nie powiodła się!" . mysql_error());

echo "<p id=\"text\">Edycja nazwy kategorii powiodła się.</p>";


Dziwne jest, że gdy wpiszę nową nazwę dla kategorii w formularzu otrzymuje potwierdzenie, że została zmieniona a gdy sprawdzam rekord w bazie albo przez stronę nie zmienia się sad.gif nie mam pojęcia co jest nie tak.
luck
A pokaż mi kolego, gdzie w Twoim formularzu edycji jest ID kategorii winksmiley.jpg Nie przesyłasz żadnego ID, skrypt nie ma pojęcia którą kategorię edytujesz. Dodaj do formularza pole typu "hidden" z wartością tego ID, daj mu name="id" i zadziała.
mortus
Ze swojej strony dodam jeszcze, że niepotrzebnie przesyłasz tutaj
Kod
<td><a href="usun_kategorie.php?type=zmien&id=$id&nazwa=$nazwa">Zmień</a></td>
nazwę. Po to tworzymy i przesyłamy unikalny identyfikator, aby tylko z niego korzystać. Odnośnie formularza, to luck zapomniał wspomnieć, abyś value tego ukrytego pola pobrał z tablicy $_GET.

Natomiast sam UPDATE odbywa się po wysłaniu formularza metodą post, zatem nie powinno być $_GET['nowa_nazwa'] tylko $_POST['nowa_nazwa'] i nie powinno być $_GET['id'] tylko $_POST['id'] (trzecia linijka w ostatnim listingu).
Zagiewa
Chłopaki działa - dzięki wielkie:D Już podaję co zmieniłem. Zaraz nad formularzem utworzyłem zmienną i zapisałem w niej wartość 'id' pobierana z linka w momencie kliknięcia:
Kod
$wartosc = $_GET['id'];

A w formularzu dodałem ukryte pole które przesyła numer identyfikatora kategorii która ma zostać zmieniona:
Kod
<input type=\"hidden\" name=\"id\" value=\"$wartosc\">

W "UPDATE..." pozmieniałem na $_POST[]

Ale mam jeszcze jedno pytanko. Mortus napisałeś, że niepotrzebnie przesyłam nazwę w linkach, że powinienem użyć identyfikatora i racja ale zrobiłem to tylko z jednego powodu. Przed formularzem mam echo który wyświetla informacje o tym, że poniższy formularz zmieni nazwę tej kategori: "tutaj_wyswietla_sie_nazwa_pobranej_kategorii" więc wystarczy, że wpisze $_GET['nazwa'] i problem z głowy. Gdy bym chciał to zrobić używając identyfikatora musiał bym się połączyć z bazą po raz drugi i pobrać nazwę za pomocą identyfikatora i wtedy ją zapisać w zmiennej i ją użyć. Moje rozwiązanie ogranicza się do przesłania wartości i odczytania jej co jest znacznie szybsze.

Jeśli jest jakieś inne wyjście to chętnie się dowiem smile.gif
mortus
Cytat(Zagiewa @ 8.04.2010, 17:04:36 ) *
Gdy bym chciał to zrobić używając identyfikatora musiał bym się połączyć z bazą po raz drugi i pobrać nazwę za pomocą identyfikatora i wtedy ją zapisać w zmiennej i ją użyć.
I to jest jedyne sensowne rozwiązanie. Dlaczego? Dlatego, że nazwę w linku możemy bez problemu zmienić i nie musi się ona wcale zgadzać z nazwą, jaka odpowiada przesyłanemu identyfikatorowi (który również możemy w linku zmienić). Dla przykładu weźmy tabelę:
Kod
id kategoria
1  kategoria 1
2  kategoria 2
Adres możemy spreparować w taki sposób, że identyfikator będzie wskazywał na kategorię 1, ale nazwa będzie odpowiadać kategorii 2, przykładowy adres w przeglądarce
Kod
http://www.moja-strona.pl/index.php?id=1&nazwa=kategoria%202
Użytkownik zostanie wtedy poinformowany, że zmianie ulegnie nazwa 'kategoria 2', gdy w rzeczywistości będziemy zmieniać nazwę 'kategoria 1'. Zatem jeśli przesyłasz zarówno identyfikator, jak i nazwę, to wypadałoby zapytaniem do bazy danych sprawdzić, czy dany identyfikator odpowiada danej nazwie. A czy w związku z tym nie lepiej przesłać sam identyfikator i pobrać odpowiednią nazwę?
Zagiewa
Rozumiem o co Ci chodzi i rzeczywiście sposób jest dobry ale boli mnie trochę to, że w jednym kodzie wykonuje dwa razy to samo (odczytuje te same wartości z tej samej tabeli) mam wrażenie, że kod taki był by strasznie lamerski. Wiem, że z moich ust to brzmi żałośnie bo sam się uczę i zabłysnąć z PHP to nie mogę tongue.gif ale sytuacja wygląda tak... ja ten kod napisałem dawno temu i był to mój pierwszy skrypt który posiadał ileś tam opcji z wartościami i bazami... Obecnie trochę lepiej już operuje językiem i gdy przypatrzyłem się temu skryptowi to choć sam jestem początkującym w PHP to widzę, że on płacze i prosi o przepisanie więc właśnie to robię tongue.gif dlatego też zależy mi aby był jak najbardziej krótki, przejrzysty, praktyczny i poprawny.

Zastanawiając się nad inną metodą zamiast ponownie pobierać wartości z bazy, to w miejscu gdzie po raz pierwszy je wyświetliłem jakoś zapisać je w do tabeli i jakoś przesłać a następnie odczytać albo stworzyć jakąś funkcję. Miało by to sens?
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.