Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]UPDATE, ale nie wszystkich pól
Forum PHP.pl > Forum > Przedszkole
David92
Witam serdecznie mam kod w php w którym użytkownik może zmieniać swoje dane, i teraz chciałbym aby były zmieniane tylko dane których pola zawierają jakąś wartość tzn. że jeżeli wypełnię tylko pole Imię to chciałbym żeby tylko imie się zmeniło , a niestety w dotychczasowym kodzie reszta zmienia się także i w tym przypadku podstawiane są puste pola. Proszę o pomoc jakbym mógł to rozwiązać, odrazu powiem że cały kod robię dla nauki.

  1. <?php
  2. include_once 'db.inc.php';
  3. include_once 'function.inc.php';
  4. if(isset($_POST['zmiana'])){
  5. if($_POST['imie'] != ''){
  6. if(!codenone($_POST['imie'])){
  7. redirect("updateinfo.php?error_code");
  8. exit ('');
  9. }
  10. }elseif($_POST['nazwisko'] != ''){
  11. if(!codenone($_POST['nazwisko'])){
  12. redirect("updateinfo.php?error_code");
  13. exit ('');
  14. }
  15. }elseif($_POST['miejscowosc'] != ''){
  16. if(!codenone($_POST['miejscowosc'])){
  17. redirect("updateinfo.php?error_code");
  18. exit ('');
  19. }
  20. }elseif($_POST['wiek'] != ''){
  21. if(checkAge($_POST['wiek'])){
  22. redirect("up
  23. dateinfo.php?error_age");
  24. exit ('');
  25. }
  26. }elseif($_POST['kontakt'] != ''){
  27. if(!checkPhone($_POST['kontakt'])){
  28. redirect("updateinfo.php?error_phone");
  29. exit ('');
  30. }
  31. }
  32. $sql = "UPDATE user SET
  33. imie = '$_POST[imie]',
  34. nazwisko = '$_POST[nazwisko]',
  35. miejscowosc = '$_POST[miejscowosc]',
  36. wiek = '$_POST[wiek]',
  37. kontakt = '$_POST[kontakt]'
  38. WHERE login='$_SESSION[zalogowany]'";
  39. if(mysql_query($sql)){
  40. redirect("konto.php?moje_konto&updateinfo");
  41. }else{
  42. redirect("updateinfo.php?error");
  43. }
  44. }
  45. include 'header.php';
  46. include 'left.php';
  47. opentable("Zmień dane");
  48. if(isset($_SESSION['zalogowany']) && !empty($_SESSION['zalogowany']) && $poziom == 2 || $poziom == 1){
  49. if(isset($_GET['error'])){
  50. echo "<p>Błąd podczas zmiany danych!</p>";
  51. }elseif(isset($_GET['error_age'])){
  52. echo "<p>Błąd podczas zmiany danych!</p>";
  53. }elseif(isset($_GET['error_phone'])){
  54. echo "<p>Błąd podczas zmiany danych!</p>";
  55. }elseif(isset($_GET['error_code'])){
  56. echo "<p>Błąd podczas zmiany danych!</p>";
  57. }
  58. $sql = mysql_query("SELECT * FROM user WHERE login='$_SESSION[zalogowany]' ");
  59. if(!$sql){
  60. exit ('Problem podczas wykonywania zapytania : ' .mysql_error(). '');
  61. }
  62. echo "<form action=".$_SERVER['PHP_SELF']." method='POST'>";
  63. echo "<table class='dane'>";
  64. echo "<tr>";
  65. echo "<td><strong>Aktualne dane</strong></td>";
  66. echo "<td><strong>Nowe dane</strong></td>";
  67. echo "</tr>";
  68. while($dane = mysql_fetch_array($sql)){
  69. echo "<tr>";
  70. echo "<td>Imię: ". $dane['imie'] ."</td>";
  71. echo "<td><input type='text' name='imie' /></td>";
  72. echo "</tr>";
  73. echo "<tr>";
  74. echo "<td>Nazwisko: ". $dane['nazwisko'] ."</td>";
  75. echo "<td><input type='text' name='nazwisko' /></td>";
  76. echo "</tr>";
  77. echo "<tr>";
  78. echo "<td>Miejscowość: ". $dane['miejscowosc'] ."</td>";
  79. echo "<td><input type='text' name='miejscowosc' /></td>";
  80. echo "</tr>";
  81. echo "<tr>";
  82. echo "<td>Wiek: ". $dane['wiek'] ."</td>";
  83. echo "<td><input type='text' name='wiek' /></td>";
  84. echo "</tr>";
  85. echo "<tr>";
  86. echo "<td>Kontakt: ". $dane['kontakt'] ."</td>";
  87. echo "<td><input type='text' name='kontakt' /></td>";
  88. echo "</tr>";
  89. }
  90. echo "</table>";
  91. echo "<input type='submit' value='Zmień' name='zmiana' />";
  92. echo "</form>";
  93. }
  94. closetable();
  95. include 'footer.php';
  96. ?>


Pozdrawiam!
Kshyhoo
Pobierz dane z bazy i wrzuć je do formularza. Po zatwierdzeniu, dostaniesz wszystkie dane, zmienione i te nie... Ew, wrzuć do sesji.
David92
No tak że na to nie wpadłem bardzo dobry pomysł dziękuję bardzo:)

