Portal PHP https://www.portalphp.org Só mais um site WordPress Thu, 25 Aug 2011 04:04:11 +0000 en hourly 1 Nomes e Convenções https://www.portalphp.org/artigos/nomes-e-convencoes https://www.portalphp.org/artigos/nomes-e-convencoes#comments Thu, 25 Aug 2011 04:04:11 +0000 Tiago Temporim https://www.portalphp.org/?p=302 Nesse artigo vamos falar um pouco sobre os nomes e convenções utilizados pelo CakePHP para as tabelas, controllers e models.

O CakePHP utiliza uma convenção simples para identificar tabelas, relacionamento de tabelas, arquivos, controles e modelos. As convenções são responsáveis pelo padrão utilizado na nomenclatura de classes, arquivos e estrutura do CakePHP. Vamos a explicação.

Arquivos e classes

De uma forma geral, no cake sempre que nos referimos a um arquivo utilizamos o underline para separar as palavaras, enquanto nos nomes das classes utilizamos o padrão CamelCase. Ex:

Controller -> PessoasController – pessoas_controller.php

Component -> MinhaMaoElement – minha_mao.php

Model -> PessoaFisica – pessoa_fisica.php

Behavior -> PessoaComportadaBehavior – pessoa_comportada.php

View -> SimplesPessoaView – simples_pessoa.php

Helper -> MyBigHelper – my_big.php

Cada classe terá uma pasta especifica para ficar.

Tabelas e models

No CakePHP os modelos são nomeados sempre no singular e CamelCase, como por exemplo, Pessoa, PessoaGrande e PessoaRealmenteGrande.

No caso das tabelas elas são sempre nomeadas no plural e tem as palavras separadas por underline, por exemplo: pessoas, pessoas_grandes e pessoas_realmente_grandes.

No caso das colunas se houver mais de uma palavra elas devem ser separadas por underline, por exemplo primeiro_nome.

Para tabelas relacionadas as foreign keys são nomeadas no singular e tem a adição de _id no final de seu nome, ex.: categoria_id.

Se sua tabela tiver uma relação de muitos para muitos, a terceira tabela que será criada deverá ser feita com os nomes das 2 tabelas relacionadas em ordem alfabética, categorias_posts.

Quando nós dermos inicio ao projeto, falarei sobre relacionamento de tabelas de uma forma mais aprofundada.

Controllers

Os controles deverão ser no plural, CamelCase e ter a palavra Controller somada ao nome, por exemplo PessoasController, PessoasGrandesController e PessoasRealmenteGrandesController.

Views

As views tem o mesmo nome dos métodos dos controllers.

Vamos a um exemplo rápido de como ficaria uma classe Pessoa.

Tabela -> pessoas

Model -> Pessoa

Controller -> PessoasController

View -> /app/views/pessoas/index.ctp

Bom galera esse pode ter ficado um pouco confuso, mas garanto que no decorrer dos posts ficará mais claro.

Queria a opinião de vocês para essa sequência de posts. O que acham melhor, vídeo ou texto?

Deixem a opinião nos comentários, obrigado e até a próxima.

]]>
https://www.portalphp.org/artigos/nomes-e-convencoes/feed 0
Entendendo MVC https://www.portalphp.org/artigos/entendendo-mvc https://www.portalphp.org/artigos/entendendo-mvc#comments Mon, 15 Aug 2011 16:56:34 +0000 Tiago Temporim https://www.portalphp.org/?p=293 Dando continuidade aos posts do cakephp, nesse artigo vou explicar como funciona o padrão de projeto MVC, que é o padrão utilizado pelo cake. Para que esse artigo não fique muito extenso, explicarei no próximo artigo como o MVC é utilizado no cake.

Dando inicio ao artigo, MVC que é a abreviação de Model – View – Controller, é um padrão de projeto muito utilizado nos dias de hoje que visa separa a parte lógica do sistema da parte de apresentação, o que facilita não só o desenvolvimento da lógica mas também da visão e o teste da aplicação.

Model

O modelo é básicamente encarregado de armazenar e recuperar as informações. É no modelo onde trabalharemos as regras de negócio de nossa aplicação.

View

A view é responsável por exibir as informações para o usuário, ela é a “cara” da nossa aplicação.

Controller

