Ir para conteúdo
Fórum Script Brasil
  • 0

Passagem de variáveis por objeto como resultado de consultas no sql [RESOLVIDO]


Lúcio Flávio da Silva Sales

Pergunta

Estou tendo dificuldade de passar essas querys por objeto:

A linha

            return $listarProvas;
 

do arquivo Prova.php não repassa as variáveis $prova1 e $prova2 chamadas na linha

  $listar_questoes = $listar_questoes->ListarProvas();
 

do arquivo prova.php.

 

Arquivo onde se encontra a função:

Prova.php

 

          <?php
    
    Class Provas
    
        {
    
            public function ListarProvas()
    
            {
    
            $objConexao = new Conexao();
            $conexao = $objConexao->getConexao();
    
            $sql = "select * from questoes where Id = 1";
            $resposta = $conexao->query($sql);
            $prova1 = $resposta->fetch_assoc();
    
            $sql = "select * from questoes where Id = 2";
            $resposta = $conexao->query($sql);
            $prova2 = $resposta->fetch_assoc();
    
    
            $listarProvas = new Provas($prova1,$prova2);
            
            return $listarProvas;
    
            }
    
        }
    
    ?>

 


Arquivo onde os resultados devem ser apresentados

prova.php

    
        <?php
    
    $listar_questoes = new Provas();
    
    $listar_questoes = $listar_questoes->ListarProvas();
    
    
    Questão 1:
    
     echo (isset ($prova1["Questao"])?$prova1["Questao"]:"");
    
    (A) echo(isset ($prova1["Alt_A"])?$prova1["Alt_A"]:"");
    
    (B) php echo(isset ($prova1["Alt_B"])?$prova1["Alt_B"]:"");
    
    (C) php echo(isset ($prova1["Alt_C"])?$prova1["Alt_C"]:"");
    
    (D) php echo(isset ($prova1["Alt_D"])?$prova1["Alt_D"]:"");
    
    (E) php echo(isset ($prova1["Alt_E"])?$prova1["Alt_E"]:"");
    
    
    Questão 2:
    
    
    echo (isset ($prova2["Questao"])?$prova2["Questao"]:"");
    
    
    (A) echo(isset ($prova2["Alt_A"])?$prova2["Alt_A"]:"");
    
    (B) echo(isset ($prova2["Alt_B"])?$prova2["Alt_B"]:"");
    
    (C) echo(isset ($prova2["Alt_C"])?$prova2["Alt_C"]:"");
    
    (D) echo(isset ($prova2["Alt_D"])?$prova2["Alt_D"]:"");
    
    (E) echo(isset ($prova2["Alt_E"])?$prova2["Alt_E"]:"");
    
    ?>

 

Editado por Lúcio Flávio da Silva Sales
Link para o comentário
Compartilhar em outros sites

7 respostass a esta questão

Posts Recomendados

  • 1
<?php
// mysql.teste.provas(id,questao)
// (1,'Quem descobriu o Brasil?,Pedro,João,Maria,Nenhuma das anteriores'),
// (2,'O Brasil tem futuro?,Sim,Não,Talvez')
class Provas
{
    function listar($id)
    {
        $conexao=new mysqli("localhost","root","","teste");
        return $conexao->query("select * from provas where id=$id")->fetch_assoc();
    }
    
}
for($q=1;$q<=2;$q++)
{
    $prova=(new Provas)->listar($q);
    $vetores=explode(',',$prova['questao']);
    foreach($vetores as $chave => $vetor)
    {
        if($chave==0)
        {
            echo "<br>";
            echo $q . ". " . $vetor . "<br>";
        } else {
            echo chr($chave+64) . ". " . $vetor . "<br>";
        }
    }
}

 

Captura de tela 2024-09-16 005234.png

Link para o comentário
Compartilhar em outros sites

  • 0