Liczę też na to że jeżeli ktoś ma inne pomysły to też się podzieli nimi w moim temacie smile.gif
thek
A czemu nie sprawdzasz jakie pola są niepuste? jeśli to zrobisz to w teorii tylko odpowiadające im kolumny możesz dodać do UPDATE.
Przykład? Jako parametr dajesz tablicę, z której usuwasz wszystkie pola, których wartości są puste. Teraz tylko coś analogicznego do:
  1. $query = 'UPDATE tabela SET';
  2. if(count($array)>0)
  3. {
  4. foreach($array AS $key => $value)
  5. {
  6. $query .= ' '.$key.' = \''.$value.'\',';
  7. }
  8. $query = rtrim($query, ',');
  9. mysql_query($query.' WHERE id = '.$record_id);
  10. }
  11. else
  12. {
  13. //sypnij jakiś komunikat, że nie było update
  14. }

Oczywiście nie dałem tu ochrony przed sqlinjection czy tego jak ową tablice przygotować, tylko ogólny zamysł. Używając FW z query_builderami całość jest jeszcze prostsza.
David92
Dzięki thek, twoja sugestia odzwierciedla dokładnie to o co mi chodziło od samego początku, nie będę musiał wysyłać za każdym razem wszystkich pól tylko te które są "niepuste" czyli do zmiany:)
Teraz tylko pozostaje mi rozmyślić jak wrzucic do tablicy wartości ale myślę że dam radęsmile.gif
Pozdro!
phpion
Sugestia ~Kshyhoo jest lepsza od ~theka. Pomyśl co się stanie w momencie, gdy będę chciał usunąć niektóre swoje dane? Przykładowo: mam wpisany numer telefonu, ale jednak wolałbym go nie podawać, więc wyczyszczę zawartość pola z telefonem. Pole w bazie nie zostanie zaktualizowane bo zostanie pominięte jako puste. Będę musiał kombinować z wpisywaniem jakiś głupot by ukryć mój faktyczny numer telefonu.
David92
Hmm no tutaj masz rację, i w sumie jest to szybsza metoda. Od samego początku chciałem zrobić tak jak mówi thek. Oba pomysły są fajne i bardzo mi pomogły, ale z drugiej strony jest prawdą że ktoś może nie chcieć podawać wszystkich danych. Jeszcze jakby inaczej patrzeć to nawet jakbym wymagał od każdego wszystkich danych to w niczym nie będzie przeszkadzać to że nadpiszę tak jakby niektóre pola.
thek
Phpion oczywiście ma rację co do "czyszczenia pól". Ja podałem tylko techniczną stronę "Czy się da tak zrobić, żeby...", gdyż to czy zastosujemy sposób przeze mnie prezentowany czy Kshyhoo tak naprawdę jest tylko kawałkiem backendu i do tego jego jednym z ostatnich. Plusem mojego jest możliwość edycji konkretnych pól bez dotykania niepotrzebnie innych, ale to które rozwiązanie jest lepsze zależy od choćby frontu. Może bowiem być opcja czyszczenia jednego lub dwóch pól poprzez checkbox w stylu "Wyczyść tekst" i bez możliwości wyświetlenia innych. W ten sposób ingerencja w jedną kolumnę jest o wiele prostsza. Ale jak zaznaczam, to JAK się podejdzie do update w pewien sposób zależy od założeń projektu.
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.