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

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.

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…

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.

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

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.

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:

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