O controle é encarregado pela entrada e saida de dados. É no controle também que é feito uma filtragem nos dados que serão retornados a view ou que serão enviados ao modelo.

Uma aplicação que trabalha com MVC funciona da seguinte forma:

Quando o usuário executar uma ação na view, esta será enviada ao controller que filtrará a informação e enviará ao modelo encarregado. O modelo por sua vez tratará as informações recebidas e retornará ao controller, que retornará a view onde nosso usuário receberá a resposta de acordo com sua requisição.

Por exemplo:

O usuário clica em um produto esperando receber mais informações sobre o mesmo. A view dispara um pedido ao controller que por sua vez requisita ao model as informações sobre o produto. O model recupera as informações armazenadas (não importa onde) e entrega ao controller, que entrega a view.

Esse conceito de MVC vale não só para o CakePHP ou PHP, mas sim para qualquer linguagem ou projeto que resolvam utilizar esse padrão de projeto.

Nos próximos posts acredito que ficará mais claro o funcionamento, mas qualquer coisa podem deixar as perguntas ai nos comentários ou abrir um tópico no fórum.

Espero que tenha ficado bem explicado, no próximo post vamos dar inicio a utilização do cake.

Obrigado, e até a próxima.

]]>
https://www.portalphp.org/artigos/entendendo-mvc/feed 10
Instalando CakePHP https://www.portalphp.org/php/instalando-cakephp https://www.portalphp.org/php/instalando-cakephp#comments Thu, 11 Aug 2011 16:26:16 +0000 Tiago Temporim https://www.portalphp.org/?p=278 Hoje começa a série de tutoriais sobre o cakephp, e nesse primeiro post nada mais sensato do que começar com a instalação desse framework.

Nos tutoriais vamos utilizar a versão 1.3 do cakephp, que é atualmente a versão mais estável. Sem mais delongas vamos ao que interessa.

Primeiro temos que baixar o framework. Para isso clique aqui.

Depois de feito o download, vamos criar uma pasta em nosso diretório onde o server posso enchergar o cake. Vamos nomear a pasta de tutorial-cakephp.

Criada a pasta, vamos descompactar o arquivo que baixamos e colocar os arquivos nesse diretório.

Vá até o seu navegador e acesse a pasta, deverá aparecer o seguinte:

Estamos quase lá, agora temos que fazer algumas configurações para que possamos começar a utilizar o framework. Vamos começar pelo acesso ao banco de dados.

Dentro de onde colocamos os arquivos do nosso framework, vá até a pasta /app/config/. Renomeie o arquivo database.php.default para database.php e em seguida abra ele. É nesse arquivo onde teremos os dados de conexão com nossa base de dados. No final do arquivo temos dois arrays (default e test). Para estabelecer a conexão com o banco vamos configurar os dados dentro do array default. Abaixo explico qual a função de cada item desse array.

drive => Drive de conexão (no nosso caso mysql).

persistent => Indica se sua conexão com o banco será persistente ou não.

host => Endereço de onde está localizado nossa base de dados.

login => Login de conexão com o banco.

password => Senha para conexão com o banco.

database => Nome de nossa base de dados.

prefix => Usado cada seja utilizado prefixo nas tabelas.

Para configurar vamos criar uma base de dados e chama-lá de cakephp. Não vamos utilizar prefixo, nem persistencia. Nossa conexão ficará parecida com isso:

Lembrando sempre que login e senha devem ser seu usuário e senha do seu banco de dados.

Vamos voltar ao nosso navegador e dar um refresh na página.

Podemos notar agora que já estamos conectados ao banco de dados, como mostra a imagem acima.

Agora vamos mudar a Security.salt e Security.cipherSeed que são as chaves utilizadas pelo cakephp para gerar criptografia (maiores detalhes no tutorial sobre autenticação).

Para modificar essas chaves vamos abrir o arquivo core.php que fica dentro de /app/config/. Busque pela linha:

1
2
3
<?php
Configure::write('Security.salt', 'DYhG93b0qyJfIxfs2guVoUubWwvniR2G0FgaC9mi');
?>

Essa linha pode contar caractéres alphanumericos. Altere o DYhG93b0qyJfIxfs2guVoUubWwvniR2G0FgaC9mi para qualquer outra sequencia de letras e números que você deseja (não precisa ter a mesma quantidade de caractér).

