+2

Um fórum simples em PHP/MySQL

criado por Rodrigo Romano Moreira em 29/08/2002 10:24pm
O script responsável para inserir as mensagens no fórum , é trata.php :

<?php
include
"./config.php";

$conn
= mysql_connect($host, $user, $password);
mysql_select_db
($database);

$consulta
= "SELECT COUNT(*) as total FROM msg WHERE pai='0'";
$quantidade
= mysql_query($consulta, $conn);
$total
= mysql_result($quantidade, 0, "total"); // Recebe o numeros de topicos no forum
$total
++;

/*
Se o _$POST[´topico´] tem um valor nulo ,cria um novo topico.
Senão adiciona mais uma mensagem ao topico.
*/

if ($_POST['topico'] == "") {
    $topico
= $total;
} else {
    $topico
= $_POST['topico'];
} // Fim if

$nome
= $_POST['nome'];
$email
= $_POST['email'];
$titulo
= $_POST['titulo'];
$mensagem
= $_POST['mensagem'];
$pai
= $_POST['pai'];
$data
= date("d/m/Y  H:i:s");;
$str
= "INSERT INTO `msg` (`autor`, `email`, `titulo`, `mensagem`, `data`, `pai`, `topico`, `resposta`) VALUES ('$nome', '$email', '$titulo', '$mensagem', '$data', '$pai', '$topico', '$resposta')";
if (!mysql_query($str,$conn)) {
    echo mysql_error
();
} // Fim if
mysql_close
($conn);
?>
<html><head>
<meta HTTP-EQUIV="Refresh" CONTENT="0;URL=topicos.php">
</head>
</html>

        Depois de inseridas as mensagens, você precisa listar as mensagens:
           A forma que eu escolhi foi na forma de correntes, igual ao fórum do PHPBrasil.com.
        Só que comecei a quebrar a cabeça. Como ia criar as correntes ?
           A idéia que eu tive foi criar uma função recursiva e array bidimensional que é passado por referência.
        Notei que há sete possibilidades principais para correntes, as outras são combinações:
        *n.gif - Mensagem inicial sem filhos.
        *m.gif - Mensagem com filhos
        *c.gif - Mensagem sem filhos.
        *t.gif – Filho do meio.
        *l.gif – Filho caçula.
        *i.gif – Neto de filho do meio.
        *trans(2).gif(Transparente) – Neto de filho caçula.

%imagem%
 
        Chamei esse array de $hist. As posições $hist[0] e $hist[1], para filho do meio. $hist[2] e $hist[3] para filho caçula. Tudo isso esta no código func.php:

<?php
/*
Função prox_nivel ,retorna uma corrente com as mensagens.

$conn variavel para conexao no mysql
$pai  variavel que informa  o pai da mensagem
$topico variavel que informa o topico
$irmao variavel que informa quantos irmaõs s mensagem tem
$hist  variavel com historia das correntes
$cont  variavel com a possição do array
$mesg  variavel contendo as mensagens
*/

function prox_nivel($conn, $pai, $topico, $irmao, $hist, &$cont, &$mesg)
{
    $val
= 1; //Posição em na hieraquia dos filhos
   
if ($pai == 0) {
        $query
= "SELECT * FROM msg WHERE (pai=\"0\" AND topico=$topico)";
   
} else {
        $query
= "SELECT * FROM msg WHERE  pai=\"$pai\" ORDER BY `codigo` ASC";
   
}
    $consulta
= mysql_query($query, $conn);
   
while ($linha = mysql_fetch_row($consulta)) {
        $consulta2
= "SELECT COUNT(*) as total FROM msg WHERE pai='$linha[0]'";
        $quantidade
= mysql_query($consulta2, $conn);
        $total
= mysql_result($quantidade, 0, "total");
       
/*
          $total igual a 0 ,a mensagem não tem filhos
        */

        $x
= 0;
        $y
= 1;
       
/*
          Se $val igual $irmao ,filho caçula.
        */

       
if ($val == $irmao) {
            $x
= 2;
            $y
= 3;
       
}
        $titulo
= "Re:$linha[3]";
        $xhist
[0] = $hist[$x];
        $xhist
[1] = $hist[$y];
        $mesg
[$cont][1] = " <a href=\"./ler.php?pai=$linha[0]&titulo=$titulo&topico=$linha[7]&codigo=$linha[0]#mesg\">$linha[3]</a>";
        $mesg
[$cont][2] = $linha[1];
        $mesg
[$cont][3] = $linha[5];
        $mesg
[$cont][4] = $linha[4];
       
if ($total == 0) {
           
if ($xhist[0] == "<img src=\"trans(2).gif\" width=\"12\" height=\"21\">") {
                $mesg
[$cont][0] = "$xhist[0]<img src=\"n.gif\">";
                $cont
++;
           
} else {
                $mesg
[$cont][0] = "$xhist[0]<img src=\"c.gif\">";
                $cont
++;
           
}
       
} else {
            $mesg
[$cont][0] = "$xhist[0]<img src=\"m.gif\">";
            $cont
++;
           
/*
              Possibilidades de images no proximo nivel,armazenadas em $newhist
            */

            $newhist
[0] = "$xhist[1]<img src=\"t.gif\">";
            $newhist
[1] = "$xhist[1]<img src=\"i.gif\">";
            $newhist
[2] = "$xhist[1]<img src=\"l.gif\">";
            $newhist
[3] = "$xhist[1]<img src=\"trans(2).gif\" width=\"12\" height=\"21\">";
            prox_nivel
($conn, $linha[0], "", $total, $newhist, $cont, $mesg);
       
}
        $val
++;
   
}
}
?>


