Um fórum simples em PHP/MySQL
O script responsável para inserir as mensagens no fórum , é trata.php :
Para listar as mensagens em forma de corrente e só o topicos.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>
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)
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)
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
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?
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)
coloquei seu link..... e apareceu um monte de erro...... perque.... tirou fora do ar
Valeu, romano
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.
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)
09/09/2002 10:42pm
(~22 anos atrás)
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