Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Gabriel T.

[Resolvido] Sistema de Perguntas e Respostas

Recommended Posts

Olá pessoal!

Quero desenvolver um sistema de perguntas e respostas (básico, só o moderador (no caso eu) pode responder as perguntas que visitantes fazem), mas preciso de uma lógica de programação.

Como posso começar?

Preciso criar sessions ou cookies?

Obrigado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

nem session e nem cookie. Terá que usar banco de dados.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Você é programador?

 

Cria um banco de dados e salva suas perguntas em uma tabela e as respostas na outra e os dois campos por um Id, ou um identificador, sei lá...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Você é programador?

 

Cara, isso é errado, o cara sendo ou não sendo programador, ele está em dúvida, o minimo que podemos fazer aqui, é orientar

dar dicas, ajudar com os códigos, e não 'julgar' o cara de tal forma, não estou te ofendendo, nem nada, mais me responde aí

você gostaria que eu fosse em um post seu, você perguntando uma coisa, eu chegasse lá, é respondesse 'Você é programador ? então resolve teu problema, pra que postou aqui' ? ou algo do tipo ?

 

:)

 

Cria um banco de dados e salva suas perguntas em uma tabela e as respostas na outra e os dois campos por um Id, ou um identificador, sei lá...

 

Sim, é basicamente isso, mokololo, você tem que criar uma tabela, na qual vai armazenar todos os dados enviados

pelo usuário, ou seja: nome, sobrenome, pergunta .. com um id como disse o amigo acima, depois você vai ler

essa tabela, gerar os links com o id de tal pergunta, então criar o formulário, que ao ser submetido, envie a resposta

pro usuário, deixa em sua caixa postal, mande e-mail, isso é ao seu critério

 

As tabelas, seriam +/- assim:

CREATE SCHEMA IF NOT EXISTS `perguntas`;
CREATE TABLE IF NOT EXISTS `perguntas`.`usuarios`(
      `uid` INT( 11 ) NOT NULL AUTO_INCREMENT,
      `nome` VARCHAR( 13 ) NOT NULL,
      `sobrenome` VARCHAR( 26 ) NOT NULL,
   PRIMARY KEY( `uid` )
)Engine = InnoDB ROW_FORMAT = Dynamic;

CREATE TABLE IF NOT EXISTS `perguntas`.`perguntas`(
      `pgid` INT( 11 ) NOT NULL AUTO_INCREMENT,
      `uid` INT( 11 ) NOT NULL,
      `pergunta` TEXT NOT NULL,
      `data` TIMESTAMP,
   PRIMARY KEY( `pgid` ),
   KEY( `uid` )
)Engine = InnoDB ROW_FORMAT = Dynamic;

CREATE TABLE IF NOT EXISTS `perguntas`.`respostas`(
      `rid` MEDIUMINT( 16 ) NOT NULL AUTO_INCREMENT, 
      `pgid` INT( 11 ) NOT NULL,
      `resposta` TEXT NOT NULL,
    PRIMARY KEY( `rid` ),
    KEY( `pgid` )
)Engine = InnoDB ROW_FORMAT = Dynamic;

 

Então, pra você relacionar as tabelas, você pode fazer o seguinte:

SELECT respostas.pgid, usuarios.nome, usuarios.sobrenome, respostas.resposta, perguntas.pergunta, 
perguntas.data FROM `perguntas` INNER JOIN `respostas` ON `perguntas`.`pgid` = `respostas`.`pgid` 
RIGHT JOIN `usuarios` ON `perguntas`.`uid` = `usuarios`.`uid` GROUP BY `respostas`.`rid`;

 

Saída:

C:\Users\Andrey>cd ..

C:\Users>cd ..

C:\>cd \dev\mysql\bin\

C:\dev\mysql\bin>mysql -u root -p
Enter password: ******
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 5
Server version: 5.1.41 Source distribution

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> use perguntas;
Database changed


