Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [mysql]UPDATE nie działa
Forum PHP.pl > Forum > Bazy danych > MySQL
kreciko
Cześć,

  1. print_r($post);
  2. $sql = "UPDATE `labch_olej` SET `1w`='" . $post['1w'] . "',
  3. `2v`='" . $post['2v'] . "' ,
  4. `3r`='" . $post['3r'] . "' ,
  5. `4s`='" . $post['4s'] . "' ,
  6. `5z`='" . $post['5z'] . "' ,
  7. `6l`=' " . $post['6l'] . " ' ,
  8. `7t`=' " . $post['7t'] . " ' ,
  9. `8zz`='" . $post['8zz'] . "' WHERE `trafo_id`=" . $_GET['id'] . " LIMIT 1;";
  10. echo $sql;
  11. $res = mysql_query($sql);
  12. if ($res == null) {
  13. echo "Nie udało się zmienić danych!";
  14. return null;
  15. }
  16. echo "Dane zmienione pomyślnie!";


Robię coś takiego. Na początku wypisuję sobie zawartość tablicy post i wszystko jest ładnie. Następnie składam zapytanie i je sobie wypisuję. Później wypisuję to zapytanie sobie. I je wywołuje. Moje zdziwienie gdy otwieram phpMyadmina, gdy widzę wartości pól 1w,2v,3r,4s, 5z, 6l, 7t, 8zz dla updatowanego id są puste.

  1. Array ( [1w] => jasny [2v] => 61 [3r] => 11000 [4s] => 0,005 [5z] => 11 [6l] => 0,1 [7t] => 30 [8zz] => on [wyslij] => Prześlij )
  2. UPDATE `labch_olej` SET `1w`='jasny', `2v`=' 61 ' , `3r`=' 11000 ' , `4s`=' 0,005 ' , `5z`=' 11 ' , `6l`=' 0,1 ' , `7t`=' 30 ' , `8zz`=' on ' WHERE `trafo_id`=1 LIMIT 1;
  3. Dane zmienione pomyślnie!


Jeżeli przekleję to wyechowane zapytanie do phpMyAdmin to się updatuje poprawnie.

Zrzut bazy:

  1. SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";
  2.  
  3. --
  4. -- Struktura tabeli dla `labch_olej`
  5. --
  6.  
  7. CREATE TABLE IF NOT EXISTS `labch_olej` (
  8. `trafo_id` int(5) NOT NULL,
  9. `user_id` int(5) NOT NULL,
  10. `1w` varchar(10) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
  11. `2v` varchar(10) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
  12. `3r` varchar(10) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
  13. `4s` varchar(10) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
  14. `5z` varchar(10) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
  15. `6l` varchar(10) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
  16. `7t` varchar(10) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
  17. `8zz` varchar(10) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
  18. PRIMARY KEY (`trafo_id`)
  19. ) ENGINE=MyISAM DEFAULT CHARSET=latin2;
  20.  
  21. --
  22. -- Zrzut danych tabeli `labch_olej`
  23. --
  24.  
  25. INSERT INTO `labch_olej` (`trafo_id`, `user_id`, `1w`, `2v`, `3r`, `4s`, `5z`, `6l`, `7t`, `8zz`) VALUES
  26. (1, 4, '', ' ', ' ', ' ', ' ', ' ', ' ', ' '),
  27. (2, 4, 'jasny', '61', '11000', '0,005', '11', '0,1', '30', 'on');



A dane pochodzą z fomularza w html: <form method="post" action="costam.php?action">


Siedzę nad tym problemem 3 dzień i nic nie mogę zdziałać. A jeszcze dodam, że to samo jest, gdy usunę rekord i dodam go na nowo.
vermis
mysql_error() zwarca stringa czyli:


mysql_query() zwraca FALSE kiedy jest błąd, więc
  1. if (!$res) {...}


