Você está na página 1de 53

CRUD com PHP

18 CRUD com PHP

CRUD o acrnimo da expresso em lngua Inglesa Create, Retrieve, Update e Delete, usada para definir quatro operaes bsicas usadas em bancos de dados relacionais (RDBMS) ou em interface para usurios para criao, consulta, atualizao e destruio de dados. pt.wikipedia.org/wiki/CRUD.

CRUD com PHP


18.1 Exerccio com CRUD Para este exerccio vamos alterar a tabela paises para incluir dois campo adicionais, a moeda e populao. Alterar a tabela Paises Efectuamos a ligao nossa base de dados, atravs da ligao pr-estabelcida no MySql Workbench.

CRUD com PHP


18.2 Exerccio com CRUD

Efectuamos um clique com o boto direito do rato sobre a tabela pases e escolhemos Alter Table.

CRUD com PHP


18.3 Exerccio com CRUD Escolhemos Columns e criamos os campos como no exemplo.

Seguidamente, fazemos Apply, seguido de Apply Sql e depois Finish e Close para fechar a janela.

CRUD com PHP


18.4 Exerccio com CRUD

Fazemos refresh e verificamos as alteraes efectuadas.

CRUD com PHP


18.5 Exerccio com CRUD

Criao do ficheiro index.php Este ficheiro vai conter o cdigo inicial deste exemplo. Deve criar uma pasta chamada CRUD, e criar um ficheiro chamado index.php

CRUD com PHP


18.6 Exerccio com CRUD <html> <head> <meta http-equiv="content-type" content="text/html; charset=UTF-8"> </head> <body> Opes:<br/> <form action="introduzireditar.php" method="GET" name="paises"> <input type="submit" value="Introduzir" /> </form> <form action="listar.php" method="GET" name="paises"> <input type="submit" value="Listar" /> </form> </body> </html>

CRUD com PHP


18.7 Exerccio com CRUD

No slide anterior criamos uma pgina HTML bsica que contm dois form, cada um com um boto, um para introduzir um novo pas e outro para listar os pases. Na opo de listar, vamos poder editar ou eliminar os pases se o desejarmos. Deve criar uma pasta dentro da pasta CRUD, chamada includes, e copiar para dentro desta pasta o ficheiro config.php criado no ltimo exemplo.

CRUD com PHP


18.8 Exerccio com CRUD

O exemplo do resultado do nosso cdigo HTML para o ficheiro index.php o seguinte:

CRUD com PHP


18.9 Exerccio com CRUD Criar o ficheiro introduzireditar.php. Este ficheiro permitir introduzir e editar novos pases. O seu cdigo HTML inicial o seguinte: <html> <head> <meta http-equiv="content-type" content="text/html; charset=UTF-8"> </head> <body> Introduzir os dados do Pas:<br />

CRUD com PHP


18.10 Exerccio com CRUD <form action="introduzireditar.php" method="POST" name="introduzir"> <label for="nomepais">Nome Pas: </label> <input type="text" name="nomepais" value="" /> <br /> <label for="moedapais">Moeda: </label> <input type="text" name="moedapais" value="" /> <br /> <label for="populacaopais">Populao: </label> <input type="text" name="populacaopais" value="" /> <br /> <input type="submit" value="Gravar" />

CRUD com PHP


18.11 Exerccio com CRUD </form> <a href="index.php">Voltar</a> </body> </html>

CRUD com PHP


18.12 Exerccio com CRUD A nossa pgina ficar como o exemplo abaixo:

CRUD com PHP


18.13 Exerccio com CRUD Introduzir o cdigo PHP no ficheiro introduzireditar.php. Criar uma pasta chamada include e colocar dentro da pasta o ficheiro config.php. Introduzir o seguinte cdigo no inicio do ficheiro introduzireditar.php, antes da primeira tag HTML e dentro das tags PHP <?php ?>. <?php //inclui o ficheiro com as configuraes da base de dados require_once("includes/config.php"); //efectua a conexo com os dados do ficheiro config.php $conexao = mysql_connect($dbhost, $dbuser, $dbpassword);

CRUD com PHP


18.14 Exerccio com CRUD //testa se a conexo teve sucesso; se no teve d erro e termina o script if (!$conexao) { die('Erro de conexo: ' . mysql_error()); } ?>

CRUD com PHP


