Primeiramente desculpe pela demora, mas o bicho tá pegando, quase recebemos nossa segunda doação de R$10,00 mas infelizmente foi cancelada rssss. Então continuamos com apenas 1 doação em praticamente 1 ano de BLOG rsss, mas enfim fazer o que né.
Bem galera não está dando para seguir o planejamento das aulas devido ao tempo que está curto, estou tento que pegar vários freelas baratinhos para pagar as contas, e isso acaba que toma o tempo todo.
Hoje vou postar para vocês um exemplo de como podemos abstrair tarefas simples e rotineiras como o update, delete, insert e select em um banco de dados.
Para os críticos, obsecados por designer patterns, segurança e tudo mais, antes de me fazer perder meu tempo lendo seu comentário leia com bastante atenção a linha abaixo:
"Estas classes tem como propósito apenas o estudo de como utilizar orientação a objetos para abstrair tarefas rotineiras, estas classes não são a solução do universo e o mundo inteiro vai utilizar, é apenas para as pessoas que acompanham o blog começarem a se interagir com o que aprenderam + prática"
Bem dito isto, vamos lá nossa idéia então é fazer uma classe para conectar no banco e outra para minimizar a tarefa de atualizar, deletar, inserir e selecionar, minha conexão não permite gravar vídeo então vou postar os códigos coloquei o máximo de comentários possível rsss por isso parece grande, mas creio que todos vão conseguir entender, senão é só mandar um comentário.
Como ficou tudo embolado então estou disponibilizando os arquivos para download, se tiver link quebrado ou coisas do tipo manda um comentário:
DOWNLOAD 1 - Classe Mysql
DOWNLOAD 2 - Classe Mysql
Como ficou tudo embolado então estou disponibilizando os arquivos para download, se tiver link quebrado ou coisas do tipo manda um comentário:
DOWNLOAD 1 - Classe Mysql
DOWNLOAD 2 - Classe Mysql
Criando nossa classe de conexão
conexao.class.php
<?php
class Conexao
{
/**
* Constante responsável por armazenar o servidor do banco
*
*/
const DB_HOST='localhost';
/**
* Constante responsável por armazenar o nome do banco
*
*/
const DB_NOME='emig';
/**
* Constante responsável por armazenar o nome do usuário do banco
*
*/
const DB_USER='root';
/**
* Constante responsável por armazenar a senha do banco
*
*/
const DB_PASS='';
/**
* Método construtor, executado "automaticamente" quando iniciada classe
*/
function __construct()
{
}
/**
* Método responsável por conectar no banco
*/
public function Conecta()
{
//lembrando que self referencia a própria classe no nosso caso
//estamos chamando uma constante que está definida nesta classe
//então conectar ao banco
$con = mysql_connect(self::DB_HOST,self::DB_USER,self::DB_PASS) or die ('Erro ao conectar: ' .mysql_error());
//Agora vamos selecionar o banco de dados
$db = mysql_select_db(self::DB_NOME) or die ('Erro ao selecionar o banco: ' .mysql_error());
}
}
?>
class Conexao
{
/**
* Constante responsável por armazenar o servidor do banco
*
*/
const DB_HOST='localhost';
/**
* Constante responsável por armazenar o nome do banco
*
*/
const DB_NOME='emig';
/**
* Constante responsável por armazenar o nome do usuário do banco
*
*/
const DB_USER='root';
/**
* Constante responsável por armazenar a senha do banco
*
*/
const DB_PASS='';
/**
* Método construtor, executado "automaticamente" quando iniciada classe
*/
function __construct()
{
}
/**
* Método responsável por conectar no banco
*/
public function Conecta()
{
//lembrando que self referencia a própria classe no nosso caso
//estamos chamando uma constante que está definida nesta classe
//então conectar ao banco
$con = mysql_connect(self::DB_HOST,self::DB_USER,self::DB_PASS) or die ('Erro ao conectar: ' .mysql_error());
//Agora vamos selecionar o banco de dados
$db = mysql_select_db(self::DB_NOME) or die ('Erro ao selecionar o banco: ' .mysql_error());
}
}
?>
Bem acho que não tem praticamente nada para eu explicar ai não né? rsss
Agora vamos criar a classe que vai fazer aquela tarefa de atualizar, remover, inserir e selecionar
manipulasql.class.php
<?php
class ManipulaSql extends Conexao
{
/**
* Propriedade responsável por retornar os resultados das querys
*
*/
public $content;
/**
* Método responsável por executar um SELECT no banco de dados
*
* Utilização:
*
* $sql = "SELECT Codigo, Nome, Descricao FROM produtos";
* $s = new ManipulaSql();
* $s->Seleciona($sql);
* if(!empty($s->content))
* {
* foreach ($s->content as $v)
* {
* echo 'Código: ' .$v[0]. '
';
* echo 'Nome: ' .$v[1]. '
';
* echo 'Descrição: ' .$v[2]. '
';
* echo '
';
* }
* } else {
* echo 'Não foram encontrados registros em sua pesquisa.';
* }
*
* @param string $qry
* @return array
*/
public function Seleciona($qry)
{
//como extendemos a classe Conexao, então podemos utilizar
//os metodos herdados pela mesma (não vou entrar em detalhes sobre visibilidade)
//conecta no banco de dados
$con = Conexao::Conecta();
//executa a query
$exec = mysql_query($qry) or die('Erro ao executar a query: ' .mysql_error());
//faço um loop nos resultados e vou armazendo em nossa variável $content
//que é responsável por nos retornar os dados da consulta
while($row = mysql_fetch_array($exec)) {
$this->content[] = $row;
}
//retorno os dados
return $this->content;
}
/**
* Método responsável executar um INSERT no banco
*
* Utilização:
*
* $sql = "INSERT INTO tabela(campo1) VALUES ('algo1')";
* $i = new ManipulaSql();
* $i->Insere($sql);
* if(!empty($i->content))
* {
* echo 'O registro ' .$i->content. ' foi adicionado a base de dados.';
* } else {
* echo 'Nenhum registro foi adicionado.';
* }
*
* @param string $qry
* @return int
*/
public function Insere($qry)
{
//conecta no banco de dados
$con = Conexao::Conecta();
//executa a query
$exec = mysql_query($qry) or die('Erro ao executar a query: ' .mysql_error());
//reonsável por armazenar o ID gerado
//em nossa variável de retorno $this->content
$this->content = mysql_insert_id();
//retorna o id do cadastro
return $this->content;
}
/**
* Método responsável executar um UPDATE no banco
*
* Utilização:
*
* $sql = "UPDATE tabela SET campo1='algo1' WHERE campo='algo'";
* $a = new ManipulaSql();
* $a->Atualiza($sql);
* if(!empty($a->content))
* {
* echo 'Foi(ram) atualizado(s) ' .$a->content. ' registro(s)';
* } else {
* echo 'Nenhum registro foi atualizado.';
* }
*
* @param string $qry
* @return int
*/
public function Atualiza($qry)
{
//conecta no banco de dados
$con = Conexao::Conecta();
//executa a query
$exec = mysql_query($qry) or die('Erro ao executar a query: ' .mysql_error());
//reonsável por armazenar o número de linhas alteradas
//em nossa variável de retorno $this->content
$this->content = mysql_affected_rows();
//retorna o id do cadastro
return $this->content;
}
/**
* Método responsável executar um DELETE no banco
*
* Utilização:
*
* $sql = "DELETE FROM nome_tabela WHERE campo='algo'";
* $r = new ManipulaSql();
* $r->Remove($sql);
* if(!empty($r->content))
* {
* echo 'Foi(ram) removido(s) ' .$r->content. ' registro(s).';
* } else {
* echo 'Nenhum registro foi removido.';
* }
*
* @param string $qry
* @return int
*/
public function Remove($qry)
{
//conecta no banco de dados
$con = Conexao::Conecta();
//executa a query
$exec = mysql_query($qry) or die('Erro ao executar a query: ' .mysql_error());
//reonsável por armazenar o número de linhas alteradas
//em nossa variável de retorno $this->content
$this->content = mysql_affected_rows();
//retorna o id do cadastro
return $this->content;
}
}
class ManipulaSql extends Conexao
{
/**
* Propriedade responsável por retornar os resultados das querys
*
*/
public $content;
/**
* Método responsável por executar um SELECT no banco de dados
*
* Utilização:
*
* $sql = "SELECT Codigo, Nome, Descricao FROM produtos";
* $s = new ManipulaSql();
* $s->Seleciona($sql);
* if(!empty($s->content))
* {
* foreach ($s->content as $v)
* {
* echo 'Código: ' .$v[0]. '
';
* echo 'Nome: ' .$v[1]. '
';
* echo 'Descrição: ' .$v[2]. '
';
* echo '
';
* }
* } else {
* echo 'Não foram encontrados registros em sua pesquisa.';
* }
*
* @param string $qry
* @return array
*/
public function Seleciona($qry)
{
//como extendemos a classe Conexao, então podemos utilizar
//os metodos herdados pela mesma (não vou entrar em detalhes sobre visibilidade)
//conecta no banco de dados
$con = Conexao::Conecta();
//executa a query
$exec = mysql_query($qry) or die('Erro ao executar a query: ' .mysql_error());
//faço um loop nos resultados e vou armazendo em nossa variável $content
//que é responsável por nos retornar os dados da consulta
while($row = mysql_fetch_array($exec)) {
$this->content[] = $row;
}
//retorno os dados
return $this->content;
}
/**
* Método responsável executar um INSERT no banco
*
* Utilização:
*
* $sql = "INSERT INTO tabela(campo1) VALUES ('algo1')";
* $i = new ManipulaSql();
* $i->Insere($sql);
* if(!empty($i->content))
* {
* echo 'O registro ' .$i->content. ' foi adicionado a base de dados.';
* } else {
* echo 'Nenhum registro foi adicionado.';
* }
*
* @param string $qry
* @return int
*/
public function Insere($qry)
{
//conecta no banco de dados
$con = Conexao::Conecta();
//executa a query
$exec = mysql_query($qry) or die('Erro ao executar a query: ' .mysql_error());
//reonsável por armazenar o ID gerado
//em nossa variável de retorno $this->content
$this->content = mysql_insert_id();
//retorna o id do cadastro
return $this->content;
}
/**
* Método responsável executar um UPDATE no banco
*
* Utilização:
*
* $sql = "UPDATE tabela SET campo1='algo1' WHERE campo='algo'";
* $a = new ManipulaSql();
* $a->Atualiza($sql);
* if(!empty($a->content))
* {
* echo 'Foi(ram) atualizado(s) ' .$a->content. ' registro(s)';
* } else {
* echo 'Nenhum registro foi atualizado.';
* }
*
* @param string $qry
* @return int
*/
public function Atualiza($qry)
{
//conecta no banco de dados
$con = Conexao::Conecta();
//executa a query
$exec = mysql_query($qry) or die('Erro ao executar a query: ' .mysql_error());
//reonsável por armazenar o número de linhas alteradas
//em nossa variável de retorno $this->content
$this->content = mysql_affected_rows();
//retorna o id do cadastro
return $this->content;
}
/**
* Método responsável executar um DELETE no banco
*
* Utilização:
*
* $sql = "DELETE FROM nome_tabela WHERE campo='algo'";
* $r = new ManipulaSql();
* $r->Remove($sql);
* if(!empty($r->content))
* {
* echo 'Foi(ram) removido(s) ' .$r->content. ' registro(s).';
* } else {
* echo 'Nenhum registro foi removido.';
* }
*
* @param string $qry
* @return int
*/
public function Remove($qry)
{
//conecta no banco de dados
$con = Conexao::Conecta();
//executa a query
$exec = mysql_query($qry) or die('Erro ao executar a query: ' .mysql_error());
//reonsável por armazenar o número de linhas alteradas
//em nossa variável de retorno $this->content
$this->content = mysql_affected_rows();
//retorna o id do cadastro
return $this->content;
}
}
?>
E por fim vamos mostrar como utilizar apesar que já coloquei como utilizar na propria classe, mas vou mostrar de qualquer forma para ficar bem claro!
index.php
<?php
//Primeiramente eu incluo as nossas duas classes
require_once('conexao.class.php');
require_once('manipulasql.class.php');
#Fazendo um select
//Monto minha query de consulta
$sql = "SELECT Codigo, Nome, Descricao FROM produtos";
//Instancio a classe de manipulação
$s = new ManipulaSql();
//executo o método reponsável por selecionar os dados passando como parametro
//a nossa query
$s->Seleciona($sql);
//nosso método retorna o objeto content que contém os dados da consulta
//então vamos verificar se nossa consulta retornou alguma informação
if(!empty($s->content))
{
//caso sim, então vamos listar estes dados encontrados
foreach ($s->content as $v)
{
//se você está se perguntando o que são este 0,1,2 é simples, observe nossa
//query: SELECT Codigo, Nome, Descricao FROM produtos, olhou viu alguma
//relação com o 0,1 e 2? Pois bem, este índices da array, nos retornam
//exatamente na ordem que especificamos na query, como as array se iniciam
//do 0(zero), logo $v[0] é o Codigo, e assim por diante. Moleza?
echo 'Código: ' .$v[0]. '
';
echo 'Nome: ' .$v[1]. '
';
echo 'Descrição: ' .$v[2]. '
';
echo '
';
}
//Caso a nossa consulta não tenha retornado nenhum resultado, então exibe o erro
} else {
echo 'Não foram encontrados registros em sua pesquisa.';
}
#fazendo um insert
//Monto minha query de inserir
$sql = "INSERT INTO tabela(campo1) VALUES ('algo1')";
//Instancio a classe de manipulação
$i = new ManipulaSql();
//executo o método reponsável por inserir os dados passando como parametro
//a nossa query de inserir
$i->Insere($sql);
//nosso método retorna o objeto content que contém informações sobre a ação efetuada
//no caso o INSERT
//então vamos verificar se nossa consulta retornou alguma informação
if(!empty($i->content))
{
echo 'O registro ' .$i->content. ' foi adicionado a base de dados.';
//Caso a nosso insert não tenha sido efetuado, então exibe o erro
} else {
echo 'Nenhum registro foi adicionado.';
}
#fazendo um update
//Monto minha query de Atualizar
$sql = "UPDATE tabela SET Campo='Algo' WHERE Campo='algumacosa'";
//Instancio a classe de manipulação
$a = new ManipulaSql();
//executo o método reponsável por atualizar os dados passando como parametro
//a nossa query de update
$a->Atualiza($sql);
//nosso método retorna o objeto content que contém informações sobre a
//ação efetuada no caso o UPDATE
//então vamos verificar se nosso update retornou alguma informação
if(!empty($a->content))
{
echo 'Foi(ram) atualizado(s) ' .$a->content. ' registro(s)';
//Caso a nosso UPDATE não tenha sido efetuado, então exibe o erro
} else {
echo 'Nenhum registro foi atualizado.';
}
#fazendo um delete
//Monto minha query de Remover
$sql = "DELETE FROM nome_tabela WHERE campo='algo'";
//Instancio a classe de manipulação
$r = new ManipulaSql();
//executo o método reponsável por atualizar os dados passando como parametro
//a nossa query de DELETE
$r->Remove($sql);
//nosso método retorna o objeto content que contém informações sobre a
//ação efetuada no caso o DELETE
//então vamos verificar se nosso delete retornou alguma informação
if(!empty($r->content))
{
echo 'Foi(ram) removido(s) ' .$r->content. ' registro(s).';
//Caso a nosso DELETE não tenha sido efetuado, então exibe o erro
} else {
echo 'Nenhum registro foi removido.';
}
?>
//Primeiramente eu incluo as nossas duas classes
require_once('conexao.class.php');
require_once('manipulasql.class.php');
#Fazendo um select
//Monto minha query de consulta
$sql = "SELECT Codigo, Nome, Descricao FROM produtos";
//Instancio a classe de manipulação
$s = new ManipulaSql();
//executo o método reponsável por selecionar os dados passando como parametro
//a nossa query
$s->Seleciona($sql);
//nosso método retorna o objeto content que contém os dados da consulta
//então vamos verificar se nossa consulta retornou alguma informação
if(!empty($s->content))
{
//caso sim, então vamos listar estes dados encontrados
foreach ($s->content as $v)
{
//se você está se perguntando o que são este 0,1,2 é simples, observe nossa
//query: SELECT Codigo, Nome, Descricao FROM produtos, olhou viu alguma
//relação com o 0,1 e 2? Pois bem, este índices da array, nos retornam
//exatamente na ordem que especificamos na query, como as array se iniciam
//do 0(zero), logo $v[0] é o Codigo, e assim por diante. Moleza?
echo 'Código: ' .$v[0]. '
';
echo 'Nome: ' .$v[1]. '
';
echo 'Descrição: ' .$v[2]. '
';
echo '
';
}
//Caso a nossa consulta não tenha retornado nenhum resultado, então exibe o erro
} else {
echo 'Não foram encontrados registros em sua pesquisa.';
}
#fazendo um insert
//Monto minha query de inserir
$sql = "INSERT INTO tabela(campo1) VALUES ('algo1')";
//Instancio a classe de manipulação
$i = new ManipulaSql();
//executo o método reponsável por inserir os dados passando como parametro
//a nossa query de inserir
$i->Insere($sql);
//nosso método retorna o objeto content que contém informações sobre a ação efetuada
//no caso o INSERT
//então vamos verificar se nossa consulta retornou alguma informação
if(!empty($i->content))
{
echo 'O registro ' .$i->content. ' foi adicionado a base de dados.';
//Caso a nosso insert não tenha sido efetuado, então exibe o erro
} else {
echo 'Nenhum registro foi adicionado.';
}
#fazendo um update
//Monto minha query de Atualizar
$sql = "UPDATE tabela SET Campo='Algo' WHERE Campo='algumacosa'";
//Instancio a classe de manipulação
$a = new ManipulaSql();
//executo o método reponsável por atualizar os dados passando como parametro
//a nossa query de update
$a->Atualiza($sql);
//nosso método retorna o objeto content que contém informações sobre a
//ação efetuada no caso o UPDATE
//então vamos verificar se nosso update retornou alguma informação
if(!empty($a->content))
{
echo 'Foi(ram) atualizado(s) ' .$a->content. ' registro(s)';
//Caso a nosso UPDATE não tenha sido efetuado, então exibe o erro
} else {
echo 'Nenhum registro foi atualizado.';
}
#fazendo um delete
//Monto minha query de Remover
$sql = "DELETE FROM nome_tabela WHERE campo='algo'";
//Instancio a classe de manipulação
$r = new ManipulaSql();
//executo o método reponsável por atualizar os dados passando como parametro
//a nossa query de DELETE
$r->Remove($sql);
//nosso método retorna o objeto content que contém informações sobre a
//ação efetuada no caso o DELETE
//então vamos verificar se nosso delete retornou alguma informação
if(!empty($r->content))
{
echo 'Foi(ram) removido(s) ' .$r->content. ' registro(s).';
//Caso a nosso DELETE não tenha sido efetuado, então exibe o erro
} else {
echo 'Nenhum registro foi removido.';
}
?>
É difícil encontrar tutoriais em português nesse nível, então vou aproveitar pra parabenizar e incentivar que continue postando!
Quanto ao tutorial...
Acho que o tutorial cumpriu bem a missão de mostrar como criar uma simples classe e facilitar a vida na interação com o banco de dados.
De cara eu só faria uma mudança simples, baseado em uma das principais ideias de OOP, que é evitar duplicação de código (DRY). Repare como os métodos 'remove', 'atualiza', 'insere', e 'seleciona' sempre executam o mesmo código 'mysql_query(...) or die(...)', se num futuro próximo você quiser lançar exceções ao invés de usar a função 'die' por exemplo, logo de cara teria que mudar o código em 4 locais diferentes. Pra corrigir isso eu ciraria um método protegido (talvez público) somente pra executar essa parte do código, assim ficaria muito mais simples pra editar depois.
Outras mudanças que eu faria seria mudar de 'conexao::conecta()' pra 'parent::conecta()' e tornaria a classe 'conecta' abstrata, mas isso foge um pouco do escopo desse tutorial.
Abraços
Olá City, primeiramente gostaria de parabenizar a você pelo comentário produtivo, por ter pegado a idéia que não é criar algo que vá salvar o mundo mas sim ir pegando a lógica da coisa e claro ter dado dicas para quem estiver estudando aproveitar e ir aprimorando e cada vez mais ir pegando o jeito.
Bem espero que todos que tiverem sugestões legais irem mandando assim todos poderão compartilhar e aprender cada dia mais assim nós construiremos um Blog bacana, pois como sabem não sou mestre programador, sou apenas um cara que curte programar e trabalho com isso e aprendi alguma coisa perguntando muitoooo hehehe
Abraços até o próximo post quem sabe eu pego as dicas e implemento na classe e vamos criando um sisteminha baseado no que aprendemos.
É meio chato pedir, mas estou começando a estudar informática agora, e quero apresentar uma surpresa para o professor por isso não busquei ele, mas tem um código que o endereço é dado lá e tem o segmento que é por:
/RDP/RDP_ mais uma data.html
Não consigo entender como é o formato desta data, será que pode me ajudar?
O Código a seguir:
-----------------------------
function selecionaData(dia,mes,ano){
varDia = String('00' + dia)
varDia = varDia.substring(varDia.length -2,varDia.length)
varMes = String('00' + mes)
varMes = varMes.substring(varMes.length -2, varMes.length)
varAno = String(ano)
varAno = varAno.substring(varAno.length -2, varAno.length)
//alert('Dia = ' + varDia + ' mes = ' + varMes + ' ano = ' + varAno)
location.href = 'RDP/RDP_' + varDia + varMes + varAno + '.html'
-------------------------------
Desculpe atrapalhar, e não posso pagar por isso, o máximo divulgar em orkut e twitter e para pessoas em geral.
Abraço e obrigado desde já.
vinymoras@gmail.com - para contato
lembrando que nosso blog é focado para o PHP não para o JS, mas de qualquer forma
vou tentar esclarecer a dúvida dentro do meu conhecimento.
Sua dúvida é referente ao entendimento do script
Se for é só analisar
function selecionaData(dia,mes,ano)
ou seja uma função que recebe 3 parametros dia mes e ano, provavelmente no formato
13,11,2010
ai blz..
primeiro ele atribui o valor a variável varDia sendo ele do tipo string '00' + dia ou seja
logo varDia terá o valor 0013
Logo depois ele utiliza a função substring(x,y)
x = número de caracteres que serão exibidos
y = sera iniciado a partir do próximo caracter estipulado no X até o limite de Y
e o .length pega o tamanho da string
lembrando que ele converteu para String porque o .lenght só funciona com string.
Então imagine
varDia.substring(varDia.length -2,varDia.length)
//visualizando ficaria assim
substring(4 - 2, 4)
//fazendo os calculos
substring(2, 4)
//retorno final baseado na variavel varDia
substring(2,4)
//então exibe 2 caracteres até o limite de 4 caracateres
//sendo que vai começar a partir do segundo logo fica 13
e assim se repete pelas outras variáveis
por fim tem
location.href = 'RDP/RDP_' + varDia + varMes + varAno + '.html'
que na verdade ele monta o nome do arquivo, que visualizando fica
'RDP/RDP_131110.html'
e o location.href tem a função de redicionarar para está página
Espero que dê para entender, acho que minha didática para JS não é muito boa
HAUAEHueHueHUEA fuiz
E para falar a verdade nem sei se falei bobagem aehueahuea mas é por ai!