Ir para conteúdo

POWERED BY:

Sapinn

Erro ao passar array de dados

Recommended Posts

NÃO SEI COMO RESOLVER ISSO PELO AMOR ... Eu tenho um método home que vai transferir os dados do banco para uma tabela 

 

Aqui esta o método no controlador:

    public function home(){

        $dados = [

            'admins' => $this->adminModel->lerAdmin()

        ];

      

        $this->view('paginas/admins/home', $dados);

    }

E esse método no model:

   public function lerAdmin(){

        $this->db->query("SELECT * FROM admins");

        return $this->db->resultados();

    }

Ai eu chama os dados no home assim:

 

<?=$dados['admins']?>

 

Só pra testar eu sei que precisa usar um foreach, mas ele me retorna o seguinte erro:

 

Notice: Undefined index: admins inC:\xampp\htdocs\PROJETOS\sistema-de-gerenciamento\app\Views\paginas\admins\home.phpon line178

Compartilhar este post


Link para o post
Compartilhar em outros sites

Fica complicado dizer qual é o problema pois dizer que o problema é uma coisa, mas na verdade pode ser outra.

Os trechos de código apresentados não diz a causa. Assim como os 2 métodos não sabemos se são da mesma classe o que é importante saber.

 

O que podemos então presumir que você está tentando acessar o array $dados no método home.

Se você quer acessa basta que $dados seja um atributo e algum método o retorne.

<?php
class exemplo {
    
    private $dados = [];
    
    public function criarArray() {
        $this->dados = ['a' => '1', 'b' => '2', 'c' => '3'];
    }
    
    public function verArray() {
        return $this->dados;
    }
}

$e = new exemplo();
var_dump($e->verArray());
//echo $e->verArray()['a']; // (Seu problema aqui) Não posso ver a chave porque ela ainda não existe

echo "<hr />";
$e->criarArray();
var_dump($e->verArray());

echo "<hr />";
var_dump($e->verArray()['a']);
echo $e->verArray()['a'];
echo $e->verArray()['x']; // Seu erro representado aqui a chave não existe

Por fim sempre use a função var_dump para analisar dados ao invés de echo

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ai cara eu fiz o que você pediu e ele não retornou nada, mesmo colocando igual

Veja:

 

<?php

class Admins extends Controller{
    
    private $dados = [];

    public function __construct()
    {
        $this->adminModel = $this->model("Admin");
    }

    public function criarArray() {
        $this->dados = ['a' => '1', 'b' => '2', 'c' => '3'];
    }
    
    public function verArray() {
        return $this->dados;
    }

$e = new Admins();
var_dump($e->verArray());


Eu tentei até mudar a versão do PHP da 7.4 para a 7.3 mas não obtive exite algum.

Compartilhar este post


Link para o post
Compartilhar em outros sites
2 horas atrás, Sapinn disse:

$e = new Admins();

var_dump($e->verArray());

De fato você está vendo o atributo é um array, mas não retorna nada porque o array está vazio, você tem que criar antes.

 

7 horas atrás, Omar~ disse:

echo "<hr />";

$e->criarArray();

var_dump($e->verArray());

Perceba que mandei criar algo antes de usar....

 

 

Em resumo o que disse seria

public function home() {
  $this->dados = [ // Ao invés de usar uma variável aqui você usa um atributo
    'admins' => $this->adminModel->lerAdmin()
  ];
  
  /*
  Não sei o que isso faz, mas se for um redirecionamento você perde todo conteúdo da classe
  Então isso deveria está em um método diferente onde você só aplicaria um redirecionamento quando realmente for necessário
  */
  $this->view('paginas/admins/home', $this->dados);
  
}

Portanto uma vez que o método home for executado você terá algo no atributo dados.

Então basta que tenha outro método para retornar o atributo dados.

Devemos olhar que as chaves que vão compor o conteúdo serão definidos pelo método lerAdmin, se ele não retornar nada $this->dados será um array com a chave admins que estará vazio.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Cara eu não sei o que fazer ainda não deu certo. O 

$this->view('paginas/admins/home', $dados);

Serve para passar os  array de dados para a view home. Isso tá dando uma dor de cabeça gigante e eu não sei porquê está dando erro. Eu não estou conseguindo enviar esse array para a view home, existe alguma outra forma de se fazer isso??? Eu não sou tão bom em orientação a objetos.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Faz do seguinte poste todo o código da classe Admins Controller e como você faz a instância.

Pode ser que o problema não seja nesse contexto que estamos tratando e sim outra coisa, nesse caso possuir todo o código pode ajudar a chegar a raiz do problema.

 

Ou simplesmente diga qual o objetivo a alcançar, talvez possamos chegar a um jeito mais fácil porque essa é a questão da orientação a objeto simplificar o complicado.

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Beleza!!

 

Controlador Admin:

 

<?php

class Admins extends Controller{

    

