Ir para conteúdo

POWERED BY:

Arquivado

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

Fabyo

Classe de conexao com Mysql

Recommended Posts

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
  1. php

  2. class Conexao
  3. {

  4. var $obj = array ( "servidor" => "localhost" ,
  5. "usuario" => "usuario" ,
  6. "senha" => "senha" ,
  7. "banco" => "banco"
  8. );

  9. var $conexao = "";
  10. var $msg_erro = true;

  11. function Abrir()
  12. {
  13. @$this->conexao = mysql_connect( $this->obj['servidor'] ,
  14. $this->obj['usuario'] ,
  15. $this->obj['senha']
  16. );

  17. if ( mysql_errno() == 2005 and $this->msg_erro == 1 )
  18. {
  19. echo "Mysql_Error(2005) Servidor nao foi encontrado [".$this->obj["servidor"]."]";
  20. exit;
  21. }

  22. elseif ( mysql_errno() == 1045 and $this->msg_erro == 1 )
  23. {
  24. echo "Mysql_Error(1045) Nome ou Senha invalidos";
  25. exit;
  26. }

  27. if ( mysql_errno() == 0 and $this->msg_erro == 1 )
  28. {
  29. if ( !mysql_select_db($this->obj["banco"], $this->conexao) )
  30. {
  31. echo "Mysql_Erro(1049) Banco [".$this->obj["banco"]. "] nao foi encontrado";
  32. exit;
  33. }
  34. }
  35. }

  36. function Fechar()
  37. {
  38. if ( isset($this->conexao ) )
  39. {
  40. return mysql_close($this->conexao);
  41. }
  42. }
  43. }

  44. class ComandoSql extends Conexao
  45. {
  46. function Executar($sql)
  47. {
  48. $this->Abrir();
  49. $re = @mysql_query($sql);
  50. $this->checa_query($sql);
  51. $this->Fechar();
  52. return $re;
  53. }

  54. function checa_query($sql)
  55. {
  56. if ( mysql_errno() == 1146 and $this->msg_erro == 1 )
  57. {
  58. $erro = mysql_error();
  59. $arr = explode("'", $erro);
  60. $tabela = explode(".", $arr[1]);
  61. echo "Essa tabela [ ".$tabela[1]." ] não existe!";
  62. exit();
  63. }

  64. if ( mysql_errno() == 1054 and $this->msg_erro == 1 )
  65. {
  66. echo "Existe algum campo com nome errado";
  67. exit();
  68. }

  69. if ( mysql_errno() == 1064 and $this->msg_erro == 1 )
  70. {
  71. $msg = "Existe algum erro na sintaxe SQL
    "
    ;
  72. $sql = preg_replace(sql_regcase("/(select|insert|delete|drop table|alter table|from|where|limit|\*|order by|group by)/"),"\\1",$sql);
  73. echo "$msg [$sql]";
  74. exit();
  75. }
  76. }
  77. }

  78. ?>

 

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

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

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

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

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

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:

 

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

 

$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

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

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

mas de qq jeito, ta de parabens !

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

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

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

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

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

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

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

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

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:

 

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

 

$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

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.