+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 (~8 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 (~14 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 (~15 anos atrás)

Ernesto disse:
muito bom o forum mano!! parabéns!!!
21/06/2006 12:13pm (~18 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 (~19 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 (~21 anos atrás)

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

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

Valeu, romano
01/10/2002 10:57am (~21 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 (~21 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 (~21 anos atrás)

Novo Comentário:

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