Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [Symfony] Propel obcina zapytanie
Forum PHP.pl > Forum > PHP > Frameworki
masterix
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.
mike
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. ?>
masterix
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
destroyerr
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.
masterix
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.
destroyerr
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ć.
masterix
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.
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.