mysql> select * from usuarios;
+-----+--------+-----------+
| uid | nome   | sobrenome |
+-----+--------+-----------+
|   1 | Andrey | Knupp     |
+-----+--------+-----------+
1 row in set (0.00 sec)

mysql> select * from perguntas;
+------+-----+----------+---------------------+
| pgid | uid | pergunta | data                |
+------+-----+----------+---------------------+
|    1 |   1 | Oi       | 2011-06-25 18:37:42 |
+------+-----+----------+---------------------+
1 row in set (0.02 sec)

mysql> select * from respostas;
+-----+------+------------+
| rid | pgid | resposta   |
+-----+------+------------+
|   1 |    1 | Olá !      |
|   2 |    1 | Tudo bom ? |
+-----+------+------------+
2 rows in set (0.01 sec)

mysql> select respostas.pgid, usuarios.nome, usuarios.sobrenome, respostas.resposta, perguntas.pergunta,
   -> perguntas.data from `perguntas` inner join `respostas` on `perguntas`.`pgid` = `respostas`.`pgid`
   -> right join `usuarios` on `perguntas`.`uid` = `usuarios`.`uid` group by `respostas`.`rid`;
+------+--------+-----------+------------+----------+---------------------+
| pgid | nome   | sobrenome | resposta   | pergunta | data                |
+------+--------+-----------+------------+----------+---------------------+
|    1 | Andrey | Knupp     | Olá !      | Oi       | 2011-06-25 18:37:42 |
|    1 | Andrey | Knupp     | Tudo bom ? | Oi       | 2011-06-25 18:37:42 |
+------+--------+-----------+------------+----------+---------------------+
2 rows in set (0.04 sec)

;)

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá, Andrey. Obrigado pela resposta. Muito informativa. ^^

Me desculpe pela demora, tive que dar uma saída...

Bom, sou um programador "rookie", mas entendo várias coisas sobre PHP e MySQL.

Minha dificuldade é desenvolver scripts sem nenhuma consulta, pois o que quero aqui é um pouco diferente...

Estive procurando por scripts HelpDesk, mas são cheios de "trlálálás"... ^^

Não quero algo como o usuário criar um ticket para sua pergunta.

O que quero desenvolver com a ajuda de vocês é algo assim:

O usuário acessa a página de perguntas. Alí teria um formulário para criar uma pergunta qualquer (Nome, E-mail, Assunto da pergunta, Pergunta), e ao lado, o php teria que fazer uma consulta para informar as últimas perguntas feitas, perguntas respondidas e pergunta sem respostas.

O administrador (no caso seria eu) teria uma senha para acessar uma página. Nesta página teria todas as perguntas feitas e um formulário para responder a pergunta clicada. Creio que eu deveria pegar o id da pergunta selecionada de alguma maneira, acho que por $_GET...

Acho que isto vai ser muito trabalhoso...

Bom, nada que a dedicação não resolva! ^^

O código para incluir a pergunta na tabela do banco de dados é este aqui (enviar.php):

<?php
include "conexao.php";
date_default_timezone_set('Brazil/East');

$nome = $_POST['nome'];
$email = $_POST['email'];
$assunto = $_POST['assunto'];
$pergunta = $_POST['pergunta'];
$data = date('H:i:s');

$sql = "INSERT INTO usuarios (nome, email) VALUES ('$nome', '$email')";
mysql_query($sql);

$sql2 = "INSERT INTO perguntas (pergunta, assunto, data) VALUES ('$pergunta', '$assunto', '$data')";
mysql_query($sql2);
?>

 

formulário (form.php):

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Untitled Document</title>
</head>

