Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Update nie zmienia danych
Forum PHP.pl > Forum > PHP
gcdreak
Witam!
Mam problem z zapytanie preinterpretowanym. Kod wygląda tak:
-konstruktor
[PHP] pobierz, plaintext
  1. private static $db;
  2. function __construct() {
  3. if(!self::$db) {
  4. self::$db = new mysqli(DB_HOST, DB_USER, DB_PASSWORD, DB_NAME);
  5. }
[PHP] pobierz, plaintext

-źle działająca metoda:
[PHP] pobierz, plaintext
  1. public function confirm($sEmail, $iListId, $sHash) {
  2. if($sHash != $this->generateHash($sEmail))
  3. return false;// to jest ok
  4. $sEmail = self::$db->real_escape_string($sEmail);
  5. $iListId = intval($iListId);
  6. // do tej pory tez jest ok
  7. $stmt = self::$db->prepare('UPDATE `subscriptions` SET `confirm` = 1 WHERE `listId` = ? AND `userId` = (SELECT `userId` FROM `users` WHERE `email` = ? LIMIT 1)'); //var_dump zwraca true
  8. $stmt->bind_param('is', $iListId, $sEmail);//var_dump zwraca true
  9. $stmt->execute();//var_dump zwraca true
  10. echo $stmt->affected_rows;// =0
  11. if($stmt->affected_rows == 1) {
  12. $stmt->close();
  13. return true;
  14. }
  15. $stmt->close();
  16. return false;
  17. }
[PHP] pobierz, plaintext

Dane w bazie nie są uaktualnione sadsmiley02.gif
Czy widzicie jakiś błąd?
Zapytanie jest dobre, ponieważ kiedy użyje go w bazie to wszystko działa.
skowron-line
Jeżeli update nie zmieni danych żadnych w sensie:
w tabeli masz id = 1 i zrobisz
  1. UPDATE tabela SET id = 1 WHERE id = 1;

To zapytanie zwroci TRUE ale mysql_affected_rows zwroci 0 mimo iz zapytanie sie wykona poprawnie,
spowodowane jest to tym iż żadne dane nie zostały zmienione.
gcdreak
Tak, oczywiście masz rację ale w moim przypadku jest inny problem, ponieważ tabela ma kolumny: listId, userId, confirm i ostatnie pole jest równe 0(zmieniłem żeby sprawdzić czy metoda będzie działać... a tu nie działa i nie wiem czemu:/)
thek
Może sprawdź czy baza nie wywala jakiegoś błędu. Wiem, że to dziwne skoro prekompilowała zapytanie, i dobrze parametry też widzi. Z jakiegoś powodu jednak nie robi update i może się to wiązać być może z pustym lub nieprawidłowym wynikiem w parametrze. Przez to w sumie UPDATE mógłby nie znaleźć odpowiedniego rekordu a tym samym nie miałby czego updateować. Ewentualnie jest też możliwość opisana przez poprzednika. Baza ze względów optymalizacji sprawdza czy rekord przed i po operacji nie będzie taki sam przypadkiem. Odczyt jest szybszy niż zapis, więc baza w takim wypadku zaktualizuje tylko kolumny, które rzeczywiście wymagają zmiany i odpowiednio ustawi TRUE jeśli choć jedna z kolumn uległa zmianie. Jeśli żadna to nie uwzględni rekordu pośród zmienionych.
skowron-line
@gcdreak wyświetl sobie zapytanie jakie się wykonuje i zobacz co jest nie tak z nim.
gcdreak
@skowron-line dzięki twojemu postowi rozwiązałem problem

Ale banalny błąd - literówka "jak@kowalski.pl" zamiast "jan@kowalski.pl" dlatego działało jak ręcznie wpisywałem...
Dzięki za pomoc.
Temat do usunięcia.
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.