18.15 Exerccio com CRUD O cdigo anterior efectua a ligao ao nosso servidor MySql usando as configuraes do ficheiro config.php. A conexo efectuada com a funo mysql_connect(), que recebe os parmetros para a ligao, o host onde reside a base de dados, o utilizador e password definidos. Um ponto importante a verificao se a ligao foi bem sucedida, com a instruco if (!conexao). Caso no tenha tido sucesso, o script terminado com a mensagem Erro de conexo , seguido do respectivo erro do MySql.

CRUD com PHP


18.16 Exerccio com CRUD Detectar um POST Como j deve ter reparado, o form contido no script introduzireditar.php, efectua um POST sobre si mesmo. A forma de sabermos que foi efectuado um POST e que o script deve recolher os valores de cada campo e efectuar a insero dos dados na tabela efectuado pela condio:

if ($_SERVER["REQUEST_METHOD"] == "POST") { }
Deve colocar a condio na segunda linha do script, logo a seguir a tag inicial do PHP <?php e fechar o if imediatamente antes da tag de fecho ?>.

CRUD com PHP


18.17 Exerccio com CRUD Seleccionar a base de dados e o charset Devemos antes de manipular os nossos registos, seleccionar a base de dados com o comando: mysql_select_db($dbdatabase, $conexao); e definir o charset com a instruco: mysql_set_charset('utf8',$conexao); Estas duas linhas devem ser colocadas a seguir instruo: if (!$conexao) { die('Erro de conexo: ' . mysql_error()); }

CRUD com PHP


18.18 Exerccio com CRUD Recolher os dados do array $_POST Neste passo vamos criar trs variveis auxiliares, que vo receber os dados do array $_POST, previamente escapados com a funo mysql_real_escape_string() para prevenir sql injection. Colocar as instrues logo abaixo s do ponto anterior. $nomepais = mysql_real_escape_string($_POST["nomepais"]); $moedapais = mysql_real_escape_string($_POST["moedapais"]); $populacaopais = mysql_real_escape_string($_POST["populacaopais"]);

CRUD com PHP


18.19 Exerccio com CRUD Criar o comando SQL para inserir os dados e testar se executou sem erros Inserir as intruces abaixo, logo aps as instruces do ponto anterior. $sql = "INSERT INTO paises (nome_pais, moeda_pais, populacao_pais)" . " VALUES ('" . $nomepais . "', '" . $moedapais . "', " . $populacaopais . ")"; $insert = mysql_query($sql); if (!$insert) { echo $sql; echo 'Erro ao inserir o registo: ' . mysql_error(); }

CRUD com PHP


18.20 Exerccio com CRUD Testar o script Nesta fase, j deve ser possvel introduzir novos registos. Executar agora um teste.

CRUD com PHP


18.21 Exerccio com CRUD Criar o script listar.php Este script mostrar uma lista dos pases e as suas informaes. Nesta lista ser possvel tambm efectuar a eliminao e edio de registos.

CRUD com PHP


18.22 Exerccio com CRUD <html> <head> <meta http-equiv="content-type" content="text/html; charset=UTF-8"> </head> <body> <table border="black"> <tr> <th>Nome Pas</th> <th>Moeda</th> <th>Populao</th> </tr>

CRUD com PHP


18.23 Exerccio com CRUD <tr> <td></td> <td></td> <td></td> </tr> </table> <a href="index.php">Voltar</a> </body> </html>

CRUD com PHP


18.24 Exerccio com CRUD Efectuar a ligao base de dados Este passo semelhante ao do exemplo anterior. Devem introduzir as instruces abaixo dentro das tags do PHP: //inclui o ficheiro com as configuraes da base de dados require_once("includes/config.php"); //efectua a conexo com os dados do ficheiro config.php $conexao = mysql_connect($dbhost, $dbuser, $dbpassword); //testa se a conexo teve sucesso; se no teve d erro e termina o script if (!$conexao) { die('Erro de conexo: ' . mysql_error()); }

CRUD com PHP


18.25 Exerccio com CRUD Seleccionar a base de dados e o charset semelhana do ficheiro anterior, seleccionamos a base de dados e definimos o charset. Colocamos as instruces abaixo logo a seguir s do ponto anterior: mysql_select_db("aulasphp", $conexao); mysql_set_charset('utf8',$conexao);

CRUD com PHP


18.26 Exerccio com CRUD Definir o comando SQL a executar O comando que vamos executar deve mostrar todos os registos presentes na tabela paises. Para esse efecito, um simples select suficiente. Colocar as intruces a seguir s do ponto anterior. $sql = "SELECT * FROM paises"; $paises = mysql_query($sql);

