Ir para o conteúdo

Publicidade

 Estatísticas do Fórum

  • 0 Usuários ativos

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

Cursos Online iMasters
Foto:

Ler o próximo registro em uma query MySQL no PHP

  • Por favor, faça o login para responder
4 respostas neste tópico

#1 Bootstrap

Bootstrap
  • Membros
  • 5 posts

Postado 12 janeiro 2012 - 03:20

Oi, pessoal,

Eu tenho esse código em PHP
$sql = "Select * from..."
 $result = mysql_query($sql,$connection);
 while ($row = mysql_fetch_array($result)) {
 ......
 }


O que eu estou precisando é conseguir ler o próximo registro dentro do laço para fazer a comparação com o registro atual. Por exemplo:
while ($row = mysql_fetch_array($result)) {
 ......
 if (ID DO PRÓXIMO RECORD != ID DO ATUAL RECORD) {
faça-alguma-coisa
 }
 }

O resultado que estou buscando é algo como:

Produto 1
Produto 1
<quebra de linha ou qualquer outra ação>
Produto 2
Produto 2
Produto 2
Produto 2
<quebra de linha ou qualquer outra ação>

Eu cheguei bem próximo da solução usando o código abaixo que encontrei na net, o único problema é que o último registro da query é sempre ignorado (não entra no while):
$current_row=mysql_fetch_array($result); //read $current_row
 while ($next_row = mysql_fetch_array($result)) { //read $next_row
 ......
 if ($current_row['id']!=$next_row['id']) { //compare it
 .....
 .....
 }
 $current_row=$next_row; //$next_row become current_row on next step 
}

travei forte nesse problema e agradeço qualquer ajuda.

Editado por Bootstrap, 12 janeiro 2012 - 03:24 .

  • 0

#2 Andrey Knupp Vital

Andrey Knupp Vital

    Web Developer

  • Moderadores
  • 4.433 posts

Postado 12 janeiro 2012 - 08:55

Dessa forma que você está fazendo, não vai dar certo, tente assim:
<?php
	
	while ( $fetch = mysql_fetch_array ( $result ) ) {
		$all [ ] = $fetch ;
	}

	$i = 1 ;
	while ( $data = mysql_fetch_array ( $result ) ) {
		$next = $all [ $i ] ;

		if ( $data [ 'id' ] != $next [ 'id' ] ) {
			// ...
		}
		++ $i ;		
	}

É mesma coisa que você fazer isto :
<?php
	for ( $i = 0 ; $i < 15 ; ++ $i ) {
		$all [ ] = $i ;
	}

	foreach ( $all as $k => $v ) {

		$next = ( $k + 1 ) ;
		if ( isset ( $all [ $next ] ) ) {
			// tem próximo 
			// próximo : atual
			echo $all [ $next ] , ': ' , $v , PHP_EOL ;
		}		

	}

Editado por Andrey Knupp, 12 janeiro 2012 - 08:59 .

  • 0

#3 Bootstrap

Bootstrap
  • Membros
  • 5 posts

Postado 12 janeiro 2012 - 11:30

Olá, Andrey

Muito obrigado pela atenção e ajuda.

Infelizmente, eu não consegui implementar a sua solução para o meu problema (não consegui entender a lógica).
Andei pesquisando e encontrei que a solução provavelmente envolve o uso do operador isset... algo como:

if (isset($proximo) && $proximo != $atual){  //compare it

Mas também não consegui avançar muito com essa parte.

Será que o caminho pode ser esse?
  • 0

#4 Andrey Knupp Vital

Andrey Knupp Vital

    Web Developer

  • Moderadores
  • 4.433 posts

Postado 12 janeiro 2012 - 12:17

Certo, primeiro você aplica um fetch, coloca todos os registros em um ARRAY:
<?php
        
        while ( $fetch = mysql_fetch_array ( $result ) ) {
                $all [ ] = $fetch ;
        }

Depois, você pode ou não fazer outro fetch, só que estaria utilizando um contador, que nesse caso, serve para pegar a linha no array $all, com esse contador ( sabendo que o array é incrementado sucessivamente 1 , 2 , 3 , 4 , 5 ) , iniciamos em 1 , pois quando um array é populado da forma que eu fiz, começa em 0 , só que, se eu começar em 1, o que vai acontecer, na hora de iterar, o loop estaria em ( 0 , 1 , 2 , 3 , 4 , 5 ) , e o contador em ( 1 , 2 , 3 , 4 , 5 , 6 ) , daí só verificar com o isset, se existe esse índice setado, que no caso é o próximo ..

Para evitar de fazer outro fetch, você pode simplesmente fazer desta forma:
<?php
        
        while ( $fetch = mysql_fetch_array ( $result ) ) {
                $all [ ] = $fetch ;
        }

	if ( is_array ( $all ) ) {
		foreach ( $all as $i => $data ) {
			$next = ( $i + 1 ) ; 
			if ( isset ( $all [ $next ] ) ) {
				// tem próximo
				$_next = $all [ $next ] ;
				if ( $_next [ 'id' ] != $data [ 'id' ] ) {
					// diferente
				} else {
					// igual
				}
			} // não tem próximo
		}
	}

dá uma olhada no exemplo em prática :seta: http://ideone.com/Ozm4p ..
<?php
        
        $all = array ( ) ;
	array_push ( $all , 1 , 2 , 3 , 4 , 5 , 6 ) ;  

	// pra cada item em $all, será atribuido $i ( índice ) = $v ( valor ) 
	foreach ( $all as $i => $v ) {
		echo 'Current: ' , $v , PHP_EOL ; 
		$_i = ( $i + 1 ) ; // próximo índice
		if ( isset ( $all [ $_i ] ) ) { // tem próximo
			$next = $all [ $_i ] ; 
			echo 'Next: ' , $next , PHP_EOL ;
		}

	}

Editado por Andrey Knupp, 12 janeiro 2012 - 12:23 .
Adicionar fragmento de código

  • 0

#5 Bootstrap

Bootstrap
  • Membros
  • 5 posts

Postado 13 janeiro 2012 - 13:57

Oi, pessoal,

O usuário mikosiko do forum http://forums.devnetwork.net me passou o código que resolve perfeitamente o problema. Estou postando aqui para caso algum dia alguém precise.
// Example
  $heading_column = '<whatever is the name of your heading column>';
  $last_heading = null;
 
  while($row = your_fetch_assoc_statement){
		// detect a change in the heading value and output the new heading
		if($last_heading != $row[$heading_column]){
				// detect if it is not the first heading - close out the previous section
				if($last_heading != null){
						// your code to close the previous section (table, div, etc)...
						echo "close section<br />";
				}
				// output the new heading here...
				echo "new section title - {$row[$heading_column]}<br />";
 
				// save the new heading as the last_heading
				$last_heading = $row[$heading_column];
		}
		// output the actual data here...
		echo "data - {$row['your_data']}<br />";
  }
  // if there was any output - close out the last section
  if($last_heading != null){
		// your code to close the previous section (table, div, etc)...
		echo "close section<br ?>";
  }

  • 0




Publicidade

/ins>