    //construct que chama o model

    public function __construct()

    {

        $this->adminModel = $this->model("Admin");

    }



    public function home(){

        $dados = [

            'admins' => $this->adminModel->lerAdmin()

        ];



        $this->view('paginas/admins/home',$dados);      

      

       

    }



    //função que cadastra o admin



    public function cadastrar(){

        $formulario = filter_input_array(INPUT_POST, FILTER_SANITIZE_STRING);

        if(isset($formulario)):

            //filtra os dados

            $dados = [

                'nome_admin' => trim($formulario['nome_admin']),

                'email_admin' => trim($formulario['email_admin']),

                'senha_admin' => trim($formulario['senha_admin']),

                'confirmar_senha_admin' => trim($formulario['confirmar_senha_admin']),

            ];



            //verificando se os dados não estão vazios

            if(in_array("", $formulario)):

            

                if(empty($formulario['nome_admin'])):

                    Sessao::mensagem('admin','Preencha o campo nome','alert-danger');

                endif;



                if(empty($formulario['email_admin'])):

                    $dados['mensagem_erro'] = "Preencha o campo email";

                endif;



                if(empty($formulario['senha_admin'])):

                    $dados['mensagem_erro'] = "Preencha o campo senha";

                 endif;



                if(empty($formulario['confirmar_senha_admin'])):

                    $dados['mensagem_erro'] = "Preencha o campo confirmar senha";

                 endif;

               

            else:

              if(Checa::checaEmail($formulario['email_admin'])):

                    Sessao::mensagem('admin','O e-mail informado é inválido','alert-danger');

                

                elseif($this->adminModel->checarEmail($formulario['email_admin'])):

                    Sessao::mensagem('admin','O e-mail informado já foi cadastrado','alert-danger');

                elseif(strlen($formulario['senha_admin']) < 6):

                    Sessao::mensagem('admin','A senha precisa ter pelo menos 6 caracteres','alert-danger');

               

                elseif($formulario['senha_admin'] != $formulario['confirmar_senha_admin']):

                    Sessao::mensagem('admin','As senhas são diferentes','alert-danger');

                else:

                    if($this->adminModel->armazenar($dados)):

                        Sessao::mensagem('admin','Admin cadastrado com sucesso!');

                        $dados = [

                            'nome_admin' => '',

                            'email_admin' => '',

                            'senha_admin' => '',

                            'confirmar_senha_admin' => '',

                        ];

                    else:

                        Sessao::mensagem('admin','Erro ao cadastrar o admin!','alert-danger');

                    endif;

                   

                endif;

        endif;

        else:

            $dados = [

                'nome_admin' => '',

                'email_admin' => '',

                'senha_admin' => '',

                'confirmar_senha_admin' => '',

                'mensagem_erro' => '',

            ];

        endif;   

        $this->view('paginas/admins/cadastrar', $dados);

    }

    //faz o login