Em 16/09/2024 em 00:52, Frank K Hosaka disse:
<?php
// mysql.teste.provas(id,questao)
// (1,'Quem descobriu o Brasil?,Pedro,João,Maria,Nenhuma das anteriores'),
// (2,'O Brasil tem futuro?,Sim,Não,Talvez')
class Provas
{
    function listar($id)
    {
        $conexao=new mysqli("localhost","root","","teste");
        return $conexao->query("select * from provas where id=$id")->fetch_assoc();
    }
    
}
for($q=1;$q<=2;$q++)
{
    $prova=(new Provas)->listar($q);
    $vetores=explode(',',$prova['questao']);
    foreach($vetores as $chave => $vetor)
    {
        if($chave==0)
        {
            echo "<br>";
            echo $q . ". " . $vetor . "<br>";
        } else {
            echo chr($chave+64) . ". " . $vetor . "<br>";
        }
    }
}

 

Captura de tela 2024-09-16 005234.png

ObrIgado, Frank, meu professor! Vou ver como fizeste a passagem da variavel. Pode ser que eu tenha omitido alguma informaçao. Eu preciso fazer as consultas separadas, porque cada uma corresponde a uma questao da prova e quero mudar a posiçao da questao de acordo com o tipo de prova. então, fazer por foreach me parece não permitir fazer essas alteraçoes de posiçao da questao e das alternativas.

O problema e que como são variaveis contendo listas, não estou sabendo retornar para a chamada da funçao.

Link para o comentário
Compartilhar em outros sites

  • 0
<?php
// mysql.teste.provas(id,questao)
// (1,'Quem descobriu o Brasil?,Pedro,João,Maria,Nenhuma das anteriores'),
// (2,'O Brasil tem futuro?,Sim,Não,Talvez')
// (3, 'Quanto é 1+1?,1,2,3,4,5')
// (4, 'Quanto é o logaritimo de 10 na base 10?,1,2,3,4,5')
class Provas
{
    private $Conexao;

    function __construct()
    {
        $this->Conexao=new mysqli("localhost","root","","teste");
    }

    function selecionar($id)
    {
        return $this->Conexao->query("select * from provas where id=$id")
			->fetch_assoc();
    }

    function imprimir($vetor)
    {
        $q=0;
        foreach($vetor as $v)
        {
            $prova=$this->selecionar($v);
            $vetores=explode(',',$prova['questao']);
            foreach($vetores as $chave => $vetor)
            {
                if($chave==0)
                {
                    echo "<br>";
                    $q++;
                    echo $q . ". " . $vetor . "<br>";
                } else {
                    echo chr($chave+64) . ". " . $vetor . "<br>";
                }
            }
        }
    }
}

(new Provas)->imprimir([4,3]);

 

Captura de tela 2024-09-18 085053.png

Editado por Frank K Hosaka
Link para o comentário
Compartilhar em outros sites

  • 0
14 horas atrás, Frank K Hosaka disse:
<?php
// mysql.teste.provas(id,questao)
// (1,'Quem descobriu o Brasil?,Pedro,João,Maria,Nenhuma das anteriores'),
// (2,'O Brasil tem futuro?,Sim,Não,Talvez')
// (3, 'Quanto é 1+1?,1,2,3,4,5')
// (4, 'Quanto é o logaritimo de 10 na base 10?,1,2,3,4,5')
class Provas
{
    private $Conexao;

    function __construct()
    {
        $this->Conexao=new mysqli("localhost","root","","teste");
    }

    function selecionar($id)
    {
        return $this->Conexao->query("select * from provas where id=$id")
			->fetch_assoc();
    }

    function imprimir($vetor)
    {
        $q=0;
        foreach($vetor as $v)
        {
            $prova=$this->selecionar($v);
            $vetores=explode(',',$prova['questao']);
            foreach($vetores as $chave => $vetor)
            {
                if($chave==0)
                {
                    echo "<br>";
                    $q++;
                    echo $q . ". " . $vetor . "<br>";
                } else {
                    echo chr($chave+64) . ". " . $vetor . "<br>";
                }
            }
        }
    }
}

(new Provas)->imprimir([4,3]);

 

Captura de tela 2024-09-18 085053.png

Entendi a ideia dessa função. Nela eu posso definir em que ordem as questões virão. Mas ela ainda gera um relatório, e para fazer as alternâncias na ordem das questões e das alternativas eu teria que alterá-la para cada tipo de prova.

O que eu tento fazer é criar uma variável com o select para cada questão. Nela vai a pergunta e as alternativas. Quando eu conseguir passar essas variáveis, então consigo montar a prova colocando a pergunta e as alternativas correspondentes em qualquer ordem na prova, e também alterando a ordem das alternativas em cada questão.

