Jump to content

Obter ligação feita à base de dados de outra função


capesone
 Share

Go to solution Solved by capesone,

Recommended Posts

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;
 }
}
Edited by capesone
geshi
Link to comment
Share on other sites

$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

Link to comment
Share on other sites

$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!

Link to comment
Share on other sites

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!

Edited by capesone
Link to comment
Share on other sites

  • Solution

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

Edited by capesone
Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.