Um pouco para baixo podemos notar a linha:

1
2
3
<?php
Configure::write('Security.cipherSeed', '76859309657453542496749683645');
?>

Essa linha só pode conter números. É só fazer o mesmo processo que na outra chave, só que dessa vez a troca deverá ser feita somente por números.

Volte agora ao navegador e de um refresh na página.

Caso você esteja utilizando linux, é possível que você tenha que setar permissão 775 (caso não funcione dê 777) na pasta tmp localizada em /app/.

Pronto, já podemos começar a utilizar cakephp para desenvolver nossas aplicações.

No próximo tutorial irei explicar a estrutura de pasta utilizada pelo cake e falar um pouco sobre MVC, que é o padrão de projeto utilizado por esse framework.

Dúvidas sobre o tutorial podem ser deixadas nos comentários, outas duvídas sobre cakephp ou php utilizem nosso fórum.

Espero ter ajudado, até a próxima!

]]>
https://www.portalphp.org/php/instalando-cakephp/feed 15
Série com framework https://www.portalphp.org/noticias/serie-com-framework https://www.portalphp.org/noticias/serie-com-framework#comments Tue, 09 Aug 2011 23:37:55 +0000 Tiago Temporim https://www.portalphp.org/?p=275 Bom galera depois de algum tempo sem postar resolvi voltar os posts com uma série de posts tutoriais para quem quer aprender a trabalhar com o cakephp e mysql.

Os posts seguirão uma certa sequência lógica que vai desde a instalação e configuração do framework até o desenvolvimento de um layout próprio, utiliando plugins em jquery.

Gostaria de saber se há um interesse de aprendizagem da utilização do cakephp com um banco de dados nosql (mongodb). Se houver interesse, deixem nos cometários e assinem o newsletter para receber com o aviso de quando os posts sairem.

Pretendo fazer uma versão dos tutoriais em vídeo aula para quem não gosta de ler, porém não tenho data ainda para dar inicio, TCC está matando.

Sem falta ainda hoje sai o inicio dessa série de tutoriais, aguardem..

Até a próxima.

]]>
https://www.portalphp.org/noticias/serie-com-framework/feed 1
Copiando imagens com CURL https://www.portalphp.org/tutoriais/copiando-imagens-com-curl https://www.portalphp.org/tutoriais/copiando-imagens-com-curl#comments Wed, 22 Jun 2011 21:17:46 +0000 Tiago Temporim https://www.portalphp.org/?p=243 Fala pessoal tudo certo?

Hoje vamos a um tutorial bem rapidinho sobre como copiar imagens usando CURL.

Primeiro passo vamos iniciar o CURL com a url da imagem que queremos baixar.

1
    $ch = curl_init('http://www.seusiteaqui.com.br/sua_imagem.jpg');

Agora vamos setar algumas opções para fazer o download da imagem e converter ela para binario.

1
2
3
    curl_setopt($ch, CURLOPT_HEADER, false);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_BINARYTRANSFER, true);

Executamos pegando o retorno do CURL e depois fechamos a conexão com o outro site.

1
2
    $bImg = curl_exec($ch);
    curl_close($ch);

Para gravar em disco vamos usar as funções de arquivo normal, fopen, fwrite e fclose.

1
2
3
    $fp = fopen('nome_arquivo.jpg', 'w'); //cria o arquivo
    fwrite($fp, $bImg); //grava o binario da imagem
    fclose($fp); //fecha o arquivo

Bom galera, essa foi rapidinha mais espero que ajude vocês quando precisarem.
Abraço até a próxima.

]]>
https://www.portalphp.org/tutoriais/copiando-imagens-com-curl/feed 0
Segurança em sites https://www.portalphp.org/artigos/seguranca-em-sites https://www.portalphp.org/artigos/seguranca-em-sites#comments Mon, 06 Jun 2011 16:11:31 +0000 Tiago Temporim https://www.portalphp.org/?p=226 Nesse artigo vou falar um pouco sobre segurança em sites php. Não vou entrar em muitos detalhes de como se proteger, caso queiram posso fazer um outro post depois.

Ultimamente tenho visto muitos sites vulneráveis na internet, principalmente sites feitos com PHP o que faz com que algumas pessoas pensem ser falha da linguagem e não dos desenvolvedores. Por isso peço a atenção de todos a esse detalhes quando forem desenvolver um site ou aplicação web.

