Fabyo 66 Denunciar post Postado Março 29, 2005 Classe de conexao com mysql (normal) debugger personalizado e mensagens preparadas e esse script foi feito para ser usado com o PHP5 e Mysql acima do 4.1 na opção $msg_erro = true; você pode deixar em false dai nao vai aparecer a mensagem de erro e se deixar em true vai aparece a mensagem de erro é bom para debugger e ele mostra ate mensagens de erro na sintaxe SQL se a sintaxe basica SQL estiver certa aparece em azul se tiver errado aparece em vermelho exemplo: [selects * from tabela] essa versao é +- um demo do que eu fiz para a empresa que eu trabalho pois aqui o debugger grava um log de erro e manda um email pro admin,com mais recursos bom fica a ideia pra quem quiser complementar ele bom aproveito pessoal qualquer duvida ou sujestao postem ai conecta.php PHP php class Conexao { var $obj = array ( "servidor" => "localhost" , "usuario" => "usuario" , "senha" => "senha" , "banco" => "banco" ); var $conexao = ""; var $msg_erro = true; function Abrir() { @$this->conexao = mysql_connect( $this->obj['servidor'] , $this->obj['usuario'] , $this->obj['senha'] ); if ( mysql_errno() == 2005 and $this->msg_erro == 1 ) { echo "Mysql_Error(2005) Servidor nao foi encontrado [".$this->obj["servidor"]."]"; exit; } elseif ( mysql_errno() == 1045 and $this->msg_erro == 1 ) { echo "Mysql_Error(1045) Nome ou Senha invalidos"; exit; } if ( mysql_errno() == 0 and $this->msg_erro == 1 ) { if ( !mysql_select_db($this->obj["banco"], $this->conexao) ) { echo "Mysql_Erro(1049) Banco [".$this->obj["banco"]. "] nao foi encontrado"; exit; } } } function Fechar() { if ( isset($this->conexao ) ) { return mysql_close($this->conexao); } } } class ComandoSql extends Conexao { function Executar($sql) { $this->Abrir(); $re = @mysql_query($sql); $this->checa_query($sql); $this->Fechar(); return $re; } function checa_query($sql) { if ( mysql_errno() == 1146 and $this->msg_erro == 1 ) { $erro = mysql_error(); $arr = explode("'", $erro); $tabela = explode(".", $arr[1]); echo "Essa tabela [ ".$tabela[1]." ] não existe!"; exit(); } if ( mysql_errno() == 1054 and $this->msg_erro == 1 ) { echo "Existe algum campo com nome errado"; exit(); } if ( mysql_errno() == 1064 and $this->msg_erro == 1 ) { $msg = "Existe algum erro na sintaxe SQL"; $sql = preg_replace(sql_regcase("/(select|insert|delete|drop table|alter table|from|where|limit|\*|order by|group by)/"),"\\1",$sql); echo "$msg [$sql]"; exit(); } } } ?> modo de usar: include "conecta.php" $con = new ComandoSql(); $re = $con->Executar("select * from tabela"); Compartilhar este post Link para o post Compartilhar em outros sites
i.Surfer 0 Denunciar post Postado Agosto 13, 2005 Ola Fabyo!Tenho uma duvida... ja reparei que alguns scripts fazem isso as vezes, mas nunca entendi o porque, tentei procurar em foruns e no manual e nao achei (se tiver no manual, onde fica?). Seguinte, o ' @ ' antesde variaveis e funcoes server para que ?Grato! Compartilhar este post Link para o post Compartilhar em outros sites
Fabyo 66 Denunciar post Postado Agosto 14, 2005 Entao o correto uso do @ é para ocultar mensagens de erros, mas só use assim em caso de você nao querer que o ususario veja um possivel erro dai você mostra uma mensagem personalizada mas nao use isso pra esconder erros, e sim para esse fim que eu te falei um exemplo simples é por exemplo você faz um script correto mas pra ele funcionar muitas vezes nao depende de você com no caso se o servidor mysql der algum problema entao quando o script tentar conectar iria aparecer uma mensgame de erro na tela, mas o usuario poderia pensar que erra um erro seu de programação por isso você esconde esse possivel erro e se quiser mostrar uma mensagem e ainda envia um email pro admin sobre o erro Compartilhar este post Link para o post Compartilhar em outros sites
i.Surfer 0 Denunciar post Postado Agosto 14, 2005 Agora sim !! Muito Obrigado !!! http://forum.imasters.com.br/public/style_emoticons/default/joia.gif Compartilhar este post Link para o post Compartilhar em outros sites
Wagner Bianchi 0 Denunciar post Postado Agosto 16, 2005 Fábio, Tiro a chapéu pra ti nessa classe. . .mandou muito bem velho, parabéns!!!! http://forum.imasters.com.br/public/style_emoticons/default/clap.gif Abraços!! DEUS Abençoe!! http://forum.imasters.com.br/public/style_emoticons/default/joia.gif Compartilhar este post Link para o post Compartilhar em outros sites
tallibba 0 Denunciar post Postado Maio 20, 2006 Prefiro usar o bom e VELHO mysql_connect("localhost", "usuario", "senha");mysql_select_db("banco") Compartilhar este post Link para o post Compartilhar em outros sites
pcdesign 0 Denunciar post Postado Novembro 14, 2006 oi fabyo beleza de script, mas não estou usando corretamente: $con = new ComandoSql();$re = $con->Executar("select * from tabela");while ($n=mysql_fetch_array($re)){ // funciona mas da um erro: argumento invalido// qual seria a forma correta de usar.//quando fiz para exibir por categoria, só exibiu o produtos referente a ultima categoria.} desde ja muito obrigado. Compartilhar este post Link para o post Compartilhar em outros sites
Fabyo 66 Denunciar post Postado Novembro 14, 2006 vou postar um script melhor, esse script que eu vou postar nao esta 100% terminado, porque depois que abandonei o php4 fiquei mechendo só com o php5 e classes para php5 é outra coisa, mas essa classe ta legalzinha ainda mais por ser simples e para php4 , ela acaba sendo util para quem quer aprender e começar a mecher com oop só explicando uma coisa que vejo sempre, muitos programadores falam que faz uma classe de conexao, mas quando voce vai ver a classe nao tem nada de oop, o que ele fez foi jogar as funções dentro de classe outra coisa se voce faz uma classe de conexao mas o resultado da query nao continua em objeto entao sua classe nao ajuda muito exemplo do que eu to falando exemplo errado: Citar $db = new Classe();$res = $db->Query("select * from tabela"); while($l = mysql_fetch_array($res)) { } como pode ver em destaque acabei fugindo da orientação a objeto o certo seria: Citar $db = new Classe();$res = $db->Query("select * from tabela"); while($l = $res->fetch_array($res)) { } percebeu a diferença?, como minha classe que voce tava usando é antiga por isso to postando uma nova para voce ver a diferença, mas muita gente ainda faz classe daquele jeito errado. bom chega de papo e vou postar minha classe que ta boazinha ma é antiga e php4(credo odeio usar var nas classes) <?php class Re { var $re; var $array; function Re($re) { $this->re = $re; } function FetchRow() { return mysql_fetch_array($this->re); } function GetOne() { $re = mysql_fetch_array($this->re); reset($re); return (string) current($re); } function GetRow() { $re = mysql_fetch_array($this->re); $keys = count(array_keys($re)); return array_slice($re, 0, $keys); } function Close() { @mysql_free_result($this->re); } function NumRows() { return @mysql_num_rows($this->re) > 0 ? @mysql_num_rows($this->re) : false; } } class Mysql { var $conexao; var $error; var $db_config; var $re; var $sql; var $last_id; var $record; var $fields; var $status; var $affected_row; function Mysql() { if(func_num_args() == 4) { $this->db_config = func_get_args(); } else { $this->db_config[0] = defined("SERVIDOR") ? SERVIDOR : ""; $this->db_config[1] = defined("USUARIO") ? USUARIO : ""; $this->db_config[2] = defined("SENHA") ? SENHA : ""; $this->db_config[3] = defined("BANCO") ? BANCO : ""; } $this->Open(); } function Open() { if(!isset($this->status)) { $this->conexao = @mysql_connect($this->db_config[0], $this->db_config[1], $this->db_config[2]); if (is_resource($this->conexao)) { if(mysql_errno() == 0) { if(!@mysql_select_db($this->db_config[3], $this->conexao)) { $this->error = "Nao foi possivel conectar no banco de dados <b>\"" . $this->db_config[3] . "\"</b>"; $this->status = false; $this->error = "Conexao falhou, verifique os dados de conexao"; } else { $this->status = true; } } } else { $this->status = false; $this->error = "Conexao falhou, verifique os dados de conexao"; } } return $this->status; } function Execute($sql) { if(!$this->status) { $this->Open(); } $this->sql = $sql; $this->re = @mysql_query($this->sql, $this->conexao); if (!$this->re) { $this->error = "Erro na execução da query ". mysql_error(); $this->status = false; } else { return new Re($this->re); } } function Close() { if($this->status) { $this->status = false; @mysql_close($this->conexao); unset($this->conexao); } } function ShowErrors() { return $this->error; } function Insert($tabela, $dados) { if(!is_array($dados)) { return false; } $campos = implode(array_keys($dados), ','); $valores = "'".implode("','", array_values($this->EscapeString($dados)))."'"; $this->sql = "INSERT INTO $tabela ($campos) VALUES ($valores)"; $this->re = $this->Execute($this->sql); if($this->re) { $this->last_id = @mysql_affected_rows($this->conexao); return $this->last_id; } else { $this->error = "[" . mysql_errno() . "]" . mysql_error(); } } function Update($tabela, $dados, $where) { if(!is_array($dados)) { return false; } $fields = array_keys($dados); $values = array_values($dados); $i = 0; $this->sql = "UPDATE $tabela SET "; while($fields[$i]){ if($i < 0){ $this->sql.=", "; } $this->sql .= $fields[$i]." = '".$values[$i]."'"; $i++; } $this->sql .= " WHERE $where"; $this->re = $this->Execute($this->sql); if($this->re) { return true; } else { $this->error = "[" . mysql_errno() . "]" . mysql_error(); } } function Affected_row() { $this->affected_row = @mysql_affected_rows($this->conexao); return $this->affected_row; } function InsertID() { $this->InsertID = @mysql_insert_id($this->conexao); return $this->last_id; } function EscapeString($value) { if( is_array($value) ) { $campos = array_keys($value); $valores = array_values($value); for($i = 0; $i < count($value); $i++) { $arr[$campos[$i]] = mysql_escape_string($valores[$i]); } return $arr; } else { if( $value == '' ) { $value = 'NULL'; } if( !is_numeric($value) || $value[0] == '0' ) { if( get_magic_quotes_gpc() ) { $value = stripslashes($value); } $value = mysql_escape_string($string); } return $value; } } } ?> Modo de usar: //$db = new Mysql("localhost", "usuario", "senha", "banco"); /* ou no lugar de passar a string de conexao eu posso usar um arquivo de configuração exemplo: config.php: <?php define("SERVIDOR", "localhost"); define("USUARIO", "usuario"); define("SENHA", "senha"); define("BANCO", "banco"); ?> e incluir o config no script e usar assim: $db = new Mysql(); */ Inserir dados: $db = new Mysql(); //teste se ta tudo ok ate aqui if(!$db->ShowErrors()) { //passo o nome do campo e o valor no caso o dado vindo de um formulario por exemplo $dados = array("campo" => "valor1", "campo2" => "valor2"); $db->Insert("tabela", $dados); //teste se deu certo e verifico se a gravação teve sucesso if(!$db->ShowErrors()) { echo $db->Affected_row(); } } //fecho o banco de dados; $db->Close(); Selecionando dados: $db = new Mysql(); $re = $db->Execute("select * from tabela"); if(!$db->ShowErrors()) { while($l = $re->FetchRow()) { echo $l["campo"]; } //libero a memoria do resource $re->Close(); //fecho o banco de dados; $db->Close(); } tem outros metodos que voce tbm como Update() e voce pode ver outros metodos tbm, uma dica use get_class_methods() para voce saber quais metodos existem uma classe só nao crio um tutorial descente para essa classe, porque pra mim ela esta obsoleta. mas se voce usa php4 ela pode ser muito util ainda. Compartilhar este post Link para o post Compartilhar em outros sites
Void : 0 Denunciar post Postado Novembro 14, 2006 olha la ... quem disse que não da pra fazer coisa legal com o php4 :Dta show de bola ...só uma coisa eu não curti ... foi um método dentro do construtor ! o método open! Compartilhar este post Link para o post Compartilhar em outros sites
Fabyo 66 Denunciar post Postado Novembro 14, 2006 eu usei o metodo open para continuar sendo automatico assim que extanciar a classe ele ja conectaria, mas tbm nao faço mais assim eu abro a conexao dentro do metodo Execute, alias eu fico sempre mudando nunca socego com o mesmo script = ) Compartilhar este post Link para o post Compartilhar em outros sites
Void : 0 Denunciar post Postado Novembro 14, 2006 mas de qq jeito, ta de parabens ! Fabyo disse: eu usei o metodo open para continuar sendo automatico assim que extanciar a classe ele ja conectaria, mas tbm nao faço mais assim eu abro a conexao dentro do metodo Execute, alias eu fico sempre mudando nunca socego com o mesmo script = ) Compartilhar este post Link para o post Compartilhar em outros sites
Epyllion 0 Denunciar post Postado Novembro 14, 2006 Bacana, Fabyo. Parabéns ! Só lembrando o pessoal: Usem o PHP 5, usando OOP com PHP 4 perdemos muitos recursos, como por exemplo -- Construtores, Visibilidade, Exceções Usar o método getTrace*() para localização rápida do erro, interfaces, classes abstratas, moficadores ...--- edit ---Chegará um dia em que todos os hosts oferecerão suporte ao PHP 5 ? Compartilhar este post Link para o post Compartilhar em outros sites
Void : 0 Denunciar post Postado Novembro 14, 2006 Epyllion disse: Bacana, Fabyo. Parabéns ! Só lembrando o pessoal: Usem o PHP 5, usando OOP com PHP 4 perdemos muitos recursos, como por exemplo -- Construtores, Visibilidade, Exceções Usar o método getTrace*() para localização rápida do erro, interfaces, classes abstratas, moficadores ...--- edit ---Chegará um dia em que todos os hosts oferecerão suporte ao PHP 5 ?espero que sim !!!! Compartilhar este post Link para o post Compartilhar em outros sites
pcdesign 0 Denunciar post Postado Novembro 15, 2006 oi desculpa minha icompetencia mas não uso php4 uso php5. num sei das quantas: e tentei por o modo correto qu você ensinou e num deu certo. nem apareceu o s resultados: <?php $con = new ComandoSql();$re = $con->Executar("select * from menu_vert group by categ_menu asc"); while($n = $re->mysql_fetch_array($re)){// usei assim tbm: while($n = $re->fetch_array($re))$categ_menu = $n['categ_menu']; echo " $categ_menu <br />"; $con = new ComandoSql();$re2 = $con->Executar("select * from menu_vert where categ_menu= '$categ_menu' order by id_menu"); while($l = $re2->mysql_fetch_array($re2)){$id_menu = $l['id_menu'];$menu = $l['menu'];$link_menu = $l['link_menu'];echo "$id_menu - $menu = $link_menu || <a href=\"up_menu.php?id_menu=$id_menu\">Alterar</a> || <a href=\"del_menu.php?id_menu=$id_menu\">Excluir</a> <br />";}} ?>obrigado Compartilhar este post Link para o post Compartilhar em outros sites
pcdesign 0 Denunciar post Postado Novembro 15, 2006 Fabyo,mai uma coisinha que queria entender:sempre que vejo alguma classe tem essa variavel(?):$this -> + alguma coisa //você poderia explicar o tal "$this ->" ou melhor indicar um link com um conteúdo completo.Mais uma vez obrigado Compartilhar este post Link para o post Compartilhar em outros sites
Void : 0 Denunciar post Postado Novembro 15, 2006 entao, o $this-> serve para referenciar algum método ou atributo da classe atual .... ou seja ... na prática: teriamos o seguinte class Pessoa{ private $nome; public function __construct($nome) { $this->nome=$nome; // usando o $this-> para referenciar o atributo nome da classe Pessoa } public function getNome(){ return $this->nome; } public function setNome($nome){ $this->nome=$nome; }}podemos dizer que é um operador de escopo Compartilhar este post Link para o post Compartilhar em outros sites
Fabyo 66 Denunciar post Postado Novembro 16, 2006 pcdesign foi falta de atenção sua lembra, olha que eu falei no topico, se voce quisesse saber os nomes dos metodos de uma classe use: get_class_methods() meu metodo se chama FetchRow() é só reparar no exemplo que eu deixei na pagina Compartilhar este post Link para o post Compartilhar em outros sites
pcdesign 0 Denunciar post Postado Novembro 16, 2006 puts! foi mal Fabyo é minha mania de ler o começo e adivinha o resto.desculpa a falta de atenção e obrigado você e o void pela nobre atenção. Compartilhar este post Link para o post Compartilhar em outros sites
renato9863 0 Denunciar post Postado Janeiro 11, 2007 Fabyo disse: vou postar um script melhor, esse script que eu vou postar nao esta 100% terminado, porque depois que abandonei o php4 fiquei mechendo só com o php5 e classes para php5 é outra coisa, mas essa classe ta legalzinha ainda mais por ser simples e para php4 , ela acaba sendo util para quem quer aprender e começar a mecher com oop só explicando uma coisa que vejo sempre, muitos programadores falam que faz uma classe de conexao, mas quando voce vai ver a classe nao tem nada de oop, o que ele fez foi jogar as funções dentro de classe outra coisa se voce faz uma classe de conexao mas o resultado da query nao continua em objeto entao sua classe nao ajuda muito exemplo do que eu to falando exemplo errado: Citar $db = new Classe(); $res = $db->Query("select * from tabela"); while($l = mysql_fetch_array($res)) { } como pode ver em destaque acabei fugindo da orientação a objetoo certo seria: Citar $db = new Classe(); $res = $db->Query("select * from tabela"); while($l = $res->fetch_array($res)) { } percebeu a diferença?, como minha classe que voce tava usando é antiga por isso to postando uma nova para voce ver a diferença, mas muita gente ainda faz classe daquele jeito errado. bom chega de papo e vou postar minha classe que ta boazinha ma é antiga e php4(credo odeio usar var nas classes) <?phpclass Re{ var $re; var $array; function Re($re) { $this->re = $re; } function FetchRow() { return mysql_fetch_array($this->re); } function GetOne() { $re = mysql_fetch_array($this->re); reset($re); return (string) current($re); } function GetRow() { $re = mysql_fetch_array($this->re); $keys = count(array_keys($re)); return array_slice($re, 0, $keys); } function Close() { @mysql_free_result($this->re); } function NumRows() { return @mysql_num_rows($this->re) > 0 ? @mysql_num_rows($this->re) : false; }}class Mysql{ var $conexao; var $error; var $db_config; var $re; var $sql; var $last_id; var $record; var $fields; var $status; var $affected_row; function Mysql() { if(func_num_args() == 4) { $this->db_config = func_get_args(); } else { $this->db_config[0] = defined("SERVIDOR") ? SERVIDOR : ""; $this->db_config[1] = defined("USUARIO") ? USUARIO : ""; $this->db_config[2] = defined("SENHA") ? SENHA : ""; $this->db_config[3] = defined("BANCO") ? BANCO : ""; } $this->Open(); } function Open() { if(!isset($this->status)) { $this->conexao = @mysql_connect($this->db_config[0], $this->db_config[1], $this->db_config[2]); if (is_resource($this->conexao)) { if(mysql_errno() == 0) { if(!@mysql_select_db($this->db_config[3], $this->conexao)) { $this->error = "Nao foi possivel conectar no banco de dados <b>\"" . $this->db_config[3] . "\"</b>"; $this->status = false; $this->error = "Conexao falhou, verifique os dados de conexao"; } else { $this->status = true; } } } else { $this->status = false; $this->error = "Conexao falhou, verifique os dados de conexao"; } } return $this->status; } function Execute($sql) { if(!$this->status) { $this->Open(); } $this->sql = $sql; $this->re = @mysql_query($this->sql, $this->conexao); if (!$this->re) { $this->error = "Erro na execução da query ". mysql_error(); $this->status = false; } else { return new Re($this->re); } } function Close() { if($this->status) { $this->status = false; @mysql_close($this->conexao); unset($this->conexao); } } function ShowErrors() { return $this->error; } function Insert($tabela, $dados) { if(!is_array($dados)) { return false; } $campos = implode(array_keys($dados), ','); $valores = "'".implode("','", array_values($this->EscapeString($dados)))."'"; $this->sql = "INSERT INTO $tabela ($campos) VALUES ($valores)"; $this->re = $this->Execute($this->sql); if($this->re) { $this->last_id = @mysql_affected_rows($this->conexao); return $this->last_id; } else { $this->error = "[" . mysql_errno() . "]" . mysql_error(); } } function Update($tabela, $dados, $where) { if(!is_array($dados)) { return false; } $fields = array_keys($dados); $values = array_values($dados); $i = 0; $this->sql = "UPDATE $tabela SET "; while($fields[$i]){ if($i < 0){ $this->sql.=", "; } $this->sql .= $fields[$i]." = '".$values[$i]."'"; $i++; } $this->sql .= " WHERE $where"; $this->re = $this->Execute($this->sql); if($this->re) { return true; } else { $this->error = "[" . mysql_errno() . "]" . mysql_error(); } } function Affected_row() { $this->affected_row = @mysql_affected_rows($this->conexao); return $this->affected_row; } function InsertID() { $this->InsertID = @mysql_insert_id($this->conexao); return $this->last_id; } function EscapeString($value) { if( is_array($value) ) { $campos = array_keys($value); $valores = array_values($value); for($i = 0; $i < count($value); $i++) { $arr[$campos[$i]] = mysql_escape_string($valores[$i]); } return $arr; } else { if( $value == '' ) { $value = 'NULL'; } if( !is_numeric($value) || $value[0] == '0' ) { if( get_magic_quotes_gpc() ) { $value = stripslashes($value); } $value = mysql_escape_string($string); } return $value; } } }?>Modo de usar: //$db = new Mysql("localhost", "usuario", "senha", "banco");/* ou no lugar de passar a string de conexao eu posso usar um arquivo de configuração exemplo:config.php:<?phpdefine("SERVIDOR", "localhost");define("USUARIO", "usuario");define("SENHA", "senha");define("BANCO", "banco");?>e incluir o config no script e usar assim:$db = new Mysql();*/ Inserir dados: $db = new Mysql();//teste se ta tudo ok ate aquiif(!$db->ShowErrors()) { //passo o nome do campo e o valor no caso o dado vindo de um formulario por exemplo $dados = array("campo" => "valor1", "campo2" => "valor2"); $db->Insert("tabela", $dados); //teste se deu certo e verifico se a gravação teve sucesso if(!$db->ShowErrors()) { echo $db->Affected_row(); } }//fecho o banco de dados;$db->Close(); Selecionando dados: $db = new Mysql();$re = $db->Execute("select * from tabela");if(!$db->ShowErrors()) { while($l = $re->FetchRow()) { echo $l["campo"]; } //libero a memoria do resource $re->Close(); //fecho o banco de dados; $db->Close();} tem outros metodos que voce tbm como Update() e voce pode ver outros metodos tbm, uma dica use get_class_methods() para voce saber quais metodos existem uma classe só nao crio um tutorial descente para essa classe, porque pra mim ela esta obsoleta. mas se voce usa php4 ela pode ser muito util ainda. Fabyo, você tem essa classe criada para o php5 ? Se tiver teria como disponibilizar ela aqui. Valeu... Renato Compartilhar este post Link para o post Compartilhar em outros sites
Fabyo 66 Denunciar post Postado Janeiro 11, 2007 Eu faço uma mais simples e padrao e posto aqui. Compartilhar este post Link para o post Compartilhar em outros sites