Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

capesone

[Resolvido] Obter ligacao feita á base de dados de outra funcao

Mensagens Recomendadas

capesone

Boas,

Estou a criar neste momento uma função que permite executar as querys atravez de 1 unica funcao, conteudo estou aqui com um pequeno problema, a query executa sem problemas e conforme da erro ou nao, guarda uns booleans e umas mensagens de erro caso for false dentro de um array, que no final da funcao é retornado, e no mesmo array tambem tenho o resulta do da query, ou seja devia guardar a ligação para retornar em conjunto com outras coisas.

O codigo nao dá erro nenhum, conteudo tambem nao me mostra o conteudo que eu queria mostrar!

page_loader: obtem a pagina aberta, obtem o nome do conteudo que está alocado na base de dados e obtem os resultados

class loader{
 function page_loader(){
#obtem o nome (do url) da página
$cont = loader::page_get();
$page = loader::page_key_for_search($cont);

#executa a query para obter os dados da pagina aberta
$res_query = db::simple_query("select", "contents", array('url_name' => $page));

if($res_query['final_array'] != null || !empty($res_query['final_array'])){
  $res_array = $res_query['final_array'];

  /**
  *
  * QUERO UTILIZAR O RESULTADO DA QUERY AQUI
  *
  * **/

  while($data = mysqli_fetch_array($res_array)){
	echo"<b>Nome:</b>{$data['name']}<br/>
	  <b>Descrição:</b>{$data['desc']}<br/>
	  <b>Tipo:</b>{$data['type']}<br/>
	 <b>Nome url:</b>{$data['url_name']}<br/>
	 <b>conteudo:</b>{$data['content']}<br/>
	 <b>Template:</b>{$data['template']}<br/>
	 <b>Escrito por:</b>{$data['writed_by']}<br/>
	 <b>Escrito em:</b>{$data['writed_time']}<br/>
	 <b>Ultima actualização:</b>{$data['last_update']}<br/>";
  }
}

#Associa os dados da página em conjunto ao template escolhido
//...
#retorna a pagina ao utilizador
//...
 }
}

simple_query: Cria e executa a query correctamente, mas nao sei se estará a retornar bem dentro do array

class db{
 function simple_query($query_type, $table, $fields = null){
#define variaveis a utilizar durante a funcao
$con = db::__define();
$result = array();
$query_type = strtoupper($query_type);

#constroi a query
if($query_type == "SELECT"){
  #verifica se existem clausulas de condições
  if(count($fields)){#se existirem numeros de linhas
	$where_clauses="WHERE ";

   foreach($fields as $key => $value){
	 $a_key = key($fields);
	 $where_clauses.="{$a_key}='{$value}'";
   }
 }else $where_clauses="";

 #monta a query final
 $query = "SELECT * FROM {$table} {$where_clauses}";
  }elseif($query_type == "INSERT"){
 //....
  }else echo "Erro: tipo de query nao foi bem definido";

  #executa a query conforme o tipo de query
  if($query_type == "SELECT"){
 if($exec = $con -> query($query)){
   if(mysqli_num_rows($exec)){
	 if($data = mysqli_fetch_array($exec)){
	   $result['final_array'] = $exec;	 #aqui está a guardar na posição do array a ligacao establecida com a base de dados
	   $result['fetch_array'] = true; $result['fetch_array_error'] = null;
	 }else{
	   #define erros
	   $result['fetch_array'] = false; $result['fetch_array_error'] = mysqli_error($con);
	   $result['final_array'] = null;
	 }

	 #existem linhas
	 $result['rows'] = true; $result['rows_error'] = null;
   }else{
	 #define erros
	 $result['rows'] = false; $result['rows_error'] = mysqli_error($con);
	 $result['fetch_array'] = false; $result['fetch_array_error'] = mysqli_error($con);

	 $result['final_array'] = null;
   }

   #A query foi bem executada
   $result['executed'] = true; $result['executed_error'] = null;
 }else{
   #define erros
   $result['executed'] = false; $result['executed_error'] = mysqli_error($con);
   $result['rows'] = false; $result['rows_error'] = mysqli_error($con);
   $result['fetch_array'] = false; $result['fetch_array_error'] = mysqli_error($con);

   $result['final_array'] = null;
 }
  }
#retorna o resultado
return $result;
 }
}

Editado por capesone
geshi

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
chbcl

$con = db::__define();

