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

[duvida]novas postagens


lucas1407

Pergunta

estou fazendo um sisteminha de fórums e na lista dos tópicos eu quero que fica atualizado as novas postagens. o tópico mais recente fica em primeiro e assim vai..

eu fiz colocar na ordem decrescente dos ids e deu certo, mas eu quero que fique atualizado tanbém o tópico que teve uma RESPOSTA mais recente, mas eu não quero que fique a lista das respostas, apenas a lista dos tópicos. alguém pode me ajudar?

vlw

Link para o comentário
Compartilhar em outros sites

Posts Recomendados

  • 0

svjets, eu pensei em fazer isso mas assim cria um outro problema:

assim vai aparecer várias vezes o mesmo tópico. E eu só quero que apareça um.

William, eu quero fazer uma lista dos tópicos que estão no banco de dados e que a ordem dos tópicos seja a ordem de novas postagens.

o tópico que tevce a reposta mais recente fica em primeiro, a q foi a penúltima em 2° e assim vai..

meu código:

function list_topics()
{
    $sql = "SELECT * FROM ".TABLE_SQL." WHERE id_forum=".id_forum." AND definition = 1 AND status = 1 ORDER BY `post` DESC ";
    $result = mysql_query($sql);

    while($row = mysql_fetch_array($result))//pagination poe array
    {
        $id_topic = $row["id_topic"];
        $id_forum = $row["id_forum"];
        $title = $row["title"];
        $query_sql = mysql_query("SELECT * FROM ".TABLE_SQL." WHERE id_topic=".$id_topic." AND definition = 2 AND status = 1");
        $answers = mysql_num_rows($query_sql);

        $table_topics = '<tr class="row">
        <td><a href="view_topic.php?f='.id_forum.'&t='.$id_topic.'">'.$title.'</a></td><td>'.$answers.'</td>
        </tr>';

        echo $table_topics;
    }
    echo "<br />";
}

Link para o comentário
Compartilhar em outros sites

  • 0

ghs_, você tem razão. Mas existem algumas formas de contornar este problema. A primeira que me veio à cabeça seria criar um array onde você vai inserindo os ids dos tópicos que já foram escritos no banco e fazer a verificação do id do tópico da resposta encontrada e, caso conste este id no array, não escrevê-lo. Mais ou menos assim:

$i=0;
$j=0;
$resp_desc=mysql_query("select id_topico from respostas order by data_resposta desc");
while($res = mysql_fetch_array($resp_desc))
{
  $ctrl=false;
  while($j<$i)
  {
    if($topico_escrito[$j] == $res['id_topico'])
    {
      $ctrl=true;
    }
    $j++;
  }
  if(!$ctrl)
  {
    //escreve o nome do tópico ou o que você quiser
  }
  $topico_escrito[$i]=$res['id_topico'];
  $i++;
}

Sei lá, foi o que veio em mente, talvez tenha como fazer mais fácil, rs.

Link para o comentário
Compartilhar em outros sites

  • 0

Cara, eu criei um array ($topico_escrito[]) onde vou armazenando os ids dos tópicos que já foram lidos/escritos e verifico com o id do tópico de cada resposta que é lida do bd. Se este tópico já foi lido/escrito ele seta a variável ($ctrl) como true. Se $ctrl for true, não escreve nada, se for false, escreve. Sendo que a condição false é a padrão.

Link para o comentário
Compartilhar em outros sites

  • 0

svjets a estrutuura é a seguinte:

1.post | 2.id_forum | 3.id_topic | 4.title | 5.text | 6.date | 7.definition

  1. id do post, é o que a cada novo item inserido aumenta um
  2. id do fórum que foi criado
  3. id do tópico que é um número aleatório, se for uma resposta, o id é do tópico em que foi criado
  4. título
  5. texto
  6. data no formato: dd/mm/aaaa
  7. definição: 1 para tópico 2 para resposta
Link para o comentário
Compartilhar em outros sites

  • 0

Então, basta usar o cógigo que havia sugerido:

