Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Nerdmonkey

__construct()

Recommended Posts

Boa tarde.

 

Qual o problema com esse __construct() ?

 

 

protected function __construct($host,$user,$pass,$db,$server) {
    $server = $_SERVER[ 'SERVER_NAME' ];
 
    if($server == 'localhost' ) {
        $host = 'localhost';
        $user = 'root';
        $pass = '';
        $db = '';
    } else {
        $host = '';
        $user = '';
        $pass = '';
        $db = '';
    }
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

Primeiro, por que acha que ele tem um problema?

Explique melhor suas dúvidas.

 

 

Um possível problema é o fato de ele ser protegido (protected). Você só poderá instanciar a classe por meio de um método estático dessa mesma classe.

Compartilhar este post


Link para o post
Compartilhar em outros sites
Porque está dando erro rs
A classe completa
<?php
class PDOConnectionFactory extends Registry {
private $con = null;
private $dbType = 'mysql';
private $host;
private $user;
private $pass;
private $db;
private $server;
private $persistent;
 
protected function __construct($host,$user,$pass,$db,$server) {
$server = $_SERVER[ 'SERVER_NAME' ];
 
if($server == 'localhost' ) {
$host = 'localhost';
$user = 'root';
$pass = '';
$db = '';
} else {
$host = '';
$user = '';
$pass = '';
$db = '';
}
}
 
public function PDOConnectionFactory( $persistent = false ) {
if( $persistent != false) { $this->persistent = true; }
}
 
public function getConnection() {
try {
$registry = Registry::getInstance();
$options  = array(
PDO::ATTR_PERSISTENT => true,
PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8',
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
);
$this->con = new PDO( $this->dbType.":host=".$this->host.";dbname=".$this->db, $this->user, $this->pass, $options );
$registry->set( 'PDO' , $this->con );
$this->con = $registry->get( 'PDO' );
return $this->con;
} catch ( PDOException $ex  ){ echo "Erro: ".$ex->getMessage(); }
}
 
public function Close() {
if( $this->con != null )
$this->con = null;
}
}
A classe Dao
<?php
class Dao extends PDOConnectionFactory {
public function Dao(){$this->conex = PDOConnectionFactory::getConnection();}
 
/**
* <b>Listar dados da tabela</b> Informe um objeto da class Dao para listar os registros da tabela 
* passada como parâmetro
* @param string $table
* @param string $fields
* @param string $filter
* @param string @inners
*/
function getAll($table, $fields, $where, $inners) {
$sql = $this->conex->prepare( "SELECT $fields FROM $table $inners $where" );
$exe = $sql->execute();
$row = $sql->rowCount();
return $this->processResults( $row, $sql );
}
Utilizando o objeto
<?php
require_once('template/inc/Config.inc.php');
 
// Put your code here
$dao = new Dao();
$dao->getAll( ' sis_clientes ', ' * ', '', '' );
?>
Erro retornado
Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[3D000]: Invalid catalog name: 1046 No database selected' in D:\Server\testes\classes\Dao.class.php:29 Stack trace: #0 D:\Server\testes\classes\Dao.class.php(29): PDOStatement->execute() #1 D:\Server\testes\index.php(23): Dao->getAll(' sis_clientes ', ' * ', '', '') 

 

Como ele está retornando No database selected, julguei que o __construct não está funcionando direito, uma vez que ele quem define esses dados. Isso é muito útil, porque é um saco toda vez que preciso aterar algo no servidor e envio por engano um arquivo, por exemplo, esse, que é o responsável pela conexão, tenho que reescrever os dados de conexão. =/

Compartilhar este post


Link para o post
Compartilhar em outros sites

Verifique o valor de $this->db, inserindo esta linha:

 

 

var_dump($this->db)

 

estes desta linha:

 

$this->con = new PDO( $this->dbType.":host=".$this->host.";dbname=".$this->db, $this->user, $this->pass, $options );

 

Também pode usar errorInfo para ver se houve algum erro na conexão: http://php.net/manual/pt_BR/pdo.errorinfo.php

Compartilhar este post


Link para o post
Compartilhar em outros sites

Então Beraldo, estou tendo dificuldades nessa parte. Como debugo essas variáveis ? Poderia me dar um exemplo de como faço pra acessá-las seja pelo objeto ou diretamente da classe ?


Se tento instanciar a classe Registry olha o erro retornado

 

 

Fatal error: Call to protected Registry::__construct() from invalid context in D:\Server\testes\index.php on line 22

Compartilhar este post


Link para o post
Compartilhar em outros sites

Já, está como public =/


Só consigo acessar as variáveis e métodos se eu trocar o encapsulamento na classe Registry, mas acho que tira a segurança, o que não faria sentido.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Então Beraldo, estou tendo dificuldades nessa parte. Como debugo essas variáveis ? Poderia me dar um exemplo de como faço pra acessá-las seja pelo objeto ou diretamente da classe ?

Simples:

$var = 'valor';
var_dump( $var );
// resto do código

Uma forma ainda melhor é usando logs. Veja http://rberaldo.com.br/como-gerar-logs-execucao-php/

 

Se tento instanciar a classe Registry olha o erro retornado

 

 

Fatal error: Call to protected Registry::__construct() from invalid context in D:\Server\testes\index.php on line 22

Isso é por que o método __construct é protegido (protected), não público (public)

 

 

Tente trocar o protected por public :)

O propósito é deixar o método protected, para usar o padrão Factory.

 

 

 

Um problema do seu código é que você não usa as variáveis passadas no __construct para definir as variáveis de instância. Você deve usá-las desta forma, por exemplo:

 

$this->host = $host;
$this->user = $user;

Compartilhar este post


Link para o post
Compartilhar em outros sites

Hum! Legal. Mas ai como vou definir os valores pras essas variáveis com base na minha variável $server depois ?


Minha primeira tentativa que não funcionou, mas achei que ficou mais organizado. Estou no caminho correto ?

public function __construct($host,$user,$pass,$db,$server) {
$this->host = $host;
$this->user = $user;
$this->pass = $pass;
$this->db = $db;
$this->server = $server;
}
 
public function getServer($server) {
$this->server = $_SERVER[ 'SERVER_NAME' ];
return $this->server; 
}
 
public function defineServer() {
if($this->server == 'localhost' ) {
$this->host = 'localhost';
$this->user = 'root';
$this->pass = '';
$this->db = '';
} else {
$this->host = '';
$this->user = '';
$this->pass = '';
$this->db = '';
}
}
 
...
$this->con = new PDO( $this->dbType.":host=".$this->defineServer()->host.";dbname=".$this->defineServer()->db, $this->defineServer()->user, $this->defineServer()->pass, $options );
...
 

Conseguir reduzir à

<?php
class PDOConnectionFactory extends Registry
{
public $con = null;
public $dbType = 'mysql';
public $host;
public $user;
public $pass;
public $db;
public $persistent;
 
public function __construct($host,$user,$pass,$db) {
$this->host = (string) $host;
$this->user = (string) $user;
$this->pass = (string) $pass;
$this->db = (string) $db;
}
 
public function PDOConnectionFactory( $persistent = false ) 
{
if( $persistent != false) { $this->persistent = true; }
}
 
public function getConnection() 
{
try 
{
$registry = Registry::getInstance();
$options  = array(
PDO::ATTR_PERSISTENT => true,
PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8',
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
);
$this->con = new PDO( $this->dbType.":host=".$this->host.";dbname=".$this->db, $this->user, $this->pass, $options );
$registry->set( 'PDO' , $this->con );
$this->con = $registry->get( 'PDO' );
 
return $this->con;
}
catch ( PDOException $ex  ){ echo "Erro: ".$ex->getMessage(); }
}
 
public function Close() 
{
if( $this->con != null )
$this->con = null;
}
}

E na criação do objeto

 

require_once('template/inc/Config.inc.php');
 
if($_SERVER[ 'SERVER_NAME' ] == 'localhost' ) {
$host = 'localhost';
$user = 'root';
$pass = '';
$db = '';
} else {
$host = 'localhost';
$user = '';
$pass = '';
$db = '';
}
 
// Put your code here
$registry = new PDOConnectionFactory($host,$user,$pass,$db);
$dao = new Dao();
 
$dao->getAll( ' sis_clientes ', ' * ', '', '' );

Compartilhar este post


Link para o post
Compartilhar em outros sites

Assim funcionou, mas é a forma correta de se manipular os dados em uma classe ?

 

 

<?php
class PDOConnectionFactory extends Registry
{
public $con = null;
public $dbType = 'mysql';
public $host;
public $user;
public $pass;
public $db;
public $persistent;
 
public function __construct($host,$user,$pass,$db) {
$this->host = (string) $host;
$this->user = (string) $user;
$this->pass = (string) $pass;
$this->db = (string) $db;
}
 
public function PDOConnectionFactory( $persistent = false ) 
{
if( $persistent != false) { $this->persistent = true; }
}
 
public function getConnection() 
{
try 
{
if($_SERVER[ 'SERVER_NAME' ] == 'localhost' ) {
$this->host = 'localhost';
$this->user = 'root';
$this->pass = '';
$this->db = '';
} else {
$this->host = 'localhost';
$this->user = '';
$this->pass = '';
$this->db = '';
}
 
$registry = Registry::getInstance();
$options  = array(
PDO::ATTR_PERSISTENT => true,
PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8',
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
);
$this->con = new PDO( $this->dbType.":host=".$this->host.";dbname=".$this->db, $this->user, $this->pass, $options );
$registry->set( 'PDO' , $this->con );
$this->con = $registry->get( 'PDO' );
 
return $this->con;
}
catch ( PDOException $ex  ){ echo "Erro: ".$ex->getMessage(); }
}
 
public function Close() 
{
if( $this->con != null )
$this->con = null;
}
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

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