Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

2 Stron V   1 2 >  
Reply to this topicStart new topic
> [php/mysql]funkcje UPDATE & DELETE
aga323
post
Post #1





Grupa: Zarejestrowani
Postów: 124
Pomógł: 0
Dołączył: 26.01.2007
Skąd: Oborniki

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


Witam. Otóż mam prosty skrypcik do edytowania kont użytkowników. Wiadomo - jeden plik z formularzem a drugi wysyłający to wszystko do bazy. No i mam mały problemik z wysłaniem do bazy bo nie wiem za bardzo jak rozwiązać kwestię edytowania. Podaję mój kod:
kawałek z formularzem z pliku 1:
  1. <?php
  2. $zapytanie = mysql_query('SELECT * FROM users WHERE ranga = 0');
  3.  
  4. echo '<form name = "educz" action = "educz2.php" method = "post" />';
  5.  
  6. echo '<table border = "1"><tr><td>ID</td><td>Imię</td>
  7. <td>Nazwisko</td><td>Klasa</td><td>Login</td><td>Hasło</td></tr>';
  8.  
  9. while ($wyswietl = mysql_fetch_object($zapytanie)) {
  10.  
  11. echo '<tr>';
  12.  
  13. echo '<td><input type = "text" name = "id" value = "'.$wyswietl -> id.'" /></td>';
  14. echo '<td><input type = "text" name = "imie" value = "'.$wyswietl -> imie.'" /></td>';
  15. echo '<td><input type = "text" name = "nazwisko" value = "'.$wyswietl -> nazwisko.'" /></td>';
  16. echo '<td><input type = "text" name = "klasa" value = "'.$wyswietl -> klasa.'" /></td>';
  17. echo '<td><input type = "text" name = "login" value = "'.$wyswietl -> login.'" /></td>';
  18. echo '<td><input type = "text" name = "haslo" value = "'.$wyswietl -> haslo.'" /></td>';
  19.  
  20. echo '</tr>';
  21.  
  22. }
  23.  
  24. echo '</table>';
  25. echo '<input type="submit" value="wyslij" />';
  26. echo '</form>';
  27. ?>

pliczek 2:
  1. <?php
  2. $id = ($_POST['id']);
  3. $imie = ($_POST['imie']);
  4. $nazwisko = ($_POST['nazwisko']);
  5. $klasa = ($_POST['klasa']);
  6. $login = ($_POST['login']);
  7. $haslo = ($_POST['haslo']);
  8.  
  9. //------------------
  10.  
  11. if(!empty($id)){
  12.  
  13. $query = "UPDATE `users` SET id='$id', imie='$imie', nazwisko='$nazwisko', klasa='$klasa', login='$login', haslo='$haslo'" or die(mysql_error());
  14. $result = mysql_query ($query);
  15. }
  16. else{
  17. $query = "DELETE FROM `users` WHERE id='$id' " or die(mysql_error());
  18. $result = mysql_query ($query);  
  19. }
  20.  
  21. echo 'Dane ucznia/ów zostały zmienione!';
  22.  
  23. header( 'Location: ses.php' );
  24. ?>

Nie wiem czy to przez te wakacje czy co, ale jakoś nie mogę ostatnio za bardzo wymyślić żadnego sensownego rozwiązania... proszę o pomoc

Ten post edytował aga323 2.08.2007, 12:03:00
Go to the top of the page
+Quote Post
plurr
post
Post #2





Grupa: Zarejestrowani
Postów: 175
Pomógł: 12
Dołączył: 28.06.2007
Skąd: Bytom

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


rzucilo mi sie w oczy usuwanie uzytkownika po id jesli $id jest puste - masz empty($id) to delete where id='$id'.

No i ja bym w ogole nie ruszal pola id w update.

Ten post edytował plurr 2.08.2007, 12:14:27
Go to the top of the page
+Quote Post
John
post
Post #3





Grupa: Zarejestrowani
Postów: 107
Pomógł: 11
Dołączył: 1.08.2007
Skąd: Poland,Warsaw

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


Chciałem tylko zauważyć Pani Agnieszko,że zapytanie dla mySQL nie ma żadnych warunków. Otóż akcja update bez warunków ( np. WHERE id=... ) spowoduje zmianę wszystkich wartości w tabeli na te podane w formularzu, chyba,że występują klucze wtedy powinno wyrzucić błąd o próbie duplikowania kluczy w tabeli.

powinno wyglądać tak :
  1. $query = "UPDATE `users` SET id='$id', imie='$imie', nazwisko='$nazwisko', klasa='$klasa', login='$login', haslo='$haslo' WHERE id=$id


Ponieważ rozumiem,że id jest unikalne

Co do usuwania to o ile dobrze pamiętam składnia była

  1. DELETE id FROM users WHERE id='$id'