A minha dificuldade é passar essas consultas numa chamada única do arquivo onde já tenho as questões e alternativas posicionadas em locais diferentes em cada prova.

Por enquanto estou tendo que fazer as consultas todas em cada prova:

È um exemplo bem abreviado. Estou omitindo boa parte do código para facilitar a escrita.

Prova 1:

$sql1 = "select * questoes where id = 1"

$sql2 = "select * questoes where id = 2"

 

Questão 1 - $sql1['questão']

(A) $sql1['alternativa A']

(B) $sql1['alternativa B']

(C) $sql1['alternativa C']

(D) $sql1['alternativa D']

(E) $sql1['alternativa E']

 

Questão 2 - $sql2['questão']

(A) $sql2['alternativa A']

(B) $sql2['alternativa B']

(C) $sql2['alternativa C']

(D) $sql2['alternativa D']

(E) $sql2['alternativa E']

 

Prova 2:

$sql1 = "select * questoes where id = 1"

$sql2 = "select * questoes where id = 2"


Questão 1 - $sql2['questão']

(A) $sql2['alternativa E']

(B) $sql2['alternativa A']

(C) $sql2['alternativa C']

(D) $sql2['alternativa B']

(E) $sql2['alternativa D']

 

Questão 2 - $sql1['questão']

(A) $sql1['alternativa C']

(B) $sql1['alternativa A']

(C) $sql1['alternativa E']

(D) $sql1['alternativa D']

(E) $sql1['alternativa B']

 

É assim que estou conseguindo fazer. Se eu conseguir centralizar as consultas ao banco de dados num arquivo só, a escrita da página da prova vai ficar enxuta.

Fico muito grato pelo esforço!

 

 

 

Editado por Lúcio Flávio da Silva Sales
Link para o comentário
Compartilhar em outros sites

  • 0

Hahahahaha... agora, eu entendi. Você não confia nos alunos:

<?php
// mysql.teste.provas(id,questao)
// (1,'Quem descobriu o Brasil?,Pedro,João,Maria,Nenhuma das anteriores'),
// (2,'O Brasil tem futuro?,Sim,Não,Talvez')
// (3, 'Quanto é 1+1?,1,2,3,4,5')
// (4, 'Quanto é o logaritimo de 10 na base 10?,1,2,3,4,5')
class Provas
{
    private $Conexao;

    function __construct()
    {
        $this->Conexao=new mysqli("localhost","root","","teste");
    }

    function imprimir($vetor)
    {
        echo "Prova 1<br>";
        $numeroQuestao=0;
        foreach($vetor as $v)
        {
            $prova=$this->selecionar($v);
            $vetores=explode(',',$prova['questao']);
            $questao=array_shift($vetores);
            $numeroQuestao++;
            $this->imprimirQuestao($questao,$numeroQuestao);
            $indicador=0;
            foreach($vetores as $alternativa)
            {  
                $indicador++;
                echo chr($indicador+64) . ". " . $alternativa . "<br>";
            }
        }
        echo "<br>--------- picote aqui----<br>";
        echo "<br>Prova 2<br>";
        shuffle($vetor);
        $numeroQuestao=0;
        foreach($vetor as $v)
        {
            $prova=$this->selecionar($v);
            $vetores=explode(',',$prova['questao']);
            $questao=array_shift($vetores);
            $numeroQuestao++;
            $this->imprimirQuestao($questao,$numeroQuestao);
            shuffle($vetores);
            $indicador=64;
            foreach($vetores as $alternativa)
            {
                $indicador++;
                echo chr($indicador) . ". " . $alternativa . "<br>";
            }
            
        }
    }

    function imprimirQuestao($questao,$numeroQuestao)
    {
        echo "<br>";
        echo $numeroQuestao . ". " . $questao . "<br>";
    }

    function selecionar($id)
    {
        return $this->Conexao->query("select * from provas where id=$id")
				->fetch_assoc();
    }
}

(new Provas)->imprimir([4,3]);

 

Captura de tela 2024-09-19 065402.png

Editado por Frank K Hosaka
Link para o comentário
Compartilhar em outros sites

  • 0