Para listar as mensagens em forma de corrente e só o topicos.php:

<?php
include
"./config.php";
include
"./func.php";

$conn
= mysql_connect($host, $user, $password);
mysql_select_db
($database);

/*
$hist isso da corrente.
*/

$hist
[0] = "<img src=\"trans(2).gif\" width=\"12\" height=\"21\">";
$hist
[1] = "<img src=\"trans(2).gif\" width=\"12\" height=\"21\">";
$hist
[2] = "<img src=\"trans(2).gif\" width=\"12\" height=\"21\">";
$hist
[3] = "<img src=\"trans(2).gif\" width=\"12\" height=\"21\">";

$consulta
= "SELECT COUNT(*) as total FROM msg WHERE pai='0'";
$quantidade
= mysql_query($consulta, $conn);
$total
= mysql_result($quantidade, 0, "total");
$cont
= 0;

/*
Listas as correntes.
*/

for ($i = $total; $i != 0; $i--) {
   prox_nivel
($conn, 0, $i, $total, $hist, $cont, $mesg);
} // Fim for
mysql_close
($conn);
?>
<p><a href="./form.php">Novo Tópico</a></p>
<table  cellSpacing="0" cellPadding="0" width="100%"
border="0">
 
<tr>
   
<td  bgColor="#99cc99"><font color="#000000"> Tópicos</font></td>
   
<td  noWrap width="150" bgColor="#99cc99"><font
     
color="#000000">Autor </font></td>
   
<td  noWrap width="150" bgColor="#99cc99"><font
     
color="#000000">Data</font></td>
 
</tr>
<?
$cor
= 1; // Variavel responsavel pelas cores alternadas
for ($i = 0; $i < $cont; $i++) {
   $cor
= -$cor;
   
if ($cor == -1) {
      $strcor
= "#E6FFE6";
   
} else {
      $strcor
= "#FFFFD7";
   
} // Fim if
?>
 
<tr vAlign="center">
    <td bgColor=
<?=$strcor;?>>
     
<table cellSpacing="0" cellPadding="0" border="0">
       
<tbody>
         
<tr >
            <td bgColor=
<?=$strcor;?>><?=$mesg[$i][0];?></td>
            <td bgColor=
<?=$strcor;?>><font color="#000000"><?=$mesg[$i][1];?></font></td>
         
</tr>
       
</tbody>
     
</table>
   
</td>
    <td  noWrap bgColor=
<?=$strcor;?>><?=$mesg[$i][2];?></td>
    <td  noWrap bgColor=
<?=$strcor;?>><?=$mesg[$i][3];?></td>
 
</tr>
<?
} // Fim for
?>
</table>

Comentários:

Mostrando 1 - 10 de 24 comentários
marciofi disse:
Olá amigo, sou novo com PHP, por favor poderia me ajudar com os seguintes erros referente aos Scripts do Forum:

Warning: include(./func.php): failed to open stream: No such file or directory in C:\xampp\htdocs\forum\topicos.php on line 3

Warning: include(): Failed opening './func.php' for inclusion (include_path='.;\xampp\php\PEAR') in C:\xampp\htdocs\forum\topicos.php on line 3

Fatal error: Call to undefined function prox_nivel() in C:\xampp\htdocs\forum\topicos.php on line 25
13/07/2015 6:30pm (~9 anos atrás)

lucas zgoda disse:
oi eu sou um novato completo em php mas eu estava fazendo um site pra sala de aula do meu irmao e eles pediram se eu podia criar um forum pra eles so q eu to com poco tempo mas quero aprender mais sobre php, eu so queria saber se vc poderia mandar um forum em php pra mim ediatar pq eu n endi muito sobre isso e tbm queria saber como colocar no meu site html.valeu meu e-mail é lucas_zgoda@yahoo.com.br
14/02/2010 5:16pm (~15 anos atrás)

Guilherme disse:
O me passa essa func.php pq sem ela ñ ta dando certo o php me manda no meu email gui.valadares@narutoultimate.net
21/06/2009 7:48pm (~16 anos atrás)

Ernesto disse:
muito bom o forum mano!! parabéns!!!
21/06/2006 12:13pm (~19 anos atrás)

eu tentei copia e corrigir algumas coisa.
esta cadastrando no banco mas ñ quer listar no topico(coloquer a funcao q acho q faltava no func.php - proximo Nivel), veja me ajudaaaa
18/11/2004 9:24am (~20 anos atrás)

Ai .. Deu um erro na linha 24 do topicos.php

o erro é esse
Warning: Supplied argument is not a valid MySQL result resource in /var/www/default/forum/topicos.php on line 24

o que pode ser?
30/10/2002 6:17pm (~22 anos atrás)

Tá lá acabei de entrar : www.dcc.ufmg.br/~romano/forum
01/10/2002 2:44pm (~22 anos atrás)

coloquei seu link..... e apareceu um monte de erro...... perque.... tirou fora do ar

Valeu, romano
01/10/2002 10:57am (~22 anos atrás)

Tem comoeu enviar por exemplo no fim do dia as novas msgs de um determinado topico para pesoas que estejam cadastradas?
Como enviar e selecionar o topico eu sei.
O problema é como fazer ele executar automático num determinado horário todo dia.
15/09/2002 9:06pm (~22 anos atrás)

Na página dois do artigo.
Ou me pega o script :
http://www.phpbrasil.com/scripts/script.php/id/376
09/09/2002 10:42pm (~22 anos atrás)

Novo Comentário:

(Você pode usar tags como <b>, <i> ou <code>. URLs serão convertidas para links automaticamente.)