    public function login(){

        $formulario = filter_input_array(INPUT_POST, FILTER_SANITIZE_STRING);

        if(isset($formulario)):

            if(isset($formulario['manter_logado'])):

                $dados = [

                    'email_admin' => trim($formulario['email_admin']),

                    'senha_admin' => trim($formulario['senha_admin']),

                    'manter_logado' => trim($formulario['manter_logado']),

                ];

            else:   

                $dados = [

                    'email_admin' => trim($formulario['email_admin']),

                    'senha_admin' => trim($formulario['senha_admin']),

                ];

            endif;

            



            if(in_array("", $formulario)):

            



                if(empty($formulario['email_admin'])):

                    Sessao::mensagem('admin','Preencha o campo e-mail','alert-danger');

                endif;



                if(empty($formulario['senha_admin'])):

                    Sessao::mensagem('admin','Preencha o campo senha','alert-danger');

                 endif;

               

            else:

              if(Checa::checaEmail($formulario['email_admin'])):

                    Sessao::mensagem('admin','O e-mail informado é inválido','alert-danger');

                else:

                    $admin = $this->adminModel->checarLogin($formulario['email_admin'], $formulario['senha_admin']);

                   if($admin):

                        $this->criarSessao($admin);
                   else:

                       Sessao::mensagem('admin','E-mail ou senha inválidos','alert-danger');

                    

                   endif;

                endif;

        endif;

        else:

            $dados = [

                'email_admin' => '',

                'senha_admin' => '',

                'manter_logado' => '',

                'mensagem_erro' => '',

            ];

        endif;   

        $this->view('paginas/admins/login', $dados);

    }



    private function criarSessao($admin){

        $_SESSION['id'] = $admin->id;

        $_SESSION['nome'] = $admin->nome;

        $_SESSION['email'] = $admin->email;

        $_SESSION['acesso'] = $admin->acesso;




        URL::redirecionar('paginas/home');

    }




    public function Sair(){
        unset($_SESSION['id']);

        unset($_SESSION['nome']);

        unset($_SESSION['email']);

        unset($_SESSION['acesso']);



  
        session_destroy(); 

        



        URL::redirecionar('paginas/login');

    }

}

 

 

Model Admin:

<?php



class Admin {

    private $db;



    public function __construct()

    {

        $this->db = new DataBase;

    }



    public function lerAdmin(){

        $this->db->query("SELECT * FROM admins");

       return $this->db->resultados();

       

    }



    public function checarEmail($email){

        $this->db->query("SELECT email FROM admins where email = :email_admin");

        $this->db->bind("email_admin",$email);



        if($this->db->resultado()):

            return true;

        else:

            return false;

        endif;

    }



    public function armazenar($dados){

        $this->db->query("INSERT INTO admins (nome, email, senha, acesso) VALUES (:nome, :email, :senha, :acesso)");

        $this->db->bind("nome", $dados['nome_admin']);

        $this->db->bind("email", $dados['email_admin']);

        $this->db->bind("senha", $dados['senha_admin']);

    
        if($this->db->executa()){

            return true;

        }else{

            return false;

        }

    }



    public function checarLogin($email, $senha){

        $this->db->query("SELECT * FROM admins where email = :email_admin and senha = :senha_admin");

        $this->db->bind("email_admin",$email);

        $this->db->bind("senha_admin",$senha);



        if($this->db->resultado()):

            $resultado = $this->db->resultado();

            return $resultado;

        else:

            return false;

        endif;

    }



}

 

Class Controler:

<?php



class Controller {



    public function model($model){

        require_once '../app/Models/'.$model.'.php';

        return new $model;

    }