O PHP não é uma linguagem tão vulneravel quanto as pessoas dizem, ela só tem mais sobrinhos que o normal. Fico P da vida quando encontro sites com falhas bestas que poderiam ser corrigidos com um simples is_numeric.

Para tentar minimizar isso, vou abrir uma área no fórum para que quando alguém desenvolver um site ou sistema web e queria que seja testado a parte de segurança, poste o link para que nós do Portal PHP façamos os devidos testes e ajudemos a corrigir os problemas encontrados.

Essa lista só poderá ser vista por usuários cadastros do fórum, para que não vire uma lista publica de sites com possíveis vulnerabilidades.

Verificar segurança: Ajuda com segurança

Esse post tem como intuito chamar a atenção para questão segurança, aqui no portal temos um post sobre sql injection, quem estiver interessado segue o link:

Segurança no PHP – SQL Injection

]]>
https://www.portalphp.org/artigos/seguranca-em-sites/feed 1
Importar lista de contatos com OpenInviter https://www.portalphp.org/php/importar-lista-de-contatos-com-openinviter https://www.portalphp.org/php/importar-lista-de-contatos-com-openinviter#comments Fri, 27 May 2011 03:33:54 +0000 Rafael Wendel Pinheiro https://www.portalphp.org/?p=222 Boa tarde pessoal.

No post de hoje vou colocar um tutorial ensinando a como trabalhar com o OpenInviter. O OpenInviter é um pacote de scripts que nos permite e auxilia a importar uma lista de contatos de maneira relativamente fácil e rápida.

Já pensou disponibilizar para o usuário do seu site/sistema um mecanismo onde ele importa todos os contatos do twitter, orkut, hotmail, gmail, aol, etc. ? Legal né. É isso que veremos a seguir.

Para começarmos a trabalhar com o OpenInviter temos que ir até o site www.openinviter.com/download.php e fazer o download do pacote de scripts. Você perceberá que na página existem pacotes direcionados ao WordPress, Joomla, Drupal, etc. No nosso caso baixaremos o pacote general (o primeiro da lista).

Feito o download, descompacte os arquivos e envie ao servidor.

Antes de testarmos uma importação, vamos ver se nosso servidor está configurado corretamente e apto à executar os scripts com segurança e eficácia. Para isso execute o arquivo postinstall.php (ex: www.seudominio.com/openinviter_dir/postinstall.php).

Esse processo pode demorar alguns minutos mas é importante pois ele fará testes com todos os plugins. (OBS: Pode ser que alguns serviços pouco conhecidos como HushMail, Motortoipa, etc. sejam apontados como NOT OK!, mas os principais como Hotmail, Gmail, Yahoo estarão com o *OK* assinalado).

Ao final da execução será solicitado a exclusão do arquivo postinstall.php. Faça isso!=)

Bom, agora vamos ao que realmente interessa. Vamos importar uma lista de contatos. Para isso, vamos criar um arquivo chamado importar.php na raiz do diretório do OpenInviter.

No meu exemplo, vou utilizar o serviço GMAIL do Google. Fique a vontade para escolher outro se desejar.

Veja:

1
2
3
4
5
6
7
8
9
10
11
12
13
startPlugin('gmail'); //informa o serviço a qual irá se conectar
$inviter-&gt;login('[email protected]', 'sua_senha'); //Informa usuario e senha
 
$contatos = $inviter-&gt;getMyContacts(); //importa os contatos
$contatos = array_keys($contatos); //pega as chaves do array
sort($contatos); //ordena o array alfabeticamente
 
foreach ($contatos as $contato){
    echo $contato . '<br>'; //imprime
}
 
$inviter-&gt;logout(); // efetua logoff
?&gt;

O processo é bem simples. Basta importar a classe do OpenInviter, criar uma instância e startar o plugin desejado(no meu caso o GMAIL). Depois efetuo login no serviço com usuário/senha e executo a função getMyContacts() para importar os contatos. Essa função retorna um array com todos os contatos onde a chave de cada registro é o endereço de email e o valor é a descrição do contato(geralmente o nome).