CRUD com PHP


18.27 Exerccio com CRUD Iterar sobre os registos Para iterarmos sobre os registos, necessitamos de um ciclo e de converter o resultado do nosso query sql num array associativo. Devem substituir o cdigo HMTL seguinte: <tr> <td></td> <td></td> <td></td> </tr>

CRUD com PHP


18.28 Exerccio com CRUD Iterar sobre os registos Para iterarmos sobre os registos, necessitamos de um ciclo e de converter o resultado do nosso query sql num array associativo. Devem substituir o cdigo HMTL seguinte: <tr> <td></td> <td></td> <td></td> </tr>

CRUD com PHP


18.29 Exerccio com CRUD Pelo seguinte cdigo: <?php while($registos = mysql_fetch_array($paises)) { echo "<tr>\n"; echo "<td>\n"; echo $registos["nome_pais"]; echo "</td>\n"; echo "<td>\n"; echo $registos["moeda_pais"]; echo "</td>\n"; echo "<td>\n"; echo $registos["populacao_pais"]; echo "</td>\n";

CRUD com PHP


18.30 Exerccio com CRUD

echo "<td>\n"; echo "<form name=\"editar\" action=\"editarpais.php\" method=\"GET\">"; echo "<input type=\"hidden\" name=\"idpais\" value=\"" . $registos["id_pais"] ."\"/>"; echo "<input type=\"submit\" value=\"Editar\"/>"; echo "</form>"; echo "</td>\n"; echo "<td>\n"; echo "<form name=\"eliminar\" action=\"eliminarpais.php\" method=\"GET\">"; echo "<input type=\"hidden\" name=\"idpais\" value=\"" . $registos["id_pais"] ."\"/>"; echo "<input type=\"submit\" value=\"Eliminar\"/>"; echo "</form>"; echo "</td>\n"; echo "</tr>\n"; } ?>

CRUD com PHP


18.31 Exerccio com CRUD
Colocamos um novo header para a tabela com o texto opes. Onde temos o cdigo: <tr> <th>Nome Pas</th> <th>Moeda</th> <th>Populao</th> </tr> Inclumos a linha: <th colspan="2">Opes</th> Imediatamente acima da tag </tr>. Com esta ltima linha de cdigo, implementmos um mtodo que permitir efectuar a edio e eliminao de registos.

CRUD com PHP


18.32 Exerccio com CRUD

Criar o script editarpais.php Este script vai permitir que o registo seleccionado seja editado. Na prtica, o utilizador ao seleccionar o boto Editar na pgina listar.php, vai chamar este script com o parmetro do registo a editar. No script editar.php, vamos recuperar o id do registo, preencher os campos com o seu valor e permitir que o utilizador faa a respectiva alterao. A nvel de SQL, ser implementado um update ao registo.

CRUD com PHP


18.33 Exerccio com CRUD Cdigo do script editarpais.php Neste passo vamos criar um novo ficheiro editarpais.php e inluir o seguinte cdigo HTML: <html> <head> <meta http-equiv="content-type" content="text/html; charset=UTF8"> </head> <body> Editar os dados do Pas:<br /> <form name="editar" action="introduzireditar.php" method="POST"> <label for="nomepais">Nome Pas: </label> <input type="text" name="nomepais" value="" /> <br />

CRUD com PHP


18.34 Exerccio com CRUD <label for="moedapais">Moeda: </label> <input type="text" name="moedapais" value="" /> <br /> <label for="populacaopais">Populao: </label> <input type="text" name="populacaopais" value="" /> <br /> <input type="submit" name =actualizar value="Actualizar" /> </form> <a href="listar.php">Voltar</a> </body> </html>

CRUD com PHP


18.35 Exerccio com CRUD Cdigo PHP para extrair o ID do registo a editar Criar um bloco de cdigo PHP logo acima da primeira linha HTML. Colocar o seguinte cdigo: //testa se a varivel superglobal foi inicializada if (!isset( $_GET["idpais"])) { die("Id do pas no fornecido."); } //atribui o valor do campo escondido do form varivel $idPais = $_GET["idpais"]; //grava o id do pais numa sesso session_start(); $_SESSION["idpais"] = $idPais;

CRUD com PHP


18.36 Exerccio com CRUD O cdigo anterior primeiro testa se a varivel idpais, do array superglobal existe. Se no existir, termina o script com erro. Se existir, o seu valor ser guardado na sesso para mais tarde ser usado.