    public function view($view, $dados = []){

        $arquivo = ('../app/Views/'.$view.'.php');

        if(file_exists($arquivo)):

            require_once $arquivo;

        else:

            die('Método não encontrada');

        endif;

    }

}

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

O que eu vi e percebi que você está tentando fazer, me corrija se eu estiver errado....

Em um arquivo você chama o método home da class Admins esse por sua vez como é herdeira da class Controller usa o método model para incluir outro arquivo de class, até aqui tudo bem (só deixando em destaque o atributo adminModel que está inexistente em ambas classes).

Logo em seguida você aciona o método view da class Controller para anexar um arquivo no caso o home.php, e acredito que seja nesse arquivo que você quer acessar os dados carregados pelo método home.

 

Um problema está no método view. Esse método tem por função anexar um arquivo, porém você não pode passar parâmetros seja por include seja por require para esse arquivo, isso não é possível de fazer.

 

Outra questão está na herança como view pertence a classe mãe "Controller" ela não tem acesso a dados de sua filha no caso a class Admins a não ser que você mande esses dados por parâmetro assim como você fez (mesmo que isso perde no conceito de abstração, mas não vem ao caso).

 

Veja que as coisas deram certo nesse exemplo:

https://drive.google.com/file/d/1LJdV04j7wGu-WthcLrlCBOIR35Y1Tq1V/view?usp=sharing

 

Acho que seu problema foi que os métodos de suas classes fazem mais do que deviam fazer, em uma classe no geral podemos dizer que um método escreve a letra i e o outro método coloca o pingo nesse i.

Dê uma enxugada nos métodos se um olha se o e-mail está correto ele já fez mais do que o necessário deixe a próxima tarefa para outro método até mesmo se use de classes específicas para cada coisa, se uma classe faz leitura no banco não há necessidade dele validar strings etc...

Siga esse truque se um método possui mais até 11 linhas é bom se está com até 22 ele está no seu limite, mais que isso aí o método não está trabalhando como se deve.

 

Incluir arquivos usando classes, não que isso seja errado, mas prefiro usar funções para tal finalidade e classes para coisas corriqueiras da aplicação.

Abaixo uma função que se por exemplo você faz:

$a = new MinhaClasse();

Sem mesmo você incluir o arquivo a função sabe que o código precisa da classe e faz o anexo dela

Spoiler

<?php
/**
 * *********************************************************************
 * @function: Função para auto carregamento de classes
 * *********************************************************************
 * @autor: Spell Master
 * @copyright (c) 2014, Spell Master AND Zeed
 * @vesion: 6.0 2021, Spell Master
 * *********************************************************************
 */

spl_autoload_register(function ($Class) {
    $findDir = [ // Em quais pastas estão os arquivos de classes?
        'diretorio_a',
        'diretorio_b',
        'diretorio_c'
    ];
    $includeDir = null;
    foreach ($findDir as $DirName) {
        if (!$includeDir && file_exists(__DIR__ . FindClass($DirName, $Class))
            && !is_dir(__DIR__ . FindClass($DirName, $Class))) {
            include_once (__DIR__ . FindClass($DirName, $Class));
            $includeDir = true;
        }
    }
    if (!$includeDir) {
        die("Erro interno no servidor ao encontrar dados cruciais de funcionamento!");
    }
});

function FindClass($dir, $class) {
    return ('class' . $dir . $class . '.php');
}

 

 

Requer manipulação do diretório no FindClass para correto funcionamento.

Ou seja essa função vai até o diretório class/ [ $findDir ] / $class .php

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

O arquivo drive que você colocou está restrito, por favor libério-o. Obrigado pelas dicas irei analisar bem os dados e tentarei corrigir senão der certo irei retornar aqui.

Compartilhar este post


Link para o post
Compartilhar em outros sites
1 hora atrás, Sapinn disse:

O arquivo drive que você colocou está restrito, por favor libério-o. Obrigado pelas dicas irei analisar bem os dados e tentarei corrigir senão der certo irei retornar aqui.

Malz apenas tinha o upado...

https://drive.google.com/file/d/1LJdV04j7wGu-WthcLrlCBOIR35Y1Tq1V/view?usp=sharing

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar Agora

  • Conteúdo Similar

    • Por luiz monteiro
      Olá, tudo bem?
       