Skoro zapytanie jest dobre to jedynie tu może być jakieś przekłamanie.
kreciko
Niestety mysql_error() nie zwrócił nic. Zmiana warunku w if'ie nie zmieniła także nic. Na bazie danych nie ma żadnego triggera.
GwynBleidD
`trafo_id` to primary_key, także jest unikalny, więc limit jest Ci niepotrzebny smile.gif Może bez limit pójdzie. PS. daj cały kod php pomiędzy znaczniki <pre> i </pre> to będzie lepiej wynik odczytywać (nowe linie).
nospor
@GwynBleidD limit sluzy w tym przypadku do optymalizacji. Jak masz milion rekordów to po znaleziueniu tego rekordu z danym ID mysql nie szuka już wiecej. Bez limit mysql by szukał nadal.
GwynBleidD
Hmm... zawsze myślałem, że jeśli zadamy silnikowi MySQL do szukania wartość, która jest unikalna (primary key albo unique) to poprzestanie on szukania na tej jednej i nie będzie kontynuował szukania, gdyż na pewno drugiej nie znajdzie.
nospor
To machnij testa na milionie rekordów. Sam z chęcią sprawdzę w praktyce jak to jest smile.gif
kreciko
Cytat
`trafo_id` to primary_key, także jest unikalny, więc limit jest Ci niepotrzebny Może bez limit pójdzie.

I bez limitu nie działa:/

Cytat
PS. daj cały kod php pomiędzy znaczniki <pre> i </pre> to będzie lepiej wynik odczytywać (nowe linie).


Nie rozumiem co masz na myśli.
nospor
czy oby na pewno zrobiles
echo mysql_error();
jak ci kazano?
kreciko
Tak. Do tego jeszcze var_dump();
  1. var_dump($post);
  2. //print_r($post);
  3. $sql = "UPDATE `labch_olej` SET `1w`='" . $post['1w'] . "',
  4. `2v`=' " . $post['2v'] . " ' ,
  5. `3r`=' " . $post['3r'] . " ' ,
  6. `4s`=' " . $post['4s'] . " ' ,
  7. `5z`=' " . $post['5z'] . " ' ,
  8. `6l`=' " . $post['6l'] . " ' ,
  9. `7t`=' " . $post['7t'] . " ' ,
  10. `8zz`=' " . $post['8zz'] . " ' WHERE `trafo_id`=" . $_GET['id'] . " LIMIT 1;";
  11. echo $sql;
  12. $res = mysql_query($sql);
  13. if ($res == null) {
  14. echo "Nie udało się zmienić danych!";
  15. return null;
  16. }
  17. echo "Dane zmienione pomyślnie!";
  18.  

Tak to wygląda obecnie.

Mam trzy funkcje, które działają podobnie do tej, i tylko w jeden zmieniłem. Jednak problem nadal jest. Co zauważyłem przed chwilą. Że gdy daję wartość otoczę spacjami czyli np. ' dupa ', i tą wartość updatuję, to te spacje otaczające dupa zostają.
GwynBleidD
Ja bym dał to tak:

  1. var_dump($post);
  2. //print_r($post);
  3. $sql = "UPDATE `labch_olej` SET `1w`='" . $post['1w'] . "',
  4. `2v`=' " . $post['2v'] . " ' ,
  5. `3r`=' " . $post['3r'] . " ' ,
  6. `4s`=' " . $post['4s'] . " ' ,
  7. `5z`=' " . $post['5z'] . " ' ,
  8. `6l`=' " . $post['6l'] . " ' ,
  9. `7t`=' " . $post['7t'] . " ' ,
  10. `8zz`=' " . $post['8zz'] . " ' WHERE `trafo_id`=" . $_GET['id'] . " LIMIT 1;";
  11. echo $sql;
  12. $res = mysql_query($sql);
  13. if (!$resl) {
  14. echo "Nie udało się zmienić danych! Błąd: ".mysql_error();
  15. return null;
  16. }
  17. echo "Dane zmienione pomyślnie!";
kreciko
Widze, że zmieniłeś tylko warunek w if'ie. Problem nadal jest.
GwynBleidD
Temat stary, ale chyba mam rozwiązanie. Możliwe, że masz w zapytaniu (z tablicy post) jakieś nieprintowalne znaki (np. nulle) które zaburzają coś. Otocz wszystkie $post[*] w zapytaniu funkcją mysql_real_escape_string.
kreciko
Dzięki. Na przyszłość się przyda:)
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.