Esta linha não tem nada em falta? Não querias dizer __construct(); ?

######

Esta:

$a_key = key($fields);

não falta o $ antes de key?

######

esta linha:

if($exec = $con -> query($query)){

esse query() vem da variavel que foi declarada como:

$con = db::__define();

(primeira coisa que falei)

-------------------

Vi isto muito por alto, não li o código todo atentamente, mas penso que uma dessas coisas deve ser o problema


developer @ filipealves.net

filipealvesbcl [a] gmail.com

github.com/filipealvesbcl

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
capesone

$con = db::__define(); -- Define a ligacao mysqli a dase de bados(funciona)

$a_key = key($fields); -- Nao falta o "$" antes do key(), pois essa funcao do php, permite me obter o nome do index do array($array['nome1'], $array['nome2'], vai retornar "nome1"/"nome2") tambem funciona sem problemas

if($exec = $con -> query($query)){ -- sim, o $con é a ligacao a base de dados em mysqli, que faz o retorno da ligacao, equanto que o $exec é o que eu quero colocar dentro do array $result['final_array'] = $exec;

function __define(){
  #define a ligação com a base de dados
 $con = new Mysqli(_db_server, _db_user, _db_pass, _db_name);

 if(mysqli_connect_errno()) die("Erro ao ligar a base de dados");
 else return $con;
}

No entanto estive a pensar e talvez criando um array multidimensional com os resultados possa retornar bem, mas ainda nao tive tempo de aplicar isso este fim de semana! amanha vou tentar isso e depois digo aqui se funcionou ou nao!

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
chbcl

mas nao parecia teres o define a funcionar, por isso é que não estabelecia a ligação!


developer @ filipealves.net

filipealvesbcl [a] gmail.com

github.com/filipealvesbcl

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
capesone

Nao, esse codigo funciona todo sem problemas, a nao ser a parte de retornar o $exec para dentro do array $result['final_array']

porque dentro da funcao ao utilizar o while, ele faz-me o fetch sem problema e a minha ideia era se faz fetch, entao passa os dados e o user faz o fetch depois da requesiçao.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo

depois disto tudo, ainda nem disseste claramente o que querias ...

dá um exemplo do resultado esperado pela função.

(nem vou comentar a desorganização do código assim como a falta de necessidade de uma função como essa ...)


IRC : sim, é algo que ainda existe >> #p@p

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
capesone

Basicamente essa funcao vai executar todas as querys para base de dados, ou seja em vez de escrever a query em cada funcao, tenho uma so funcao, passo os dados necessários para a query, a funcao executa-a e devolve-me um array que ira conter todos os resultados da query, e se ocurreu algum erro ou nao!

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
capesone

A funcao retorna o array abaixo exemplificado:

#constroi, executa a query e guarda o retornado na variavel $res_query
$res_query = db::simple_query("tipo_query", "db_nome_tabela", array('tbl_nome_coluna' => 'tbl_valor_coluna'));

A funcao simple query deve retornar um array deste estilo

#se query executou
$result['executed'] = true/false;
$result['executed_error'] = null/mysqli_error($con);

#Se query Retornou linhas
$result['rows'] = true/false;
$result['rows_error'] = null/mysqli_error($con);

#Se o fetch array functionou
$result['fetch_array'] = true/false;
$result['fetch_array_error'] = null/mysqli_error($con);
$result['final_array'] = $exec #( if($exec = $con -> query(...){ } )

O utilizador usa o array retornado com todos os dados que foram enviados no array!

#dados para o utilizador validar a query
$res_query['executed']
$res_query['executed_error']
$res_query['rows']
$res_query['rows_error']
$res_query['fetch_array']
$res_query['fetch_array_error']

#utiliza a ligacao feita na query dentro de mysqli_fetch_array
$result['final_array']

  exe:
  while($dados = mysqli_fetch_array($result['final_array'])){
   $dados['id'];
   $dados['name']
   $dados['content']
   ....
  }

Quando a funcao retornar esse array o utilizador verifica se nao ocurreram erros, ($result['executed'],$result['rows'] ,$result['fetch_array']) se nao ocurreram, o utilizador faz um while ao $result['final_array'] com a funcao mysqli_fetch_array() do php e utiliza os dados dentro do while!

espero ter-me conseguido exprimir!

Editado por capesone

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo

$result['final_array'] = $exec ( if([u]$exec[/u] = $con -> query(...){ } )

isto não faz sentido ...

ps : não vou estár a ler o código colocado uns posts atrás porque a indentação torna tudo completamente ilegível.


IRC : sim, é algo que ainda existe >> #p@p

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
capesone

esse if dentros dos parentes era so para dizer qual era o exec, esquecime de por em comentario aqui no post

Ja organizei o espacamento no 1º post

Editado por capesone

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo

O codigo nao dá erro nenhum, conteudo tambem nao me mostra o conteudo que eu queria mostrar!

o que é que mostra e o que deveria mostrar ?


IRC : sim, é algo que ainda existe >> #p@p

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
capesone

o que é que mostra e o que deveria mostrar ?

Devia mostrar o resultado final para cada linha da tabela como uma consulta normal, mas ja consegui por a funcionar!

Ja consegui Resolver, o if($data = mysqli_fetch_array($exec)), por algum motivo nao me estava a deixar fazer outra fez o fetch da ligacao.

O codigo a funcionar para os selects, falta para os outros tipos de querys:

Como usar a função

$tipoquery = "select, insert, update, etc...";
$tblnome = "Nome da tabela a consultar";
$valores = array('nome coluna_tabela' => 'valor coluna', 'nome coluna_tabela' => 'valor coluna',);

$res_query = db::simple_query($tipoquery, $tblnome, array('url_name' => $valores));

if(!$res_query['final_array'] == null)
 while($data = mysqli_fetch_array($res_query['final_array'])){
echo"<b>Nome:</b>{$data['name']}<br/>
  <b>Descrição:</b>{$data['desc']}<br/>
  <b>Tipo:</b>{$data['type']}<br/>
  <b>Nome url:</b>{$data['url_name']}<br/>
  <b>conteudo:</b>{$data['content']}<br/>
  <b>Template:</b>{$data['template']}<br/>
  <b>Escrito por:</b>{$data['writed_by']}<br/>
  <b>Escrito em:</b>{$data['writed_time']}<br/>
  <b>Ultima actualização:</b>{$data['last_update']}<br/>";
 }
}

O codigo da função

class db{
 function simple_query($query_type, $table, $fields = null){
#define variaveis a utilizar durante a funcao
$con = db::__define();
$result = array();
$query_type = strtoupper($query_type);

#constroi a query
if($query_type == "SELECT"){
  #verifica se existem clausulas de condições
	if(count($fields)){#se existirem numeros de linhas
	  $where_clauses="WHERE ";

	  foreach($fields as $key => $value){
		$a_key = key($fields);
		$where_clauses.="{$a_key}='{$value}'";
	  }
	}else $where_clauses="";

   #monta a query final
   $query = "SELECT * FROM {$table} {$where_clauses}";
 }elseif($query_type == "INSERT"){
   //..Outros tipos de query a construir
 }else echo "Erro: tipo de query nao foi bem definido";

 #executa a query conforme o tipo de query
 if($query_type == "SELECT"){
   if($exec = $con -> query($query)){
	 if(mysqli_num_rows($exec)){
	   $result['final_array'] = $exec;
	   $result['fetch_array'] = true; $result['fetch_array_error'] = null;

	   #existem linhas
	   $result['rows'] = true; $result['rows_error'] = null;
	 }else{
	   #define erros
	   $result['rows'] = false; $result['rows_error'] = mysqli_error($con);
	   $result['fetch_array'] = false; $result['fetch_array_error'] = mysqli_error($con);

	   $result['final_array'] = null;
	}

	#A query foi bem executada
	$result['executed'] = true; $result['executed_error'] = null;
  }else{
	#define erros
	$result['executed'] = false; $result['executed_error'] = mysqli_error($con);
	$result['rows'] = false; $result['rows_error'] = mysqli_error($con);
	$result['fetch_array'] = false; $result['fetch_array_error'] = mysqli_error($con);

	$result['final_array'] = null;
  }
}

#retorna o resultado
return $result;
 }
}

Neste caso retorna o conteudo que pedi a base de dados, que é um post de blog, ou uma página

Nome:Nome do post

Descriçãoo: Descrição do post

Tipo:1

Nome url: nome-unico-url

conteudo:bla bla bla bla bla

Template:blog_post_nosidebar

Escrito por:1

Escrito em:1429901223

Ultima actualização:0

Agora é so carregar o template devolver o html final ao utilizador

Editado por capesone

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.