Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
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.
Pode me dar um "empurrão"? ^^
Preciso de um início, pelo menos como seria o banco de dados...
Obrigado.
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á...
>
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)
;)
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!!
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.
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'"); $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.
Melhorar ? a primeira vista é simples, não use 'mysql_', utilize PDO ou MySQLi
Manual do PHP :seta: PHP Data Object - PDO
Manual do PHP :seta: Extensão do MySQL Melhorada
^_^
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 />";
}
}
}
}
?>Você vai fazer as alterações que eu te falei ? :)
>
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?
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
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:
Opá legal, .. qualquer dúvida, posta aí ..
Abraços
;)
nem session e nem cookie. Terá que usar banco de dados.