Go to the top of the page
+Quote Post
aga323
post
Post #4





Grupa: Zarejestrowani
Postów: 124
Pomógł: 0
Dołączył: 26.01.2007
Skąd: Oborniki

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


Posłuchałam waszych rad i trochę to pomogło, lecz nie do końca. W tej chwili mogę pięknie edytować ale tylko użytkownika, który znajduje się na końcu listy użytkowników, resztę jak pozmieniam to nie aktualizuje sie w bazie. A usuwanie w tej chwili mi w ogóle nie działa.
Go to the top of the page
+Quote Post
John
post
Post #5





Grupa: Zarejestrowani
Postów: 107
Pomógł: 11
Dołączył: 1.08.2007
Skąd: Poland,Warsaw

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


Teraz zauważyłem,że tobie się wyświetla cała lista i chciałabyś,żeby zmieniało Ci wszystko naraz ? To chyba niemożliwe.
Go to the top of the page
+Quote Post
drPayton
post
Post #6





Grupa: Zarejestrowani
Postów: 890
Pomógł: 65
Dołączył: 13.11.2005
Skąd: Olsztyn

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


Jeżeli pole id to standardowy autoinkrementowany znacznik, to:
  1. UPDATE pole = wartosc WHERE id = $_POST['id']

Natomiast kasowanie:
  1. DELETE FROM tabela WHERE id = $_POST['id']

Albo samo id, skoro wcześniej przepisujesz do zmiennych
Tyle, że u Ciebie id jest podawane z formularza, jeżeli nie jest określone to skąd system ma wiedzieć, który rekord skasować?
A jeśli pole id to u Ciebie jakieś inne pole, niezwiązane a autoinkrementem, to musisz (powinnaś) dodać jakieś tego właśnie typu pole...

Ten post edytował drPayton 2.08.2007, 14:15:47
Go to the top of the page
+Quote Post
aga323
post
Post #7





Grupa: Zarejestrowani
Postów: 124
Pomógł: 0
Dołączył: 26.01.2007
Skąd: Oborniki

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


Tylko w sumie za bardzo nie wiem jak dodać, w jakiej formie zrobić to pole, może ktoś miałby jakiś pomysł jak to zrobić?
Go to the top of the page
+Quote Post
skowron-line
post
Post #8





Grupa: Zarejestrowani
Postów: 4 340
Pomógł: 542
Dołączył: 15.01.2006
Skąd: Olsztyn/Warszawa

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


mozesz teraz zmodyfikowac tabele
Kod
ALTER TABLE `nazwa_tabeli` MODIFY id int not null auto_increment

i najlepiej zeby to id bylo kluczem glownym w twojej tabeli
Go to the top of the page
+Quote Post
drPayton
post
Post #9





Grupa: Zarejestrowani
Postów: 890
Pomógł: 65
Dołączył: 13.11.2005
Skąd: Olsztyn

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


Dodasz jako nowe pole:
  1. ALTER TABLE `tabela` ADD `uid` INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY;

Zmienisz istniejące:
  1. ALTER TABLE `tabela` CHANGE `id` `id` INT UNSIGNED NOT NULL AUTO_INCREMENT

  1. ALTER TABLE `tabela` DROP PRIMARY KEY, ADD PRIMARY KEY(`id`)


Ten post edytował drPayton 2.08.2007, 15:50:40
Go to the top of the page
+Quote Post
aga323
post
Post #10





Grupa: Zarejestrowani
Postów: 124
Pomógł: 0
Dołączył: 26.01.2007
Skąd: Oborniki

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


e.. bo już się trochę gubię... Mam tak tabela users i w niej pole id tym integer (10) Usigned, not null, auto_increment. Później mam jeszcze jakieś tam dane to są varchary (imię, nazwisko itd.). I mam indeks na id typ unique.
I teraz nie wiem czy mam to dobrze czy coś zmienić...?
Go to the top of the page
+Quote Post
drPayton
post
Post #11





Grupa: Zarejestrowani
Postów: 890
Pomógł: 65
Dołączył: 13.11.2005
Skąd: Olsztyn

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


Prawie dobrze, tylko, że nie UNIQUE tylko PRIMARY KEY (chociaż u Ciebie to nie będzie różnicy, to tylko przy relacjach), więc SQL'a zostaw jak jest.
Ale skoro masz autoinkrementowane pole id w tabeli, to ono samo będzie się uzupełniać, wywal to pole z formularza!
I wtedy:
  1. UPDATE tabela SET pole1='wartosc1', pole2='wartosc2' WHERE id = {$_POST['id']}

A id w formularzu daj najlepiej w polu typu hidden. Czyli:
  1. <?php
  2. while ($wyswietl = mysql_fetch_object($zapytanie)) {
  3.  
  4. echo '<tr>';
  5.  
  6. echo '<td><input type = "hidden" name = "id" value = "'.$wyswietl -> id.'" /></td>';
  7.  
  8. (...)
  9.  
  10. echo '</tr>';
  11.  
  12. }
  13. ?>