Lamentavelmente, isso daí não é nada óbvio.

Estou tentanto estudar a linguagem orientada a objetos desde 2020, mas eu só consegui engatinhar em 2024 com a ajuda do autoload para o PHP 8.2 que o iOwys publicou no fórum Script.

O autoload explica para o PHP aonde estão as classes.

Mas não basta o PHP saber onde estão as classes, ele precisa saber como chegar até a classe, assim ele precisa do roteador.

Na internet tem um monte de roteadores prontos para você baixar pelo comando composer, mas ao invés disso eu ofereço um roteador meia-boca para você ver a cara dele, e estudar como ele funciona. Classe é um conceito muito antigo, mas para fazer funcionar, só nesse ano é que eu consegui alguma coisa.

arquivo config.php
<?php
ini_set('display_errors', 1);
date_default_timezone_set('America/Sao_Paulo');

spl_autoload_register(fn ($class) => 
    require str_replace('\\', DIRECTORY_SEPARATOR, strtolower($class)) . '.php');

function view($arquivo, $array = null)
{
    if (!is_null($array)){
        foreach ($array as $var => $value)
        {
            ${$var} = $value;
        }
    }
    ob_start();
    include $arquivo . ".php";
    ob_flush();
}

arquivo index.php
<?php
require 'config.php';
$rota='Provas_inicio';
if($_GET)
{
    if(strpos(key($_GET),"_")==0)
    {
        exit;
    }
    $rota=isset($_GET) ? key($_GET) : $rota;
}
$segmentos=explode('_',$rota);
$nomeControle=$segmentos[0] ?? 'Provas';
$metodo=$segmentos[1] ?? 'inicio';
$parametro=$segmentos[2] ?? null;
$controle=new $nomeControle();
$controle->$metodo($parametro);

arquivo provas.php
<?php
// mysql.teste.provas(id,questao)
// (1,'Quem descobriu o Brasil?,Pedro,João,Maria,Nenhuma das anteriores'),
// (2,'O Brasil tem futuro?,Sim,Não,Talvez')
// (3, 'Quanto é 1+1?,1,2,3,4,5')
// (4, 'Quanto é o logaritimo de 10 na base 10?,1,2,3,4,5')
class Provas
{
    private $Conexao;

    function __construct()
    {
        $this->Conexao=new mysqli("localhost","root","","teste");
    }

    function imprimir()
    {
        $vetor=explode(",",$_POST['questoes']);
        echo "Prova 1<br>";
        $numeroQuestao=0;
        foreach($vetor as $v)
        {
            $prova=$this->selecionar($v);
            $vetores=explode(',',$prova['questao']);
            $questao=array_shift($vetores);
            $numeroQuestao++;
            $this->imprimirQuestao($questao,$numeroQuestao);
            $indicador=0;
            foreach($vetores as $alternativa)
            {  
                $indicador++;
                echo chr($indicador+64) . ". " . $alternativa . "<br>";
            }
        }
        echo "<br>--------- picote aqui----<br>";
        echo "<br>Prova 2<br>";
        shuffle($vetor);
        $numeroQuestao=0;
        foreach($vetor as $v)
        {
            $prova=$this->selecionar($v);
            $vetores=explode(',',$prova['questao']);
            $questao=array_shift($vetores);
            $numeroQuestao++;
            $this->imprimirQuestao($questao,$numeroQuestao);
            shuffle($vetores);
            $indicador=64;
            foreach($vetores as $alternativa)
            {
                $indicador++;
                echo chr($indicador) . ". " . $alternativa . "<br>";
            }
            
        }
    }

    function imprimirQuestao($questao,$numeroQuestao)
    {
        echo "<br>";
        echo $numeroQuestao . ". " . $questao . "<br>";
    }

    function inicio()
    {
        view('provasView');
    }

    function selecionar($id)
    {
        return $this->Conexao->query("select * from provas where id=$id")
				->fetch_assoc();
    }
}

arquivo provasView.php
<form method=post action=?Provas.imprimir>
    Quais são as questões selecionadas?
    <br>
    <input name=questoes placeholder="exemplo: digite 4,3">
    <br>
    <input type=submit>
</form>

 

Editado por Frank K Hosaka
Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,4k
×
×
  • Criar Novo...