Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [php/mysql]funkcje UPDATE & DELETE
Forum PHP.pl > Forum > Przedszkole
aga323
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
plurr
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.
John
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'
aga323
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.
John
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.
drPayton
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...
aga323
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ć?
skowron-line
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
drPayton
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`)
aga323
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ć...?
drPayton
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
aga323
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
drPayton
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. ?>
aga323
Kurcze, zrobiłam tak jak mówiłeś, ale w tej chwili to już nic mi nie edytuje ani nie usuwa, nawet tego ostatniego... sad.gif
drPayton
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.
in5ane
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.
aga323
A może lepiej byłoby to rozwiązać w inny sposób, bo ten na razie nie działa 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?
Kicok
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.
aga323
Aha, teraz to rzeczywiście trochę jaśniej 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ć?
Kicok
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.
aga323
Mój plik w tej chwili wygląda tak:
  1. <?php
  2.  
  3. include ("connect.php");
  4. //-------------------
  5.  
  6. if(empty($_POST['login'])){
  7. $query = "DELETE FROM `users` WHERE id = {$_POST['id']} " or die(mysql_error());
  8. $result = mysql_query($query);
  9.  
  10.  }
  11.  else{
  12. $query ="UPDATE `users` SET imie = {$_POST['imie']}, nazwisko = {$_POST['nazwisko']}, klasa = {$_POST['klasa']}, login = {$_POST['login']}, haslo = {$_POST['haslo']} WHERE id = {$_POST['id']}" or die (mysql_error());
  13. $result = mysql_query ($query);
  14.  
  15.  }
  16. header( 'Location: ses.php' );
  17.  
  18. ?>

Wiem, że teraz muszę to wszystko dać do pętli, tylko nie wiem w którym momencie ją wcisną i jakie dane do niej wstawić, więc proszę o małą pomoc smile.gif
Kicok
1. Co do kasowania wierszy to ja dodałbym jeszcze jednego checkboxa:
  1. <input type="checkbox" name="kasuj[<?php echo $wyswietl->id; ?>]" value="1" />


2. Teraz zauważyłem, że można było lepiej nazwać te pola, a mianowicie zrobić coś w rodzaju:
  1. <input type="text" name="id[<?php echo $wyswietl->id; ?>][imie]" />
  2. <input type="text" name="id[<?php echo $wyswietl->id; ?>][nazwisko]" />
  3. <input type="text" name="id[<?php echo $wyswietl->id; ?>][klasa]" />
  4. ...
  5. <input type="checkbox" name="id[<?php echo $wyswietl->id; ?>][kasuj]" value="1" />

ale niech już zostanie tak jak jest. A dane z formularza odbierasz w ten sposób:
  1. <?php
  2.  
  3. if( isset( $_POST['submit'] ) )
  4. {
  5. foreach( $_POST['imie'] as $id => $item )
  6. {
  7. if( !empty( $_POST['kasuj'][$id] ) )
  8. {
  9. // Kasujemy wiersz o ID = $id
  10.  
  11. continue;
  12. }
  13.  
  14.  
  15. // Aktualizujemy wiersz o ID = $id
  16. $imie = $_POST['imie'][$id];
  17. $nazwisko = $_POST['nazwisko'][$id];
  18. // ...
  19. } 
  20. }
  21.  
  22.  ?>
aga323
W tej chwili skrypt elegancko usuwa użytowników guitar.gif Ale nadal mam problem z edytowaniem. Oto mój kod:
  1. <?php
  2.  
  3. include ("connect.php");
  4. //-------------------
  5.  
  6. if( isset( $_POST['submit'] ) )
  7. {
  8. foreach( $_POST['imie'] as $id => $item )
  9. {
  10. if( !empty( $_POST['kasuj'][$id] ) )
  11. {
  12. // Kasujemy wiersz o ID = $id
  13.  $query = "DELETE FROM `users` WHERE id = $id " or die(mysql_error());
  14.  $result = mysql_query ($query);
  15.  
  16. continue;
  17. }
  18. else{
  19.  
  20. $imie = $_POST['imie'][$id];
  21. $nazwisko = $_POST['nazwisko'][$id];
  22. $klasa = $_POST['klasa'][$id];
  23. $login = $_POST['login'][$id];
  24. $haslo = $_POST['haslo'][$id];
  25.  
  26. $query = ("UPDATE `users` SET imie = $imie, nazwisko = $nazwisko, klasa = $klasa, logi
    n = $login, haslo = $haslo WHERE id = $id"
    ) or die (mysql_error());
  27. $result = mysql_query ($query);
  28.  }
  29. } 
  30. }
  31.  
  32.  ?>
nospor
tekst trzeba brac w ciapki ''
czyli nie:
imie = $imie
a:
imie = '$imie'
analogicznie inne pola tekstowe.

pozatym nie:
  1. <?php
  2. $zapytanie = '....' or die(mysql_error());
  3. mysql_query($zapytanie);
  4. ?>

a:
  1. <?php
  2. $zapytanie = '....';
  3. mysql_query($zapytanie) or die(mysql_error());
  4. ?>
aga323
Wielkie dzięki, teraz wszystko śmiga, że aż miło biggrin.gif I sorry, że pisze z takimi głupimi błędami, postaram się już ich nie popełniać smile.gif
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.