GUJ Discussões   :   últimos tópicos   |   categorias   |   GUJ Respostas

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


#1

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. 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.


#2

Cara, não manjo de PHP, mas tenho um palpite sobre isso... o problema deve ser com o $next_row['id'] que deve estar retornando nulo, já que quando você está no último registro não existe um próximo... Para ter certeza disso experimente testar isoladamente os valores desses dois caras ... o $next_row['id'] e o $current_row['id']


#3

Crie uma variável para armazenar o identificador da linha anterior.

$id = -1; // Um valor que nunca vai existir no banco
while($row = mysql_fetch_array($result)) {
  $currentId = $row["id"];
  if($id == -1) {
    // Primeiro registro lido
  } else {
    if($id != $currentId) {
      // ID diferente, adicione a quebra
    }
    else {
      // Mesmo ID,  liste os dados
    }
  }
  $id = $currentId;
}

Dependendo do caso vc pode armazenar toda a linha anterior numa variável.

$oldRow = null;
while($row = mysql_fetch_array($result)) {
  if($oldRow == null) {
    // Primeiro registro lido
  } else {
    if($oldRow["id"] != $row["id"]) {
      // ID diferente, adicione a quebra
    }
    else {
      // Mesmo ID,  liste os dados
    }
  }
  $oldRow = $row;
}

#4

posto em 2 forum essa duvida :stuck_out_tongue:
http://forum.imasters.com.br/topic/454072-ler-o-proximo-registro-em-uma-query-mysql-no-php/


#5

Pessoal (lsjunior e ADEMILTON) agradeço a atenção e ajuda.

Tentei implementar a solução do lsjunior no meu problema mas não obtive sucesso.

Pelo pouco que encontrei na net, parece que a solução passa pelo uso do 'isset'... pelo que entendi, seria algo como na comparação entre o registro atual e o próximo:

if (isset($proximo) && $proximo != $atual)

Mas não consegui avançar muito além disso.

Será que o caminho é por ai mesmo?


#6

AAAFFFF....

Isso daí é uma POG, padrão XGH.

O jeito certo é fazer com ORM!


#7

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 ?>";
  }

#8