Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Problem z aktualizacją rekordów
barthez66
post 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 smile.gif. Ostatnio ostro wziełem się za PHP/MYSQL i dlatego też zarejestrowałem się szukać pomocy jak i wypowiadać się na różne tematy smile.gif.
Mam nadzieje, że tutaj dostane odpowiedź na moje pytanie sad.gif bo siedze już chyba z tydzień nad tym i nie wiem jak to zrobić sad.gif

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 sad.gif 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 tongue.gif, pozostałych nie mogę edytować, domyślam się, że coś musi być źle w zapytaniu ale nie wiem, dopiero się uczę sad.gif

Proszę o pomoc..
Go to the top of the page
+Quote Post
tehaha
post 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
Go to the top of the page
+Quote Post
barthez66
post 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 smile.gif.

Mam 4 pola w bazie ID | NAZWA_POLA_1 | NAZWA_POLA_2 | JAKAS_WARTOSC



Go to the top of the page
+Quote Post
tehaha
post 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%)
-----


smile.gif 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().
Go to the top of the page
+Quote Post
barthez66
post 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ł thumbsdownsmileyanim.gif oczywiście działa wystarczyło tylko wstawić pętle while przed <form> .... wszystko gra i chula teraz muszę tylko dopracować resztę tongue.gif mam nadzieje, że tym razem bez pomocy smile.gif

Dziękuję za podpowiedź smile.gif


Witam po raz kolejny smile.gif. Niestety nadal chyba nie jest najlepiej sad.gif 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 sad.gif

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 sad.gif. Wcześniej jak robiłem przez Link to wyświetlało tak jak chciałem, ale były błędy sad.gif teraz błędów nie ma, ale wyświetla tylko jeden wynik sad.gif 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 questionmark.gif. 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 questionmark.gif

Proszę o pomoc ostateczną sad.gif
Go to the top of the page
+Quote Post
tehaha
post 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
  1. WHERE ID = $_POST[ID]
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:

  1. <?php
  2.  
  3. //Jeżeli przy odświeżeniu strony, czyli wysłaniu żądania do serwera jest załączone żądanie POST wtedy dokonaj aktualizacji bazy
  4. if (isset($_POST['akcja'])) {
  5.  
  6. $produkt3 = $_POST['Produkt3'];
  7. $id = $_POST['ID'];
  8.  
  9. if (!empty($produkt3) && (is_numeric($produkt3)== true)) {
  10.  
  11. $zap = "UPDATE produkty SET Produkt3 = '$produkt3' WHERE ID = $_POST[ID]";
  12. $wyn = mysql_query ($zap) or die ('Brak polaczenia nie można wyświetlić nazw: '.mysql_error());
  13.  
  14. }
  15.  
  16.  
  17. }
  18.  
  19. //teraz pobieramy produkty, nawet jeżeli były aktualizowane to pobieramy aktualną listę ponieważ aktualizacja jest wyżej w kodzie, niż pobierani
  20. $zapytania = "SELECT * FROM produkty";
  21. $wyniki = mysql_query ($zapytania) or die ('Brak polaczenia nie można wyświetlić nazwa: '.mysql_error());
  22.  
  23. while ($rekord = mysql_fetch_array($wynik))
  24. {
  25.  
  26. ?>
  27. <form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post" enctype="multipart/form-data">
  28. <tr>
  29. <td class="tytul2"><strong><?php echo $rekord['Produkt']; ?></strong></td>
  30. <td class="tytul2"><strong><?php echo $rekord['Produkt2']; ?></strong></td>
  31.  
  32. <td class="tytul2"><input name="Produkt3" maxlength="5" size="6" type="text" /></td>
  33. <input name="ID" type="hidden" value="<?php echo $rekord['ID']; ?>" />
  34.  
  35. <td class="tytul2"><button type="submit" name="akcja" value="dodaj">Dodaj</button></td>
  36. </tr>
  37. </form>
  38. <?php
  39.  
  40. }
  41. ?>
  42.  
  43. </table>
  44.  


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
Go to the top of the page
+Quote Post
Niktoś
post 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%)
X----


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 wink.gif

Ten post edytował Niktoś 17.09.2012, 16:43:30
Go to the top of the page
+Quote Post
barthez66
post 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ąć sad.gif 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 smile.gif 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 smile.gif.

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 smile.gif
Go to the top of the page
+Quote Post
tehaha
post 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ąć smile.gif 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
Go to the top of the page
+Quote Post
barthez66
post 17.09.2012, 21:28:35
Post #10





Grupa: Zarejestrowani
Postów: 11
Pomógł: 0
Dołączył: 16.09.2012

Ostrzeżenie: (0%)
-----


Cytat(tehaha @ 17.09.2012, 20:25:12 ) *
heh właśnie chyba Ty nie bardzo wiesz co chcesz osiągnąć smile.gif 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 smile.gif , żeby pokazał na dole 3, 10, 12, 15 itp itp.. smile.gif
Go to the top of the page
+Quote Post
tehaha
post 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:
  1. WHERE id IN(1, 2, 3, 4)
, czyli zbudujesz je tak
  1. WHERE implode(', ', $_SESSION['tablica_z_zaktualizowanymi_id']);
, oczywiście to nie jest gotowy kod, musisz zapoznać się z tymi tematami i zrobić tak jak Ci napisałem, powodzenia smile.gif
Go to the top of the page
+Quote Post
barthez66
post 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ź smile.gif ale poradziłem sobie w inny sposób bo już miałem po poprostu dość tego sad.gif.

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 smile.gif i już smile.gif.

Będę musiał poczytać o tych sesjach sad.gif

Pozdrawiam zamykamy temat smile.gif
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 28.04.2024 - 16:36