Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Bom pessoal, seguinte, tenho as seguintes páginas:
ProvaData.class.php:
<?php
class ProvaData extends CodonData
{
public static function PegarProva() {
$query = "SELECT * FROM `phpvmsv2_provas` order by rand() limit 10 ";
/*order by rand() limit 1 */
$results = DB::get_results($query);
$code = DB::errno();
if ($code != 0){
$message = DB::error();
throw new Exception($message, $code);
}
return $results;
}
}
Prova/index.tpl:
<?php
$recebeProva = ProvaData::PegarProva();
$i = 1;
foreach($recebeProva as $resultsProva)
{
?>
<p><strong><?php echo $i++?>)</strong> <?php echo $resultsProva->pergunta?><br/><br/>
<br/><img src="<?php echo $resultsProva->img?>" alt="<?php echo $resultsProva->id?>" /><br/><br/>
<div class="control-group">
<label class="control-label">Selecione a reposta correta:</label>
<div class="controls">
<label for="general-themed-radio1">
<input type="radio" id="general-themed-radio1" name="general-radios" class="input-themed" value="<?php echo $resultsProva->resposta1?>" /> <?php echo $resultsProva->resposta1?><br/>
</label>
<label for="general-themed-radio2">
<input type="radio" id="general-themed-radio2" name="general-radios" class="input-themed" value="<?php echo $resultsProva->resposta2?>" /> <?php echo $resultsProva->resposta2?><br/>
</label>
<label for="general-themed-radio3">
<input type="radio" id="general-themed-radio3" name="general-radios" class="input-themed" value="<?php echo $resultsProva->resposta3?>" /> <?php echo $resultsProva->resposta3?><br/>
</label>
<label for="general-themed-radio3">
<input type="radio" id="general-themed-radio3" name="general-radios" class="input-themed" value="<?php echo $resultsProva->resposta4?>" /> <?php echo $resultsProva->resposta4?><br/>
</label>
</div>
</div>
</p>
<hr/>
<?php
}
?>
Prova.php:
<?php
class Prova extends CodonModule
{
public function index()
{
if(!Auth::LoggedIn()) {
$this->set('message', 'Você não precisar estar logado para fazer a prova!');
$this->render('core_error.tpl');
return;
}
$this->set('recebeProva', ProvaData::PegarProva());
$this->render('Prova/index.tpl');
}
public function questoes()
{
$this->render('Prova/questoes.tpl');
$this->set('recebeProva', ProvaData::PegarProva());
}
}
Só que na hora em que os usuário vão fazer a prova eles não conseguem selecionar o Input Radio pra cada questão. O que acontece é que é exibida os radios normalmente para as 10 respostas das 10 perguntas, porém eles consegue selecionar apenas as respostar de uma pergunta, se selecionam a resposta "A" da questão 1, ele não consegue selecionar as outras respostas, pois a resposta "A" é desmarcada, e marca a outra resposta selecionada.
O que acontece pessoal, me ajudem a resolver isso ai!! Obrigado!!
Mesmo name das radius. Isso faz com que desmarque a radius já selecionada
Mano alterei o nome da Radius mas agora acontece que posso seleciona-las todas de uma vez, como se fossem checkbox! Mas o que eu quero é que possa selecionar apenas uma! O que faço??
Perdão equivoco meu...
Faça assim que deve resolver;...
>
div class="control-group">
<label class="control-label">Selecione a reposta correta:</label>
<div class="controls">
<label for="general-themed-radio1">
<input type="radio" id="general-themed-radio1" name="general-radios" class="input-themed" value="<?php echo $resultsProva->resposta1?>" /> <?php echo $resultsProva->resposta1?><br/>
<input type="radio" id="general-themed-radio2" name="general-radios" class="input-themed" value="<?php echo $resultsProva->resposta2?>" /> <?php echo $resultsProva->resposta2?><br/>
<input type="radio" id="general-themed-radio3" name="general-radios" class="input-themed" value="<?php echo $resultsProva->resposta3?>" /> <?php echo $resultsProva->resposta3?><br/>
<input type="radio" id="general-themed-radio3" name="general-radios" class="input-themed" value="<?php echo $resultsProva->resposta4?>" /> <?php echo $resultsProva->resposta4?><br/>
</label>
</div>
</div>
</p>Retire a Label de cada radius e coloque um envolta de todas as respostas. Isso ira selecionar só um por label
>
Perdão equivoco meu...
Faça assim que deve resolver;...
Retire a Label de cada radius e coloque um envolta de todas as respostas. Isso ira selecionar só um por label
rsrs amigo fiz como você mencionou, mas novamente voltou ao sistema que mencionei acima, ele apenas seleciona um resposta dentre todas as questões! :yes:
Eu faria diferente. Com três tabelas.
Logo
mysql> describe prova;
+----------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+----------+--------------+------+-----+---------+----------------+
| codprova | int(11) | NO | PRI | NULL | auto_increment |
| titulo | varchar(200) | YES | | NULL | |
+----------+--------------+------+-----+---------+----------------+
mysql> describe pergunta;
+-------------+---------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------------+---------+------+-----+---------+----------------+
| codpergunta | int(11) | NO | PRI | NULL | auto_increment |
| codprova | int(11) | NO | MUL | NULL | |
| texto | text | YES | | NULL | |
| ordem | int(11) | YES | | 0 | |
+-------------+---------+------+-----+---------+----------------+
mysql> describe opcao;
+-------------+------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------------+------------+------+-----+---------+----------------+
| codopcao | int(11) | NO | PRI | NULL | auto_increment |
| codpergunta | int(11) | NO | MUL | NULL | |
| texto | text | YES | | NULL | |
| ordem | int(11) | YES | | 0 | |
| correta | tinyint(1) | YES | | 0 | |
+-------------+------------+------+-----+---------+----------------+
Assim, faria uma classe para cada tabela, facilitando o trabalho:
// classe que representa prova
class Prova {
public $codprova;
public $titulo;
public $perguntas = array();
}
// Classe que representa pergunta
class Pergunta {
public $codpergunta;
public $codprova;
public $texto;
public $ordem;
public $opcoes = array();
}
// Classe que representa opcao
class Opcao {
public $codopcao;
public $codpergunta;
public $texto;
public $ordem;
public $correta;
}Então, nossa classe Prova ficaria assim (a conexão com o banco fiz no método somente para ilustrar. O correto é vir de um outro lugar):
class Prova {
public $codprova;
public $titulo;
public $perguntas = array();
static public function getByCodigo($codprova){
$pdo = new PDO('mysql:host=127.0.0.1;dbname=testes','root','');
$prova = null;
$sql = 'SELECT pr.codprova,
pr.titulo,
pe.codpergunta,
pe.texto as pergunta,
pe.ordem as ordem_pergunta,
op.codopcao,
op.texto as opcao,
op.ordem as ordem_opcao,
op.correta
FROM prova pr
LEFT JOIN pergunta pe ON pe.codprova = pr.codprova
LEFT JOIN opcao op ON op.codpergunta = pe.codpergunta
WHERE pr.codprova = :codprova
ORDER BY pe.ordem, op.ordem';
$rs = $pdo->prepare($sql);
$rs->bindValue( ':codprova', $codprova );
$rs->execute();
while($row = $rs->fetch(PDO::FETCH_ASSOC)){
if(empty($prova)){
$prova = new Prova();
$prova->codprova = $row['codprova'];
$prova->titulo = $row['titulo'];
}
if(!empty($row['codpergunta'])){
if(!isset($prova->perguntas[$row['codpergunta']])){
$pergunta = new Pergunta();
$pergunta->codpergunta = $row['codpergunta'];
$pergunta->codprova = $row['codprova'];
$pergunta->texto = $row['pergunta'];
$pergunta->ordem = $row['ordem_pergunta'];
$prova->perguntas[$row['codpergunta']] = $pergunta;
} else {
$pergunta = $prova->perguntas[$row['codpergunta']];
}
}
if(!empty($row['codopcao'])){
if(!isset($pergunta->opcoes[$row['codopcao']])){
$opcao = new Opcao();
$opcao->codopcao = $row['codopcao'];
$opcao->codpergunta = $row['codpergunta'];
$opcao->texto = $row['opcao'];
$opcao->ordem = $row['ordem_opcao'];
$opcao->correta = !empty($row['correta']);
$pergunta->opcoes[$row['codopcao']] = $opcao;
}
}
}
if(!empty($prova)){
$prova->perguntas = array_values($prova->perguntas);
foreach($prova->perguntas as $pergunta){
$pergunta->opcoes = array_values($pergunta->opcoes);
}
}
return $prova;
}
}//// aqui vc pode pegar por GET/POST/SESSION.
//// O que melhor servir no teu caso
$codprova = 1;
$prova = Prova::getByCodigo($codprova);
if(!empty($prova)){
echo '<h1>Exibindo as perguntas da prova: ',$prova->titulo,'</h1>';
echo '<ol>';
foreach($prova->perguntas as $pergunta){
echo '<li>',$pergunta->texto;
echo '<ul style="margin-bottom: 30px">';
foreach($pergunta->opcoes as $opcao){
printf('<li><label><input type="radio" name="pergunta[%d]" value="%d" /> %s</label></li>',
$opcao->codpergunta,
$opcao->codopcao,
$opcao->texto
);
}
echo '</ul>';
}
echo '</ol>';
}
Espero que o exemplo tenha sido claro.
@braços e fique com Deus!
Complemento:
Como foi dito no segundo post, os radios precisam se diferenciar pela pergunta.
<ol>
<li>
<h1>Enunciado da questão</h1>
<ol type="a">
<li>
<label for="exam200Question1Answer1">
Primeira alternativa
<input type="radio" id="exam200Question1Answer1" name="exam200Question1" value="answer1">
</label>
</li>
<li>
<label for="exam200Question1Answer2">
Segunda alternativa
<input type="radio" id="exam200Question1Answer2" name="exam200Question1" value="answer2">
</label>
</li>
<li>
<label for="exam200Question1Answer3">
Terceira alternativa
<input type="radio" id="exam200Question1Answer3" name="exam200Question1" value="answer3">
</label>
</li>
</ol>
</li>
<li>
<h1>Enunciado da segunda questão</h1>
<ol type="a">
<li>
<label for="exam200Question2Answer1">
Primeira alternativa
<input type="radio" id="exam200Question2Answer1" name="exam200Question2" value="answer1">
</label>
</li>
<li>
<label for="exam200Question2Answer2">
Segunda alternativa
<input type="radio" id="exam200Question2Answer2" name="exam200Question2" value="answer2">
</label>
</li>
<li>
<label for="exam200Question2Answer3">
Terceira alternativa
<input type="radio" id="exam200Question2Answer3" name="exam200Question2" value="answer3">
</label>
</li>
</ol>
</li>
<li>
<h1>Enunciado da terceira questão</h1>
<ol type="a">
<li>
<label for="exam200Question3Answer1">
Primeira alternativa
<input type="radio" id="exam200Question3Answer1" name="exam200Question3" value="answer1">
</label>
</li>
<li>
<label for="exam200Question3Answer2">
Segunda alternativa
<input type="radio" id="exam200Question3Answer2" name="exam200Question3" value="answer2">
</label>
</li>
<li>
<label for="exam200Question3Answer3">
Terceira alternativa
<input type="radio" id="exam200Question3Answer3" name="exam200Question3" value="answer3">
</label>
</li>
</ol>
</li>
</ol>>
Eu faria diferente. Com três tabelas.
Logo
mysql> describe prova;
+----------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+----------+--------------+------+-----+---------+----------------+
| codprova | int(11) | NO | PRI | NULL | auto_increment |
| titulo | varchar(200) | YES | | NULL | |
+----------+--------------+------+-----+---------+----------------+
mysql> describe pergunta;
+-------------+---------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------------+---------+------+-----+---------+----------------+
| codpergunta | int(11) | NO | PRI | NULL | auto_increment |
| codprova | int(11) | NO | MUL | NULL | |
| texto | text | YES | | NULL | |
| ordem | int(11) | YES | | 0 | |
+-------------+---------+------+-----+---------+----------------+
mysql> describe opcao;
+-------------+------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------------+------------+------+-----+---------+----------------+
| codopcao | int(11) | NO | PRI | NULL | auto_increment |
| codpergunta | int(11) | NO | MUL | NULL | |
| texto | text | YES | | NULL | |
| ordem | int(11) | YES | | 0 | |
| correta | tinyint(1) | YES | | 0 | |
+-------------+------------+------+-----+---------+----------------+
Assim, faria uma classe para cada tabela, facilitando o trabalho:
// classe que representa prova
class Prova {
public $codprova;
public $titulo;
public $perguntas = array();
}
// Classe que representa pergunta
class Pergunta {
public $codpergunta;
public $codprova;
public $texto;
public $ordem;
public $opcoes = array();
}
// Classe que representa opcao
class Opcao {
public $codopcao;
public $codpergunta;
public $texto;
public $ordem;
public $correta;
}Assim, ficaria tudo concentrado num lugar só.
Por questões de performance, faria uma consulta só ao banco, para pegar tudo o que preciso, e separaria pelo PHP os dados de cada uma. Desta forma, você não perde tanto tempo em comunicação com o banco.
Então, nossa classe Prova ficaria assim (a conexão com o banco fiz no método somente para ilustrar. O correto é vir de um outro lugar):
class Prova {
public $codprova;
public $titulo;
public $perguntas = array();
static public function getByCodigo($codprova){
$pdo = new PDO('mysql:host=127.0.0.1;dbname=testes','root','');
$prova = null;
$sql = 'SELECT pr.codprova,
pr.titulo,
pe.codpergunta,
pe.texto as pergunta,
pe.ordem as ordem_pergunta,
op.codopcao,
op.texto as opcao,
op.ordem as ordem_opcao,
op.correta
FROM prova pr
LEFT JOIN pergunta pe ON pe.codprova = pr.codprova
LEFT JOIN opcao op ON op.codpergunta = pe.codpergunta
WHERE pr.codprova = :codprova
ORDER BY pe.ordem, op.ordem';
$rs = $pdo->prepare($sql);
$rs->bindValue( ':codprova', $codprova );
$rs->execute();
while($row = $rs->fetch(PDO::FETCH_ASSOC)){
if(empty($prova)){
$prova = new Prova();
$prova->codprova = $row['codprova'];
$prova->titulo = $row['titulo'];
}
if(!empty($row['codpergunta'])){
if(!isset($prova->perguntas[$row['codpergunta']])){
$pergunta = new Pergunta();
$pergunta->codpergunta = $row['codpergunta'];
$pergunta->codprova = $row['codprova'];
$pergunta->texto = $row['pergunta'];
$pergunta->ordem = $row['ordem_pergunta'];
$prova->perguntas[$row['codpergunta']] = $pergunta;
} else {
$pergunta = $prova->perguntas[$row['codpergunta']];
}
}
if(!empty($row['codopcao'])){
if(!isset($pergunta->opcoes[$row['codopcao']])){
$opcao = new Opcao();
$opcao->codopcao = $row['codopcao'];
$opcao->codpergunta = $row['codpergunta'];
$opcao->texto = $row['opcao'];
$opcao->ordem = $row['ordem_opcao'];
$opcao->correta = !empty($row['correta']);
$pergunta->opcoes[$row['codopcao']] = $opcao;
}
}
}
if(!empty($prova)){
$prova->perguntas = array_values($prova->perguntas);
foreach($prova->perguntas as $pergunta){
$pergunta->opcoes = array_values($pergunta->opcoes);
}
}
return $prova;
}
}Basta você pegar a prova desejada e imprimir os dados:
//// aqui vc pode pegar por GET/POST/SESSION.
//// O que melhor servir no teu caso
$codprova = 1;
$prova = Prova::getByCodigo($codprova);
if(!empty($prova)){
echo '<h1>Exibindo as perguntas da prova: ',$prova->titulo,'</h1>';
echo '<ol>';
foreach($prova->perguntas as $pergunta){
echo '<li>',$pergunta->texto;
echo '<ul style="margin-bottom: 30px">';
foreach($pergunta->opcoes as $opcao){
printf('<li><label><input type="radio" name="pergunta[%d]" value="%d" /> %s</label></li>',
$opcao->codpergunta,
$opcao->codopcao,
$opcao->texto
);
}
echo '</ul>';
}
echo '</ol>';
}
Espero que o exemplo tenha sido claro.
@braços e fique com Deus!
Complemento:
Os arquivos de exemplo podem ser baixados aqui
Mano, muito bom este exemplo! Ele funcionou quado eu rodei ele em localhost, mas quando fui criar um módulo de desenvolvimento para a minha aplicação ele deu o seguinte erro:
Warning: call_user_func_array() expects parameter 1 to be a valid callback, class 'Prova' does not have a method 'questoes' in /home/XXXXXXXX/public_html/XX/core/classes/MainController.class.php on line 218
Meus códigos ficaram assim:
ProvaData.class.php:
<?php
//header('Content-Type: text/plain');
class Questionario {
public $codprova;
public $titulo;
public $perguntas = array();
static public function getByCodigo($codprova){
$pdo = new PDO('mysql:host=localhost;dbname=prova','prova','**********');
$prova = null;
$sql = 'SELECT pr.codprova,
pr.titulo,
pe.codpergunta,
pe.texto as pergunta,
pe.ordem as ordem_pergunta,
op.codopcao,
op.texto as opcao,
op.ordem as ordem_opcao,
op.correta
FROM prova pr
LEFT JOIN pergunta pe ON pe.codprova = pr.codprova
LEFT JOIN opcao op ON op.codpergunta = pe.codpergunta
WHERE pr.codprova = :codprova
ORDER BY pe.ordem, op.ordem';
$rs = $pdo->prepare($sql);
$rs->bindValue( ':codprova', $codprova );
$rs->execute();
while($row = $rs->fetch(PDO::FETCH_ASSOC)){
if(empty($prova)){
$prova = new Prova();
$prova->codprova = $row['codprova'];
$prova->titulo = $row['titulo'];
}
if(!empty($row['codpergunta'])){
if(!isset($prova->perguntas[$row['codpergunta']])){
$pergunta = new Pergunta();
$pergunta->codpergunta = $row['codpergunta'];
$pergunta->codprova = $row['codprova'];
$pergunta->texto = $row['pergunta'];
$pergunta->ordem = $row['ordem_pergunta'];
$prova->perguntas[$row['codpergunta']] = $pergunta;
} else {
$pergunta = $prova->perguntas[$row['codpergunta']];
}
}
if(!empty($row['codopcao'])){
if(!isset($pergunta->opcoes[$row['codopcao']])){
$opcao = new Opcao();
$opcao->codopcao = $row['codopcao'];
$opcao->codpergunta = $row['codpergunta'];
$opcao->texto = $row['opcao'];
$opcao->ordem = $row['ordem_opcao'];
$opcao->correta = !empty($row['correta']);
$pergunta->opcoes[$row['codopcao']] = $opcao;
}
}
}
if(!empty($prova)){
$prova->perguntas = array_values($prova->perguntas);
foreach($prova->perguntas as $pergunta){
$pergunta->opcoes = array_values($pergunta->opcoes);
}
}
return $prova;
}
}
Prova.php
<?php
// classe que representa prova
class Prova extends CodonModule {
public $codprova;
public $titulo;
public $perguntas = array();
public function index()
{
$this->render('Prova/index.tpl');
}
}
// Classe que representa pergunta
class Pergunta extends CodonModule {
public $codpergunta;
public $codprova;
public $texto;
public $ordem;
public $opcoes = array();
}
// Classe que representa opcao
class Opcao extends CodonModule {
public $codopcao;
public $codpergunta;
public $texto;
public $ordem;
public $correta;
}
Layout.tpl:
<?php
//// aqui você pode pegar por GET/POST/SESSION.
//// O que melhor servir no teu caso
$codprova = 1;
$prova = Prova::getByCodigo($codprova);
if(!empty($prova)){
echo '<h1>Exibindo as perguntas da prova: ',$prova->titulo,'</h1>';
echo '<ol>';
foreach($prova->perguntas as $pergunta){
echo '<li>',$pergunta->texto;
echo '<ul style="margin-bottom: 30px">';
foreach($pergunta->opcoes as $opcao){
printf('<li><label><input type="radio" name="pergunta[%d]" value="%d" /> %s</label></li>',
$opcao->codpergunta,
$opcao->codopcao,
$opcao->texto
);
}
echo '</ul>';
}
echo '</ol>';
}
?>
Mesmo name das radius. Isso faz com que desmarque a radius já selecionada