Ir para conteúdo

POWERED BY:

Arquivado

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

Elnata COsta

sistema de Prova

Recommended Posts

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!!

Compartilhar este post


Link para o post
Compartilhar em outros sites

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??

Compartilhar este post


Link para o post
Compartilhar em outros sites

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>
<hr/>

 

Retire a Label de cada radius e coloque um envolta de todas as respostas. Isso ira selecionar só um por label

Compartilhar este post


Link para o post
Compartilhar em outros sites

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:

Compartilhar este post


Link para o post
Compartilhar em outros sites

Eu faria diferente. Com três tabelas.

  • Uma representando uma prova
  • Uma representando uma pergunta dentro de uma prova
  • Uma representando uma opção de resposta dentro de uma pergunta

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;
}

Na classe Prova, acrescentaria um método estático para pegar os dados da prova (perguntas e opções).
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;
	}
}

Agora, fica relativamente fácil.
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

Compartilhar este post


Link para o post
Compartilhar em outros sites

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>

Compartilhar este post


Link para o post
Compartilhar em outros sites

Eu faria diferente. Com três tabelas.

  • Uma representando uma prova
  • Uma representando uma pergunta dentro de uma prova
  • Uma representando uma opção de resposta dentro de uma pergunta

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;
}

Na classe Prova, acrescentaria um método estático para pegar os dados da prova (perguntas e opções).

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;
	}
}

Agora, fica relativamente fácil.

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>';
}
?>

Alguém pode me ajudar como resolver este erro aí?

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.