Interagindo com Banco de Dados Até agora não falamos de banco de dados, pois gostaríamos prime iro de te preparar para o uso do banco de dados dentro do Framework MVC. Mas antes de falarmos do framework e MVC vamos criar um banco de dados chamado News com a tabela noticias e iremos inserir 4 notícias nela. E iremos construir uma estrutura de programação integrada ao banco de dados. Para isso necessitamos que habilite o Mysql no Painel de Controle do Xampp e clique no Admin, como mostra as telas abaixo. 1
Essa é a tela do PHPMyadmin, com ele iremos trabalhar com banco de dados MySql. 7.1- Criando Usuário Primeira ação a ser tomada é criar um usuário que irá fazer conexão com o banco de dados para isso clique em Privilégios na tela acima. Você entrará na tela abaixo e verá que já tem dois usuários criados o root que não tem senha cadastrada e o pma que é de uso interno do PHPMyAdmin. 2
Porém para nossas aplicações vamos criar o nosso usuário. Para isso siga os procedimentos da próxima tela atentamente. O usuário deve ter nome simples sem caractere especial e espaço, o servidor será o Local automaticamente ele preenche com localhost, a senha pode ser de 4 a 12 caracteres, preencha uma senha que memorize. O campo gerar senha, irá gerar uma senha ideal com vários caracteres aceitáveis, aufanuméricos, fica a sua escolha. Em relação a banco de dados por usuários, deixe nenhum que seu usuário funcionará em qualquer aplicação. Permissão de dados, escolha SELECT, INSERT, UPDATE, DELETE e FILE, para que consiga listar registros, inserir, alterar e excluir. As demais permissões não é adequado fazer na aplicação e sim direto no banco de dados, dependendo sempre da regra do negócio. Após isso clique no botão Executar. 7.2 Criando as tabelas e inserts Agora clique em SQL no menu superior do PHPMyAdmin e escreva o seguinte 3
código SQL. CREATE DATABASE news; Em seguida clique em executar. Agora clique na lateral sob o banco de dados news afim de selecioná-lo a receber os seguintes códigos abaixo, caso você não selecionar o banco de dados, ao executar os scripts abaixo ele irá dizer que nenhum banco de dados foi selecionado. Ao selecionar o banco de dados, clique em SQL e digite os códigos abaixo. CREATE TABLE noticias( noticia_id INT(11) NOT NULL AUTO_INCREMENT, noticia_titulo VARCHAR(255) NOT NULL, noticia_seo VARCHAR(255) NOT NULL, noticia_texto TEXT NOT NULL, noticia_fonte VARCHAR(255) NOT NULL, noticia_data DATE NOT NULL, CONSTRAINT PK_not PRIMARY KEY(noticia_id) ); INSERT INTO noticias (noticia_titulo, noticia_seo, noticia_texto, noticia_fonte, noticia_data) VALUES ('Título 1','titulo-1','Lorem Ipsum é simplesmente uma simulação de texto da indústria tipográfica e de impressos, e vem sendo utilizado desde o século XVI, quando um impressor desconhecido pegou uma bandeja de tipos e os embaralhou para fazer um livro de modelos de tipos. Lorem Ipsum sobreviveu não só a cinco séculos, como também ao salto para a editoração eletrônica, permanecendo essencialmente inalterado. Se popularizou na década de 60, quando a Letraset lançou decalques contendo passagens de Lorem Ipsum, e mais recentemente quando passou a ser integrado a softwares de editoração eletrônica como Aldus PageMaker.','fonte 1','2011-11-12'), ('Título 2','titulo-2','Lorem Ipsum é simplesmente uma simulação de texto da indústria tipográfica e de impressos, e vem sendo utilizado desde o século XVI, quando um impressor desconhecido pegou uma bandeja de tipos e os embaralhou para fazer um livro de modelos de tipos. Lorem Ipsum sobreviveu não só a cinco séculos, como também ao salto para a editoração eletrônica, permanecendo essencialmente inalterado. Se popularizou na década de 60, quando a Letraset lançou decalques contendo passagens de Lorem Ipsum, e mais recentemente quando passou a ser integrado a softwares de editoração 4
eletrônica como Aldus PageMaker.','fonte 2','2011-11-12'), ('Título 3','titulo-3','Lorem Ipsum é simplesmente uma simulação de texto da indústria tipográfica e de impressos, e vem sendo utilizado desde o século XVI, quando um impressor desconhecido pegou uma bandeja de tipos e os embaralhou para fazer um livro de modelos de tipos. Lorem Ipsum sobreviveu não só a cinco séculos, como também ao salto para a editoração eletrônica, permanecendo essencialmente inalterado. Se popularizou na década de 60, quando a Letraset lançou decalques contendo passagens de Lorem Ipsum, e mais recentemente quando passou a ser integrado a softwares de editoração eletrônica como Aldus PageMaker.','fonte 3','2011-11-12'), ('Título 4','titulo-4','Lorem Ipsum é simplesmente uma simulação de texto da indústria tipográfica e de impressos, e vem sendo utilizado desde o século XVI, quando um impressor desconhecido pegou uma bandeja de tipos e os embaralhou para fazer um livro de modelos de tipos. Lorem Ipsum sobreviveu não só a cinco séculos, como também ao salto para a editoração eletrônica, permanecendo essencialmente inalterado. Se popularizou na década de 60, quando a Letraset lançou decalques contendo passagens de Lorem Ipsum, e mais recentemente quando passou a ser integrado a softwares de editoração eletrônica como Aldus PageMaker.','fonte 4','2011-11-12'); CREATE TABLE textos( texto_id INT(11) NOT NULL AUTO_INCREMENT, texto_titulo VARCHAR(255) NOT NULL, texto_seo VARCHAR(255) NOT NULL, texto_texto TEXT NOT NULL, CONSTRAINT PK_tex PRIMARY KEY(texto_id) ); INSERT INTO textos (texto_titulo, texto_seo, texto_texto) VALUES ('Quem Somos','quem-somos','Lorem Ipsum é simplesmente uma simulação de texto da indústria tipográfica e de impressos, e vem sendo utilizado desde o século XVI, quando um impressor desconhecido pegou uma bandeja de tipos e os embaralhou para fazer um livro de modelos de tipos. Lorem Ipsum sobreviveu não só a cinco séculos, como também ao salto para a editoração eletrônica, permanecendo essencialmente inalterado. Se popularizou na década de 60, quando a Letraset lançou decalques contendo passagens de Lorem Ipsum, e mais recentemente quando passou a ser integrado a softwares de editoração eletrônica como Aldus PageMaker.'), ('Home','home','Lorem Ipsum é simplesmente uma simulação de texto da 5
indústria tipográfica e de impressos, e vem sendo utilizado desde o século XVI, quando um impressor desconhecido pegou uma bandeja de tipos e os embaralhou para fazer um livro de modelos de tipos.'); 7.3 Criando listar notícias Ao fazer o procedimento acima, você acaba de criar uma tabela no banco de dados e inserir 4 registros na mesma. Agora iremos construir três arquivos. 7.3.1 Arquivo BASICS.PHP O primeiro arquivo será o basics.php que conterá a classe simples do capítulo terá uma relação de classes a serem usadas na minha aplicação, o segundo arquivo será o arquivo news.php que conterá as classes de banco de dados, o terceiro arquivo será o controlador.php que irá criar objetos e instanciar métodos do objeto criado e controlará quais serão os métodos deverão ser acessados. E o terceiro e último arquivo será um HTML que terá a variável PHP sendo exibida apenas. Abra então o seu editor HTML, salve um arquivo em branco chamado news.php e escreva as seguintes instruções. Segue abaixo script de cada arquivo. BASICS.PHP Conterá o código da classe simples com capítulo 6 acrescido das linhas abaixo em negrito. <?php class basics { public $mes; public $data; public $valor; public $semana; public $caracter; public $url; public $string; public $msg; public $nome_banco; public $login; public $senha; 6
public function formata_data_banco($data) { //converte data dd/mm/aaaa para aaaa-mm-dd if ($data == "") return null; $corrige = explode("/", $data); $corrige = $corrige[2]."-".$corrige[1]."-".$corrige[0]; return $corrige; public function formata_data_br($data) { //converte aaaa-mm-dd para dd/mm/aaaa if ($data == "") return ""; $corrige = explode("-",$data); $corrige = $corrige[2]."/".$corrige[1]."/". $corrige[0]; return $corrige; public function formata_dollar($valor) {//converte valor de U$ para R$ $valor = str_replace('.','',$valor); $valor = str_replace(',','.',$valor); if(empty($valor)) return "0.00"; return $valor; public function formata_real($valor) {//converte valor de U$ para R$ $valor = str_replace('.',',',$valor); if(empty($valor)) return "0,00"; return $valor; public function nome_mes($mes) { //converte mês em número para o nome em pt $arr = array('janeiro','fevereiro','março','abril','maio','junho','julho','agosto','setembro','out ubro','novembro','dezembro'); return $arr[$mes]; public function semana($semana) {// converte o dia da semana em num para extenso em pt $arr = array('domingo','segunda-feira','terça-feira','quarta- Feira','Quinta-Feira','Sexta-Feira','Sábado'); return $arr[$semana]; public function caracteres($string,$caracter){ $str = substr($string,0,$caracter)."..."; return $str; public function data_hoje(){ return date("y")."-".date("m")."-".date("d"); public function horario(){ return date("h")."-".date("i")."-".date("s"); public function redireciona($url){?> <script> 7
location.href="<?= $url?>"; </script> <? public function redireciona_msg($url,$msg){?> <script> location.href="<?= $url?>"; alert("<?= $msg?>"); </script> <? public function conn($server,$nome_banco,$login,$senha){ $conn = mysql_connect($server,$login,$senha); mysql_select_db($nome_banco) or die("não conectou!");?> Foi inserido um método no código anterior, o método conn realiza conexão com o banco de dados. 7.3.2 - Arquivo NEWS.PHP <?php 1 include basics.php ; 2 class news extends basics{ 3 public $noticia_id; 4 public function lista_news(){ 5 $sql = mysql_query("select * FROM noticias ORDER BY noticia_data DESC"); 6 if(mysql_num_rows($sql)>0){ 7 $list_news = "<h1>notícias</h1>"; 8 while($array = mysql_fetch_array($sql)){ 9 $list_news.= "<a href=\"controller.php?noticia_id=".$array['noticia_id']."\"><h2>".basic s::formata_data($array['noticia_data'])." - ".$array['noticia_titulo']."</h2> <p>".basics::caracteres($array['noticia_texto'],100)."</p></a><p> </p><hr /><p> </p>"; 10 11 12 return $list_news; 13 14 public function detail_news($noticia_id){ 15 $sql = mysql_query("select * FROM noticias WHERE 8
noticia_id='$noticia_id'"); 16 if(mysql_num_rows($sql)>0){ 17 $array = mysql_fetch_array($sql); 18 $list_news = "<h1>".$array['noticia_titulo']."</h1> ".$array['noticia_texto']." <p><strong>fonte:</strong> ".$array['noticia_fonte']."</p> <p><strong>data:</strong> ".basics::formata_data($array['noticia_data'])."</p>"; 19 else{ 20 $list_news = "Não há esta notícia no banco de dados!"; 21 22 return $list_news; 23 24?> Na linha 1 ele inclui a classe basics.php. Na linha 2 ele começa a classe news que se extende da classe basics já explicada nas páginas anteriores. Na linha 3 ele declara o atributo noticia_ id como público. Na linha 4 ele começa a construir o método lista_news que irá listar os registros contidos na tabela noticias no banco de dados. Repare que as querys de banco de dados estão dentro do código mysql_query, que tem a função de executar querys SQL. O mysql_num_rows irá indicar a quantidade de registros no banco de dados e o mysql_fetch_array irá transformar a consulta do mysql_query em array recuperando os valores contidos em cada coluna do banco de dados na consulta. É importante salientar que nesse livro não iremos abordar a fundo banco de dados, o leitor precisa já ter um conhecimento do mesmo. Iremos aqui usar as querys para resultar registros de nossas consultas, caso queira se aprofundar em banco de dados mysql acesse o site www.mysql.com e para saber todas as funções que existem no PHP para mysql acesse: http://php.net/manual/pt_br/ref.mysql.php Voltando ao código na linha 5 fazemos a consulta MySql. Na linha 6 criamos uma condição dizendo, se existir registros no banco de dados execute as linhas abaixo. Na linha 7 ele cria a variável lista_news e atribui o valor de titulo Noticias. Na linha 8 ele inicia o loop while criando um array através da função 9
mysql_fetch_array. Na linha 9 ele cria o elemento a ser repetido, repare que a variável $lista_news antes do sinal = (igual) tem um ponto (.) o que fará essa variável ser concatenada dentro do laço. Repare que no link apontamos para o mesmo arquivo, porém colocamos?noticia_id=(variável do banco de dados do ID), com isso ao clicarmos na notícia enviaremos o ID da notícia através do método GET para o navegador. E também usamos métodos contidos na classe basics e os instanciamos apenas com basics:: As linhas 10 e 11 irão fechar while e o if, a linha 12 irá retornar a variável lista_news e a linha 13 irá fechar o método. Da linha 14 a linha 24 terá o método detail_news. Da linha 14 a 16 faremos o mesmo procedimento da classe anterior, apenas com a diferença que nessa consulta na clausula WHERE dizemos para carregar apenas a notícia do ID recuperado pelo método GET. Agora na linha 17 ao invés de usar o while iremos apenas usar o array declarado na função mysql_fetch_array. Na linha 18 iremos exibir informações da noticia. Na linha 19 a 21 iremos fazer um e lse caso o id da notícia não exista no banco de dados. E na linha 22 retornamos a variável criada e nas linhas 23 e 24 fechamos método e de pois a classe. 7.3.3 - Arquivo CONTROLADOR.PHP Agora vamos criar o arquivo CONTROLADOR.PHP que irá analisar as variáveis recebidas e enviar o conteúdo conforme as recebe r. <?php 1 include "news.php"; 2 $obj = new news; 3 $obj->conn("localhost","news","daniela","1234"); 4 if(isset($_get['noticia_id'])){ 5 $content = $obj->detail_news($_get['noticia_id']); 6 else{ 7 $content = $obj->lista_news(); 8 9 include "view.html";?> Ele inclui as classes contidas no news.php e cria o objeto, repare que ele consegue acessar os métodos do basic sem a necessidade de criar um objeto para os métodos contidos na classe basic. 10
Na terceira linha ele acessa o método de conexão contido no basics e faz a conexão. Na quarta linha ele verifica se o noticia_id veio pelo método GET e se a variável existir ele acessa o conteúdo do método detail_news caso contrário ele acessa os dados do lista_news, já explicados nas páginas anteriores. Na linha 9 ele inclui o arquivo view.html que será o template HTML a ser usado. 7.3.4 - ARQUIVO VIEW.php É um HTML simples na tag body tem o código <?= $content?> Pronto os arquivos estão prontos, agora acesse http://localhost/controlador.php para ver o resultado. E verá uma página listando notícias e ao clicar abre o detalhe da notícia. Essa é uma maneira simples de fazer um leitor de notícia, porém o grande problema desse método é a segurança, pois variáveis carregadas pelo método GET, podem causar invasões ao banco de dados através de SQL Injection, que são injeções de código SQL através de variáveis recebidas através do método GET. Por isso falaremos no capítulo 9 a respeito rwriter url que nos permite criar URLs que protegem o script de ataques de SQL Injection e também podemos criar URLs inteligentes visando um melhor desempenho do site junto aos sites de busca já que nas regras do SEO Search Engenee Optimization a URL é um dos primeiros índices para indexação de palavras chaves. 11