Problem z aktualizacją rekordów |
Problem z aktualizacją rekordów |
16.09.2012, 16:57:05
Post
#1
|
|
Grupa: Zarejestrowani Postów: 11 Pomógł: 0 Dołączył: 16.09.2012 Ostrzeżenie: (0%) |
Witam wszystkich . Ostatnio ostro wziełem się za PHP/MYSQL i dlatego też zarejestrowałem się szukać pomocy jak i wypowiadać się na różne tematy .
Mam nadzieje, że tutaj dostane odpowiedź na moje pytanie bo siedze już chyba z tydzień nad tym i nie wiem jak to zrobić Mam taki kod, który działa częściowo tzn aktualizuje tylko ostatni rekord. Chodzi o to, że mam na stronie 500 inputów z 2 stałymi wartościami wybranych z bazy danych i jedną którą trzeba będzie wpisywać i po naciśnieciu buttona aktualizuje tą wartość do wybranego ID. Nie stety wszystko było by fajnie jakby nie to, że tylko można aktualizować ostatni wpis a nie każdy który chce o to kod. Kod <form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post" enctype="multipart/form-data"> <?php while ($rekord = mysql_fetch_array($wynik)) { ?> <tr> <td class="tytul2"><strong><?php echo $rekord['Produkt2']; ?></strong></td> <td class="tytul2"><strong><?php echo $rekord['Produkt2']; ?></strong></td> <td class="tytul2"><input name="Produkt3" size="8" type="text" /></td> <input name="ID" type="hidden" value="<?php echo $rekord['ID']; ?>" /> <td class="tytul2"><button type="submit" name="akcja" value="dodaj">Dodaj</button></td> </tr> <?php } ?> </form> // oraz aktualizacja do bazy danych <?php if (isset($_POST['akcja'])) { $produkt3 = $_POST['Produkt3']; $id = $_POST['ID']; $zap = "UPDATE produkty SET Produkt3 = '$produkt3' WHERE ID = $id"; $wyn = mysql_query ($zap) or die ('Brak polaczenia nie można wyświetlić nazwa: '.mysql_error()); } ?> I tak jak pisałem na początku, można edytować tylko ostatni rekord czyli w moim przypadku 577 , pozostałych nie mogę edytować, domyślam się, że coś musi być źle w zapytaniu ale nie wiem, dopiero się uczę Proszę o pomoc.. |
|
|
16.09.2012, 17:21:02
Post
#2
|
|
Grupa: Zarejestrowani Postów: 1 748 Pomógł: 388 Dołączył: 21.08.2009 Skąd: Gdynia Ostrzeżenie: (0%) |
Masz u siebie błąd logiczny, tworzysz input o nazwie ID tyle razy ile masz rekordów, w efekcie jego wartość zostaje napisana tyle razy ile jest rekordów i przyjmuje wartość ostatniego inputa. Najlepiej jakbyś tu miał tylko listę rekordów z linkiem "edytuj", który będzie w sobie zawierał id np. edit.php?id=5 (odbierzesz go z tablicy $_GET -> $_GET['id']), i wtedy na osobnej podstronie w formularzu masz tylko 2 pola: id i wartość do edycji, bo bez sensu taki duży formularz robić no i przydała by się też paginacja tej listy.
Ten post edytował tehaha 16.09.2012, 17:22:04 |
|
|
16.09.2012, 18:32:00
Post
#3
|
|
Grupa: Zarejestrowani Postów: 11 Pomógł: 0 Dołączył: 16.09.2012 Ostrzeżenie: (0%) |
Problem z tym, że to nie jest edycja tylko DODAWANIE nowej wartości do bazy .
Mam 4 pola w bazie ID | NAZWA_POLA_1 | NAZWA_POLA_2 | JAKAS_WARTOSC |
|
|
16.09.2012, 20:01:30
Post
#4
|
|
Grupa: Zarejestrowani Postów: 1 748 Pomógł: 388 Dołączył: 21.08.2009 Skąd: Gdynia Ostrzeżenie: (0%) |
no i co z tego, że sobie przycisk nazwałeś "Dodaj"? Przecież w zapytanie robisz "UPDATE" czyli aktualizujesz wpis w bazie o konkretnym ID, a to, że sobie postanowiłeś, że edytujesz tylko jedno pole to już z punktu widzenia skryptu nie ma znaczenia. W Twoim skrypcie identyfikacji rekordu do aktualizacji dokonujesz na podstawie pola, które się nadpisuje. Nie może być tak, że wielokrotnie występuje w formularzu pole o takiej samej nazwie. Jeżeli chcesz zachować taki sposób rozwiązania tego problemu to najprościej będzie jeżeli każdy taki wiersz będzie oddzielnym formularzem. Czyli tag <form> wsadź wewnątrz pętli foreach().
|
|
|
17.09.2012, 15:02:49
Post
#5
|
|
Grupa: Zarejestrowani Postów: 11 Pomógł: 0 Dołączył: 16.09.2012 Ostrzeżenie: (0%) |
Nie no po prostu..... szkoda słów na mój umysł oczywiście działa wystarczyło tylko wstawić pętle while przed <form> .... wszystko gra i chula teraz muszę tylko dopracować resztę mam nadzieje, że tym razem bez pomocy
Dziękuję za podpowiedź Witam po raz kolejny . Niestety nadal chyba nie jest najlepiej tzn jest bo już wysyła do bazy UPLOAD i wyświetla wynik i wszystko było by ok jakby nie to, że wyświetla tylko jeden wynik po naciśnięciu submita A ja chciałem tak, że po wpisaniu wartości w Produkt3 wciskam w submit i wyświetla to na ekran, następnie wybieram inna pozycję i wpisuje następną wartość wyświetla mi tą wartość razem z poprzednią wartością którą wcześniej wpisałem i tak dalej i tak dalej. Mam to zrobione w pętli ale nie wiem czemu nie wyświetla więcej niż jeden rekord . Wcześniej jak robiłem przez Link to wyświetlało tak jak chciałem, ale były błędy teraz błędów nie ma, ale wyświetla tylko jeden wynik Proszę o ostateczną pomoc o to cały kod Kod <?php while ($rekord = mysql_fetch_array($wynik)) { ?> <form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post" enctype="multipart/form-data"> <tr> <td class="tytul2"><strong><?php echo $rekord['Produkt']; ?></strong></td> <td class="tytul2"><strong><?php echo $rekord['Produkt2']; ?></strong></td> <td class="tytul2"><input name="Produkt3" maxlength="5" size="6" type="text" /></td> <input name="ID" type="hidden" value="<?php echo $rekord['ID']; ?>" /> <td class="tytul2"><button type="submit" name="akcja" value="dodaj">Dodaj</button></td> </tr> </form> <?php } ?> </table> </div> <div id="tabela2"> <table> <tr> <td class="tytul"><strong>Produkty</strong></td> <td class="tytul"><strong>Produkt2</strong></td> <td class="tytul"><strong>Produkt3</strong></td> </tr> <?php if (isset($_POST['akcja'])) { $produkt3 = $_POST['Produkt3']; $id = $_POST['ID']; if (!empty($produkt3) && (is_numeric($produkt3)== true)) { $zap = "UPDATE produkty SET Produkt3 = '$produkt3' WHERE ID = $_POST[ID]"; $wyn = mysql_query ($zap) or die ('Brak polaczenia nie można wyświetlić nazw: '.mysql_error()); $zapytania = "SELECT * FROM produkty WHERE ID = $_POST[ID]"; $wyniki = mysql_query ($zapytania) or die ('Brak polaczenia nie można wyświetlić nazwa: '.mysql_error()); } while ($rekord2 = mysql_fetch_array($wyniki)) { ?> <tr> <td class="tytul2"><strong><?php echo $rekord2['Produkt']; ?></strong></td> <td class="tytul2"><strong><?php echo $rekord2['Produkt2']; ?></strong></td> <td class="tytul2"><strong><?php echo $produkt3; ?></strong></td> <td class="tytul2"><strong>5747</strong></td> <td class="tytul2"><a href="<?php echo $_SERVER['PHP_SELF'];?>?ak=usun&id=<?php echo $id; ?>">Usuń</a></td> </tr> <?php } } ?> </table> </div> Próbowałem już wszystkiego, żeby tą pętle gdzieś indziej wstawić. Nie wiem może problem jest taki, że tylko ćwiczę na jednej tabeli w bazie . Może powinno być tak, że po wciśnięciu w submita wysyła Produkt, Produkt2 i Produkt 3 do nowej tabeli tam zapisuje wartość, a następnie wyświetla te wartości na ekran Proszę o pomoc ostateczną |
|
|
17.09.2012, 16:03:00
Post
#6
|
|
Grupa: Zarejestrowani Postów: 1 748 Pomógł: 388 Dołączył: 21.08.2009 Skąd: Gdynia Ostrzeżenie: (0%) |
Wisz najlepiej jakbyś znalazł sobie jakąś fajną książkę, wentualnie dobry kurs, bo masz tutaj problem z najbardziej elementarnymi sprawami. Po pierwsze błędem jest to, że wszystko pchasz do jednego pliku php. Najlepiej jakby każda podstrona to był oddzielny plik, bo tak wpychasz wszystko razem i widzę, że gubisz się w tym. To jak będziesz chciał nad tym zapanować jak kodu będzie 10 razy tyle?
Ale odpowiadając wprost na Twoje pytanie: Twój skrypt obecnie wyświetla formularz dla każdego rekordu, po naciśnięciu "przycisku dodaj" czyli wysłaniu żądania POST wpis jest aktualizowany i dodatkowo jest pobierany produkt, który został zaktualizowany. Na dole wyświetla Ci się tylko jeden wynik, ponieważ w zapytaniu SELECT wstawiłeś warunek jeżeli chcesz, żeby pobrało wszystko to usuń ten WHERE. Dodatkowo mam tutaj wrażenie, że błędnie rozumujesz działanie skryptu php. Po co jest ten drugi SELECT, skoro pobiera dokładnie to samo co ten pierwszy? Skrypt po każdym odświerzeniu strony wykonuje się od góry do dołu, jeżeli chcesz, żeby ta lista pokazywała już zaktualizowane rekordy to musisz przenieć zapytanie UPDATE przed pierwszego SELECT'a. Czyli:
Oczywiście musisz sam sprawdzić czy to działa jak trzeba, ja tylko tak na szybko przestawiłem kolejność. Ten post edytował tehaha 17.09.2012, 16:09:09 |
|
|
17.09.2012, 16:28:53
Post
#7
|
|
Grupa: Zarejestrowani Postów: 1 195 Pomógł: 109 Dołączył: 3.11.2011 Ostrzeżenie: (10%) |
Wydaje mi się że skrypt trochę nieoptymalny i pod względem specyfikacji html błędny:
Generowanie wielu formularzy w pętli while ,może być kłopotliwe w przypadku użycia js(front-endu).Czy nie można by tego użyć w ramach jednego formularza?Poza tym przed tagami tr td ,powinno zgodnie ze specyfikacją używać się tagu table w przeciwnym razie należało by użyć tagów ul ,li, czyli listowania.Być może tkwię w błędzie, ale według mnie tag form i table(którego brak) można by wrzucić przed pętle while a generować w niej tylko wiersze i kolumny. Wiem,że to nie dział ocen, ale jakoś wpadło mi to w oko Ten post edytował Niktoś 17.09.2012, 16:43:30 |
|
|
17.09.2012, 17:46:26
Post
#8
|
|
Grupa: Zarejestrowani Postów: 11 Pomógł: 0 Dołączył: 16.09.2012 Ostrzeżenie: (0%) |
Chyba nie do końca rozumiecie co chce osiągnąć spróbuję wytłumaczyć jakoś..
Mam 4 pola ID | POLE1 | POLE2 | POLE3 Te pola na początku skryptu wybieram z bazy, gdzie POLE 1 I POLE 2 są to jakieś wyrazy np bla bla bla bla i takich rekordów jest dokładnie 577 oczywiście słowa te są różne dla każdej komórki. POLE 3 Jest to input który jest skopiowany 577 razy razem z polem POLEM1 I POLEM2 a także z SUBMITEM poprzez pętle WHILE. No sobie są te wyniki i chcę do jakiegoś inputa czyli do POLA3 wprowadzić jakąś wartość np "333". Po wciśnięciu SUBMITA dane o INDEFIKATORZE np: 5 z POLEM1, POLEM2 I POLEM3 są aktualizowane w bazie i tak na samym początku POLE1, POLE2 I POLEM3 wyglądało tak np: bla bla bla | be be be | 0 Po wrowadzeniu SUBMITA POLE1, POLE2 I POLE3 ma teraz wartość bla bla bla | be be be | 333 więc zmieniło się tylko POLE 3 . I teraz tak, na tej samej stronie czyli tam gdzie jest formularz z 577 pozycjami, na samym dole CHCĘ WYŚWIETLIĆ WARTOŚCI, gdzie naciśnięto SUBMITA No i DLATEGO NIE MOGĘ UŻYĆ TAKIEGO ZAPYTANIA Z BAZY jak "SELECT * FORM Produkty" bo wtedy wyświetli mi całą liste produktów bez naciśnięcia SUBMITA Jak dam SELECT * FROM Produkty WHERE ID =$id"; To po naciśnięciu wyświetla mi tylko jeden ID a chcę wyświetlić wszystkie ID gdzie użyto SUBMITA . Mam nadzieje, że dobrze wytłumaczyłem o co mi chodzi |
|
|
17.09.2012, 19:25:12
Post
#9
|
|
Grupa: Zarejestrowani Postów: 1 748 Pomógł: 388 Dołączył: 21.08.2009 Skąd: Gdynia Ostrzeżenie: (0%) |
heh właśnie chyba Ty nie bardzo wiesz co chcesz osiągnąć Jak możesz pokazać więcej niż jedno pole gdzie użyto submita, skoro submit możesz nacisnąć tylko jeden? Tak jak tu masz zrobione to: Submit naciskasz jeden, więc formularz wysyłasz jeden, więc pole aktualizujesz jedno, czyli wyświetlasz jeden rekord, który został zaktualizowany. Jeżeli chcesz, żeby jednocześnie można było wprowadzić (czyli zaktualizować) więcej rekordów to trzeba zrobić jeden formularz i najlepiej wtedy jeden submit, żeby było wiadomo o co chodzi, ale wtedy trzeba też inaczej nazwać pola formularza(name) ponieważ ta nazwa musi być unikalna.
A może Ty chciałbyś utrzymać w pamięci pomiędzy żądaniami numery ID, które zostały zaktualizowane w czasie tej sesji? O to Ci chodzi? Że jak zaktualizuje pole 10 to na dole pokaże się pole 10, a jak potem jeszcze zaktualizuję pola 12 i 15 to na dole będą wszystkie 3: 10, 12, 15? Ten post edytował tehaha 17.09.2012, 19:34:03 |
|
|
17.09.2012, 21:28:35
Post
#10
|
|
Grupa: Zarejestrowani Postów: 11 Pomógł: 0 Dołączył: 16.09.2012 Ostrzeżenie: (0%) |
heh właśnie chyba Ty nie bardzo wiesz co chcesz osiągnąć Jak możesz pokazać więcej niż jedno pole gdzie użyto submita, skoro submit możesz nacisnąć tylko jeden? Tak jak tu masz zrobione to: Submit naciskasz jeden, więc formularz wysyłasz jeden, więc pole aktualizujesz jedno, czyli wyświetlasz jeden rekord, który został zaktualizowany. Jeżeli chcesz, żeby jednocześnie można było wprowadzić (czyli zaktualizować) więcej rekordów to trzeba zrobić jeden formularz i najlepiej wtedy jeden submit, żeby było wiadomo o co chodzi, ale wtedy trzeba też inaczej nazwać pola formularza(name) ponieważ ta nazwa musi być unikalna. A może Ty chciałbyś utrzymać w pamięci pomiędzy żądaniami numery ID, które zostały zaktualizowane w czasie tej sesji? O to Ci chodzi? Że jak zaktualizuje pole 10 to na dole pokaże się pole 10, a jak potem jeszcze zaktualizuję pola 12 i 15 to na dole będą wszystkie 3: 10, 12, 15? Tak dokładnie o to mi chodzi , żeby pokazał na dole 3, 10, 12, 15 itp itp.. |
|
|
17.09.2012, 21:46:30
Post
#11
|
|
Grupa: Zarejestrowani Postów: 1 748 Pomógł: 388 Dołączył: 21.08.2009 Skąd: Gdynia Ostrzeżenie: (0%) |
to będziesz musiał do tego troszęczkę poczytać, ponieważ Ty chcesz aby pomiędzy żądaniami http zostały zachowane w pamięci pewnie dane, tak więc musisz tutaj użyć mechanizmu sesji, po każdym takim update będziesz dodawał do sesji zaktualizowany ID
tematy do ogarniącia (linki do pierwsze lepsze z google): - php sesje, np. http://pl.wikibooks.org/wiki/PHP/Sesje - php tablice, np. http://phpkurs.pl/tablice/ - klauzula Mysql IN, np. http://www.tutorialspoint.com/mysql/mysql-in-clause.htm co musisz zrobić? - na początku skryptu wystartować sesję - po każdym update przypisać do zmiennej sesyjnej kolejne ID, aby ta zmienna mogła przechowywać więcej niż jedną zmienną to musi być tablicą(array), czyli będziesz dodawać kolejne ID do tablicy - następnie używając funkcji implode() i klauzuli IN pobierzesz odpowiednie wyniki, zapytanie będzie musiała wyglądać tak: , czyli zbudujesz je tak , oczywiście to nie jest gotowy kod, musisz zapoznać się z tymi tematami i zrobić tak jak Ci napisałem, powodzenia |
|
|
18.09.2012, 07:01:59
Post
#12
|
|
Grupa: Zarejestrowani Postów: 11 Pomógł: 0 Dołączył: 16.09.2012 Ostrzeżenie: (0%) |
Dziękuję za odpowiedź ale poradziłem sobie w inny sposób bo już miałem po poprostu dość tego .
Po wciśnięciu submita zapisuje dane do NOWEJ TABELI a następnie wyświetlam wszystkie dane z nowo otworzonej tabeli i koniec. Czyli po prostu zrobiłem kopiowanie z jednej tabeli do drugiej INSERT INTO blabla (a, b, c) SELECT aa, bb, cc FROM blabla2 i już . Będę musiał poczytać o tych sesjach Pozdrawiam zamykamy temat |
|
|
Wersja Lo-Fi | Aktualny czas: 28.04.2024 - 16:36 |