Jump to content
Fórum Script Brasil
  • 0

PHP + MVC


Leonardo Felipe
 Share

Question

Bom Dia pessoal, estou reestruturando um projeto antigo para o Modelo MVC.... Comecei tudo bem, digitava o login e senha e autenticava certo e entrava no Home, então tive a necessidade de fazer umas alterações devido aos extends que necessitei então, não sei porque, começou a apresentar:

Warning: mysqli_prepare() expects parameter 1 to be mysqli, null given in...

Não entendi porque, pois estava funcionando!

PS.: O que está apresentado não é todo o código de cada arquivo... Só postei o que achei necessário para entenderem o problema.

// MainVar.class.php - Variáveis do Sistema( classe que criei para que qualquer arquivo possa usar suas variáveis )
class MainVar {
    var $DBName        = 'dbName';
    var $DBServer        = 'localhost';
    var $DBUser          = 'root';
    var $DBPassword   = '';

   { ..... }
}
// Conexao.class.php - Classe de Conexao
class Conexao extends MainVar {
   
    public function __construct(){
       
    }
   
    public function Connect(){
       
        $mysqli = mysqli_connect($this->DBServer, $this->DBUser, $this->DBPassword, $this->DBName);
                       
        if(mysqli_connect_errno()){
            trigger_error('Erro ao tentar conectar ao banco de dados! '.$mysqli->error,E_USER_ERROR);
        }
       
        $mysqli->autocommit(false);
       
        mysqli_query($mysqli, "SET NAMES 'utf8'");
        mysqli_query($mysqli, 'SET character_set_connection=utf8');
        mysqli_query($mysqli, 'SET character_set_client=utf8');
        mysqli_query($mysqli, 'SET character_set_results=utf8');
       
        return $mysqli;
    }
}
// logar.php
require_once('Config/MainVar.class.php');
require_once('Config/Conexao.class.php');
require_once('Libs/Funcoes.class.php');
require_once('Controller/LoginController.php');

if($_GET['acessar'] == 'acessar'){
       
    $LoginController = new LoginController();
    $login = $_POST['login'];
    $senha = $_POST['senha'];
   
    // Tenta logar o usuário com os dados
    if($LoginController->ValidaUsuario($login, $senha)){
       
        // Usuário logado com sucesso, redireciona ele para a página restrita
        header("Location: index.php");
        exit;
      }
}
// LoginController.php
require_once('Model/LoginModel.php');

class LoginController extends LoginModel{
   
    private $LoginModel;
    private $Funcoes;
   
    public function __construct(){
        $this->Funcoes = new Funcoes();
    }
   
    public function ValidaUsuario($login, $senha){
       
        if($senhaCodificada = $this->Funcoes->CodificaSenha($login, $senha)){
           
            // Chamo o ValidaUsuario de LoginModel
            $total = parent::ValidaUsuario($login, $senhaCodificada);
            return ($total == 1) ? true : false;
           
        }
    }
    {...}
}
// LoginModel.php
class LoginModel extends Conexao{
   
    private $mysqli;
   
    public function __construct(){
        $this->mysqli = parent::Connect();
    }
   
