Ajuda PHP + MVC

13 views
Skip to first unread message

Leonardo Felipe

unread,
Aug 14, 2012, 9:57:40 AM8/14/12
to forkin...@googlegroups.com
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, mas creio que não esteja conseguindo realizar a conexão por isso está vazio, mas tento desde ontem a noite e não consegui resolver. Vou apresentar a baixo como está meu código:

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( para pegar em qualquer arquivo )
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.

Como posso testar e consequentemente resolver... Como faço??? Estou perdido, OMG!!!

Agradeço antecipadamente pelas dicas!!!

Jefersson Nathan

unread,
Jun 22, 2013, 4:24:39 PM6/22/13
to forkin...@googlegroups.com, leonar...@gmail.com
Boa tarde,

Primeira coisa que notei é que está misturando PHP4 e 5;

var $blablabla ?

Blza, Mais vamos ao problema. A primeira coisa aqui é entender como o parser funciona na OO.
Tipo, o $this é uma referência interna a um objeto, ele é o próprio objeto. ELE NÃO É A CLASSE!

Se você não tem um objeto, você não pode chamar o $this, porque ele não existe, logo o Garbage Collector
faz o seu trabalho e joga essa porcaria pra fora da memória interna.

Ou seja, quando o método Connect() é chamado estáticamente a referência ao
$this não existe, mais o PHP pode cria-lá automáticamente e assim o faz.

Ou seja se a variavél não existe, ela retorna o valor NULL, logo o php entende que você
não está passando nada para o coitado :(

O que você tem que fazer?

Vai ter que criar as váriaveis estáticamente e chamalas como tal na classe Connect(). Exemplo:

public function Connect(){
       public static $DBServer = 'mysql.phpse.net';
        $mysqli = mysqli_connect(self::$DBServer, self::$DBUser, self::$DBPassword, self::$DBName);
       [...]

poderia usar constantes de classe tbm!
     
Qualquer coisa posta em um Gist que fica melhor de ajudar :)

--
Minha opnião sobre o código:

Tem muita coisa que não tem lógica no seu código, principalmente a nomeclatura de classes,
Penso que você poderia pensar em um refactory geral desse código.

Como você vai persistir essa conexão? Não seri ainteressante implementar um registry?


Boa sorte com os códigos! Let fix it!

--
Jefersson Nathan
PHP Sergipe Leader - www.phpse.net
https://github.com/malukenho
Twitter @malukenho

Jefersson Nathan

unread,
Jun 22, 2013, 4:26:46 PM6/22/13
to forkin...@googlegroups.com, leonar...@gmail.com
Cê pode chamar estaticamente de qualquer classe,
Não coloque na Connect() não, alí é só um exemplo :S


Em terça-feira, 14 de agosto de 2012 10h57min40s UTC-3, Leonardo Felipe escreveu:
Reply all
Reply to author
Forward
0 new messages