CRUD com PHP


18.37 Exerccio com CRUD Seguidamente, colocamos o cdigo abaixo: //inclui o ficheiro com as configuraes da base de dados require_once("includes/config.php"); //efectua a conexo com os dados do ficheiro config.php $conexao = mysql_connect($dbhost, $dbuser, $dbpassword); //testa se a conexo teve sucesso; se no teve d erro e termina o script if (!$conexao) { die('Erro de conexo: ' . mysql_error()); }

CRUD com PHP


18.38 Exerccio com CRUD mysql_select_db("aulasphp", $conexao); mysql_set_charset('utf8',$conexao); $sql = "SELECT * FROM paises WHERE id_pais = " . mysql_real_escape_string($idPais); $paises = mysql_query($sql); if (mysql_num_rows($paises) == 0) { die("Registo no encontrado" ); } $registo = mysql_fetch_assoc($paises); $nomePais = $registo ["nome_pais"]; $moedaPais = $registo ["moeda_pais"]; $populacaoPais = $registo ["populacao_pais"];

CRUD com PHP


18.39 Exerccio com CRUD Parte do cdigo anterior j conhecido. O query SQL executado pesquisa na tabela de pases o pas com o ID pretendido e atribui o resultado do query a um array associativo para podermos usar os campos.

CRUD com PHP


18.40 Exerccio com CRUD Alteraao dos inputs do formulrio. Com os dados do registo j atribudos a um array, podemos afix-los no form, atravs do campo value de cada input do form. Alterar os inputs de acordo com as instruces abaixo: <input type="text" name="nomepais" value="<?php echo $nomePais; ?>" /> <input type="text" name="moedapais" value="<?php echo $moedaPais; ?>" /> <input type="text" name="populacaopais" value="<?php echo $populacaoPais; ?>" />

CRUD com PHP


18.41 Exerccio com CRUD Actualizar o script introduzireditar.php Este script deve ser alterado para servir no s para introduzir informao, mas tambm para permitir a edio dos mesmos. As alteraes a efectuar so as seguintes: Detectar se foi efectuado um POST Como vamos usar o mesmo script para inserir e editar registos, necessitamos de testar se foi efectuado um POST. Caso no tenha sido feito um POST, o form apresentado, se pelo contrrio, tivermos efectuado um POST, vamos detectar se devemos fazer um insert ou um update. inserir o cdigo seguinte no incio do script introduzireditar.php:

CRUD com PHP


