[php+mysql+zend] Nieoczekiwane działanie zapytania UPDATE


(Raul1993) #1

Witam

Mam pewien problem. Oto kod:

// pobieram z bazy rekord o podanym id

        $select = $this->sites_db_table->select();

        $select->where('id = ?', $site_id);                                  

        $cur_pos = $this->sites_db_table->fetchRow($select);


// pobieram z bazy rekord, którego pozycja jest niewiększa niż pozycja rekordu uzyskanego w poprzednim zapytaniu i nie jest równa -1

        $select = $this->sites_db_table->select();

        $select->where('menu_gorne_poz < ?', $cur_pos->menu_gorne_poz);

        $select->where('menu_gorne_poz != ?', -1);

        $select->order('menu_gorne_poz DESC');

        $select->limit(1,0);

        $new_pos = $this->sites_db_table->fetchRow($select);


// updatuje uzyskany wyżej rekord ustawiając jego pozycje na -1

        $where = $this->sites_db_table->getAdapter()->quoteInto('id = ?', (int)$new_pos->id);

        $data = array('menu_gorne_poz' => -1);

        $this->sites_db_table->update($data,$where);

Problem polega na tym, że mimo iż w bazie wartości id się nie powtarzają ( co jest oczywiste) to zupdatowane zostają czasem dwa rekordy zamiast jednego :confused:

PS. Nie zwracajcie uwagi na sensowność operacji, bo kod, który Wam przedstawiłem jest maksymalnie uproszczony, żeby nie zaciemniać sprawy jakimiś zbędnymi szczegółami. W rzeczywistości robi on co innego, ale problem jest ten sam co w wyżej przedstawionym kodzie.


(M@ster) #2

Moja rada, zrzuć sobie gdzieś jakie zapytanie się faktycznie wykonuje, w czystym SQL, bo widzę że korzystasz z klasy ZENDa do obsługi bazy i być może wygenerowane zapytanie jest inne niż Ci się wydaje. Ja osobiście używam innego frameworka który też ma coś podobnego i czasami warto zobaczyć co faktycznie idzie do MySQLa. Wklej te zapytania w takiej czystej postaci jak możesz...


(Raul1993) #3

Napisałem zapytania samemu i wysłałem przez funkcję Zenda fetchAll() do bazy. Nie wydaje mi się, żeby ta funkcja modyfikowała w jakiś sposób zapytania, ale sprawdziłem to w FirePHP(swoją drogą świetne narzędzie) i wszystko wydaje się być w porządku:

UPDATE podstrony SET menu_gorne_poz='-1' WHERE id=34;

Mimo to często aktualizuje dwa rekordy zamiast jednego.


(M@ster) #4

No jeśli id jest kluczem podstawowym to nie jest to możliwe przy tym warunku where.


(Raul1993) #5

Id jest kluczem podstawowym. Tym bardziej dziwi mnie efekt :confused: Nie mam pojęcia co jest grane, a najgorsze w tym jest to, że przez taką głupotę stanąłem z projektem.


(M@ster) #6

A ten drugi wpis który się przy okazji modyfikuje jaki ma ID? Coś mi się w to wierzyć nie chce, nie wykonują Ci się tam przypadkiem 2 zapytania albo coś w tym guście? Nie ma możliwości aby MySQL się "pomylił" w takiej rzeczy :slight_smile:


(Raul1993) #7

No i wykryłem usterkę... Po wykonaniu powyższego kodu w pewnym miejscu przekierowywałem stronę za pomocą zendowskiej funkcji _forward(). Po zmianie jej na _redirector(), wszystko działa jak należy.

Pozdrawiam