Como eu quero os endereços de email, eu usei a função array_keys para receber um novo array com os valores sendo as chaves do antigo array. Depois eu uso o sort para ordenar os registros alfabeticamente. Por fim percorro todos os valores e os imprimo na tela. Por questões de segurança é bom efetuar logoff do serviço depois que terminar a importação.

Execute o arquivo e veja toda sua lista de contatos.

Espero ter ajudado.

Abs.

]]>
https://www.portalphp.org/php/importar-lista-de-contatos-com-openinviter/feed 2
Obtendo título e descrição de vídeos do youtube https://www.portalphp.org/tutoriais/obtendo-titulo-e-descricao-de-videos-do-youtube https://www.portalphp.org/tutoriais/obtendo-titulo-e-descricao-de-videos-do-youtube#comments Mon, 09 May 2011 16:42:43 +0000 Tiago Temporim https://www.portalphp.org/?p=217 Eai galera tudo certo?

Nesse tutorial vou ensinar como fazer para pegar o título e descrição de um vídeo no youtube.

Para fazer isso nós vamos utilizar uma função nativa do PHP, a get_meta_tags(). Essa função faz uma ‘captura’ de todas as meta tags de um site, sendo assim esse tutorial pode ser usado não só para obter descrição e titulo de um vídeo do youtube, mais para capturar qualquer meta tag de qualquer site.

Vamos ao exemplo:

1
2
3
<?php
    $tags = get_meta_tags('http://www.youtube.com/watch?v=xZubjXW6wHw&NR=1');
?>

A função get_meta_tags() retorna um array com todas as meta tags do site em que mandamos ela vasculhar.
Em uma meta tag é colocado um valor para name e outro para content. Os valores dentro de name serão as chaves de nosso array e os content serão os dados a serem exibidos.
Assim para imprimir o titulo e a descrição do vídeo basta recuperar os dados pelas keys ‘title’ e ‘description’. Exemplo:

1
2
echo $tags['title'].'<br />';
echo $tags['description'];

Fácil né?
Espero que tenha ajudado, qualquer duvida é só deixar ai nos comentários.
Até a próxima!

]]>
https://www.portalphp.org/tutoriais/obtendo-titulo-e-descricao-de-videos-do-youtube/feed 0
Criando função permalink para títulos igual wordpress com regex https://www.portalphp.org/php/criando-funcao-permalink-para-titulos-igual-wordpress-com-regex https://www.portalphp.org/php/criando-funcao-permalink-para-titulos-igual-wordpress-com-regex#comments Thu, 28 Apr 2011 05:08:30 +0000 Tiago Temporim https://www.portalphp.org/?p=212 Esses dias eu estava procurando alguma função em regex que me ajudasse a criar links amigáveis a partir do nome de empresas e acabei vendo uma função (infelizmente não lembro o site) que retirava os acentos de uma forma bem didática, acabei ajeitando ela e reutilizando.

Então vamos ao que interessa:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
<?php
$troca = array(
        'A' => '/&Agrave;|&Aacute;|&Acirc;|&Atilde;|&Auml;|&Aring;/',
        'a' => '/&agrave;|&aacute;|&acirc;|&atilde;|&auml;|&aring;/',
        'C' => '/&Ccedil;/',
        'c' => '/&ccedil;/',
        'E' => '/&Egrave;|&Eacute;|&Ecirc;|&Euml;/',
        'e' => '/&egrave;|&eacute;|&ecirc;|&euml;/',
        'I' => '/&Igrave;|&Iacute;|&Icirc;|&Iuml;/',
        'i' => '/&igrave;|&iacute;|&icirc;|&iuml;/',
        'N' => '/&Ntilde;/',
        'n' => '/&ntilde;/',
        'O' => '/&Ograve;|&Oacute;|&Ocirc;|&Otilde;|&Ouml;/',
        'o' => '/&ograve;|&oacute;|&ocirc;|&otilde;|&ouml;/',
        'U' => '/&Ugrave;|&Uacute;|&Ucirc;|&Uuml;/',
        'u' => '/&ugrave;|&uacute;|&ucirc;|&uuml;/',
        'Y' => '/&Yacute;/',
        'y' => '/&yacute;|&yuml;/',
        'a.' => '/&ordf;/',
        'o.' => '/&ordm;/',
    '-' =>   '/[\,\.\!\? ]/'
);
$enc = 'UTF-8';
 