<body>
<form id="form1" name="form1" method="post" action="enviar.php">
 <table width="200" border="1" align="center">
   <tr>
     <td width="79">Nome:</td>
     <td width="105"><label for="nome"></label>
     <input type="text" name="nome" id="nome" /></td>
   </tr>
   <tr>
     <td>Email:</td>
     <td><label for="email"></label>
     <input type="text" name="email" id="email" /></td>
   </tr>
   <tr>
     <td>Assunto:</td>
     <td><label for="assunto"></label>
     <input type="text" name="assunto" id="assunto" /></td>
   </tr>
   <tr>
     <td>Pergunta:</td>
     <td><label for="pergunta"></label>
     <textarea name="pergunta" id="pergunta" cols="45" rows="5"></textarea></td>
   </tr>
   <tr>
     <td> </td>
     <td><input type="submit" name="enviar" id="enviar" value="Submit" /></td>
   </tr>
 </table>
</form>
</body>
</html>]

 

Tabela perguntas:

CREATE TABLE IF NOT EXISTS `perguntas` (
 `pgid` int(11) NOT NULL AUTO_INCREMENT,
 `uid` int(11) NOT NULL,
 `pergunta` varchar(80) NOT NULL,
 `assunto` varchar(80) NOT NULL,
 `data` varchar(10) NOT NULL,
 PRIMARY KEY (`pgid`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=4 ;

 

Tabela respostas:

CREATE TABLE IF NOT EXISTS `respostas` (
 `rid` int(11) NOT NULL AUTO_INCREMENT,
 `pgid` int(11) NOT NULL,
 `resposta` varchar(80) NOT NULL,
 PRIMARY KEY (`rid`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;

 

Tabela usuarios:

CREATE TABLE IF NOT EXISTS `usuarios` (
 `uid` int(11) NOT NULL AUTO_INCREMENT,
 `nome` varchar(13) NOT NULL,
 `email` varchar(80) NOT NULL,
 PRIMARY KEY (`uid`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=5 ;

 

Creio que preciso modificar algo nas tabelas para verificar quais perguntas são respondidas ou não...

Preciso de uma ajuda para seguir adiante!

Obrigado pela atenção!!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Nem precisa. É só você verificar se existe um valor inserido na tabela respostas com pgid igual ao valor da pgid da tabela perguntas. Se existir, é porque a pergunta foi respondida.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom pessoal, fiz um pequeno sistema aqui e umas pequenas modificações.

Precisei criar 5 arquivos (formperguntar.php, enviarpergunta.php, listaperguntas.php, formresponder.php, enviarresposta.php).

formperguntar.php:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Untitled Document</title>
</head>

<body>
<form id="form1" name="form1" method="post" action="enviar.php">
 <table width="200" border="1" align="center">
   <tr>
     <td width="79">Nome:</td>
     <td width="105"><label for="nome"></label>
     <input type="text" name="nome" id="nome" /></td>
   </tr>
   <tr>
     <td>Email:</td>
     <td><label for="email"></label>
     <input type="text" name="email" id="email" /></td>
   </tr>
   <tr>
     <td>Assunto:</td>
     <td><label for="assunto"></label>
     <input type="text" name="assunto" id="assunto" /></td>
   </tr>
   <tr>
     <td>Pergunta:</td>
     <td><label for="pergunta"></label>
     <textarea name="pergunta" id="pergunta" cols="45" rows="5"></textarea></td>
   </tr>
   <tr>
     <td> </td>
     <td><input type="submit" name="enviar" id="enviar" value="Submit" /></td>
   </tr>
 </table>
</form>
</body>
</html>

 

enviarpergunta.php:

<?php
include "conexao.php";
date_default_timezone_set('Brazil/East');

$nome = $_POST['nome'];
$email = $_POST['email'];
$assunto = $_POST['assunto'];
$pergunta = $_POST['pergunta'];
$data = date('H:i:s');

$sql = "INSERT INTO usuarios (nome, email) VALUES ('$nome', '$email')";
mysql_query($sql);

$sql2 = "INSERT INTO perguntas (pergunta, assunto, data) VALUES ('$pergunta', '$assunto', '$data')";
mysql_query($sql2);

$sql3 = mysql_query("SELECT * FROM usuarios WHERE nome = '$nome' AND email = '$email'");
while($escrever=mysql_fetch_array($sql3)){
$idusuario = $escrever['uid'];
}

$sql4 = mysql_query("UPDATE perguntas SET uid = '$idusuario' WHERE pergunta = '$pergunta' AND assunto = '$assunto'");

header("Location: listaperguntas.php");

?>

 

<?php
include "conexao.php";
$sqla = mysql_query("SELECT * FROM perguntas ORDER BY pgid");
while($escrever=mysql_fetch_array($sqla)){
	echo "Pergunta: <a id='whitelink' href='formresponder.php?pgid=$escrever[pgid]'>$escrever[pergunta]</a><br />";
	echo "Assunto: $escrever[assunto]<br />";
	echo "Em: $escrever[data]<br />";
	$idnomeusuario = $escrever['uid'];
	$sqlb = mysql_query("SELECT * FROM usuarios WHERE uid = '$idnomeusuario'");
		while($escrever2=mysql_fetch_array($sqlb)){
			echo "Por: $escrever2[nome]<br /><br />";
		}
}
?>

 

formresponder.php:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Untitled Document</title>
</head>

<body>
<form id="form1" name="form1" method="post" action="enviarresposta.php?pgid=<?php echo "$_GET[pgid]"; ?>">
 <table width="200" border="1" align="center">
   <tr>
     <td>Nome:</td>
     <td><label for="nome"></label>
     <input type="text" name="nome" id="nome" /></td>
   </tr>
   <tr>
     <td>Resposta:</td>
     <td><label for="resposta"></label>
       <label for="resposta"></label>
     <textarea name="resposta" id="resposta" cols="45" rows="5"></textarea></td>
   </tr>
   <tr>
     <td> </td>
     <td><input type="submit" name="enviar" id="enviar" value="Submit" /></td>
   </tr>
 </table>
</form>
</body>
</html>

 

<?php
include "conexao.php";
date_default_timezone_set('Brazil/East');
$pgid = $_GET['pgid'];
$nome = $_POST['nome'];
$resposta = $_POST['resposta'];
$data = date('H:i:s');

$sqlu = "INSERT INTO respostas (pgid, resposta, por, data) VALUES ('$pgid', '$resposta', '$nome', '$data')";
mysql_query($sqlu);

mysql_query("UPDATE perguntas SET respondida='S' WHERE pgid = '$pgid'");

$sqlas = mysql_query("SELECT * FROM respostas WHERE pgid = '$pgid'");
while($mostrar=mysql_fetch_array($sqlas)){
	$ridd = $mostrar['rid'];
	mysql_query("UPDATE perguntas SET rid = '$ridd' WHERE pgid = '$pgid'");
}
?>

 

Tabelas do MySQL (perguntas, respostas, usuarios).

perguntas:

CREATE TABLE IF NOT EXISTS `perguntas` (
 `pgid` int(11) NOT NULL AUTO_INCREMENT,
 `uid` int(11) NOT NULL,
 `rid` int(11) NOT NULL,
 `pergunta` varchar(80) NOT NULL,
 `assunto` varchar(80) NOT NULL,
 `data` varchar(10) NOT NULL,
 `respondida` enum('S','N') NOT NULL DEFAULT 'N',
 PRIMARY KEY (`pgid`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=5 ;

 

respostas:

CREATE TABLE IF NOT EXISTS `respostas` (
 `rid` int(11) NOT NULL AUTO_INCREMENT,
 `pgid` int(11) NOT NULL,
 `resposta` varchar(80) NOT NULL,
 `por` varchar(80) NOT NULL,
 `data` varchar(10) NOT NULL,
 PRIMARY KEY (`rid`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=4 ;

 

usuarios:

CREATE TABLE IF NOT EXISTS `usuarios` (
 `uid` int(11) NOT NULL AUTO_INCREMENT,
 `nome` varchar(13) NOT NULL,
 `email` varchar(80) NOT NULL,
 PRIMARY KEY (`uid`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=5 ;

 

Queria saber se há como melhorar este pequeno sistema, e se falta alguma coisa...

Obrigado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom pessoal, modifiquei o arquivo "listaperguntas.php", onde consegui separar as perguntas respondidas das não respondidas:

 

<?php
include "conexao.php";
$sqla = mysql_query("SELECT * FROM perguntas ORDER BY pgid");
       while($escrever=mysql_fetch_array($sqla)){
               echo "Pergunta: <a id='whitelink' href='formresponder.php?pgid=$escrever[pgid]'>$escrever[pergunta]</a><br />";
               echo "Assunto: $escrever[assunto]<br />";
               echo "Em: $escrever[data]<br />";
               $idnomeusuario = $escrever['uid'];
               $sqlb = mysql_query("SELECT * FROM usuarios WHERE uid = '$idnomeusuario'");
                       while($escrever2=mysql_fetch_array($sqlb)){
                               echo "Por: $escrever2[nome]<br />";
							 $sqlaa = "SELECT respondida FROM perguntas WHERE pergunta = '$escrever[pergunta]' AND '$escrever[pgid]'";
							 $sqlaa = mysql_query($sqlaa) or die (mysql_error());
							 list($resposta) = mysql_fetch_array($sqlaa);
							 if($resposta == 'N'){
								 echo "Respondida: Não.<br /><br />";
							 }elseif($resposta == 'S'){
								 $sqlaaa = mysql_query("SELECT * FROM respostas WHERE pgid = '$escrever[pgid]'");
								 while($escrever3=mysql_fetch_array($sqlaaa)){
									 echo "Respondida: Sim.<br />";
									 echo "Resposta: $escrever3[resposta]<br /><br />";
								 }
							 }


                       }
       }
?>

Compartilhar este post


Link para o post
Compartilhar em outros sites

Você vai fazer as alterações que eu te falei ? :)

Estou tendo problemas com a função mysqli_fetch_array...

Já tinha feito a modificação mas mudei.

Irei tentar novamente, acho que foi algum erro de digitação que o php não me informou...

 

while($escrever=mysqli_fetch_array($sqla))

 

Para mim usar o mysqli no fetch array é assim mesmo?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Use PDO amigo, funciona simplesmente assim:

$PDO = new PDO( 'mysql:host=localhost;dbname=seu db', 'usuario', 'senha' );
$Dados = $PDO->query( 'seu sql' )->fetch( PDO::FETCH_ASSOC );

 

Isso pra querys diretas, nas quais não são passados nenhum tipo de valor para uma clausula.

Caso for passar valores como login e senha, e recomendável que use:

$query = $PDO->prepare( 'SELECT * FROM `usuarios` WHERE `login` = :login AND `senha` = :senha' );
$query->bindParam( ':login', $login, PDO::PARAM_STR );
$query->bindParam( ':senha', $senha, PDO::PARAM_STR );
$query->execute();
$Dados = $query->fetch( PDO::FETCH_ASSOC );

 

Pra trazer o resultset inteiro, porque o fetch fecha apenas uma linha do resultado, você pode usar:

$Dados = $query->fetchAll( PDO::FETCH_ASSOC );

 

o PDOStatement::prepare junto ao bindParam evita Injeções SQL que afetam seu banco de dados com algo malicioso

ou até mesmo prejudica os dados armazenados, por isso é bom usar ele quando você envia algo pra query :D

Compartilhar este post


Link para o post
Compartilhar em outros sites

Andrey, tentei usar o PDO aqui mas é meio difícil... :mellow:

Terei que estudar mais sobre isso. ;)

 

Amigo Andrey, já pode considerar o tópico como resolvido.

Consegui concluir meu projeto com sua sugestão de programação.

Muito obrigado mesmo! :lol:

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.