PHP + MVC - Como resolver falha de extends
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.
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:
Mas não retornou nada na tela. Tô 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 msm? Como posso testar e consequentemente resolver... Como faço??? Estou perdido, OMG!!!
Agradeço antecipadamente pelas dicas!!!
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. Tô 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 msm? Como posso testar e consequentemente resolver... Como faço??? Estou perdido, OMG!!!
Agradeço antecipadamente pelas dicas!!!
comentários (0)
suspender
Lista de Respostas:
15/08/2012 2:38pm
(~12 anos atrás)
(~12 anos atrás)
Boa tarde pessoal,
=================
Wilson Tamarozzi Jr.
Obrigado pela resposta Wilson... Mas não uso PDO, uso uma extensão do PHP * MySQLi - feita para aproveitar os recursos mais avançados do MySQL *.
Mas não foi este o problema não.... Explicação abaixo!
=================
Bem, consegui filtrar o problema. Em LoginModel.php na function __construct() conectava ao banco usando parent::Connect(), desta forma:
LoginModel.php
Mas o problema é que não está entrando no método __construct(). Para testar fiz o seguinte:
LoginModel.php
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
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...
=================
Wilson Tamarozzi Jr.
Obrigado pela resposta Wilson... Mas não uso PDO, uso uma extensão do PHP * MySQLi - feita para aproveitar os recursos mais avançados do MySQL *.
Mas não foi este o problema não.... Explicação abaixo!
=================
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...
16/08/2012 11:44am
(~12 anos atrás)
(~12 anos atrás)
Fiz o seguinte teste aqui e tudo ocorreu como o esperado
Qual a versão do PHP que está usando???
<?php
class MainVar {
public $DBName = 'dbName';
public $DBServer = 'localhost';
public $DBUser = 'root';
public $DBPassword = '';
}
// Conexao.class.php - Classe de Conexao
class Conexao extends MainVar {
public function __construct(){
echo 'Chamou o construtor de Conexao <br />';
}
public function Connect(){
$mysqli = "mysqli_connect($this->DBServer, $this->DBUser, $this->DBPassword, $this->DBName)";
return $mysqli;
}
}
// LoginModel.php
class LoginModel extends Conexao{
private $mysqli;
public function __construct(){
echo 'Chamou o construtor de LoginModel <br />';
$this->mysqli = parent::Connect();
}
public function ValidaUsuario($login, $senha){
$sql = "SELECT COUNT(*) AS total
FROM tabela_usuarios
WHERE login = ? AND senha = ?";
if($this->mysqli!=null){
echo 'ENTROU<br />'. time() . '<br />' . $this->mysqli;
}
}
}
$a = new LoginModel;
$a->ValidaUsuario('A',"B");
Qual a versão do PHP que está usando???