      Estou melhorando meu conhecimento em php e mysql e, me deparei com o seguinte. A tabela da base de dados tem um campo do tipo varchar(8) o qual armazena números. Eu não posso alterar o tipo desse campo. O que preciso é fazer um select para retornar o números que contenham zeros a direita ou a esquerda.
      O que tentei até agora
       
      Ex1
      $busca = $conexao->prepare("select campo form tabela where (campo = :campo) ");
      $busca->bindParam('campo', $_REQUEST['campo_form']);
       
      Se a direita da string $_REQUEST['campo_form'] termina ou inicia com zero ou zeros, a busca retorna vazio.
      Inseri dados numéricos, da seguinte maneira para testar: 01234567;  12345670: 12345678: 12340000... entre outros nessa coluna. Todos os valores que não terminam ou não iniciam com zero ou zeros, o select funciona.
       
       
      Ex2
      $busca = $conexao->prepare("select campo form tabela where (campo = 0340000) ");
      Esse número está cadastrado, mas não retorna.
       
      Ex3
      $busca = $conexao->prepare("select campo form tabela where (campo = '02340001' ) ");
      Esse número está cadastrado, mas não retorna.
       
       
      Ex4
      $busca = $conexao->prepare("select campo form tabela where (campo like 2340000) ");
      Esse número está cadastrado, mas não retorna.
       
      Ex5
      $busca = $conexao->prepare("select campo form tabela where (campo like '12340000') ");
      Esse número está cadastrado, mas não retorna.
       
      Ex6
      $busca = $conexao->prepare("select campo form tabela where (campo like '"12340000"' ) ");
      Esse número está cadastrado, mas não retorna.
       
       
      Ex7
      $busca = $conexao->prepare("select campo form tabela where (campo like :campo) ");
      $busca->bindParam('campo', $_REQUEST['campo_form'])
      Não retorna dados.
       
      O  $_REQUEST['campo_form'] é envio via AJAX de um formulário. 
      Usei o gettype para verificar o post, e ele retorna string.
      Fiz uma busca com número 12345678 para verificar o que o select retorna, e também retrona como string.
       
      Esse tipo de varchar foi usado porque os números que serão gravados nesse campo,  terão zeros a direita ou na esquerda. Os tipos number do mysql não gravam zeros, então estou usando esse. O problema é a busca.
      Agradeço desde já.
       
       
    • Por daemon
      Boa tarde,
       
      Eu tenho uma rotina que faz uma leitura do arquivo .xml de vários sites.

