Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Amigos, tenho uma dúvida.
Estou criando uma classe de tratamento de palavras, class PalavraPluralToSingular e dentro dela tenho uma consulta ao meu banco de dados(select). A dúvida esta em instânciar a classe de conexão dentro da classe de PalavraPluralToSingular ou eu devo herdar a classe de conexão dentro da classe de palavras?
Como eu deveria fazer, qual a melhor solução levando em conta as regras de OOP?
Obrigado.
Léo
Bom dia kisuke, tudo bem? Desde já obrigado pela ajuda.
Realmente, fiz uma instância, porém ele apresenta um erro:
"Fatal error: Call to a member function f_codigo_transacao() on a non-object in /var/www/html/123achei.com.br/class/PalavraPluralToSingular.class.php on line 29"
Na linha 29 eu tenho a instância da classe de conexão. Quando tendo usar o método da classe conectar chamado de f_codigo_transacao, ele fala que é um "non-object".
Se tiver alguma sugestão.
Muito obrigado.
// Instância da classe de conexão dentro da classe de tratamento de palavras.
$conectar = new conectar;
$conectar->f_codigo_transacao("CD01");
$conectar->f_iniciar_conexao();
$this->resultado_query = $conectar->f_select("exclusao_palavra","*","palavra_plur = '$this->palavra'");
// Debug
echo $conexao->f_debug_sql; // Mostra a string SQL montada.
// Número de registros encontrados.
$this->nr_exclusaoPalavra = $conectar->f_num_rows();
// Vincula as colunas de resultado.
// Agora $ths->row_exclusaoPalara com os campos de retorno do banco.
$this->row_exclusaoPalavra = mysql_fetch_array($this->resultado_query);
tks
Léo,
Basta que você pergunte ao seu objeto de tratamento de palavras:
"Você é um objeto de conexão com banco de dados ou você usa uma conexão com banco de dados para trabalhar ?"
Se seu objeto de tratamento de palavras responder que ele é uma conexão com banco de dados, então você deverá utilizar herança, agora, se seu objeto de tratamento de palavras usar uma conexão, então você deverá passar o objeto de conexão para o objeto de palavras.
;)
Bom dia João, tudo bem? Curti o seu Blog! Parabéns. Obrigado pela ajuda.
Se você puder me auxiliar um pouco mais...rs
Compreendi o que você me recomendou, a classe de tratamento da palavra ela USA uma conexão existente com o banco de dados para poder executar o Select para o tratamento da palavra em questão.
Os códigos estão abaixo.
Se tiver um tempinho, agradeço a ajuda! :-)
abs
mysql.conexao.class.php
<?php
// Classe abstrata, não poderá ser estanciada diretamente.
abstract class set_conexao{
public function f_set_vars($hostname_epil, $username_epil, $password_epil, $database_epil){
$this->hostname_epil = $hostname_epil;
$this->username_epil = $username_epil;
$this->password_epil = $password_epil;
$this->database_epil = $database_epil;
}
}
class conectar extends set_conexao{
// Campos da conexão com o banco
public $codigo;
public $hostname_epil;
public $username_epil;
public $password_epil;
public $database_epil;
public $status_conexao;
public $sql_connect;
public $select_db;
// Erro da conexão com o banco.
public $erro;
// Campos da função select.
public $campos;
public $tabela;
public $condicao;
public $sql_select;
public $select_resultado;
// Campos para a funação delete
public $sql_delete;
// Campos para a função update.
public $sets_updates;
// Número de consultas retornadas.
public $num_rows;
// codigo_transacao -> Código CDXX para determinado banco de dados.
public function f_codigo_transacao($codigo){
$this->codigo = $codigo;
if($this->codigo == "CD01"){
$database_epil = "db";
$hostname_epil = "localhost";
$username_epil = "use4r";
$password_epil = "senha";
parent::f_set_vars($hostname_epil,$username_epil,$password_epil,$database_epil);
}
elseif($this->codigo == "CD02"){
// Seta as variaveis de conexão.
$database_epil = "db2";
$hostname_epil = "localhost";
$username_epil = "usuario";
$password_epil = "pass";
parent::f_set_vars($hostname_epil,$username_epil,$password_epil,$database_epil);
}
}
public function f_iniciar_conexao(){
try
{
$this->sql_connect = mysql_connect($this->hostname_epil,
$this->username_epil,
$this->password_epil);
$this->select_db = mysql_select_db($this->database_epil,$this->sql_connect);
$this->sql_connect = $status_conexao;
}
catch(exception $erro)
{
return $erro;
}
/*
echo $this->database_epil . "<br>";
echo $this->hostname_epil . "<br>";
echo $this->username_epil . "<br>";
echo $this->password_epil . "<Br>";}
public function f_finalizar_conexao(){
// Finalizar conexão com o banco de dados
try
{
if($this->sql_connect == true){
mysql_free_result($this->select_resultado);
mysql_close($this->sql_connect);
}
}
catch(exception $erro)
{
return $erro;
}
}
public function f_select($tabela,$campos,$condicao){
$this->campos = $campos;
$this->tabela = $tabela;
$this->condicao = $condicao;
$this->sql_select = "select $this->campos from $this->tabela ";
// Monta o Where separadamente.
if($this->condicao != ""){
$this->sql_select .= " where " . $this->condicao;
}
$this->select_resultado = mysql_query($this->sql_select);
return $this->select_resultado;
}
public function f_num_rows(){
return mysql_num_rows($this->select_resultado);
}
public function f_debug_sql(){
return $this->sql_select;
}
public function f_update($tabela,$sets,$condicao){
$this->tabela = $tabela;
$this->sets = $sets;
$this->condicao = $condicao;
$this->sql_delete = "update $this->tabela sets $this->sets ";
// Monta o Where separadamente.
if($this->condicao != ""){
$this->sql_update .= " where " . $this->condicao;
}
$this->update_resultado = mysql_query($this->sql_update) or die(mysql_error());
// True or False
return $this->update_resultado;
}
public function f_delete($tabela,$condicao){
$this->tabela = $tabela;
$this->condicao = $condicao;
$this->sql_delete = "delete from $this->tabela ";
// Monta o Where separadamente.
if($this->condicao != ""){
$this->sql_delete .= " where " . $this->condicao;
}
$this->delete_resultado = mysql_query($this->sql_delete) or die(mysql_error());
// True or False
return $this->delete_resultado;
}
}
?>
Agora a classe de tratamento de palavras, que usa a conexão.
<?php
// require_once("../conexao/mysql.conexao.class.php");
class PalavraPluralToSingular{
public $nr_exclusaoPalavra;
public $quantPalvra;
public $umaLetras;
public $duasLetras;
public $tresLetras;
public $flagAltera;
public $varPalavra;
public $palavraPlural;
public $resultado_query;
public $bancoPal;
public function converter($palavra,$conectar){
// Recupe palavra
$this->palavra = $palavra;
// remove os espaços
$this->varPalavra = trim($this->palavraPlural);
// Classe para se conectar no banco CD01.
// $conectar = new conectar;
// $conecatar->f_codigo_transacao("CD01");
// $conectar->f_iniciar_conexao();
$this->resultado_query = $conectar->f_select("exclusao_palavra","*","palavra_plur = '$this->palavra'");
// Debug
// echo $conexao->f_debug_sql; // Mostra a string SQL montada.
// Número de registros encontrados.
$this->nr_exclusaoPalavra = $conectar->f_num_rows();
// Vincula as colunas de resultado.
// Agora $ths->row_exclusaoPalara com os campos de retorno do banco.
$this->row_exclusaoPalavra = mysql_fetch_array($this->resultado_query);
// verifica se existe palavra na tabela de exclusão
if ($this->nr_exclusaoPalavra < 1) {
// conta a quantidade de caracteres da palavra
$this->quantPalvra = count($this->varPalavra);
// pega as ultimas 4 letras da palavra
$this->umaLetras = substr($this->varPalavra, -1, 1);
// pega as ultimas 4 letras da palavra
$this->duasLetras = substr($this->varPalavra, -2, 2);
// pega as ultimas 4 letras da palavra
$this->tresLetras = substr($this->varPalavra, -3, 3);
// define flag inicial
$this->flagAltera = "n";
// verifica se as letras são "nes", "res", "ses" e "zes" -> ex. líquenes, gérmenes, ímanes e hífenes
if($this->tresLetras == "NES" || $this->tresLetras == "nes" || $this->tresLetras == "RES" || $this->tresLetras == "res" || $this->tresLetras == "SES" || $this->tresLetras == "ses" || $this->tresLetras == "ZES" || $this->tresLetras == "zes") {
// substitui o "nes" por "n"
$this->varPalavra = substr($this->varPalavra, 0, $this->quantPalvra - 3);
$this->flagAltera = "s";
};
// verifica se as letras são "aes" ou "ães" -> ex. cães e pães
if($this->tresLetras == "AES" || $this->tresLetras == "ÃES" || $this->tresLetras == "aes" || $this->tresLetras == "ães" || $this->tresLetras == "ãES") {
$this->varPalavra = substr($this->varPalavra, 0, $this->quantPalvra - 3);
$this->varPalavra = $this->varPalavra."O";
$this->flagAltera = "s";
};
// verifica se as letras são "oes" e "ões" -> ex. leões e aldeões
if($this->tresLetras == "OES" || $this->tresLetras == "ÕES" || $this->tresLetras == "oes" || $this->tresLetras == "ões" || $this->tresLetras == "õES") {
$this->varPalavra = substr($this->varPalavra, 0, $this->quantPalvra - 4);
$this->varPalavra = $this->varPalavra."AO";
$this->flagAltera = "s";
};
// verifica se as letras são "aos" e "ãos" -> ex. cristãos e irmãos
if($this->tresLetras == "AOS" || $this->tresLetras == "ÃOS" || $this->tresLetras == "aos" || $this->tresLetras == "ãos" || $this->tresLetras == "ãOS") {
$this->varPalavra = substr($this->varPalavra, 0, $this->quantPalvra - 2);
//$this->varPalavra = $this->varPalavra."AO";
$this->flagAltera = "s";
};
// verifica se as letras são "ns" -> ex. homens e jovens
if($this->duasLetras == "NS" || $this->duasLetras == "ns") {
$this->varPalavra = substr($this->varPalavra, 0, $this->quantPalvra - 3);
$this->varPalavra = $this->varPalavra."M";
$this->flagAltera = "s";
};
// verifica se as letras são "ais" e "uis" -> ex. casais e pauis
if($this->tresLetras == "AIS" || $this->tresLetras == "UIS" || $this->tresLetras == "ais" || $this->tresLetras == "uis") {
$this->varPalavra = substr($this->varPalavra, 0, $this->quantPalvra - 3);
$this->varPalavra = $this->varPalavra."L";
$this->flagAltera = "s";
};
// verifica se as letras são "ois" -> ex. bois
if($this->tresLetras == "OIS" || $this->tresLetras == "ois") {
$this->varPalavra = substr($this->varPalavra, 0, $this->quantPalvra - 3);
$this->varPalavra = $this->varPalavra."I";
$this->flagAltera = "s";
};
// verifica se as letras são "eis" -> ex. fósseis
if($this->tresLetras == "EIS" || $this->tresLetras == "eis") {
$this->varPalavra = substr($this->varPalavra, 0, $this->quantPalvra - 4);
$this->varPalavra = $this->varPalavra."IL";
$this->flagAltera = "s";
};
// verifica se as letras são "éis" -> ex. anéis
if($this->tresLetras == "ÉIS" || $this->tresLetras == "éis" || $this->tresLetras == "éIS") {
$this->varPalavra = substr($this->varPalavra, 0, $this->quantPalvra - 4);
$this->varPalavra = $this->varPalavra."EL";
$this->flagAltera = "s";
};
// verifica se as letras são "óis" -> ex. faróis
if($this->tresLetras == "ÓIS" || $this->tresLetras == "óis" || $this->tresLetras == "óIS") {
$this->varPalavra = substr($this->varPalavra, 0, $this->quantPalvra - 4);
$this->varPalavra = $this->varPalavra."OL";
$this->flagAltera = "s";
};
// verifica se as letras são "as" -> ex. escolas
if($this->duasLetras == "AS" || $this->duasLetras == "as") {
if ($this->flagAltera == "n") {
$this->varPalavra = substr($this->varPalavra, 0, $this->quantPalvra - 2);
$this->flagAltera = "s";
};
};
// verifica se as letras são "es" -> ex. hectares
if($this->duasLetras == "ES" || $this->duasLetras == "es") {
if ($this->flagAltera == "n") {
$this->varPalavra = substr($this->varPalavra, 0, $this->quantPalvra - 2);
$this->flagAltera = "s";
};
};
// verifica se as letras são "is" -> ex. barris
if($this->duasLetras == "IS" || $this->duasLetras == "is") {
if ($this->flagAltera == "n") {
$this->varPalavra = substr($this->varPalavra, 0, $this->quantPalvra - 2);
$this->flagAltera = "s";
};
};
// verifica se as letras são "os" -> ex. masculinos
if($this->duasLetras == "OS" || $this->duasLetras == "os") {
if ($this->flagAltera == "n") {
$this->varPalavra = substr($this->varPalavra, 0, $this->quantPalvra - 2);
$this->flagAltera = "s";
};
};
// verifica se as letras são "is" -> ex. museus
if($this->duasLetras == "US" || $this->duasLetras == "us") {
if ($this->flagAltera == "n") {
$this->varPalavra = substr($this->varPalavra, 0, $this->quantPalvra - 2);
$this->flagAltera = "s";
};
};
// retorno variavel
return $this->varPalavra;
// fim da verificação de exclusao
} else {
// recupera valor da variavel do banco de dados
$this->bancoPal = $this->row_exclusaoPalavra['palavra_sing'];
// deixa todos os caracteres em maiusculo
$this->varPalavra = strtoupper($this->bancoPal);
// fecha a conexão com o banco de dados
$this->f_finalizar_conexao();
// retorno variavel
return $this->varPalavra;
};
// fim da classe
}
}
?>ta usando algum Framework ?
se não tiver, como está colocando a classe de conexão para que assim possa instanciar ?
da uma pesquisada sobre herança, está confundindo as bolas...
Boa tarde Wesley,
Não uso nenhum fw para fazer isso.
A questão é que o objeto não esta sendo reconhecido, preciso que a minha classe de Tratamento de palavras se comunique com a classe de conexão com o banco de dados, porém não esta dando certo.
Se, por exemplo, eu colocar todas as classes em um único arquivo e fazer as heranças, daria certo?
Obrigado,
Léo
Wesley,
aproveitando, o que você achou das classes? Estou implementando OOP corretamente?
tks
Seu último post não contem uma dúvida.
Mesmo assim, gostaria de apontar algumas falhas, pois você mesmo já respondeu que a classe usa uma conexão, mas os métodos insistem em se comportar como se fossem a conexão, veja:
>
// fecha a conexão com o banco de dados
$this->f_finalizar_conexao();
Se você já está utilizando a conexão, limite-se a manter as funções de BD dentro da conexão, não há necessidade disso:
>
$this->row_exclusaoPalavra = mysql_fetch_array($this->resultado_query);
Substitua esse tanto de IF's por switch, fica mais limpo, legível e, dependendo da arquitetura, mais rápido.
Notei que nos últimos casos, existe a checagem se $this->flagAltera == 'n', seria interessante passar essa verificação primeiro e suas respectivas alterações dentro de um { bloco }
Você pode mover os métodos f_iniciar_conexao e f_finalizar_conexao para os métodos mágicos __construct() e __destruct() respectivamente; depois basta trocar
$this->f_finalizar_conexao();
por:
unset($conexao);
Faça uso de Type Hinting, se $conexão deve ser um objeto do tipo conectar, você pode prever isso deste modo:
public function converter($palavra, conectar $conexao){}
Ao meu ver, aquela classe abstrata está ali para enfeite, a classe conexão + set_conexao poderiam ser escritas assim:
class DBHandler {
const CD01 = array('localhost','use4r','senha','db');
const CD02 = array('localhost','usuario','pass','db2');
private $conn;
private $db;
private $recordset;
public $numRows = 0;
public $query;
public $erro;
public function __construct(array $params = DBHandler::CD01){
if(false === ($this->conn = mysql_connect($params[0],$params[1],$params[2]))){
$this->erro = mysql_error();
return false;
}
if(false === ($this->db = mysql_select_db($params[3],$this->conn))){
$this->error = mysql_error();
return false;
}
return true;
}
public function __destruct(){
@mysql_free_result($this->recordset);
mysql_close($this->conn);
}
public function select($table,array $campos = array(),$cond = null){
if(empty($campos)) $campos = '*';
else $campos = implode(', ',$campos);
$this->query = 'SELECT '.$campos.' FROM '.$table.(!empty($cond))? ' WHERE '.$cond : '';
if(!$this->doQuery()) return false;
$this->numRows = mysql_num_rows($this->recordset);
return true;
}
public function update($table,array $newValues,$cond){
foreach($newValues as $field=>$newValue) $replaces[] = "`{$field}`='{$newValue}'";
$this->query = 'UPDATE '.$table.' SET '.implode(', ',$replaces).' WHERE '.$cond;
if(!$this->doQuery()) return false;
$this->numRows = mysql_affected_rows($this->conn);
return true;
}
public function delete($table,$cond){
$this->query = 'DELETE FROM '.$table.' WHERE '.$cond;
if(!$this->doQuery()) return false;
$this->numRows = mysql_affected_rows($this->conn);
return true;
}
private function doQuery(){
if(false === ($this->recordset = mysql_query($this->query,$this->conn))) {
$this->erro = mysql_error();
return false;
}
return true;
}
}Boa tarde Evandro, tudo bem?
Nossa, muito obrigado pela sua atenção e as dicas irão me auxiliar muito.
Vou modificar as classes.
Muito obrigado aos amigos,
como é uma questão de projeto, o post pode ser mudado para RESOLVIDO.
Obrigado,
Léo
Uma instancia apenas.
Abs