18.42 Exerccio com CRUD if ($_SERVER["REQUEST_METHOD"] == "POST") { //inclui o ficheiro com as configuraes da base de dados require_once("includes/config.php"); //efectua a conexo com os dados do ficheiro config.php $conexao = mysql_connect($dbhost, $dbuser, $dbpassword); //testa se a conexo teve sucesso; se no teve d erro e termina o script if (!$conexao) { die('Erro de conexo: ' . mysql_error()); } mysql_select_db("aulasphp", $conexao); mysql_set_charset('utf8',$conexao);

CRUD com PHP


18.43 Exerccio com CRUD

O cdigo anterior testa se foi efectuado um POST, efectua o require das configuraes da ligao base de dados, e termina o script se a ligao no for efectuada, feita tambm a seleco da base de dados e definido o charset da ligao.

CRUD com PHP


18.44 Exerccio com CRUD Efectuar insert ou update? O prximo bloco de cdigo vai permitir efectuar um insert ou update, dependendo de uma condio. Vejamos o cdigo seguinte, que deve ser inserido logo aps a ltima instruco do cdigo anterior.

CRUD com PHP


18.45 Exerccio com CRUD if (array_key_exists("actualizar", $_POST)) { session_start(); $idPais = mysql_real_escape_string($_SESSION["idpais"]); $nomepais = mysql_real_escape_string($_POST["nomepais"]); $moedapais = mysql_real_escape_string($_POST["moedapais"]); $populacaopais = mysql_real_escape_string($_POST["populacaopais"]);
$sql = "UPDATE paises SET nome_pais = '" . $nomepais . "', moeda_pais = " . $moedapais . " , populacao_pais = " . $populacaopais . " WHERE id_pais = " . $idPais; $update = mysql_query($sql); if (!$update) { echo $sql; echo 'Erro ao actualizar o registo: ' . mysql_error(); } }

CRUD com PHP


18.46 Exerccio com CRUD else { $nomePais = mysql_real_escape_string($_POST["nomepais"]); $moedaPais = mysql_real_escape_string($_POST["moedapais"]); $populacaoPais = mysql_real_escape_string($_POST["populacaopais"]); $sql = "INSERT INTO paises (nome_pais, moeda_pais, populacao_pais)" . " VALUES ('" . $nomePais . "', '" . $moedaPais . "', " . $populacaoPais . ")"; $insert = mysql_query($sql); if (!$insert) { echo $sql; echo 'Erro ao inserir o registo: ' . mysql_error(); } }

CRUD com PHP


18.47 Exerccio com CRUD Este cdigo que introduzimos responsvel pelo seguinte: Testar de onde vem o POST Testa se no array superglobal $_POST existe uma chave com o nome actualizar. Isto efectuado com a funo array_key_exists(). Se existir esta chave, significa que o POST foi efectuado do form no script editarpais.php. O cdigo HTML responsvel por esta aco seguinte: <input type="submit" name="actualizar" value="Actualizar" /> O POST contm a chave actualizar Se o POST contm a chave actualizar, devemos recuperar os dados submetidos pelo form do array $_POST, e recuperar tambm da sesso o ID do registo que desejamos alterar, que foi guardado prviamente no script editarpais.php.O cdigo responsvel por estas aces o exposto abaixo: session_start(); $idPais = mysql_real_escape_string($_SESSION["idpais"]); $nomepais = mysql_real_escape_string($_POST["nomepais"]); $moedapais = mysql_real_escape_string($_POST["moedapais"]); $populacaopais = mysql_real_escape_string($_POST["populacaopais"]);

CRUD com PHP


18.48 Exerccio com CRUD Construir o query SQL e efectuar o UPDATE No cdigo abaixo, vamos construir o nosso query SQL e execut-lo: $sql = "UPDATE paises SET nome_pais = '" . $nomepais . "', moeda_pais = " . $moedapais . " , populacao_pais = " . $populacaopais . WHERE id_pais = " . $idPais; $update = mysql_query($sql); if (!$update) { echo 'Erro ao actualizar o registo: ' . mysql_error(); } } E assim conclui a parte do cdigo para editar um registo. Seguidamente vamos verificar como podemos inserir um novo registo.

CRUD com PHP


18.49 Exerccio com CRUD Inserir um novo registo A insero de um novo registo ser efectuada sempre como alternativa condio. Resumidamente o que ser efectuado ser uma edio de um registo, caso no array $_POST exista a chave actualizar, se no existir, ser efectuado uma insero de um novo registo. if (array_key_exists("actualizar", $_POST)) { // Editar o registo } else { // inserir o registo }

CRUD com PHP


18.50 Exerccio com CRUD Devemos introduzir o cdigo abaixo no else da condio: $nomePais = mysql_real_escape_string($_POST["nomepais"]); $moedaPais = mysql_real_escape_string($_POST["moedapais"]); $populacaoPais = mysql_real_escape_string($_POST["populacaopais"]); $sql = "INSERT INTO paises (nome_pais, moeda_pais, populacao_pais)" . " VALUES ('" . $nomePais . "', '" . $moedaPais . "', " . $populacaoPais . ")"; $insert = mysql_query($sql); if (!$insert) { echo 'Erro ao inserir o registo: ' . mysql_error(); } } Este pedao de cdigo semelhante ao anterior, sendo que a principal diferena situa-se no facto de ser efectuado um INSERT em vez de um UPDATE.

CRUD com PHP


18.51 Exerccio com CRUD Devemos introduzir o cdigo abaixo no else da condio: $nomePais = mysql_real_escape_string($_POST["nomepais"]); $moedaPais = mysql_real_escape_string($_POST["moedapais"]); $populacaoPais = mysql_real_escape_string($_POST["populacaopais"]); $sql = "INSERT INTO paises (nome_pais, moeda_pais, populacao_pais)" . " VALUES ('" . $nomePais . "', '" . $moedaPais . "', " . $populacaoPais . ")"; $insert = mysql_query($sql); if (!$insert) { echo 'Erro ao inserir o registo: ' . mysql_error(); } } Este pedao de cdigo semelhante ao anterior, sendo que a principal diferena situa-se no facto de ser efectuado um INSERT em vez de um UPDATE.

CRUD com PHP


18.52 Exerccio com CRUD O script eliminarpais.php Para completar o nosso exerccio, falta implementar uma forma de eliminar registos. A implementao desta funcionalidade ficar a cargo dos formandos. Nota: a soluo ser fornecida com o material deste curso.