$i=0;
$j=0;
$resp_desc=mysql_query("select id_topic from tabela order by date desc");
while($res = mysql_fetch_array($resp_desc))
{
  $ctrl=false;
  while($j<$i)
  {
    if($topico_escrito[$j] == $res['id_topic'])
    {
      $ctrl=true;
    }
    $j++;
  }
  if(!$ctrl)
  {
   echo res['title'];
  }
  $topico_escrito[$i]=$res['id_topic'];
  $i++;
}

Esse código irá escrever apenas o nome do tópico por ordem decrescente de data (da mais atual para a menos antiga) sem repetir o nome do tópico.

Link para o comentário
Compartilhar em outros sites

  • 0

cara não deu certo de jeito nenhum, fiz um bilhão de mudanças e continuou sem dar certo, olha o meu código inteiro e tente editar:

$sql = "SELECT * FROM ".TABLE_SQL." WHERE id_forum=".id_forum." AND definition = 1 AND status = 1 AND level_topic = 0 OR level_topic = 5 ORDER BY `post` DESC LIMIT $begin, $amount";
    $result = mysql_query($sql);

    $c = 2;
    $numbers = array("1","2");
    
    $table_topics_normal = '<tr class="row3"><td>Tópicos do fórum</td><td></td></tr>';
    while($row = mysql_fetch_array($result))
    {
        $id_topic = $row["id_topic"];
        $id_forum = $row["id_forum"];
        $title = $row["title"];
        $index = $c % 2;
        $c++;
        $number = $numbers[$index];
        $query_sql = mysql_query("SELECT * FROM ".TABLE_SQL." WHERE id_topic=".$id_topic." AND definition = 2 AND status = 1");
        $answers = mysql_num_rows($query_sql);

        $table_topics_normal .= '<tr class="row'.$number.'">
        <td><a href="view_topic.php?f='.id_forum.'&t='.$id_topic.'">'.$title.'</a></td><td>'.$answers.'</td>
        </tr>';

        
    }
    echo $table_topics_normal;
    echo "<br />";

Link para o comentário
Compartilhar em outros sites

  • 0

Está errada sua lógica, não tenho tempod e refazê-lo hoje, só amanhã. Mas para já ir adiantando, você passou essa estrutura:

1.post | 2.id_forum | 3.id_topic | 4.title | 5.text | 6.date | 7.definition

1. id do post, é o que a cada novo item inserido aumenta um

2. id do fórum que foi criado

3. id do tópico que é um número aleatório, se for uma resposta, o id é do tópico em que foi criado

4. título

5. texto

6. data no formato: dd/mm/aaaa

7. definição: 1 para tópico 2 para resposta

Existem outros campos definidos como status e level_topic aí pergunto, eles são utilizados da mesma forma tanto para tópicos quanto para respostas? E mais, o title quando é tópico refere-se ao nome do tópico, certo? E quando é resposta, o title contém algum valor?

Link para o comentário
Compartilhar em outros sites

  • 0

A solução que encontrei e que provavelmente não é a mais simples é essa, heheh:

<?php
$sql = "SELECT * FROM ".TABLE_SQL." WHERE id_forum=".id_forum." AND definition = 1 AND status = 1 AND level_topic = 0 OR level_topic = 5 ORDER BY date DESC";
$result = mysql_query($sql);

$i=0
while($tlin = mysql_fetch_array($result))
{
  $tid[$i]=$tlin['id_topic'];
  $tforum[$i]=$tlin['id_forum'];
  $tnome[$i]=$tlin['title'];
  $tdate[$i]=$tlin['date'];
  $i++;
}

for($j=0;$j++;$j<$i)
{
  $sql = mysql_query("SELECT *,count(*) as total FROM ".TABLE_SQL." WHERE id_topic=".$tid[$j]." definition = 2 AND status = 1 ORDER BY date DESC LIMIT 1");
  if($rlin = mysql_fetch_array($sql))
  {
    $rid[$rlin['date']]=$tid[$j];
    $rforum[$rlin['date']]=$tforum[$j];
    $rnome[$rlin['date']]=$tnome[$j];
    $rtotal[$rlin['date']]=$rlin['total'];
  }
  else
  {
    rid[$tdate[$j]]=$tid[$j];
    rforum[$tdate[$j]]=$tforum[$j];
    $rnome[$tdate[$j]]=$tnome[$j];
    $rtotal[$tdate[$j]]=0;
  }
}

