Ir para conteúdo

POWERED BY:

Arquivado

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

Ricard0

Conexão em mais de uma database

Recommended Posts

Lá vem eu denovo pedindo ajuda :lol:

 

Estava fazendo um site, consegui fazer meu próprio painel para adicionar/deletar/editar noticias, ai fiz a conexão com o banco de dados do site que fiz, mais tem uma parte do site que vou fazer para aparecer os ultimos tópicos criado no forúm, só que não sei como criar 2 conexões uma para cada função..

 

Queria que a função 1 fizesse a conexao com a database do site e a função 2 fizesse conexao com a database do forum.

 

Obrigado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Queria que a função 1 fizesse a conexao com a database do site e a função 2 fizesse conexao com a database do forum.

 

Você pode utilizar Singleton Registry e armazenar a referência para as duas bases:

 

Registry.php

<?php
class Registry {
/**
 * @var	Registry
 */
private static $instance;

/**
 * @var	ArrayObject
 */
private $storage;

/**
 * Constroi o objeto do Registry
 */
private function __construct(){
	$this->storage = new ArrayObject();
}

/**
 * Recupera um valor armazenado no registro
 * @param	string $key Chave do registro
 * @throws	RuntimeException Se a chave não for encontrada
 */
public function get( $key ){
	if ( $this->storage->offsetExists( $key ) ){
		return $this->storage->offsetGet( $key );
	} else {
		throw new RuntimeException( 'Chave não encontrada' );
	}
}

/**
 * Recupera uma instância única de Registry
 * @return	Registry
 */
public static function getInstance(){
	if ( self::$instance == null ){
		self::$instance = new Registry();
	}

	return self::$instance;
}

/**
 * Registra um novo valor utilizando uma chave
 * @param	string $key Chave do registro
 * @param	mixed $value Valor que será registrado
 */
public function set( $key , $value ){
	$this->storage->offsetSet( $key , $value );
}

/**
 * Remove o registro de uma determinada chave
 * @param	string $key Chave que será removida
 * @throws	RuntimeException Se a chave não for encontrada
 */
public function remove( $key ){
	if ( $this->storage->offsetExists( $key ) ){
		$this->storage->offsetUnset( $key );
	} else {
		throw new RuntimeException( 'Chave não encontrada' );
	}
}
}

 

Registrando:

<?php
$registry = Registry::getInstance();
$registry->set( 'site' , new PDO( 'mysql:host=host_do_site;dbname=base_do_site' , 'usuario' , 'senha' ) );
$registry->set( 'forum' , new PDO( 'mysql:host=host_do_forum;dbname=base_do_forum' , 'usuario' , 'senha' ) );

 

Usando em algum lugar:

