Tenho um sistema em PHP que gerencia uma galeria de imagens. Nesse sistema eu tenho uma classe model. Esta classe, entre outras coisas, tem um método que vai gerenciar a "ordem" de exibição das imagens nas views. A classe, para isso, recebe os seguintes parâmetros:
id -> o id do registro no banco da foto
sentido -> se a view solicitou que a foto fosse ordenada mais acima ou mais abaixo
ordem -> a posição em que ela se encontra no momento dessa solicitação.
Fazer a troca de posição entre uma foto "a" com a foto "b" logo acima ou abaixo não é problema. Funciona tudo bem.
Meu problema está quando eu excluo uma foto. Vamos supor que eu tenha 5 fotos com posições de 1 a 5:
id posição
1 - 1
2 - 2
3 - 3
4 - 4
5 - 5
Aí resolvo excluir a foto de posição 2 por exemplo. Então tenho que pegar as fotos com posição maior do que dois e diminuir em '1' sua posição, ficando algo como:
id posição
1 - 1
3 - 2
4 - 3
5 - 4
O problema é que parece que as querys estão se perdendo ou se misturando conforme solicito isso ao server.
Abaixo o método:
function ordemByDelete($ordem) { $query = "SELECT * WHERE fot_ordem > ". $ordem; // solicito à super que chame a query com os registros com ordem > do que a ordem da foto escolhida: $linhas = $this->db->query($query); //$this->db->select('*')->from('fotos')->where('fot_ordem > ', $ordem); //$linhas = $this->db->get(); echo "rows: " . count($linhas->result()); $upper = ""; foreach($linhas->result() as $row) { $newOrdem = $row->fot_ordem - 1; $idAlvo = $row->fot_id; echo "id: ". $row->fot_id . " ordem: " . $row->fot_ordem . " e vai para ordem " . $newOrdem . "<br>"; $upper = "UPDATE fotos SET fot_ordem = ". $newOrdem ." WHERE fot_id = ". $idAlvo . ";"; echo "query: " . $upper . "<br>--------------------<br>"; $update = $this->db->query($upper); } }
Notem que tento atualizar as posições dentro do foreach. Alguma sugestão melhor ?
O resultado da query é que ele em vez de diminuir '1' apenas nos registros com ordem maior que o parâmetro $ordem, o PHP está alterando a ordem em todos os registros (!!!). E o mais estranho é que quando eu dou um echo da quantidade de registros da query $linhas->result() ele define o número exato de vezes que o foreach deve rodar. Mas altera-se todos os registros da tabela.
Então o que estou obtendo, ainda no exemplo de excluir o registro de ordem 2 acima, é:
id posição
1 - 0
3 - 2
4 - 3
5 - 4
Note que no registro de id 1, a ordem fica com valor '0'. Mas isso não deveria acontecer, já que apenas os registros de ordem > 2 deveriam ser afetados.
Aguardo sugestões, galera.
Valeu.
pp
Ah! $this->db é a super da classe. Esse sistema está sendo desenvolvido com o framework Code Igniter.
Nesse caso ele faz apenas uma chamada mysql_query.
Abraços
pp