Ir para conteúdo
Fórum Script Brasil
  • 0

(Resolvido) While não exibe o primeiro registro


CarlosFreire

Pergunta

:blush: Antes, desculpas pela aparente simplicidade da pergunta. Sou iniciante em php, mas com muito boa experiência em asp, e não consigo ver onde está o erro. Procurei mas não encontrei menção parecida em fórum php algum (Imasters, por exp.).

O código é um simples while:

no cabeçalho, criando a consulta (a $con está definida em um include):

$sql = "select id, nome, site, ano from ClientesT where exibir='S' order by nome";

$Rs1 = mysql_query($sql,$con) or die(mysql_error());

$result1 = mysql_fetch_array($Rs1);

$total1 = mysql_num_rows($Rs1);

no body, respondendo:

<?php while($result1 = mysql_fetch_array($Rs1)) { ?>

<p><?php echo "<a href=# onClick=showInfos('".$result1['id']."&tabela=ClientesT')>".$result1['nome']."</a>"; } ?></p>

O erro: o loop somente responde a partir do segundo registro, seguindo corretamente até o final.

Para corrigir, tive que reescrever a resposta assim:

<p><?php echo "<a href=# onClick=showInfos('".$result1['id']."&tabela=ClientesT')>".$result1['nome']."</a>"; ?></p>

<?php while($result1 = mysql_fetch_array($Rs1)) { ?>

<p><?php echo "<a href=# onClick=showInfos('".$result1['id']."&tabela=ClientesT')>".$result1['nome']."</a>"; } ?></p>

Ou seja, chamando “manualmente" o primeiro registro e a seguir o loop. Obviamente, fiquei intrigado, ainda mais se comparando ao do while do asp, onde nunca precisei de “gatilho” parecido.

Alguma luz?

Editado por CarlosFreire
Link para o comentário
Compartilhar em outros sites

4 respostass a esta questão

Posts Recomendados

  • 0

Oi ESerra, obrigado pela resposta.

Como estou refazendo algumas coisas no código inicial que postei, segue abaixo então outro código, tão simples quanto, de outra página (mas “completo” no que diz respeito ao loop). Vale observar que este comportamento estranho acontece em todas as páginas do site onde tem while.

//arquivo de conexão:

<?

$str = "Conexão com o banco falhou!/Não foi possível selecionar o banco de dados!";

$erro = explode("/",str);

$con = mysql_connect(“mysql.meudb”,”meulogin”,”minhasenha”) or die($erro[0]);

mysql_select_db(“meudb”, $con) or die($erro[1]);

$msg = $_REQUEST["msg"];

mysql_set_charset('utf8’);

?>

//cabeçalho php da página

<?php require_once('conn.php');

$sql = "SELECT nome, site, ano FROM Clientes WHERE exibir = 'S' order by ano desc";

$Rs = mysql_query($sql,$con) or die(mysql_error());

$row_Rs = mysql_fetch_array($Rs);

$totalRows_Rs = mysql_num_rows($Rs);

?>

//body

<p>&rArr;&nbsp;&nbsp;<?php echo "<a href=.$row_Rs['site]. ">".$row_Rs['nome']."</a>"; ?></p> //linha “gatilho"

<?php while($row_Rs = mysql_fetch_array($Rs)) { ?>

<p>&rArr;&nbsp;&nbsp;<?php echo "<a href=.$row_Rs['site]. ">".$row_Rs['nome']."</a>"; ?></p>

<?php } ?>

No banco de dados tenho 15 registros na condição da consulta. Se deixo apenas o while, a consulta retorna 14 registros (omite o primeiro).

Editado por CarlosFreire
Link para o comentário
Compartilhar em outros sites

  • 0

Observe que no cabeçalho da página, logo após a query você chama o primeiro resultado da consulta:

$Rs = mysql_query($sql,$con) or die(mysql_error()); <- Consulta

$row_Rs = mysql_fetch_array($Rs); <- Primeiro resultado

Depois que você chama o primeiro resultado a consulta avança o ponteiro para o segundo e por isso que no while exibe a partir do segundo resultado, ele não reinicia a cada vez que é chamado, neste caso você terá que usar o mysql_data_seek para voltar o ponteiro para o primeiro resultado, ou seja:

$Rs = mysql_query($sql,$con) or die(mysql_error()); <- Consulta

$row_Rs = mysql_fetch_array($Rs); <- Primeiro resultado

mysql_data_seek($Rs, '0'); <- Retorna o ponteiro para o primeiro resultado.

Link para o comentário
Compartilhar em outros sites

  • 0

:blush: Ooops… acho que me candidatei a esporro do Hitler (enquadra tb. quem faz a procura de forma errada?).

Mas, ao menos, uma boa conclusão tirei: pensar em como faço atualmente no asp para entender o php ajuda, mas… com um pé atrás, sempre!

Apenas eliminei a chamada ao primeiro registro (compartilho este erro com o asp e seu mínimo de 3 linhas para abrir uma consulta). Assim, o while vem corretamente, sem precisar reiniciar a consulta com o data_seek.

Acho que vale colocar o resultado “final” da ajuda aqui do post. Um jeito bem fácil e simples de abrir div’s com informações mais detalhadas de um registro usando 5 linhas de javascript básico. O link rel não vem ao caso, é jquery abrindo/fechando outras div’s, chamando página de update, etc.).

As div’s chamadas pelo javascript não podem ter display algum no css.

//java
function verInfo(valor) {
document.getElementById(""+valor+"").style.display = "block";
}
function fecharInfo(valor) {
document.getElementById(""+valor+"").style.display = "none";
}

//body
<?php If (!empty($Rs2));{
    while($result2 = mysql_fetch_array($Rs2)) { ?>
    <p>
      <input type="checkbox" name="check[]" value="<?php echo $result2['id']?>" style="margin-right:5px" />
      <a href="#" onClick="verInfo('info<?php echo $result2['id'];?>');"><span>+</span></a>&nbsp; <a href="#" id="edita" rel="edita.php?id=<?php echo $result2['id']?>&tabela=Infos"><?php echo $result2['titulo']; ?></a></p>
    <div id="info<?php echo $result2['id'];?>" style="display:none; margin:5px 0">
      <p><?php echo str_replace("\r","<br>",$result2['texto']);?></p>
      <p><a href="#" onClick="fecharInfo('info<?php echo $result2['id'];?>');"><span>-</span></a></p>
    </div>
    <?php }} ?>

Editado por CarlosFreire
Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,2k
    • Posts
      652k
×
×
  • Criar Novo...