$titulo_post = 'Eu vi, eu vi um avião e nele estava escrito _MEUTIME_ é campeão!';
$permalink = preg_replace($troca, array_keys($troca), htmlentities($titulo_post,ENT_NOQUOTES, $enc));
 
echo 'Permalink: '.$permalink;
?>

A função preg_replace vai pegar no primeiro parâmetro os valores da nossa matriz como um pattern para a busca. No segundo parâmetro pega as chaves da matriz para fazer a troca. E no terceiro é onde passamos a string a ser trocada.

Como podemos ver, antes de aplicar nossas expressões regulares, a função converte nossa string para htmlentities, ou seja, para entidades html. Explicando ela mais detalhadamente vemos que passamos no segundo parâmetro, que é opcional, o ENT_NOQUOTES, que significa não converter as aspas. E no terceiro parâmetro, que também é opcional, passamos o charset da conversão; passei como UTF-8 pois o padão é ISO-8859-1 e também porque não teremos acentos.

Após esta conversão para a normalização dos dados é que aplicamos a regex na string, trocando as letras com acentos para as sem acentos e tirando as pontuações também como na última linha do array: , . ! ? e espaço. Por isso está entre colchetes.

Créditos ao nosso amigo Suissa!
Post original -> LINK

]]>
https://www.portalphp.org/php/criando-funcao-permalink-para-titulos-igual-wordpress-com-regex/feed 0
Persistência de dados e conceitos de mapeamento objeto-banco relacional https://www.portalphp.org/artigos/persistencia-de-dados-e-conceitos-de-mapeamento-objeto-banco-relacional https://www.portalphp.org/artigos/persistencia-de-dados-e-conceitos-de-mapeamento-objeto-banco-relacional#comments Fri, 15 Apr 2011 04:49:52 +0000 Tiago Temporim https://www.portalphp.org/?p=208 Nos últimos anos as linguagens de programação de um modo geral tem evoluído para atender as novas necessidades como por exemplo internet, celular e etc, assim como outras que surgem quase todos os dias. Apesar de toda essa evolução das linguagens, os bancos de dados não tem evoluído da mesma forma.  Principalmente para suprir a necessidade de uma característica comum a maioria das linguagens de hoje em dia, a orientação a objetos. O modelo utilizado pelos bancos de dado hoje em dia é o modelo relacional. Este segue os mesmos princípios definidos pelo Dr. E.F. Codd, pesquisador da IBM que definiu 12 regras clássicas do conceito de banco de dados relacionais durante as décadas de 1970 e 80.

Existem vários projetos open source que suportam parte ou inteiramente a orientação a objetos, como o banco PostgreSQL. Entretanto os maiores players da indústria, que também são os principais fornecedores comerciais, não oferecem 100% de compatibilidade com essa característica. As linguagens também não contribuem de uma maneira simples para representação de tabelas relacionais. Nesse sentido, cabe ao desenvolvedor decidir os meios para fazer o mapeamento de uma tabela numa representação de classe/objeto. Para resolver esse dilema, o desenvolvedor pode adotar duas soluções, bibliotecas de terceiros como o conhecido Hibernate para Java e o NHibernate para .Net.

No caso do PHP, existem poucos projetos nessa área; contudo, podemos mencionar um bom projeto brasileiro denominado Lumine que supre parte desta lacuna. O endereço do projeto é http://hufersil.com.br/lumine. Não vou entrar em detalhes de como utilizar essa ferramenta no processo de mapeamento, mas vamos criar uma classe que sirva de base as classes que irão representar as tabelas.

A classe Persistivel é uma classe abstrata que provê um único método que retorna a chave primária de uma tabela, que foi mapeada por uma classe que estender do Persistivel. Não é ideia deste exemplo, fornecer todos os métodos para abranger o conceito de uma ferramenta igual o Hibernate,  contudo essa classe cumprirá o papel de ser a classe base para mapeamento objeto banco relacional.

Vejamos:

1
2
3
4
5
<?php
abstract class Persistivel {
    public abstract function getChavePrimaria();
}
?>

Bom galera por hoje é isso ai.. até a próxima!!!

]]>
https://www.portalphp.org/artigos/persistencia-de-dados-e-conceitos-de-mapeamento-objeto-banco-relacional/feed 0