<?php
$pdoSite = Registry::getInstance()->get( 'site' );
$stm = $pdoSite->query( 'SELECT alguma_coisa FROM base_do_site;" );

 

<?php
$pdoForum = Registry::getInstance()->get( 'forum' );
$stm = $pdoForum->query( 'SELECT outra_coisa FROM base_do_forum;" );

 

;)

Compartilhar este post


Link para o post
Compartilhar em outros sites

Dá sim Andrey. Bastaria, então, usar o segundo argumento de mysql_query() e cia., o qual especifica qual link de conexão usar.

 

O problema desse uso é a falta de portabilidade em sistemas já criados, que ignoram esse parâmetro, já que o último link aberto será usado.

 

Acontece que a partir do momento que o link referente ao Fórum tiver sido usado, todas as chamadas à mysql_query() (e cia.) ocorrerão sobre o link do Fórum, e vários erros poderiam ocorrer.

 

Usando um Registry aliado à PDO (que por si só já é excelente) garante que você use os métodos de consulta sobre o link que quiser, a hora que quiser.

Compartilhar este post


Link para o post
Compartilhar em outros sites

sim .. e ai da pro cara fazer uma classe pra trabalhar com query em um banco .. e query em outro .. como tambem da pra fazer a classe pra o registro dos links como o joão postou :clap:

 

mais como você disse .. 'sistemas já criados' fica dificil mesmo ..

Abraços

Compartilhar este post


Link para o post
Compartilhar em outros sites

Parece que deu certo, mais to precisando de uma pequena ajudinha nessa parte olha, aqui está a parte onde eu usei para aparecer os tópicos do forum :

 

 

<div id="conteudo">
<div class="titulonoticias"><h1>Ultimas Noticias</h1></div>
<div id="noticias_lista">

<div id="fundonoticia">
<?php include"scripts/noticias.php"; ?>
</div>
</div>

<div id="noticias_forum">

<div class="titulonoticias"><h1>Ultimas Noticias do Forúm</h1></div>
<div id="fundonoticia">
<?php

$limite = '5';

$pdoForum = Registry::getInstance()->get( 'forum' );
$stm = $pdoForum->query("SELECT title, start_date, starter_name FROM topics ORDER BY start_date DESC LIMIT $limite");

if(@mysql_num_rows($pdoForum) <= '0'){
echo "Nenhuma notícia encontrada";
}else{

while($res_stm=mysql_fetch_array($pdoForum)){

	$title = $res_noticias[0];
	$start_date = $res_noticias[1];
	$starter_name = $res_noticias[2];

			$autor = $res_noticias[3];

	$pega_autor = mysql_query("SELECT name FROM members WHERE id = '$autor'")
                  or die(mysql_error());
 if(@mysql_num_rows($pega_autor) <= '0') echo 'Erro ao selecionar o usuario';
 else{

	 while($res_autor=mysql_fetch_array($pega_autor)){

		 $autor_do_post = $res_autor[0];




?>

<?php echo $title; ?><?php echo $start_date; ?><?php echo $starter_name; ?><?php echo $autor; ?>
</div><!--noticias forum-->
       <br />
<div id="ranking">

<div class="titulonoticias"><h1>Ranking PvP</h1></div>
<div id="fundonoticia">
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
</div>
<br />
</div><!--ranking-->
</div>

<?php
}	 
}
?>
<?php
}	 
}
?>

 

 

Vejam se ta certo, pois no meu site só fica escrito : "Nenhuma notícia encontrada."

Mais o IPB sempre vem com um tópico...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Primeiro execute a query à parte, via phpMyAdmin por exemplo.

 

Ela retorna algo? Se não, então ela está errada, se sim, então é o código.

 

Se for no código, remova a supressão de erros (o arroba).

 

Daí você pode ignorar o while porque a PDO tem um método chamado fetchAll() que faz todo processo do loop automaticamente.

 

Quanto ao usuário autor da mensagem, das duas uma: Ou você inclui, se existir, o campo da tabela que contém o nome o autor OU, depois de retornar, você atribui à uma variável a informação do primeiro índice de todos os que forem retornados.

Compartilhar este post


Link para o post
Compartilhar em outros sites

eu tambem tenho esse metodo hehe

 

     public function fetchAll(){
               $arr = array();
			     while( $this->dados = mysql_fetch_assoc( $this->query ) ){
               $arr[] = $this->dados;
               }
          return $arr;
        }

 

ele deve ser usado em fluent interface sobre a minha função query .. vo postar tudo ..

 

       public function query( $sql )
       {
               $this->query = mysql_query( $sql );
               if( !$this->query )
               throw new Exception( ' Query Error : '.mysql_error().' ');
               return $this;
       }

     public function fetchAll(){
               $arr = array();
			     while( $this->dados = mysql_fetch_assoc( $this->query ) ){
               $arr[] = $this->dados;
               }
          return $arr;
        }


 

usando

 

try{
$consulta = $SQL->query("select * from `db_conf`")->fetchAll();
foreach($consulta as $resultado){
 echo $resultado['ini_parameters']; // meu campo .. 
}
}catch(Exception $e){
echo $e->getMessage();
// tratamento de erros caso queira ..
}

no caso ele vai retornar todas as linhas .. o $SQL deve ser a instancia de sua classe ^^ mais pode fazer com a funçao nativa do pdo mesmo ..

Compartilhar este post


Link para o post
Compartilhar em outros sites

Do jeito que fiz ali encima como mostrei no spoiler, deixei uma mensagem de que quando existir tópicos, apareça ali, mais tem um tópico na db só que no site permanece a mensagem de nenhuma noticia encontrada...

Compartilhar este post


Link para o post
Compartilhar em outros sites

neste teu codigo , cade a outra instancia ?

 

 

<div id="conteudo">
<div class="titulonoticias"><h1>Ultimas Noticias</h1></div>
<div id="noticias_lista">

<div id="fundonoticia">
<?php include"scripts/noticias.php"; ?>
</div>
</div>

<div id="noticias_forum">

<div class="titulonoticias"><h1>Ultimas Noticias do Forúm</h1></div>
<div id="fundonoticia">
<?php

$limite = '5';

$pdoForum = Registry::getInstance()->get( 'forum' );
$stm = $pdoForum->query("SELECT title, start_date, starter_name FROM topics ORDER BY start_date DESC LIMIT $limite");

if(@mysql_num_rows($pdoForum) <= '0'){
       echo "Nenhuma notícia encontrada";
}else{

       while($res_stm=mysql_fetch_array($pdoForum)){

               $title = $res_noticias[0];
               $start_date = $res_noticias[1];
               $starter_name = $res_noticias[2];

                               $autor = $res_noticias[3];

               $pega_autor = mysql_query("SELECT name FROM members WHERE id = '$autor'")
                         or die(mysql_error());
        if(@mysql_num_rows($pega_autor) <= '0') echo 'Erro ao selecionar o usuario';
        else{

                while($res_autor=mysql_fetch_array($pega_autor)){

                        $autor_do_post = $res_autor[0];




?>

<?php echo $title; ?><?php echo $start_date; ?><?php echo $starter_name; ?><?php echo $autor; ?>
</div><!--noticias forum-->
       <br />
<div id="ranking">

<div class="titulonoticias"><h1>Ranking PvP</h1></div>
<div id="fundonoticia">
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
</div>
<br />
</div><!--ranking-->
</div>

<?php
       }        
}
?>
<?php
       }        
}
?>

 

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Tipo, eu coloquei o código igual desse para mostrar os ultimos tópicos do forúm, só que um para site.. que no caso inclui ele ali "<?php include "scripts/noticias.php"; ?>"

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ta ai :

 

<?php

$limite = '5';


$noticias = mysql_query("SELECT id, titulo, texto, categoria, `data`, autor FROM rs_posts ORDER BY data DESC LIMIT $limite")
		or die(mysql_error());

if(@mysql_num_rows($noticias) <= '0'){
echo "Nenhuma notícia encontrada";
}else{

while($res_noticias=mysql_fetch_array($noticias)){

	$id_do_post = $res_noticias[0];
	$titulo = $res_noticias[1];
	$texto = $res_noticias[2];
	$categoria = $res_noticias[3];
	$data = $res_noticias[4];
	$autor = $res_noticias[5];


	$pega_autor = mysql_query("SELECT nome FROM rs_users WHERE id = '$autor'")
                  or die(mysql_error());
 if(@mysql_num_rows($pega_autor) <= '0') echo 'Erro ao selecionar o usuario';
 else{

	 while($res_autor=mysql_fetch_array($pega_autor)){

		 $autor_do_post = $res_autor[0];

?>
<ul>
  <a href="index.php?pagina=nav/single&topico=<?php echo $id_do_post; ?>"><?php echo $titulo; ?>  <i>em</i>  <?php echo date('d/m/Y', strtotime($data)); ?>  | <strong><?php echo $categoria;?></strong></a>
</ul>
<br />

<?php
}	 
}
?>

<?php
}
}
?>

Compartilhar este post


Link para o post
Compartilhar em outros sites

Eu me conectei ao banco de dados pela index.php, eu apenas coloquei aquele sisteminha de chamar as paginas pra dentro da index, olha como ta ele :

 

 

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<?php

include "Connections/config.php";

$conexao = mysql_connect("$hostname_config", "$username_config", "$password_config")
	or die(mysql_error());

$db = mysql_select_db("$database_config")
	or die(mysql_error());

?>

<?php include "scripts/limita_palavras.php"; ?>

<script type="text/javascript" src="admin/scripts/bloq.js"></script>

<title>RagnaMonster</title>
<link href="style.css" rel="stylesheet" type="text/css" />
<script type="text/javascript" src="js/jquery.js" /></script>
<script type="text/javascript" src="js/cycle.js" /></script>

<style type="text/css">
#slider{width:490px; height:163px;}
#slider ul{list-style:none;}
#slider img{border:none;}
</style>

<script type="text/javascript">
$(function(){
  $('#slider ul').cycle({
    fx: 'fade',
    speed: 2000,
    timeout: 5000
  })
})
</script>
</head>

<body>
<div id="box">

<div id="header">

   	<div id="header_logo">
       <img src="images/logo.png" alt="" />
       </div><!--header logo-->

       <div id="header_status">

       </div><!--header status-->

</div><!--header-->

   <div id="menu">

   <ul>
   	<li><a href="index.php?pagina=nav/home">Início</a></li>
       <li><img src="images/menu_sp.png" alt="" /></li>
       <li><a href="#">Cadastro</a></li>
       <li><img src="images/menu_sp.png" alt="" /></li>
       <li><a href="index.php?pagina=nav/down">Downloads</a></li>
       <li><img src="images/menu_sp.png" alt="" /></li>
       <li><a href="index.php?pagina=nav/info">Informações</a></li>
       <li><img src="images/menu_sp.png" alt="" /></li>
       <li><a href="index.php?pagina=nav/staff">Staff</a></li>
       <li><img src="images/menu_sp.png" alt="" /></li>
       <li><a href="index.php?pagina=nav/regras">Regras</a></li>
       <li><img src="images/menu_sp.png" alt="" /></li>
       <li><a href="index.php?pagina=nav/doacao">Doação</a></li>
       <li><img src="images/menu_sp.png" alt="" /></li>
       <li><a href="#">Fórum</a></li>
   </ul>

   </div><!--menu-->

   <div id="sidebar">
   <div id="calendario">
<script language=JavaScript>
<!--
var week = new Array("<p>Dom</p>", "<p>Seg</p>", "<p>Ter</p>", "<p>Quar</p>", "<p>Quin</p>", "<p>Sex</p>", "<p>Sáb</p>");
var monthdays = new Array(31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
var today = new Date();
var month = today.getMonth();
var day = today.getDay();
var dayN = today.getDate();
var days = monthdays[month];
if (month == 1) {
var year = today.getYear();
if (year%4 == 0) days = 29;
}
document.write("<table border='0' cellspacing='0' cellpadding='0'>");
document.write("<tr>");
for (var i=0; i<7; i++) {
document.write("<td width='25' height='25'>");
document.write("<div align='center'>" + week[i] + "</div>");
document.write("</td>");
}
document.write("</tr>");
var jumped = 0;
var inserted = 1;
var start = day - dayN%7 + 1;
if (start < 0) start += 7;
var weeks = parseInt((start + days)/7);
if ((start + days)%7 != 0) weeks++;
for (var i=weeks; i>0; i--) {
document.write("<tr>");
for (var j=7; j>0; j--) {
document.write("<td>");
if (jumped<start || inserted>days) {
document.write("<div align='center'></div>");
jumped++;
}
else {
if (inserted == dayN) document.write("<div align='center'>[" + inserted + "]</div>");
else document.write("<div align='center'>" + inserted + "</div>");
inserted++;
}
document.write("</td>")
}
document.write("</tr>");
}
document.write("</table>");
// -->
</SCRIPT>    
</div>

<div id="horariowoe">
<h1>Horário WoE</h1>
<p>Dia 1 : Horario 1</p>
<p>Dia 2 : Horario 2</p>
<p>Dia 3 : Horario 3</p>
</div>

<div id="botaoum">
<a href="http://www.studio.ricardosuman.com.br"><img src="images/botaoum.png" /></a>
</div>

<div id="botaodois">
<a href="index.php?pagina=nav/doacao"><img src="images/botaodois.png" /></a>
</div>

<div id="botaotres">
<a href="index.php?pagina=nav/staff"><img src="images/botaotres.png" /></a>
</div>


</div><!--sidebar-->


   <div id="content">

           <div id="slider">
            <ul>
<li>
<a href="#"><img src="images/slides/1.png" alt="" /></a>
</li>

<li>
<a href="#"><img src="images/slides/2.png" alt="" /></a>
</li>

<li>
<a href="#"><img src="images/slides/3.png" alt="" /></a>
</li>

<li>
<a href="#"><img src="images/slides/4.png" alt="" /></a>
</li>

<li>
<a href="#"><img src="images/slides/5.png" alt="" /></a>
</li>
</ul>
           </div><!--slider-->


<div id="conteudo">



       <?php 
foreach ($_REQUEST as $___opt => $___val) {
 $$___opt = $___val;
}
if(empty($pagina)) {
include("nav/home.php");
}
elseif(substr($pagina, 0, 4)=='http' or substr($pagina, 
0, 1)=="/" or substr($pagina, 0, 1)==".") 
{
echo '<br><font face=arial size=11px><br><b>A página não existe.</b><br>Por favor selecione uma página a partir do Menu Principal.</font>'; 
}
else {
include("$pagina.php");
}

?>


</div> 
<div id="clear">
</div> 


</div>


</div><!--box-->


<div id="footer">

<a href="http://www.studio.ricardosuman.com.br"><img src="images/marcadagua.png" /></a>
<p>RagnaMonster - Todos Direitos Reservados.<br />
Cópia parcial ou total do site é proibida.</p><br />
</div>

</body>
</html>

 

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.