Tylko, że:
1. Jeśli chcesz edytować tylko jednego użytkownika, to formularz musisz umieścić w pętli razem z tymi polami
2. Jeśli chcesz wszystkich, to napisz, bo wtedy będzie nieco inaczej

Ten post edytował drPayton 2.08.2007, 18:29:03
Go to the top of the page
+Quote Post
aga323
post
Post #12





Grupa: Zarejestrowani
Postów: 124
Pomógł: 0
Dołączył: 26.01.2007
Skąd: Oborniki

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


No interesuje mnie raczej żeby edytować wszystkich. Bo to by było najwygodniejsze, chyba, że byłoby to zbyt trudne do wykonania, bo doświadczenia zbyt dużego to w pisaniu skryptów jeszcze nie mam. Wtedy trzeba by wymyślić inne rozwiązanie
Go to the top of the page
+Quote Post
drPayton
post
Post #13





Grupa: Zarejestrowani
Postów: 890
Pomógł: 65
Dołączył: 13.11.2005
Skąd: Olsztyn

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


Wtedy nazwy pól (name="nazwa") muszą być tabelaryczne, czyli np <input type="text" name="nazwa[]" (...) />
a w skrypcie php po tych polach "jedziesz" pętlą for, czyli np.:
  1. <?php
  2. $j=sizeof($_POST['id']);
  3. for ($i=0; $i<$j; $i++) {
  4. query("UPDATE tabela SET imie = {$_POST['imie'][$i]}, nazwisko = {$_POST['nazwisko'][$i]} WHERE id = {$_POST['id'][$i]}");
  5. }
  6. ?>


Ten post edytował drPayton 2.08.2007, 20:56:00
Go to the top of the page
+Quote Post
aga323
post
Post #14





Grupa: Zarejestrowani
Postów: 124
Pomógł: 0
Dołączył: 26.01.2007
Skąd: Oborniki

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


