Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [Symfony] Propel obcina zapytanie
masterix
post 31.03.2009, 09:37:10
Post #1





Grupa: Zarejestrowani
Postów: 93
Pomógł: 0
Dołączył: 7.09.2004

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


Witam,

Mam problem z updatem danych w bazie. Oto jakie wykonane zapytanie wyświetla mi webdebug:
  1. UPDATE campaign SE WHERE campaign.CAMP_ID=: p1 (: p1 = 14758000)

Jak widać wcięło cały środek.

Oto kod, który odpowiada za UPDATE:
  1. <?php
  2. public static function syncCampaign( $camp, $client_id )
  3.    {
  4.        $con = Propel::getConnection();
  5.        try
  6.        {
  7.            $con->beginTransaction();
  8.            $update = true;
  9.            // check if object exists in DB
  10.            $campaign = self::retrieveByPK( $camp->getId() );
  11.            if( is_null( $campaign ) )
  12.            {
  13.                $campaign = new Campaign();
  14.                $update = false;
  15.            }
  16.            // set proper values
  17.            $campaign->setCampId( $camp->getId() );
  18.            $campaign->setCampName( $camp->getName() );
  19.            $campaign->setClientId( $client_id );
  20.            $campaign->setCampStatus( $camp->getStatus() );
  21.            $campaign->setCampBudget( $camp->getBudgetAmount() );
  22.            
  23.            // do update if object existed in DB and insert if it didn't
  24.            if( $update )
  25.            {
  26.                self::doUpdate( $campaign );
  27.            }
  28.            else
  29.            {
  30.                $campaign->save();
  31.            }
  32.            
  33.            $con->commit();
  34.        }
  35.        catch( PropelException $pe )
  36.        {
  37.            $con->rollback();
  38.            //throw $pe;
  39.        }
  40.        
  41.    }
  42. ?>

Jeśli odkomentuję dalsze rzucanie wyjątku to dostaję komunikat "Something is wrong in your syntax near WHERE campaign.CAMP_ID = 99999"
Cóż może powodować takie zachowanie?

pzdr.
Go to the top of the page
+Quote Post
mike
post 31.03.2009, 09:57:01
Post #2





Grupa: Przyjaciele php.pl
Postów: 7 494
Pomógł: 302
Dołączył: 31.03.2004

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


W PHP5 można nareszcie robić type hinting. Poza tym Propel sam wie czy ma zrobić insert czy update. I na koniec: nie ma sensu robić transakcji dla jednej operacji.
Całą tą funkcję można napisać tak:
  1. <?php
  2.  
  3. public static function syncCampaign(Campaign $campaign, $client_id) {
  4.    $campaign->setClientId($client_id);
  5.    try {
  6.        $campaign->save();
  7.    } catch (PropelException $e) {
  8.        // zrób coś z wyjątkiem
  9.    }
  10. }
  11.  
  12. ?>
Go to the top of the page
+Quote Post
masterix
post 2.04.2009, 14:56:48
Post #3





Grupa: Zarejestrowani
Postów: 93
Pomógł: 0
Dołączył: 7.09.2004

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


Bez transakcji nie robił mi UPDATE ponieważ tabela jest nadrzędna dla innej. Stąd transakcja. A niestety u mnie propel nie wie, czy ma być insert czy update, przy $campaign->save() się wywalał rzucając wyjątkiem o naruszeniu unikalności klucza podstawowego. Stąd cała otoczka w tej metodzie.

Więc skąd to ucięte zapytanie?

pzdr
Go to the top of the page
+Quote Post
destroyerr
post 2.04.2009, 15:17:38
Post #4





Grupa: Zarejestrowani
Postów: 879
Pomógł: 189
Dołączył: 14.06.2006
Skąd: Bytom

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


Propel nie obcina zapytania, kawałek zapytania w wyjątku to kawałek błędnego zapytania, który to kawałek jest zwracany przez mysql.
Jeśli chodzi o nie działanie metody save, to szerze mówiąc wątpię w to. Pewnie błąd leży gdzie indziej.
Go to the top of the page
+Quote Post
masterix
post 2.04.2009, 15:24:11
Post #5





Grupa: Zarejestrowani
Postów: 93
Pomógł: 0
Dołączył: 7.09.2004

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


Metodę save() przetestuję zaraz ponownie. Ale powiedz mi: dlaczego akurat to zapytanie zwraca takie "ucięte" a inne web debug pokazuje w całości( mimo, że są wielolinijkowe)? Bo trochę tego nie rozumiem. No i błąd sugeruje, że być może faktycznie je ucina.

Dzięki za odzew.

pzdr.
Go to the top of the page
+Quote Post
destroyerr
post 2.04.2009, 16:43:18
Post #6





Grupa: Zarejestrowani
Postów: 879
Pomógł: 189
Dołączył: 14.06.2006
Skąd: Bytom

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


Ale urywek zapytania dostajesz w wyjątku, a nie w debug toolbarze. Zapytanie jest generowane całe, a mysql stwierdza, że w zapytaniu jest błąd i pokazuje w którym miejscu. Jeśli w zapytaniu nie byłoby błędu to w całości pokazałoby się w debug toolbarze. Nie wiem jak inaczej Ci to wytłumaczyć.
Go to the top of the page
+Quote Post
masterix
post 2.04.2009, 17:30:09
Post #7





Grupa: Zarejestrowani
Postów: 93
Pomógł: 0
Dołączył: 7.09.2004

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


Odnośnie tego zapytania: jak zakomentowałem rzucanie wyjątku w bloku catch() to widziałem to zapytanie w debug toolbarze więc tu tłumaczyć mi nie musisz - wiem co widziałem smile.gif i nadal twierdzę, że to było w debug a nie w treści wyjątku.

Ale to ma mniejsze znaczenie teraz. Prawdopodobnie faktycznie błąd był gdzie indziej i teraz jak zmieniłem na samo ->save() to już jest ok więc mieliście rację. Pewnie błąd poprawiłem przy okazji jakiejś innej zmiany kodu.

Dzięki za odpowiedzi i pomoc smile.gif

pzdr.
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 Wersja Lo-Fi Aktualny czas: 26.06.2025 - 12:32