Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Dado a seguinte estrutura hipotética:
conn.php
<?php
@session_start();
Define("DATABASE_SERVER", "localhost");
Define("DATABASE_USERNAME", "root");
Define("DATABASE_PASSWORD", "");
Define("DATABASE_NAME", "db1");
class dbconfig{
private $errorLog;
private $mysqli;
public function __construct(){
$this->mysqli = new mysqli(DATABASE_SERVER, DATABASE_USERNAME, DATABASE_PASSWORD, DATABASE_NAME);
}
public function executeSelect($query){
if($this->checkConnection()){
if (!$result=@$this->mysqli->query($query)) {
$this->__errorLog($this->mysqli->error, $this->mysqli->errno, 71, 'dbconfig.executeSelect', 'MySQL', $query);
}else{
while ($row = $result->fetch_assoc()) {
$resultado[] = $row;
}
return $resultado;
}
}else{
return false;
}
}
?>
class1.php
<?php
require_once('anotherthing.php');
require_once('dbconfig.php');
class thing1{
private $dbconfig;
public function thing1(){
$this->dbconfig = new dbconfig();
}
public function getSomething() {
$query = "SELECT someting
FROM somewhere
WHERE something1 = something2
LIMIT 100";
$resultado = $this->dbconfig->executeSelect($query);
return $resultado;
}
public function getAnotherThing() {
$gAT= new AnotherThing();
$gAT->getAnotherThing();
}
?>
class2.php
<?php
require_once('dbconfig.php');
class anotherThing{
private $dbconfig;
public function anotherThing() {
$this->dbconfig = new dbconfig();
}
function getAnotherThing() {
$query = "SELECT *
FROM somewhere2
LIMIT 100";
$resultado = $this->dbconfig->executeSelect($query);
return $resultado;
}
?>
Pergunta: Quando eu instanciar a classe1 (thing) e chamar o método getAnotherThing (aquele que instancia a classe anotherThing), eu vou ter duas conexões distintas com a database?
Eu gostaria que sempre que o Flex chamasse o PHP, a primeira classe instanciada criasse a conexão (dbconfig) e se alguma classe x instanciasse outra classe y, esta segunda [y] não criaria uma nova conexão e sim usaria a conexão existente. Se a forma como estou usando cria duas conexões distintas, como eu deveria usar para criar só uma?
Outra coisa, eu devo me preocupar com isso? Acredito que o desempenho seria maior com apenas uma classe realizando a conexão.
Muuuuuuuito obrigado :)
Dei uma olhada rápida no exemplo de Singleton que tem aqui no Fórum e achei muito interessante, mas vi que a prática de Registry para database pode evitar-me problemas. Vou dar uma pesquisada depois e aprender a usar.
Again, Thx o/
Desculpe o Double Post, mas seguinte:
dado o novo seguinte evento hipotético:
registry.php
<?php
class Registry{
public static $mysqli;
public static function connect() {
if(self::checkConnection()){
self::$mysqli = new mysqli(DATABASE_SERVER, DATABASE_USERNAME, DATABASE_PASSWORD, DATABASE_NAME) or die('Test Die. Is it dead?');
}
return self::checkConnection();
}
public static function checkConnection(){
return is_null(self::$mysqli);
}
?>
dbconfig.php
<?php
class dbconfig extends Registry{
/**
* Variável de Erro
* @var Array
*/
private $errorLog;
public function __construct(){
if(parent::connect()){
$this->fileLog(1);
}else{
$this->dataClass = new datas();
$this->dblog = new dblog();
}/*
* executaSelect
* Recebe uma query e executa-a a partir do objeto MySQLi.
* @param String $query a ser executada.
* @return Mixed False se conexão com o banco não existe.
* Array se select retornou dados.
* NULL se select não retornou nada.
* Em caso de erro a nível de SQL, a função __errorLog será chamada
* para gravar informações do erro ocorrido.
*/
public function executeSelect($query){
if(!parent::checkConnection()){
if (!$result=@parent::$mysqli->query($query)) {
$this->__errorLog(parent::$mysqli->error, parent::$mysqli->errno, 102, 'dbconfig.executeSelect', 'MySQL', $query);
}else{
while ($row = $result->fetch_assoc()) {
$resultado[] = $row;
}
return $resultado;
}
}else{
return false;
}
}
?>
Sabendo que todas as classes do meu sistema instanciam, em seus construtores, um novo objeto da classe dbconfig, parei para pensar se é necessário ter essas duas classes ou seria mais interessante incorporar todas as funções da classe dbconfig dentro do arquivo registry.php (só um exemplo) e usar tudo a partir daí.
Pergunta: Isso é uma opção válida? Se sim, eu teria que extender registry.php em todas as classes para usar via parent::$mysqli ou é semelhante a java, posso usar simplismente algo do tipo registry::$mysqli;
Se a melhor forma já é do jeito que estou fazendo (instanciando um novo dbconfig toda hora), alguém saberia me dizer por que não consigo executar Query?
Assim, imagina o Registry como uma grande caixa de brinquedos.
Cada brinquedo é uma instância de algum objeto.
Você não precisa carregar a caixa pra qualquer lugar (no conceito prerguntado, seria extender Registry) e sim pegar aquilo que você quer pra brincar na hora.
Como Registry é um tipo de "derivado" do Singleton, você colocando seu brinquedo na caixa assim que chega em casa (logo no começo do script, tipo na index.php) você pode usá-lo na sala, no quarto, na cozinha (nos controladores, nas models...).
Espero que a analogia não tenha te confundido. :thumbsup:
$Registry = new ArrayObject();
$Registry->offsetSet( 'MySQL', new PDO( 'mysql:host=localhost;dbname=seubanco', 'root', '454077' ) );
$PDO = $Registry->offsetGet( 'MySQL' );
print_r( $PDO );
Vai retornar:
PDO Object( )
você terá uma so conexão, pois a segunda irá sobrescrever a primeira.
pesquise pelos patterns Registry e Singleton
>
Outra coisa, eu devo me preocupar com isso?
sim, deve se preocupar.Qnto menos requisições, e menos conexões desnecessárias você fizer, mais performance terá.