ksort($rid);
ksort($rforum);
ksort($rnome);
ksort($rtotal);
$ord_id=array_reverse($rid,true);
$ord_forum=array_reverse($rforum,true);
$ord_nome=array_reverse($rnome,true);
$ord_total=array_reverse($rtotal,true);

$c=0;
$table_topics_normal = '<tr class="row3"><td>Tópicos do fórum</td><td></td></tr>';
foreach($ord_id as $indice => $id)
{
  $num=2;
  if($c % 2 == 0)
  {
    $num=1;
  }
  $c++;
  $table_topics_normal .= '<tr class="row'.$num.'">
  <td><a href="view_topic.php?f='.$ord_forum[$indice].'&t='.$id.'">'.$ord_nome[$indice].'</a></td><td>'.$ord_total.'</td>
  </tr>';
}
echo $table_topics_normal;
echo "<br />";
?>

Link para o comentário
Compartilhar em outros sites

  • 0

caracas, não precisava disso tudo não cara, vou por seus créditos juntos com o sistema mesmo se eu não usar, o que eu coloco lá, me fala seu nome e outros dados que você queira por.

@ essas linhas:

ksort($rid);
ksort($rforum);
ksort($rnome);
ksort($rtotal);
$ord_id=array_reverse($rid,true);
$ord_forum=array_reverse($rforum,true);
$ord_nome=array_reverse($rnome,true);
$ord_total=array_reverse($rtotal,true);

tão dando esses erros:

Warning: ksort() expects parameter 1 to be array, null given in C:\Users\Sillas\Documents\gabriel\EasyPHP-5.3.3\www\teste\forum\view_forum.php on line 135

Warning: ksort() expects parameter 1 to be array, null given in C:\Users\Sillas\Documents\gabriel\EasyPHP-5.3.3\www\teste\forum\view_forum.php on line 136

Warning: ksort() expects parameter 1 to be array, null given in C:\Users\Sillas\Documents\gabriel\EasyPHP-5.3.3\www\teste\forum\view_forum.php on line 137

Warning: ksort() expects parameter 1 to be array, null given in C:\Users\Sillas\Documents\gabriel\EasyPHP-5.3.3\www\teste\forum\view_forum.php on line 138

Warning: array_reverse() expects parameter 1 to be array, null given in C:\Users\Sillas\Documents\gabriel\EasyPHP-5.3.3\www\teste\forum\view_forum.php on line 139

Warning: array_reverse() expects parameter 1 to be array, null given in C:\Users\Sillas\Documents\gabriel\EasyPHP-5.3.3\www\teste\forum\view_forum.php on line 140

Warning: array_reverse() expects parameter 1 to be array, null given in C:\Users\Sillas\Documents\gabriel\EasyPHP-5.3.3\www\teste\forum\view_forum.php on line 141

Warning: array_reverse() expects parameter 1 to be array, null given in C:\Users\Sillas\Documents\gabriel\EasyPHP-5.3.3\www\teste\forum\view_forum.php on line 142

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

  • 0

O errro ocorre porque a busca está retornando arrays vazios.

Antes de corrigir o problema de arrays vazios corrija isso aqui:

$sql = "SELECT * FROM ".TABLE_SQL." WHERE id_forum=".id_forum." AND definition = 1 AND status = 1 AND level_topic = 0 OR level_topic = 5 ORDER BY date DESC";
No trecho:
WHERE id_forum=".id_forum."
Creio que seja:
WHERE id_forum=".$id_forum."
Sendo que $id_forum vem de algum GET, provavelmente, certo? Porém, por mais que faça essa correção, se algum nível do fórum (determinado por id_forum) não tiver nenhum tópico criado o erro pode ocorrer também, aí seria interessante colocar um "if" para testar se existe algum dos arrays (existindo 1, os outros têm de existir também). O código corrigido seria:
<?php
$sql = "SELECT * FROM ".TABLE_SQL." WHERE id_forum=".$id_forum." AND definition = 1 AND status = 1 AND level_topic = 0 OR level_topic = 5 ORDER BY date DESC";
$result = mysql_query($sql);

$i=0
while($tlin = mysql_fetch_array($result))
{
  $tid[$i]=$tlin['id_topic'];
  $tforum[$i]=$tlin['id_forum'];
  $tnome[$i]=$tlin['title'];
  $tdate[$i]=$tlin['date'];
  $i++;
}

for($j=0;$j++;$j<$i)
{
  $sql = mysql_query("SELECT *,count(*) as total FROM ".TABLE_SQL." WHERE id_topic=".$tid[$j]." definition = 2 AND status = 1 ORDER BY date DESC LIMIT 1");
  if($rlin = mysql_fetch_array($sql))
  {
    $rid[$rlin['date']]=$tid[$j];
    $rforum[$rlin['date']]=$tforum[$j];
    $rnome[$rlin['date']]=$tnome[$j];
    $rtotal[$rlin['date']]=$rlin['total'];
  }
  else
  {
    rid[$tdate[$j]]=$tid[$j];
    rforum[$tdate[$j]]=$tforum[$j];
    $rnome[$tdate[$j]]=$tnome[$j];
    $rtotal[$tdate[$j]]=0;
  }
}

if(isset($rid))
{
  ksort($rid);
  ksort($rforum);
  ksort($rnome);
  ksort($rtotal);
  $ord_id=array_reverse($rid,true);
  $ord_forum=array_reverse($rforum,true);
  $ord_nome=array_reverse($rnome,true);
  $ord_total=array_reverse($rtotal,true);

  $c=0;
  $table_topics_normal = '<tr class="row3"><td>Tópicos do fórum</td><td></td></tr>';
  foreach($ord_id as $indice => $id)
  {
    $num=2;
    if($c % 2 == 0)
    {
      $num=1;
    }
    $c++;
    $table_topics_normal .= '<tr class="row'.$num.'">
    <td><a href="view_topic.php?f='.$ord_forum[$indice].'&t='.$id.'">'.$ord_nome[$indice].'</a></td><td>'.$ord_total.'</td>
    </tr>';
  }
  echo $table_topics_normal;
  echo "<br />";
}
?>

Testa aí pra ver se dá certo.

Quanto aos créditos, não se faz necessário. ;)

Link para o comentário
Compartilhar em outros sites

  • 0

Ok, então é só deixar id_forum sem o "$". Vi um erro, onde está:

else
  {
    rid[$tdate[$j]]=$tid[$j];
    rforum[$tdate[$j]]=$tforum[$j];
    $rnome[$tdate[$j]]=$tnome[$j];
    $rtotal[$tdate[$j]]=0;
  }
Substituir por:
else
  {
    $rid[$tdate[$j]]=$tid[$j];
    $rforum[$tdate[$j]]=$tforum[$j];
    $rnome[$tdate[$j]]=$tnome[$j];
    $rtotal[$tdate[$j]]=0;
  }

Nesse caso eu deixei de colocar o "$", heheh. Se ainda assim não retornar um array, tem que verificar as condições de busca, se estão corretas ou não.

Link para o comentário
Compartilhar em outros sites

  • 0

Depois de:

while($tlin = mysql_fetch_array($result))
{
  $tid[$i]=$tlin['id_topic'];
  $tforum[$i]=$tlin['id_forum'];
  $tnome[$i]=$tlin['title'];
  $tdate[$i]=$tlin['date'];
  $i++;
}
coloque:
echo $i;
exit;

Só pra saber se é gerado alguma resposta da primeira pesquisa. Se for > ou igual a 1, deveria funcionar.

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