      Eu consigo pegar o tópico e a descrição, e mostrar a imagem que esta na pagina do link.
      Para isso utilizo esta função:
      function getPreviewImage($url) { // Obter o conteúdo da página $html = file_get_contents($url); // Criar um novo objeto DOMDocument $doc = new DOMDocument(); @$doc->loadHTML($html); // Procurar pela tag meta og:image $tags = $doc->getElementsByTagName('meta'); foreach ($tags as $tag) { if ($tag->getAttribute('property') == 'og:image') { return $tag->getAttribute('content'); } } // Se não encontrar og:image, procurar pela primeira imagem na página $tags = $doc->getElementsByTagName('img'); if ($tags->length > 0) { return $tags->item(0)->getAttribute('src'); } // Se não encontrar nenhuma imagem, retornar null return null; } // Uso: $url = "https://example.com/article"; $imageUrl = getPreviewImage($url); if ($imageUrl) { echo "<img src='$imageUrl' alt='Preview'>"; } else { echo "Nenhuma imagem encontrada"; }  
      Mas estou com um problema, esta funcão funciona quando coloco em uma pagina de teste.php. Preciso mostrar em uma página inicial diversas fotos de todos os links. (No caso acima só funciona 1).
    • Por violin101
      Caros amigos, saudações.
       
      Por favor, me permita tirar uma dúvida com os amigos.

      Tenho um Formulário onde o Usuário digita todos os Dados necessários.

      Minha dúvida:
      --> como faço após o usuário digitar os dados e salvar, o Sistema chamar uma Modal ou mensagem perguntando se deseja imprimir agora ?

      Grato,
       
      Cesar
    • Por Carcleo
      Tenho uma abela de usuarios e uma tabela de administradores e clientes.
      Gostaria de uma ajuda para implementar um cadastro
       
      users -> name, login, passord (pronta) admins -> user_id, registratiom, etc.. client -> user_id, registratiom, etc...
      Queria ajuda para extender de user as classes Admin e Client
      Olhem como estáAdmin
      <?php namespace App\Models; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; class Admin extends User {     use HasFactory;            protected $fillable = [         'name',         'email',         'password',         'registration'     ];      private string $registration;     public function create(         string $name,          string $email,          string $password,         string $registration     )     {         //parent::create(['name'=>$name, 'email'=>$email, 'password'=>$password]);         parent::$name = $name;         parent::$email = $email;         parent::$password = $password;         $this->registration = $registration;     } } User
      <?php namespace App\Models; // use Illuminate\Contracts\Auth\MustVerifyEmail; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Foundation\Auth\User as Authenticatable; use Illuminate\Notifications\Notifiable; use Illuminate\Database\Eloquent\Relations\BelongsToMany; class User extends Authenticatable {     /** @use HasFactory<\Database\Factories\UserFactory> */     use HasFactory, Notifiable;     static string $name;     static string $email;     static string $password;     /**      * The attributes that are mass assignable.      *      * @var list<string>      */     protected $fillable = [         'name',         'email',         'password',     ];          /**      * The attributes that should be hidden for serialization.      *      * @var list<string>      */     protected $hidden = [         'remember_token',     ];     /**      * Get the attributes that should be cast.      *      * @return array<string, string>      */     protected function casts(): array     {         return [             'email_verified_at' => 'datetime',             'password' => 'hashed',         ];     }          public function roles() : BelongsToMany {         return $this->belongsToMany(Role::class);     }       public function hasHole(Array $roleName): bool     {                 foreach ($this->roles as $role) {             if ($role->name === $roleName) {                 return true;             }         }         return false;     }         public function hasHoles(Array $rolesName): bool     {                 foreach ($this->roles as $role) {             foreach ($rolesName as $rolee) {             if ($role->name === $rolee) {                 return true;             }          }         }         return false;     }         public function hasAbility(string $ability): bool     {         foreach ($this->roles as $role) {             if ($role->abilities->contains('name', $ability)) {                 return true;             }         }         return false;     }     } Como gravar um Admin na tabela admins sendo que ele é um User por extensão?
      Tentei assim mas é claro que está errado...
      public function store(Request $request, Admin $adminModel) {         $dados = $request->validate([             "name" => "required",             "email" => "required|email",             "password" => "required",             "registration" => "required"         ]);         $dados["password"] =  Hash::make($dados["password"]);                  $admin = Admin::where("registration",  $dados["registration"])->first();                  if ($admin)              return                    redirect()->route("admin.new")                             ->withErrors([                                 'fail' => 'Administrador já cadastrados<br>, favor verificar!'                   ]);                            $newAdmin = $adminModel->create(                                    $dados['name'],                                    $dados['email'],                                    $dados['password'],                                    $dados['registration']                                 );         dd($newAdmin);         $adminModel->save();         //$adminModel::create($admin);                  return redirect()->route("admin.new")->with("success",'Cadastrado com sucesso');     }  
    • Por violin101
      Caros amigos, saudações.
       
      Gostaria de tirar uma dúvida com os amigos, referente a PDV.
       
      Estou escrevendo um Sistema com Ponto de Vendas, a minha dúvida é o seguinte, referente ao procedimento mais correto.

      Conforme o caixa vai efetuando a venda, o Sistema de PDV já realiza:
      a baixa direto dos produtos no estoque
      ou
      somente após concretizar a venda o sistema baixa os produtos do estoque ?
       
      Grato,
       
      Cesar
       
×

Informação importante

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