Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [SF]Propel i save(), Po wykonaniu save() w ramach aktualizacji rekordu zwraca 0
kkamis
post
Post #1





Grupa: Zarejestrowani
Postów: 8
Pomógł: 0
Dołączył: 24.03.2011

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


Witam,

Być może podobny wątek istnieje już na forum - ja niestety nic takiego nie znalazłem...

Problem polega na tym, że przekazuje do akcji dane z formularza. Na ich podstawie mają zostać utworzone nowe rekordy w bazie danych jak i zaktualizowane już istniejące. O ile przy zapisie nowych rekordów funkcja propela save() zwraca liczbę 1 tak przy aktualizacji zwracane jest 0 choć sama aktualizacja następuje prawidłowo. Z tego co wyczytałem to funkcja ta zwraca liczbę "przetworzonych?" wierszy (być może źle zrozumiałem). Wydaje mi się, że w kodzie jest wszystko w porządku, ale mogę się oczywiście mylić...

Oto kod:

  1. foreach($_POST['obj'] as $obj) {
  2. if($obj['id']) {
  3. $update_obj = ObjPeer::retrieveByPK($obj['id']);
  4. } else {
  5. $update_obj = new Obj();
  6. }
  7. $update_obj->setValue($obj['value']);
  8. if(!$update_obj->save()) $success = false;
  9. }


Z góry dziękuję za wszelką pomoc i pozdrawiam smile.gif
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 4)
arecki
post
Post #2





Grupa: Zarejestrowani
Postów: 222
Pomógł: 35
Dołączył: 6.02.2005

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


Wczoraj na szybko odpisałem ale niestety nie do końca zgodnie z zadanym pytaniem tak więc dzisiaj jeszcze raz podszedłem do tematu i sprawdziłem w kodzie symfony, a właściwie to propela, jest.
Mianowicie doszedłem do metody public static function doUpdate(parametry...) w pliku sfPropelPlugin/lib/vendor/propel/util/BasePeer.php i z tego co mi się wydaje to affectet rows, czyli to co Ciebie interesuje zwracane jest z obiektu PDO. A z manuala wnioskować można że jest to zależne od rodzaju bazy i nie za bardzo można na tym polegać co oczywiście cytuje:
Cytat
PDOStatement::rowCount() returns the number of rows affected by the last DELETE, INSERT, or UPDATE statement executed by the corresponding PDOStatement object.

If the last SQL statement executed by the associated PDOStatement was a SELECT statement, some databases may return the number of rows returned by that statement. However, this behaviour is not guaranteed for all databases and should not be relied on for portable applications.



--------------------
Go to the top of the page
+Quote Post
kkamis
post
Post #3





Grupa: Zarejestrowani
Postów: 8
Pomógł: 0
Dołączył: 24.03.2011

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


Dziękuję za tak szybką odpowiedź. A czy istnieje jakiś sposób by rozwiązać ten problem? Szukałem w manualu, ale jakoś ciężko znaleźć coś co by temu odpowiadało. Oczywiście mogę sprawdzać po każdym zapisie/aktualizacji czy rekord istnieje, ale wtedy liczba zapytań może być ogromna i mija się to z celem...
Go to the top of the page
+Quote Post
arecki
post
Post #4





Grupa: Zarejestrowani
Postów: 222
Pomógł: 35
Dołączył: 6.02.2005

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


Przeglądałem manual ale nic sensownego tam nie znalazłem. Na szybko myśląc możesz zrobić sobie jakieś pole "token", do którego podczas update'u rekordu wpiszesz wartość którą przez updatem sobie wygenerowałeś. Przed updatem, zapisz sobie ilość wierszy które miały być zmienione, a po updacie łatwo wyciągniesz te które miały być uaktualnione. Po tym sprawdzić czy ilość wierszy przed aktualizacją zgadza się z tą po aktualizacji. Potem czyść pole "token" i sprawa na szybko jest załatwiona. Nie wiem na ile to "eleganckie" rozwiązanie ale wydaje mi się że będzie pewne.

Ten post edytował arecki 29.03.2011, 14:26:05


--------------------
Go to the top of the page
+Quote Post
kkamis
post
Post #5





Grupa: Zarejestrowani
Postów: 8
Pomógł: 0
Dołączył: 24.03.2011

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


Spróbuję... Dziękuje bardzo za pomoc smile.gif
Go to the top of the page
+Quote Post

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

 



RSS Aktualny czas: 19.08.2025 - 17:59