Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Bom dia a todos. Estou iniciando em php oo e fazendo um script de login, mas o bicho num funfa. Da msg de erro "no database selected". Segue o código para análise. Sou grato por qq ajuda.
Classe Usuario
<?php
class Usuario {
// Dados do usuario
var $login;
var $senha;
// Dados do servidor mysql
var $servidor = 'localhost';
var $administrador = 'root';
var $passe = 'klz3t8j1';
var $banco = 'pessoal';
function conecta_banco() {
$this->servidor = $servidor;
$this->administrador = $administrador;
$this->passe = $passe;
$this->banco = $banco;
$conexao = mysql_connect($this->servidor, $this->administrador, $this->passe);
mysql_select_db($this->banco, $conexao);
}
function getNome() {
return $this->login;
}
function autentica() {$this->conecta_banco();
$login = $this->login;
$senha = $this->senha;
$query = "SELECT usuario, senha, idpessoa FROM pessoa WHERE usuario = $login AND senha = $senha";
$resultados = mysql_query($query) or die (mysql_error());
if (mysql_num_rows($resultados)==1) {
$this->geraSessao($this);
return true;
}
else
{
return false;
}
}
function geraSessao($login) {
session_start();
$_SESSION['usuario'] = $login;
}
}
?>
[i]Página autenticar.php[/i]
<?php
include("usuario.php");
$login = $_POST["txtUsuario"];
$senha = $_POST["txtsenha"];
$usuario = new Usuario($login,$senha);header("location:listar.php");
}
?>Tu ta em qual versão do php pra usar var? E o banco de dados existe ?
>
var $banco = 'pessoal';
Coloque aqui, o nome do seu banco de dados. Você já o criou?
O nome do banco é pessoal
>
Tu ta em qual versão do php pra usar var? E o banco de dados existe ?
A versão do php é PHP 5.3.10. O banco foi criado com o nome "pessoal"
Está online ou localmente?
>
Está online ou localmente?
Estou trabalhando localmente com o php 5.3.10 configurado em ambiente linux ubuntu 12.04 apache2handler.
Por padrão a senha do MySql, é um valor de nulo, e você declarou: klz3t8j1, você mudou a senha padrão do MySql, ou não? Se não, declare a senha com nulo.
Adicione uma variável para conexão:
private $_conexao;
Não é necessário usar 'var' para declarar uma variável e os manuais de estilo recomendam não usar, portanto, há uma convenção de não usar 'var'.
As variáveis a seguir devem ser privadas, para que não sejam acessadas de fora da classe.
private $_servidor = 'localhost';
private $_administrador = 'root';
private $_passe = 'klz3t8j1';
private $_banco = 'pessoal';
Observe que eu escrevi o nome de todas com o prefixo '_'. Isso é outra convenção, para que fique mais fácil identificar que essa variável é privada e só podo ser acessada de dentro da classe.
Leia isso:
Remova isso, não faz sentido...
$this->servidor = $servidor;
$this->administrador = $administrador;
$this->passe = $passe;
$this->banco = $banco;
De onde estão vindo as variáveis $servidor, $administrador, $passe e $banco (você não está passando pela função). Parece que você está usando valores nulos para sobrescrever suas variáveis com dados para conexão com o banco. O porquê de seu script não está funcionando provavelmente é este.
Crie a sua conexao da seguinte forma
// Faz a conexao...
$this->_conexao = mysql_connect($this->_servidor, $this->_administrador, $this->_passe);
// ...e verifica se não houve nenhum erro ao fazer a conexão
if (!$this->_conexao) {
die('Não está conectado ao servidor: ' . mysql_error());
}
// Seleciona o banco de dados
$bd_selecionado = mysql_select_db($this->_banco, $this->_conexao);
// ...e verifica...
if (!$bd_selecionado) {
die ('Não foi possível selecionar o banco de dados: ' . mysql_error());
}
O correto é chamar o método 'conecta_banco' já no construtor
function __construct() {
$this->conecta_banco();
}
Adicione também um método destrutor, e feche a conexão quando você destruir o objeto:
function __destruct() {
mysql_close($this->_conexao);
}
o método 'autentica' fará então apenas o query e a comparação do resultado.
Saiba mais sobre Construtores e Destrutores.
Quando for fazer o query, use o identificador da conexão:
mysql_query($query, $this->_conexao);
Observações:
- Não testei o código acima, portanto pode conter algum erro de sintaxe. Caso apareça, verifique a linha onde ocorreu o erro e corrija.
- Ao postar um código no fórum, coloque entre as tags 'php' para que fique mais fácil a leitura:
[php] ... código [/php]
troque esta linha:
mysql_select_db($this->banco, $conexao);
por esta:
mysql_select_db($this->banco, $conexao) or exit( mysql_error() );
isso mostrará a mensagem de erro, caso haja falha na seleção do banco
você também pode usar var_dump() para testar o retorno dessa função
e leia isto:
http://br2.php.net/mysql_select_db
no topo já há o aviso pra evitar mysql_*(). Prefira MySQLi ou PDO
>
Adicione uma variável para conexão:
private $_conexao;
Não é necessário usar 'var' para declarar uma variável e os manuais de estilo recomendam não usar, portanto, há uma convenção de não usar 'var'.
As variáveis a seguir devem ser privadas, para que não sejam acessadas de fora da classe.
private $_servidor = 'localhost';
private $_administrador = 'root';
private $_passe = 'klz3t8j1';
private $_banco = 'pessoal';
Observe que eu escrevi o nome de todas com o prefixo '_'. Isso é outra convenção, para que fique mais fácil identificar que essa variável é privada e só podo ser acessada de dentro da classe.
Leia isso:
Remova isso, não faz sentido...
$this->servidor = $servidor;
$this->administrador = $administrador;
$this->passe = $passe;
$this->banco = $banco;
De onde estão vindo as variáveis $servidor, $administrador, $passe e $banco (você não está passando pela função). Parece que você está usando valores nulos para sobrescrever suas variáveis com dados para conexão com o banco. O porquê de seu script não está funcionando provavelmente é este.
Crie a sua conexao da seguinte forma
// Faz a conexao...
$this->_conexao = mysql_connect($this->_servidor, $this->_administrador, $this->_passe);
// ...e verifica se não houve nenhum erro ao fazer a conexão
if (!$this->_conexao) {
die('Não está conectado ao servidor: ' . mysql_error());
}
// Seleciona o banco de dados
$bd_selecionado = mysql_select_db($this->_banco, $this->_conexao);
// ...e verifica...
if (!$bd_selecionado) {
die ('Não foi possível selecionar o banco de dados: ' . mysql_error());
}
O correto é chamar o método 'conecta_banco' já no construtor
function __construct() {
$this->conecta_banco();
}
Adicione também um método destrutor, e feche a conexão quando você destruir o objeto:
function __destruct() {
mysql_close($this->_conexao);
}
o método 'autentica' fará então apenas o query e a comparação do resultado.
Saiba mais sobre Construtores e Destrutores.
Quando for fazer o query, use o identificador da conexão:
mysql_query($query, $this->_conexao);
Observações:
- Não testei o código acima, portanto pode conter algum erro de sintaxe. Caso apareça, verifique a linha onde ocorreu o erro e corrija.
- Ao postar um código no fórum, coloque entre as tags 'php' para que fique mais fácil a leitura:
[php] ... código [/php]
Quando eu declaro
[php]
private $_servidor = 'localhost';
private $_administrador = 'root';
private $_passe = 'klz3t8j1';
private $_banco = 'pessoal';não estou atribuindo valores a estas variáveis?
Sim, aí você está. Mas o que você está fazendo na função conecta_banco com as essas variáveis?
Na linha 15 você colocou:
function conecta_banco() {
$this->servidor = $servidor;
$this->administrador = $administrador;
$this->passe = $passe;
$this->banco = $banco;
$conexao = mysql_connect($this->servidor, $this->administrador, $this->passe);
mysql_select_db($this->banco, $conexao);
}
Porque você está sobrescrevendo a propriedades do objeto e onde foi que você declarou as variáveis $servidor, $administrador, $passe e $banco?
>
Sim, aí você está. Mas o que você está fazendo na função conecta_banco com as essas variáveis?
Na linha 15 você colocou:
function conecta_banco() {
$this->servidor = $servidor;
$this->administrador = $administrador;
$this->passe = $passe;
$this->banco = $banco;
$conexao = mysql_connect($this->servidor, $this->administrador, $this->passe);
mysql_select_db($this->banco, $conexao);
}
Porque você está sobrescrevendo a propriedades do objeto e onde foi que você declarou as variáveis $servidor, $administrador, $passe e $banco?
Já suprime isso
$this->servidor = $servidor;
$this->administrador = $administrador;
$this->passe = $passe;
$this->banco = $banco;
Devo fazer então
$conexao = mysql_connect($this->_servidor, $this->_administrador, $this->_passe);
mysql_select_db($this->banco, $_conexao);
certo?
Você recebe alguma mensagem de erro, ou simplesmente tenta logar e nada acontece ?
#12
Não se esqueça do "this->" em _conexao (essa variável precisa ser acessível a todos os métodos da classe) e das verificações. Você deve verificar se a conexão foi feita com sucesso antes de selecionar o DB, e deve verificar se o banco de dados foi selecionado com sucesso antes de executar um comando SQL (veja como eu coloquei no post #8).
Meu amigo, não era mais simples você fazer isso aqui ? :huh:
irá funcionar normalmente...
<?php
class Usuario {
// Dados do usuario
public $login;
public $senha;
// Dados do servidor mysql
private $servidor = 'localhost';
private $administrador = '';
private $passe = '';
private $banco = '';
public function geraSessao()session_start();
}
public function conecta_banco() {
$conexao = mysql_connect($this->servidor,$this->administrador,$this->passe);
mysql_select_db($this->banco, $conexao)or die(mysql_error());
}
public function __construct($login,$senha)$this->conecta_banco();
$this->login = $login;
$this->senha = $senha;
$query =mysql_query("SELECT usuario, senha, idpessoa FROM pessoa WHERE usuario = '".$this->login."' AND senha = '".$this->senha."'")or die(mysql_error());
if (mysql_num_rows($query)==1)
{
$this->geraSessao();
$_SESSION['usuario'] = $this->login;
header("Location: lista.php");
}
}
}
$login = $_POST["txtUsuario"];
$senha = $_POST["txtsenha"];
$usuario = new Usuario($login,$senha);
?>
Não esqueça de colocar os dados.
>
Meu amigo, não era mais simples você fazer isso aqui ? :huh:
irá funcionar normalmente...
<?php
class Usuario {
// Dados do usuario
public $login;
public $senha;
// Dados do servidor mysql
private $servidor = 'localhost';
private $administrador = '';
private $passe = '';
private $banco = '';
public function geraSessao()session_start();
}
public function conecta_banco() {
$conexao = mysql_connect($this->servidor,$this->administrador,$this->passe);
mysql_select_db($this->banco, $conexao)or die(mysql_error());
}
public function __construct($login,$senha)$this->conecta_banco();
$this->login = $login;
$this->senha = $senha;
$query =mysql_query("SELECT usuario, senha, idpessoa FROM pessoa WHERE usuario = '".$this->login."' AND senha = '".$this->senha."'")or die(mysql_error());
if (mysql_num_rows($query)==1)
{
$this->geraSessao();
$_SESSION['usuario'] = $this->login;
header("Location: lista.php");
}
}
}
$login = $_POST["txtUsuario"];
$senha = $_POST["txtsenha"];
$usuario = new Usuario($login,$senha);
?>
Não esqueça de colocar os dados.
Não funfou... fiz exatamente como descrito e nada. Nada é executado. Não exibe nenhuma msg.
Então você está com problemas em seu servidor, pois teste o script e funciona corretamente. Como você fez ? como está o formlário ? preencheu os dados: nome do banco login e senha ?
var $banco = 'pessoal';
Coloque aqui, o nome do seu banco de dados. Você já o criou?