Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Galera estou a hora pesquisando, como muitos já devem ter percebido, só venho aqui pra pedir ajuda ^^ pois é o único lugar que da pra recorrer após longas horas de pesquisas e nada --'
Bom gostaria de saber como posso resolver este erro, e se alguém tiver link de tutoriais relacionado ao PDO OO me mandem por favor. (Pode ser em inglês também sem problemas)...
O erro que quero tratar :
/applications/core/interface/imageproxy/imageproxy.php?img=http://i.imgur.com/f2t18M9.png&key=493ae4a15acb41f988159fe030fc2ad7cacf6cca62b1239faee78740a77d3c97" alt="f2t18M9.png" />
Meu código:
<?php
class DB {
private static $Connection;
public function Connect() {
global $Config;
try {
if(!isset(self::$Connection)) {
self::$Connection = new PDO('mysql:host='.$Config['mysql']['hostname'].';dbname='.$Config['mysql']['database'].'', $Config['mysql']['username'], $Config['mysql']['password']);
}
} catch(PDOException $e) {
exit('<div><b>Error #03</b>: Could not connect to the server :: ' . $e->getMessage() . '</div>');
}
return self::$Connection;
}
}
?>
Agradeço :)
:kiss:
Haha, muito obrigado, utilizei da forma como você escreveu e funcionou perfeitamente, apenas corrigindo um erro:
O que você postou
if (!self::Connection)
alterei para
if (!self::$Connection)
Desculpe o vacilo, mas fiz algumas correções novamente.
Segue abaixo o update as 20:25
<?php
class DB {
private static $Connection;
private $Instance;
public static function getDB(){
if (!self::$Instance){
self::$Instance = new DB();
}
return self::$Instance;
}
private function __construct($db_server=DB_SERVER, $db_user=DB_USER, $db_pass=DB_PASS, $db_params = array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8")) {
if(!$this->Connection){
try {
$this->Connection = new PDO($db_server, $db_user, $db_pass, $db_params);
$this->Connection->setAttribute(PDO::ATTR_PERSISTENT, PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch (PDOException $e) {
$this->Connection = null;
die($e->getMessage());
}
}
return $this->Connection;
}
}Opa mais uma pergunta ou dúvida, a onde tá
rivate function __construct($db_server=DB_SERVER, $db_user=DB_USER, $db_pass=DB_PASS, $db_params = array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"))
Eu não usei defines eu fiz normal por que eu gosto de usar as variasveis globais, como por exemplo,
global $settings;
$settings['config']['DB_SERVER'] = 'dbname';
Ou por defines é mais viável?
Essa não é uma maneira muito elegante de passar informações para uma classe, mas é uma alternativa!
Eu faria por constantes, instancia de outra classe, ou Injeção de dependência
E evitaria o uso de variáveis globais
<?php
class DATABASE_CONFIG {
public $default = array(
'host' => 'localhost',
'login' => 'root',
'password' => '123456',
'database' => 'banco_default',
'driver' => 'mysql'
);
public $cep = array(
'host' => 'localhost',
'login' => 'root',
'password' => '123456',
'database' => 'cep',
'driver' => 'pgsql'
);
public $test = array(
'host' => 'localhost',
'login' => 'root',
'password' => '123456',
'database' => 'test',
'driver' => 'mysql'
);
}
private function __construct() {
$database = new DATABASE_CONFIG();
$options = array(
PDO::ATTR_PERSISTENT => true,
PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8',
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
);
$dsn = sprintf( '%s:host=%s;dbname=%s;', $database->default['driver'], $database->default['host'], $database->default['database'] );
$this->Connection = new PDO( $dsn, $database->default['login'], $database->default['password'], $options);
}
Mas ai mora outro problema com Singleton, que não tinha mencionado antes, se amanha você quiser usar em sua aplicação mais de um banco de dados, servidores em várias partes do mundo, terá um serio problema, pois seu limite é um, ou vai ter que ir clonando as classes, abandonei esta pratica acima em 2008, a partir dai comecei a usar Registry
De uma olhada aqui
Primeiramente, eu mudaria algumas coisas, ao invés de só saber como tratar este erro.
>
self::$Connection = new PDO('mysql:host='.$Config['mysql']['hostname'].';dbname='.$Config['mysql']['database'].'', $Config['mysql']['username'], $Config['mysql']['password']);
A PDO abstrai vários bancos, e praticamente com o código acima, você teria só uma opção, o MySQL, ai não faria o minimo sentindo colocar sua conexão em OPP.
Uma forma de se corrigir isso é passar por parâmetros o banco também, vamos passar pela @var db_server
ou através de CONSTANTES, como Default
Eliminando esta POG
global $Config;
Aqui não entendi, você queria criar uma instancia da conexão
if(!isset(self::$Connection)) {
Então é melhor cria uma da classe, para evitar que chame novamente a PDO
ou
Para lançar um erro da PDO na Exception, use
$this->Connection->setAttribute(PDO::ATTR_PERSISTENT, PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
Uma versão final do seu script poderia ficar assim "vide abaixo", olha existe várias maneiras de se fazer conexões com PDO em Oo, não posso afirmar que essa e a maneira mais correta, pois conheço no minimo uns 07 tipos diferentes.
<?php
class DB {
Abraços