    public function ValidaUsuario($login, $senha){
       
        $sql = "SELECT COUNT(*) AS total
                FROM tabela_usuarios
                WHERE login = ? AND senha = ?";
       
       if($query = mysqli_prepare($this->mysqli, $sql)){

            O PROBLEMA É QUE AQUI NÃO ENTRA MAIS!!!!!
       
            /* ADICIONA OS PARÂMETROS */
            mysqli_stmt_bind_param($query, "ss",
                                   $login,
                                   $senha);
           
            /* ADICIONA OS PARAMETROS */
            if(mysqli_stmt_execute($query)){
               
                mysqli_stmt_bind_result($query,$total);
               
                if(mysqli_stmt_fetch($query)){
                    return $total;
                }
            }
        }
    }
    {...}
}
Então, aí está a dificuldade: if($query = mysqli_prepare($this->mysqli, $sql)){ $this->mysqli deve(acho) está vazia como informa o Warning. Achando isso, em LoginModel fiz:
class LoginModel extends Conexao{
   
    private $mysqli;
   
    public function __construct(){
        $this->mysqli = parent::Connect();
        var_dump($this->mysqli); // ADICIONEI ESTE VAR_DUMP();
    }
    { ... }
}

Mas não retornou nada na tela. estou achando que a classe de Conexão não esteja realizando corretamente o extends da classe MainVar OU nã está conseguindo trazer os valores de DBServer, DBUser, DBUser e DBName para a function Connect() da classe Conexao:

$mysqli = mysqli_connect($this->DBServer, $this->DBUser, $this->DBPassword, $this->DBName);

ACHO que está vindo assim, tudo vazio:

$mysqli = mysqli_connect(, , ,);

Mas não to sabendo como confirmar isto...

Será este o problema mesmo? Como posso testar e consequentemente resolver... Como faço??? Estou perdido, OMG!!!

Agradeço antecipadamente pelas dicas!!!

Link to comment
Share on other sites

2 answers to this question

Recommended Posts

  • 0

Bom dia pessoal,

Bem, consegui filtrar o problema. Em LoginModel.php na function __construct() conectava ao banco usando parent::Connect(), desta forma:

LoginModel.php

class LoginModel extends Conexao{
   
    private $mysqli;
   
    public function __construct(){
        $this->mysqli = parent::Connect();
    }
   
    public function ValidaUsuario($login, $senha){
       
        $sql = "SELECT COUNT(*) AS total
                FROM tabela_usuarios
                WHERE login = ? AND senha = ?";
       
       if($query = mysqli_prepare($this->mysqli, $sql)){

            O PROBLEMA É QUE AQUI NÃO ENTRA MAIS!!!!!
       
            /* ADICIONA OS PARÂMETROS */
            mysqli_stmt_bind_param($query, "ss",
                                   $login,
                                   $senha);
           
            /* ADICIONA OS PARAMETROS */
            if(mysqli_stmt_execute($query)){
               
                mysqli_stmt_bind_result($query,$total);
               
                if(mysqli_stmt_fetch($query)){
                    return $total;
                }
            }
        }
    }
    
    {...}
}
Mas o problema é que não está entrando no método __construct(). Para testar fiz o seguinte: LoginModel.php
class LoginModel extends Conexao{
   
    private $mysqli;
   
    public function __construct(){
        //$this->mysqli = parent::Connect(); VOU UTILIZAR ESTE MÉTODO NA FUNCTION VALIDAUSUARIO()
    }
   
    public function ValidaUsuario($login, $senha){
       
        $sql = "SELECT COUNT(*) AS total
                FROM tabela_usuarios
                WHERE login = ? AND senha = ?";

       $this->mysqli = parent::Connect(); // COLOQUEI AQUI A CHAMADA DO MÉTODO DE CONEXÃO
       
       if($query = mysqli_prepare($this->mysqli, $sql)){

            O PROBLEMA É QUE AQUI NÃO ENTRA MAIS!!!!!
       
            /* ADICIONA OS PARÂMETROS */
            mysqli_stmt_bind_param($query, "ss",
                                   $login,
                                   $senha);
           
            /* ADICIONA OS PARAMETROS */
            if(mysqli_stmt_execute($query)){
               
                mysqli_stmt_bind_result($query,$total);
               
                if(mysqli_stmt_fetch($query)){
                    return $total;
                }
            }
        }
    }
    
    {...}
}
A testar funcionou perfeitamente, autenticou e acessou minha home.php. O estranho é que em LoginController.php eu uso o método __construct() da seguinte forma: LoginController.php
require_once('Model/LoginModel.php');

class LoginController extends LoginModel{
   
    private $LoginModel;
    private $Funcoes;
   
    public function __construct(){
        $this->Funcoes = new Funcoes(); // INSTANCIO A CLASSE FUNÇÕES
    }
   
    public function ValidaUsuario($login, $senha){
       
        if($senhaCodificada = $this->Funcoes->CodificaSenha($login, $senha)){ // CHAMO O MÉTODO DE CRIPTOGRAFAR SENHA
           
            // Chamo o ValidaUsuario de LoginModel
            $total = parent::ValidaUsuario($login, $senhaCodificada);
            return ($total == 1) ? true : false;
           
        }
    }
    
    { ... }
}

E consegue entrar no __construct() instanciar a classe Funcoes e utilizar seus métodos.

Só não entendi o porque.... Alguém poderia me explicar para que eu consigar utilizar do __construct() de LoginModel.php para fazer a Conexão!!???

Agradeço antecipadamente...

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share



  • Forum Statistics

    • Total Topics
      150.9k
    • Total Posts
      648.8k
×
×
  • Create New...