Kurcze, zrobiłam tak jak mówiłeś, ale w tej chwili to już nic mi nie edytuje ani nie usuwa, nawet tego ostatniego... (IMG:http://forum.php.pl/style_emoticons/default/sad.gif)
Go to the top of the page
+Quote Post
drPayton
post
Post #15





Grupa: Zarejestrowani
Postów: 890
Pomógł: 65
Dołączył: 13.11.2005
Skąd: Olsztyn

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


To co napisałem to idea, nie sprawdzałem jej. Teraz nie mam czasu, jak będę miał a w międzyczasie nie napisze tego nikt inny to wtedy się tym zajmę, sorry.
Go to the top of the page
+Quote Post
in5ane
post
Post #16





Grupa: Zarejestrowani
Postów: 1 335
Pomógł: 34
Dołączył: 9.11.2005
Skąd: Wrocław

Ostrzeżenie: (10%)
X----


Dam ci przykład:

  1. <?php
  2. if ($co == 'popraw') {
  3. if ($login && $haslo) {
  4. $query = "UPDATE admin SET login='$login', haslo='$haslo' WHERE id='$id';";
  5. $wynik = mysql_query ($query);
  6. }
  7. } elseif ($co == 'edytuj') {
  8. $query = "SELECT * FROM admin WHERE id='$id';";
  9. $wynik = mysql_query ($query);
  10. $row = mysql_fetch_array ($wynik);
  11. $id = $row[0]; $login = $row[1]; $haslo = $row[2];
  12. echo '<form method="post">
  13. <input type="hidden" name="co" value="popraw">
  14. <input type="hidden" name="id" value="'.$id.'">
  15. Login: <input type="text" name="login" value="'.$login.'"><br>
  16. Hasło: <input type="password" name="haslo" value="'.$haslo.'"><br>
  17. <input type="submit" value="Popraw"></form>';
  18. } elseif ($co == 'skasuj') {
  19. $wynik = mysql_query ("DELETE FROM admin WHERE id='$id';");
  20. }
  21. $wynik = mysql_query ("SELECT * FROM admin;");
  22. echo "<table border=1 cellspacing=0 cellpadding=2><tr><td><b>Login:</b></td><td></td><td></td>n";
  23. while ($row = mysql_fetch_array ($wynik)) {
  24. $id = $row[0]; $login = $row[1]; $haslo = $row[2];
  25. echo "<tr><td>$login</td><td><a href="?co=skasuj&id=$id">Skasuj</a></td><td><a href="?co=edytuj&id=$id">Edytuj</a></td></tr>";
  26. }
  27. echo '</table>';
  28. ?>


Tutaj jest, jak używam.
Masz tutaj edycje (dwa pola, login i hasło) oraz usuwanie.
Go to the top of the page
+Quote Post
aga323
post
Post #17





Grupa: Zarejestrowani
Postów: 124
Pomógł: 0
Dołączył: 26.01.2007
Skąd: Oborniki

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


A może lepiej byłoby to rozwiązać w inny sposób, bo ten na razie nie działa (IMG:http://forum.php.pl/style_emoticons/default/sad.gif) Skoro edytowanie wszystkich naraz jest raczej mało możliwe może lepiej zrobić listę użytkowników i po kliknięciu na dana osobę zmieniać tam jej dane... Co o tym myślicie?
Go to the top of the page
+Quote Post
Kicok
post
Post #18





Grupa: Zarejestrowani
Postów: 1 033
Pomógł: 125
Dołączył: 17.09.2005
Skąd: Żywiec

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


Cytat
Skoro edytowanie wszystkich naraz jest raczej mało możliwe


Jest możliwe ;]

  1. <form name = "educz" action = "educz2.php" method = "post" />
  2.  
  3. <table border = "1">
  4. <tr>
  5. <td>ID</td>
  6. <td>Imię</td>
  7. <td>Nazwisko</td>
  8. <td>Klasa</td>
  9. <td>Login</td>
  10. <td>Hasło</td>
  11. </tr>
  12.  
  13. <?php
  14.  
  15. $zapytanie = mysql_query( 'SELECT * FROM users WHERE ranga = 0' );
  16. while( $wyswietl = mysql_fetch_object( $zapytanie ) ):
  17.  
  18. ?>
  19.  
  20. <tr>
  21. <td><?php echo $wyswietl->id; ?></td>
  22. <td><input type="text" name="imie[<?php echo $wyswietl->id; ?>]" value="<?php echo htmlspecialchars( $wyswietl->imie ); ?>" /></td>
  23. <td><input type="text" name="nazwisko[<?php echo $wyswietl->id; ?>]" value="<?php echo htmlspecialchars( $wyswietl->nazwisko ); ?>" /></td>
  24. <td><input type="text" name="klasa[<?php echo $wyswietl->id; ?>]" value="<?php echo htmlspecialchars( $wyswietl->klasa ); ?>" /></td>
  25. <td><input type="text" name="login[<?php echo $wyswietl->id; ?>]" value="<?php echo htmlspecialchars( $wyswietl->login ); ?>" /></td>
  26. <td><input type="text" name="haslo[<?php echo $wyswietl->id; ?>]" value="<?php echo htmlspecialchars( $wyswietl->haslo ); ?>" /></td>
  27. </tr>
  28.  
  29. <?php
  30.  
  31. endwhile;
  32.  
  33. ?>
  34.  
  35. </table>
  36.  
  37. <input type="submit" name="submit" value="Wyślij" />
  38. </form>



A później w drugim pliku zrób sobie:
  1. <?php
  2.  
  3. if( isset( $_POST['submit'] ) )
  4. {
  5. echo '<pre>' . print_r( $_POST, true ) . '</pre>';
  6. }
  7.  
  8. ?>



Wyświetlone wyniki powinny wskazać ci kierunek myślenia.
Go to the top of the page
+Quote Post
aga323
post
Post #19





Grupa: Zarejestrowani
Postów: 124
Pomógł: 0
Dołączył: 26.01.2007
Skąd: Oborniki

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


Aha, teraz to rzeczywiście trochę jaśniej (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg) Ale mam pytanie teraz czy ten drugi plik może zostać mniej więcej tak samo jak miałam go wcześniej, czy tez pisać zupełnie od nowa i czy to edytowanie i usuwani musi być w pętli czy inaczej to rozwiązać?
Go to the top of the page
+Quote Post
Kicok
post
Post #20





Grupa: Zarejestrowani
Postów: 1 033
Pomógł: 125
Dołączył: 17.09.2005
Skąd: Żywiec

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


Cytat
czy to edytowanie i usuwani musi być w pętli czy inaczej to rozwiązać?


Trzeba trochę przebudować ten plik, tak żeby w pętli aktualizował dane.


Rozwiązanie pierwsze: Aktualizuj wszystkie. Wszystkie dane zostaną zaktualizowane, nawet te, które się nie zmieniły.

Rozwiązanie drugie: JS. Do każdego wiersza dodać jeszcze jedno pole hidden:
  1. <input type="hidden" name="zmodyfikowane[<?php echo $wyswietl->id; ?>]" value="0" />

W każdym z pozostałych pól tego wiersza dodać zdarzenie onKeyPress, które zmieni wartość tego pola na "1"
Po wysłaniu formularza będzie wiadomo które pola zostały zmodyfikowane (i należy je uaktualnić w bazie), a które nie. Wady: wymaga włączonego JS.
Go to the top of the page
+Quote Post

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

 



RSS Aktualny czas: 23.08.2025 - 02:15