Jump to content


Photo

Querys Em Sequencia


  • Faça o login para participar
3 replies to this topic

#1 Pedropauloalmeida

Pedropauloalmeida

    Fale ao motorista somente o indispensável

  • Usuários
  • 1376 posts
  • Sexo:Masculino
  • Localidade:Santo André SP

Posted 28/10/2008, 19:35

Caros.

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

#2 boirock

boirock

    Tecnologia para todos (agora hexa campeão)

  • Usuários
  • 1559 posts
  • Sexo:Masculino
  • Localidade:Curitiba - PR
  • Interesses:PostgreSQL - PHP

Posted 28/10/2008, 21:33

:ponder:
Pedropaulo... não dava pra usar um único UPDATE?
UPDATE tabela SET ordem = ordem-1 WHERE ordem > $ordemDoRegistroDeletado


Mas me parece que seu script deveria funcionar, de qualquer maneira... tem certeza que $ordem tem o valor correto?

#3 dddj

dddj

    Normal

  • Usuários
  • 112 posts
  • Sexo:Masculino
  • Localidade:Campo Grande

Posted 29/10/2008, 08:11

Eu acho que do jeito que o boirock falou seria um jeito legal de resolver mas se for fazer do jeito que vc está falando coloca um condição no seu UPDATE:

$upper	 = "UPDATE fotos SET fot_ordem = ". $newOrdem  ." WHERE fot_id = ". $idAlvo . " AND fot_ordem >".$ordem.";";

Acho que da certo .
Djavan Loureiro - SEO Marketing - Search Engine Optimization - Otimização de Sites
Coloque seu site no topo dos sistemas de busca - Projeto SEM - Visitem o site.

#4 Pedropauloalmeida

Pedropauloalmeida

    Fale ao motorista somente o indispensável

  • Usuários
  • 1376 posts
  • Sexo:Masculino
  • Localidade:Santo André SP

Posted 29/10/2008, 08:20

Olha só, hein?

Ótimas sugestões. Vou testar assim que puder e posto o resultado, editando aqui o post.

Abraços.

pp




0 user(s) are reading this topic

0 membro(s), 0 visitante(s) e 0 membros anônimo(s)

IPB Skin By Virteq