Material para
a formacin profesional inicial
Familia profesional
IFC
Informtica e comunicacins
Ciclo formativo
CSIFC03
Grao
Superior
Mdulo profesional
MP0613
Unidade didctica
UD6
Actividade
A02
Autores
Nome do arquivo
CSIFC01_ MP0613_UD06_A02_PDO
Pxina 1 de 35
Pxina 2 de 35
ndice
1.Ficha tcnica.....................................................................................................................5
Contexto da actividade.......................................................................................................................... 5
Ttulo da actividade............................................................................................................................... 5
Resultados de aprendizaxe do currculo................................................................................................ 5
Obxectivos didcticos e ttulo e descricin da actividade......................................................................5
Criterios de avaliacin........................................................................................................................... 6
Contidos................................................................................................................................................ 6
Actividades de ensino e aprendizaxe e de avaliacin, mtodos, recursos e instrumentos de avaliacin
................................................................................................................................................................. 7
Tarefas.................................................................................................................................. 15
Autoavaliacin..................................................................................................................................... 16
1.2.1Tarefa 2. Execucin de consultas preparadas..................................................................................................... 18
Autoavaliacin..................................................................................................................................... 20
1.2.2Tarefa 3. Uso de transaccins............................................................................................................................. 25
Autoavaliacin..................................................................................................................................... 25
3.Avaliacin........................................................................................................................30
Exemplo de exercizo a realizar na proba prctica a realizar ao rematar a U.D...................................30
Autoavaliacin..................................................................................................................................... 31
Pxina 3 de 35
Pxina 4 de 35
1.
Ficha tcnica
Contexto da actividade
Mdulo
Durac
in
Unidade didctica.
Sesi
ns 50
Actividades
Sesi
ns 50
175
24
14
10
Ttulo da actividade
N
Ttulo
Descricin
Duracin
A02
10
Completo
RA6. Desenvolve aplicacins de acceso a almacns de datos, aplicando medidas para manter a seguridade e a integridade
da informacin
Non
O1.2
O1.3
Actividade
Descricin bsica
Pxina 5 de 35
Duracin
10
Criterios de avaliacin
Criterios de avaliacin
CA6.2.2 - Creronse aplicacins que establezan conexins con bases de datos empregando PDO
CA6.3.2 - Recuperouse informacin almacenada en bases de datos empregando PDO
CA6.4 - Publicouse en aplicacins web a informacin recuperada.
CA6.5 - Utilizronse conxuntos de datos para almacenar a informacin.
CA6.6.2 - Creronse aplicacins web que permitan a actualizacin e a eliminacin de informacin dispoible nunha base de datos empregando
PDO
CA6.7.2 - Utilizronse transaccins para manter a consistencia da informacin empregando PDO
CA6.8 - Probronse e documentronse as aplicacins.
CA6.9 - Identificouse a necesidade do uso de consultas preparadas
Contidos
Contidos
Establecemento de conexins con bases de datos relacionais.
A extensin PDO
Pxina 6 de 35
Cmo
Actividade
(ttulo e descricin)
Profesorado
(en termos de tarefas)
Alumnado
(tarefas)
Resultados
ou produtos
Con qu
Cmo e con qu se
valora
Recursos
Instrumentos e
procedementos de
avaliacin
Duracin
(sesins)
10
2.
1.1
Introducin
Esta actividade ten como obxectivos:
Identificar os principios bsicos da programacin en capas e a sa aplicacin
empregando a linguaxe PHP.
Coecer as vantaxes da programacin en capas fronte a programacin estruturada
tradicional.
1.2
Actividade
A extensin PDO
PDO (PHP Data Objects) unha extensin de PHP que permite abstraerse do sistema xestor
de base de datos que se est a usar.
A extensin MySQLi unha boa opcin para programar unha aplicacin que utilice
como sistema xestor de bases de datos MySQL: Ofrece acceso a todas as caractersticas do
motor de base de datos, vez que reduce os tempos de espera na execucin de sentenzas.
Non obstante, se no futuro tes que cambiar o SXBD por outro distinto, ters que volver
programar gran parte do cdigo desta. Por iso, antes de comezar o desenvolvemento, moi
importante revisar as caractersticas especficas do proxecto. No caso de que exista a posibilidade, presente ou futura, de utilizar outro servidor como almacenamento, debers adoptar
unha capa de abstraccin para o acceso aos datos. Existen varias alternativas como ODBC,
pero sen dbida a opcin mis recomendable na actualidade PDO.
O obxectivo que se chegado o momento necesitas cambiar o servidor de base de datos,
as modificacins que debas realizar no teu cdigo sexan mnimas. Mesmo posible desenvolver aplicacins preparadas para utilizar un almacenamento ou outro segundo se indique
no momento da execucin, pero este non o obxectivo principal de PDO. PDO non abstrae
de forma completa o sistema xestor que se utiliza. Por exemplo, non modifica as sentenzas
SQL para adaptalas s caractersticas especficas de cada servidor. Se isto fose necesario,
habera que programar unha capa de abstraccin completa.
A extensin PDO debe utilizar un driver ou controlador especfico para o tipo de base de
datos que se utilice. Podes consultar os controladores dispoibles na ta instalacin de PHP
na informacin que proporciona a funcin phpinfo.
Mentres que a extensin MySQLi permite programacin estructurada e programacin
orientada a obxectos, PDO basase unicamente nas caractersticas de orientacin a obxectos
de PHP. Para acceder s funcionalidades da extensin tes que empregar os obxectos que
ofrece, cos seus mtodos e propiedades. Non existen funcins alternativas.
Conexin base de datos
Para establecer unha conexin cunha base de datos utilizando PDO, debes instanciar un
obxecto da clase PDO pasndolle os seguintes parmetros (s o primeiro obrigatorio):
Pxina 8 de 35
orixe de datos (DSN): unha cadea de texto que indica o tipo de xestor de base de datos
ao que se vai conectar PDO, seguido do nome da base de datos e do host no que se atopa
a base de datos.
nome de usuario con permisos para establecer a conexin.
contrasinal do usuario.
opcins de conexin, almacenadas en forma de array.
Por exemplo, para establecer unha conexin coa base de datos 'receita' fariamos o seguinte:
$db = new PDO('mysql:host=localhost;dbname=receitas', 'alumno', 'abc123.');
Unha vez establecida a conexin, podes utilizar o mtodo getAttribute para obter informacin do estado da conexin e setAttribute para modificar algns dos parmetros
que afectan a esta. Por exemplo, para obter a versin do servidor podes facer:
$version = $db->getAttribute(PDO::ATTR_SERVER_VERSION);
print "Versin: $version";
E se queres por exemplo que che devolva todos os nomes de columnas en maisculas:
$db->setAttribute(PDO::ATTR_CASE, PDO::CASE_UPPER);
Unha vez rematado o traballo coa base de datos, basta con eliminar as referencias ao
obxecto para que se peche a conexin e se liberen os recursos.
$db = null;
Execucin de consultas
Na sa forma mis bsica, executar unha consulta con PDO pode ser exactamente igual que
con calquera das outras extensins. Se a consulta xera un conxunto de datos, como o caso
de SELECT usaremos o mtodo query, que devolve un obxecto da clase PDOStatement.
Ao igual que coa extensin MySQLi, en PDO tes varias posibilidades para tratar co conxunto de resultados devolto polo mtodo query.
fetch() : Obten a seguinte fila dun conxunto de resultados (ou false cando xa non
quedan mis rexistros). Polo que teremos que empregar un bucle para percorrer todos os
resultados (filas) da execucin da consulta.
$db = new PDO('mysql:host=localhost;dbname=receitas', 'alumno','abc123.');
$stmt = $db->query("SELECT nome, dificultade FROM receita");
while($fila = $stmt->fetch()) {
echo $fila['nome']." (".$fila['dificultade'].")<br />";
}
Por defecto, o mtodo fetch xera e devolve a partir de cada rexistro un array con claves numricas e asociativas. Para cambiar o seu comportamento, admite un parmetro
opcional que pode tomar un dos seguintes valores:
o PDO::FETCH_ASSOC: Devolve s un array asociativo.
o PDO::FETCH_NUM: Devolve s un array con claves numricas.
o PDO::FETCH_BOTH: Devolve un array con claves numricas e asociativas. o
comportamento por defecto.
o PDO::FETCH_OBJ: Devolve un obxecto cuxas propiedades se corresponden cos
campos do rexistro.
$stmt = $db->query("SELECT nome, dificultade FROM receita");
while($fila = $stmt->fetch(PDO::FETCH_OBJ)) {
echo $fila->nome." (".$fila->dificultade.")<br />";
}
o PDO::FETCH_LAZY: Devolve tanto o obxecto coma o array con clave dual anterior.
o PDO::FETCH_BOUND: Devolve true e asigna os valores do rexistro a variables,
segundo se indique co mtodo bindColumn. Este mtodo debe ser chamado unha vez
Pxina 10 de 35
Ao igual ca funcin fetch(), admite un valor como parmetro que determinar cmo
devolver a funcin os resultados. Novamente FETCH_BOTH o valor por defecto.
fetchObject(): Obtn a seguinte fila e devlvea como un obxecto. Do mesmo xeito
que coa funcin fetch_object da extensin mysqli, podemos pasar dous parmetros
(opcionais) a esta funcin: O primeiro sera o nome da clase a instanciar, e o segundo, un
array opcional de parmetros a pasar ao construtor de dita clase. Os campos da fila do
conxunto de resultados. Os campos da fila pasan a ser atributos pblicos da clase, co cal
poderemos acceder a estes dentro da clase sen necesidade de definilos. Pero unha boa
prctica definilos na clase. No caso de definilos, o nome debe coincidir co nome da
columna.
Se non lle pasamos ningn parmetro, simplemente accederemos s columna da fila
como se esta fose un obxecto e as columnas fosen propiedades (o que similar a usar o
mtodo fetch con PDO::FETCH_OBJ.
class receita{
public $nome;
public $dificultade;
public function maiusculasDificultade() {
return strtoupper($this->dificultade);
}
}
try{
$db = new PDO('mysql:host=localhost;dbname=receitas', 'alumno',
'abc123.');
$stmt = $db->query("SELECT nome, dificultade FROM receita");
while ($resultado = $stmt->fetchObject('receita')) {
echo $resultado->nome." (".$resultado->maiusculasDificultade().
")<br />";
}
}catch(PDOException $e)
{
print $e->getMessage();
}
Non se aconsella empregar o mtodo query para sentenzas con parmetros externos. No
caso de usalo, deberemos acompaalo do mtodo quote() para indicar que queremos escapar (antepoer '\' aos caracteres problemticos) un valor. Tamn poderiamos usar mysqli_real_escape_string() ou real_escape_string(), dependendo de se estamos a usar
unha interface procedemental ou orientada a obxectos.
Pxina 11 de 35
Ao igual que con MySQLi, tamn utilizando PDO podemos preparar consultas parametrizadas
no servidor para executalas de forma repetida. O procedemento similar e mesmo os
mtodos a executar teen practicamente os mesmos nomes.
Para preparar unha consulta no servidor MySQL, debers utilizar o mtodo prepare da
clase PDO. Este mtodo devolve un obxecto da clase PDOStament e encrgase de escapar os
parmetros que se lle pasen, evitando problemas coa inxeccin de SQL. Este obxecto o
que imos usar nas posteriores vinculacins, execucins e recollida de resultados.
Os parmetros pdense marcar utilizando signos de consulta como no caso anterior:
$stmt = $db->prepare('SELECT * FROM chef WHERE nome=? and Apelido1=?');
Utilicemos unha alternativa ou outra, o seguinte paso vincular un valor aos parmetros
de substitucin. E para isto usaremos a funcin bindValue() ou bindParam().
As, se usamos parmetros con nome, para vincular o valor fariamos:
$stmt->bindValue(':param_nome', $nome);
$stmt->bindValue(':param_apelido1', $apelido1);
Ademis do nome do prametro e o seu valor pdemos indicar o tipo dos parmetros empregando as seguintes constantes predefinidas de PDO:
o PDO::PARAM_BOOL
o PDO::PARAM_NULL
o PDO::PARAM_INT
o PDO::PARAM_STR
o PDO::PARAM_LOB
As funcins bindParam() e bindValue() son similares. A diferenza que:
Con bindParam() s se poden pasar variables. Non se poden pasar valores directamente.
So funciona coas variables debido a que unicamente permite parmetros por referencia
(e un valor non unha referencia vlida en PHP).
Con bindValue() pdense pasar tanto valores como variables.
Pxina 12 de 35
Unha vez preparada a consulta e enlazados os parmetros cos seus valores, exectase a
consulta utilizando o mtodo execute().
$stmt->execute();
Unha caracterstica importante desta funcin que permite opcionalmente asignar valores dos parmetros no momento de executar a consulta. Para isto, usaremos un array (asociativo ou con claves numricas dependendo da forma en que indicases os parmetros) na
chamada a execute.
$parametros = array(':nome' => 'XOEL', ':apelido1' => 'GARCA');
$consulta->execute($parametros);
rowCount
A funcin rowCount() devolve o nmero de filas afectadas pola ultima sentenza de insercin, borrado ou actualizacin. Esta unha funcin da clase PDOStatement.
$stmt = $db->prepare('DELETE FROM LIBRO WHERE cod_chef=:chef');
$stmt->execute([':chef' => 4]);
$count = $stmt->rowCount();
print("Borrronse $count filas.\n");
PDO non asegura que a funcin rowCount() funcione correctamente en todos os sistemas xestores de bases de datos para sentenzas de tipo SELECT.
Na
Transaccins
Como xa vimos na actividade anterior, as transaccins son un mecanismo que nos asegura
que todas as consultas que forman parte dunha operacin se executan de forma segura e, no
caso de que falle algunha das consultas a transaccin non se levar a cabo.
Como PDO unha capa de abstraccin sobre mltiples tipos de xestores de bases de datos
e cada un dos xestores ten regras diferentes, pode suceder que algn destes non admita o
mecanismo de transaccins. Por exemplo, en MySQL non todos os motores de almacenamento de tboas soportan transaccins. Os tipos de tboas MyISAM non permiten transaccins, mentras que as tboas InnoDB s as permiten.
Pxina 13 de 35
Ao igual que pasaba con MySQLi, por defecto PDO traballa en modo autocommit, isto ,
confirma de forma automtica cada sentenza que executa o servidor. Polo tanto o primeiro
que teremos que facer e desactivar o modo autocommit para poder indicar onde remata a
nosa transaccin. Isto faise coa funcin beginTransaction() que marca o inicio dunha
nova transaccin.
A transaccin finalizar cando se execute un dos seguinte mtodos: commit() para confirmar a transaccin actual, ou rollback() para reverter os cambios levados a cabo na
transaccin actual en caso de producirse algn erro.
A clase PDO ten unha funcin exec(string $statement), que executa unha sentenza
sql e devolve o numero de filas afectadas por esta. E similar a query() pero unicamente
adecuada para consultas de accin xa que non devolve os resultados dunha sentenza SELECT.
Debemos ter en conta, que sexa cal sexa o resultado dunha transaccin, a conexin base
de datos volve estar en modo autocommit ata que iniciemos unha nova transaccin con beginTransaction().
$bandeira = true;
$db->beginTransaction();
if($db->exec('DELETE ') == 0) $bandeira = false;
if($db->exec('UPDATE ') == 0) $bandeira = false;
Pxina 14 de 35
Tarefas
As tarefas propostas son as seguintes.
Tarefa 1. Execucin de consultas. Nesta tarefa 1executaremos consultas e amosaremos
informacin da base de datos obtendo os resultados de diferentes maneiras.
Tarefa 2. Execucin de consultas preparadas. Nesta tarefa usaremos consultas
preparadas para aquelas consultas que tean parmetros.
Tarefa 3. Uso de transaccins. Nesta tarefa executaremos operacins que implican o
uso de transaccins.
Pxina 15 de 35
b) Tarefa 1_b
Nesta tarefa queremos obter cada fila como un obxecto dunha clase que teremos creada e
que ter dous mtodos para dar formato ao nome da receita e do chef como se ve a continuacin:
Autoavaliacin
a) Tarefa 1_a
<html>
<head>
<TITLE>Receitas</TITLE>
<link rel="stylesheet" href="../public/tarefas.css" />
</head>
<body>
<div id="contido">
<h1>LISTADO DE RECEITAS</h1>
<table>
<tr>
<th>RECEITA</th>
<th>DIFICULTADE</th>
<th>TEMPO</th>
<th>CHEF</th>
<th/>
</tr>
<?php
$servidor = "localhost";
$base = "receitas";
$usuario = "alumno";
$contrasinal = "abc123.";
try{
//Establecemos a conexin co servidor
Pxina 16 de 35
b) Tarefa 1_b
Neste caso teriamos que modificar o xeito no que recuperamos o resultado como se ve a
continuacin:
$stmt = $db->query($sql);
//Asignamos o resultado da consulta a variables
$stmt->bindColumn(1, $nome);
$stmt->bindColumn(2, $dificultade);
$stmt->bindColumn(3, $tempo);
$stmt->bindColumn(4, $nomeartistico);
while ($rexistro = $stmt->fetch(PDO::FETCH_BOUND)) {
echo "<tr>
<td>".$nome."</td>
<td>".$dificultade."</td>
<td>".$tempo."</td>
<td>".$nomeartistico."</td>
</tr>";
}
echo '</table>';
c) Tarefa 1_c
<html>
<head>
<TITLE>Receitas</TITLE>
<link rel="stylesheet" href="../public/tarefas.css" />
</head>
<body>
<div id="contido">
<h1>LISTADO DE RECEITAS</h1>
<table>
<tr>
<th>RECEITA</th>
<th>DIFICULTADE</th>
<th>TEMPO</th>
<th>CHEF</th>
<th/>
</tr>
<?php
class receita{
public $nome;
public $dificultade;
Pxina 17 de 35
public $tempo;
public $nomeartistico;
public function formatearNome() {
return substr($this->nome,0,1).
mb_strtolower(substr($this->nome,1,strlen($this->nome)));
}
public function formatearChef() {
return substr($this->nomeartistico,0,1).
mb_strtolower(substr($this->nomeartistico,1,
strlen($this->nomeartistico)));
}
}
$servidor = "localhost";
$base = "receitas";
$usuario = "alumno";
$contrasinal = "abc123.";
try{
//Establecemos a conexin co servidor
$db= new PDO('mysql:host='.$servidor.';dbname='.$base,
$usuario, $contrasinal);
$sql = 'SELECT receita.nome, dificultade,tempo, nomeartistico '
. 'FROM receita inner join chef on cod_chef=chef.codigo'
. ' order by nomeartistico';
$stmt = $db->query($sql);
//Volcamos o resultado da consulta nun obxecto da clase receita
while ($resultado = $stmt->fetchObject('receita')) {
echo "<tr>
<td>".$resultado->formatearNome()."</td>
<td>".$resultado->dificultade."</td>
<td>".$resultado->tempo."</td>
<td>".$resultado->formatearChef()."</td>
</tr>";
}
echo '</table>';
$db = null;
}catch(PDOException $e)
{
print $e->getMessage();
}
?>
1.2.1
Imos modificar a tboa da tarefa 1 para que o nome sexa un enlace que nos leve a unha
nova pxina que amosa informacin relativa aos ingredentes que ten a receita como se amosa a continuacin:
Pxina 18 de 35
b) Tarefa 2_b
Ao premer no enlace Editar dun cocieiro deberase abrir a pxina de edicin do rexistro
que amosar a informacin como se ve a continuacin:
Todos os campos deben ser editables salvo o cdigo que identifica a cada cocieiro.
Sexo e localidade deben ser desplegables que permiten elexir entre os posibles valores.
O botn Cancelar debe devolver Listaxe de cocieiros
Os botns de Actualizar e Eliminar de momento estn desactivados.
c) Tarefa 2_c
Agora imos implementar o botn de Actualizar para que reflexe na base de datos as modificacins que teamos feito nos campos:
Usa parmetros con nome e unha funcin para asociar os valores aos parmetros.
d) Tarefa 2_d
Agora fai o mesmo que na tarefa 2c pero pasa non uses nomes para os parmetros e psaos como un array.
Pxina 19 de 35
Ademis debes engadir unha mensaxe que indique o nmero de rexistros afectados pola
actualizacin que se mostre 4 segundos antes de recargar o rexistro actualizado da base de
datos.
Autoavaliacin
a) Tarefa 2_a
O script que amosa a tboa sera similar ao da tarefa 1. Unicamente cambiara en que
neste caso debemos coller o cdigo, que ser o que usemos no enlace a pxina que amosa os
ingredientes de que consta a receita.
$db= new PDO('mysql:host='.$servidor.';dbname='.$base,
$usuario, $contrasinal);
$sql = 'SELECT receita.codigo, receita.nome, dificultade,
tempo, nomeartistico '
. 'FROM receita inner join chef on cod_chef=chef.codigo';
$stmt = $db->query($sql);
/* Volcamos o resultado da consulta na variable rexistros:
un array de arrays onde cada fila unha fila devolta pola consulta
*/
$filas = $stmt->fetchAll();
foreach ($filas as $fila) {
echo "<tr>
<td><a href=infoReceita.php?cod=".$fila['codigo'].
" title='Ver a receita completa'>"
.$fila['nome'].
"</a></td>
<td>".$fila['dificultade']."</td>
<td>".$fila['tempo']."</td>
<td>".$fila['nomeartistico']."</td>
</tr>";
}
$db = null;
infoReceita.php
<html>
<head>
<TITLE>Receitas</TITLE>
<link rel="stylesheet" href="../public/tarefas.css" />
</head>
<body>
<?php
$servidor = "localhost";
$base = "receitas";
$usuario = "alumno";
$contrasinal = "abc123.";
$db= new PDO('mysql:host='.$servidor.';dbname='.$base,
$usuario, $contrasinal);
// Se existe o cdigo da receita.
if (isset($_GET['cod'])) {
$sql = 'SELECT cod_receita, cod_ingrediente,
receita.nome as receita,'
. 'ingrediente.nome as ingrediente, cantidade, medida '
. 'FROM receita inner join receita_ingrediente '
. 'on receita.codigo=cod_receita inner join ingrediente '
. 'on ingrediente.codigo=cod_ingrediente '
. 'WHERE receita.codigo = ?';
$stmt = $db->prepare($sql);
// executamos a consulta pasndolle como parmetro o cdigo
$resultado = $stmt->execute(array($_GET['cod']));
// obtemos os resultados
$fila = $stmt->fetch();
echo "<div id='contido'><h1>".$fila['receita']."</h1>
<h2>Ingredientes da receita</h2>";
echo "<p class='ingredientes'>".$fila['ingrediente'].
Pxina 20 de 35
b) Tarefa 2_b
ConectarPDO.php
<?php
function dbConnect (){
$servidor = "localhost";
$base = "receitas";
$usuario = "alumno";
$contrasinal = "abc123.";
try {
$db = new PDO('mysql:host='.$servidor.';dbname='.$base,
$usuario, $contrasinal);
}
catch (PDOException $e) {
echo '<p>No conectado !!</p>';
echo $e->getMessage();
exit;
}
return $db;
}
?>
tarefa2b.php
<html>
<head>
<TITLE>Cocieiros</TITLE>
<link rel="stylesheet" href="../../public/tarefas.css" />
</head>
<body>
<div id="contido">
<h1>LISTAXE DE COCIEIROS</h1>
<table>
<tr>
<th>NOME</th>
<th>APELIDOS</th>
<th>NOMEARTSTICO</th>
<th/>
</tr>
<?php
require_once 'ConectarPDO.php';
try{
//Establecemos a conexin co servidor
$db=dbConnect();
$sql = 'SELECT codigo, nome, apelido1, apelido2, nomeartistico '
. 'FROM chef ORDER BY apelido1, apelido2, nome';
$stmt = $db->query($sql);
//Volcamos o resultado da consulta nun array de arrays
//onde cada fila unha fila devolta pola consulta
$filas = $stmt->fetchAll();
foreach ($filas as $fila) {
echo "<tr>
<td>".$fila['nome']."</td>
<td>".$fila['apelido1']." ".$fila['apelido2']."</td>
Pxina 21 de 35
<td>".$fila['nomeartistico']."</td>
<td><a href=editarChef.php?cod=".$fila['codigo'].
" title='Editar a informacin do chef'>"
.'Editar'.
"</a></td>
</tr>";
}
$db = null;
}catch(PDOException $e)
{
print $e->getMessage();
}
?>
</table>
</div>
</body>
</html>
editarChef.php
<html>
<head>
<TITLE>Editar cocieiro</TITLE>
<link rel="stylesheet" href="../../public/tarefas.css" />
</head>
<body>
<div id="contido">
<h1>EDITAR COCIEIRO</h1>
<?php
require_once 'ConectarPDO.php';
try{
//Establecemos a conexin co servidor
$db=dbConnect();
if (isset($_GET['cod'])) {
$sql = 'SELECT * FROM CHEF WHERE CODIGO=? ';
$stmt = $db->prepare($sql);
$filas = $stmt->execute(array($_GET['cod']));
$fila=$stmt->fetch();
if (empty($fila)) {
$filas = "Non se atoparon resultados !!";
}
$sexo="";
if ($fila['sexo']=='H') {
$sexo .= "<option value='H' selected='selected'>
Home</option><option value='M'>Muller</option>";
}
else {
$sexo .="<option value='H'>Home</option>
<option value='M' selected='selected'>Muller</option>";
}
$provincia="";
$sql2 = 'SELECT * FROM PROVINCIA';
$stmt2 = $db->query($sql2);
$filasp = $stmt2->fetchAll();
foreach ($filasp as $filap) {
$provincia.="<option value='".$filap['codigo']."'";
if (strcmp($filap['codigo'],$fila['cod_provincia'])==0){
$provincia.=" selected='selected' ";
}
$provincia.=">".$filap['nome']."</option>";
}
}
}catch(PDOException $e)
{
print $e->getMessage();
}
?>
Pxina 22 de 35
c) Tarefa 2_c
Pxina 23 de 35
Pxina 24 de 35
d) Tarefa 2_d
Temos que modificar a parte da actualizacin de editarChef.php para que quede como se
ve a continuacin:
if (array_key_exists('update', $_POST)) {
$sql = 'UPDATE chef SET nome = ?, apelido1 = ?, apelido2 = ?, '.
'nomeartistico=?, sexo=?, data_nacemento=?, '.
' localidade=?, cod_provincia=? '.
' WHERE codigo = ?';
$stmt = $db->prepare($sql);
$resultado = $stmt->execute(array($_POST['nome'],
$_POST['apelido1'], $_POST['apelido2'],
$_POST['nomeArtistico'], $_POST['sexo'],
$_POST['data'],$_POST['localidade'],
$_POST['provincia'],$_GET['cod']));
if ($resultado==1) {
$count = $stmt->rowCount();
print("Actualizouse $count rexistro.\n");
header("refresh: 4;editarChef.php?cod=".$_GET['cod']);
exit;
} else {
echo '<p>Produciuse un erro na actualizacin..</p>';;
}
}
1.2.2
Pxina 25 de 35
editarChef.php
<html>
<head>
<TITLE>Cocieiros</TITLE>
<link rel="stylesheet" href="../public/tarefas.css" />
</head>
<body>
<div id="contido">
<h1>LISTAXE DE COCIEIROS</h1>
<?php
require_once 'ConectarPDO.php';
try{
//Establecemos a conexin co servidor
$db=dbConnect();
if (isset($_GET['cod'])) {
$sql = 'SELECT * FROM CHEF WHERE CODIGO=? ';
$stmt = $db->prepare($sql);
$filas = $stmt->execute(array($_GET['cod']));
$fila=$stmt->fetch();
if (empty($fila)) {
$filas = "Non se atoparon resultados !!";
}
$sexo="";
if ($fila['sexo']=='H') {
$sexo .="<option value='H' selected='selected'>Home</option>
<option value='M'>Muller</option>";
}
else {
$sexo .="<option value='H'>Home</option>
<option value='M' selected='selected'>Muller</option>";
}
$provincia="";
$sql2 = 'SELECT * FROM PROVINCIA';
$stmt2 = $db->query($sql2);
$filasp = $stmt2->fetchAll();
foreach ($filasp as $filap) {
$provincia.="<option value='".$filap['codigo']."'";
if (strcmp($filap['codigo'],$fila['cod_provincia'])==0){
$provincia.=" selected='selected' ";
}
$provincia.=">".$filap['nome']."</option>";
}
}
if (array_key_exists('update', $_POST)) {
$sql = 'UPDATE chef SET nome = ?, apelido1 = ?, apelido2 = ?, '.
'nomeartistico=?, sexo=?, data_nacemento=?, '.
'localidade=?, cod_provincia=? WHERE codigo = ?';
$stmt = $db->prepare($sql);
$resultado = $stmt->execute(array($_POST['nome'],
$_POST['apelido1'],$_POST['apelido2'],
$_POST['nomeArtistico'], $_POST['sexo'],
$_POST['data'],$_POST['localidade'],
$_POST['provincia'],$_GET['cod']));
if ($resultado==1) {
$count = $stmt->rowCount();
print("Actualizouse $count rexistro.\n");
header("refresh: 4;editarChef.php?cod=".$_GET['cod']);
exit;
} else {
echo '<p>Produciuse un erro na actualizacin..</p>';;
}
}
else if (array_key_exists('delete', $_POST)) {
//como o cocieiro pode ter dependenzas, temos que eliminar
// primeiro stas para poder borralo da base de datos
//Para que non quede a medias empregamos transaccins
$bandeira = true;
Pxina 26 de 35
$db->beginTransaction();
// Borramos os libros que tea escritos este cocieiro
$sql = 'DELETE FROM libro WHERE cod_chef = ?';
$stmt = $db->prepare($sql);
if($stmt->execute(array($_GET['cod'])) == 0)
{ $bandeira = false; }
else {
$count = $stmt->rowCount();
print("<p class='mensaxe'>Borrronse $count libros.</p>");
}
// Borramos os restaurantes que tea este cocieiro
$sql = 'DELETE FROM restaurante WHERE cod_chef = ?';
$stmt = $db->prepare($sql);
if($stmt->execute(array($_GET['cod'])) == 0)
{ $bandeira = false; }
else {
$count = $stmt->rowCount();
print("<p class='mensaxe'>Borrronse $count restaurantes.
</p>");
}
//Borramos as receitas deste cocieiro
$sql = 'DELETE FROM receita_ingrediente '
. 'WHERE cod_receita IN (select codigo '
. 'from receita '
. 'where cod_chef= ?)';
$stmt = $db->prepare($sql);
if($stmt->execute(array($_GET['cod'])) == 0)
{ $bandeira = false; }
else {
$count = $stmt->rowCount();
print("<p class='mensaxe'>Borrronse $count ingredientes
de receitas.</p>");
}
$sql = 'DELETE FROM receita WHERE cod_chef = ?';
$stmt = $db->prepare($sql);
if($stmt->execute(array($_GET['cod'])) == 0)
{ $bandeira = false; }
else {
$count = $stmt->rowCount();
print("<p class='mensaxe'>Borrronse $count receitas.</p>");
}
// Unha vez eliminadas as dependenzas, borramos o cocieiro
$sql2 = 'DELETE FROM CHEF WHERE CODIGO=?';
$stmt2 = $db->prepare($sql2);
if($stmt2->execute( array($_GET['cod'])) == 0) {
$bandeira = false; echo 'estoy aqu2';
} else {
$count = $stmt2->rowCount();
print("<p class='mensaxe'>Borrouse $count cocieiro.</p>");
}
if($bandeira) {
$db->commit();
// Se todo foi ben confirma os cambios
echo '<p class="mensaxe">Eliminado o cocieiro con
cdigo '.$_GET['cod'].'</p>';
header("refresh: 4;url=tarefa3.php");
exit;
} else {
$db->rollback();
// e se non, revrteos
echo '<p class="mensaxe">Produciuse un erro
no borrado...</p>';
}
}
}catch(PDOException $e)
{
Pxina 27 de 35
print $e->getMessage();
}
?>
<form action="" method="post">
<table class="edicion">
<tr><td><label for="codigo">Codigo:</label></td>
<td><input type="number" name="codigo" id="codigo"/
disabled="disabled" value="<?php echo $fila['codigo'];?>">
<br/></td></tr>
<tr><td><label for="nome">Nome:</label></td>
<td><input type="text" name="nome" id="nome"/
value="<?php echo $fila['nome'];?>"><br/></td></tr>
<tr><td><label for="apelido1">Apelidos:</label></td>
<td><input type="text" name="apelido1" id="apelido1"/
value="<?php echo $fila['apelido1'];?>">
<input type="text" name="apelido2" id="apelido2"/
value="<?php echo $fila['apelido2'];?>"><br/></td></tr>
<tr><td><label for="nomeArtistico">Nome artstico:</label></td>
<td><input type="text" name="nomeArtistico" id="nomeArtistico"/
value="<?php echo $fila['nomeartistico'];?>"><br/></td></tr>
<tr><td><label for="sexo">Sexo:</label></td>
<td><select name="sexo" id="sexo">
<?php echo $sexo; ?>
</select></td></tr>
<tr><td><label for="data">Nome:</label></td>
<td><input type="date" name="data" id="data"/
value="<?php echo $fila['data_nacemento'];?>"><br/>
</td></tr>
<tr><td><label for="localidade">Localidade:</label></td>
<td><input type="text" name="localidade" id="localidade"/
value="<?php echo $fila['localidade'];?>"><br/></td></tr>
<tr><td><label for="provincia">Provincia:</label></td>
<td><select name="provincia" id="provincia">
<?php echo $provincia; ?>
</select></td></tr>
<tr><td colspan="2">
<button type="submit" name="update"> Actualizar</button>
<button type="submit" name="delete"
onclick="return confirm('Est seguro que desea eliminar
este cocieiro?')">Eliminar
</button>
<button formaction="tarefa3.php">Cancelar</button></td></tr>
</table>
</form>
</div>
</body>
</html>
Pxina 28 de 35
1.3
1.4
Recursos didcticos
Apuntes do profesor
Ordenador persoal con:
o Software de servidor web Apache ou semellante.
o Intrprete da linguaxe PHP.
o Contorno de desenvolvemento de aplicacins web NetBeans ou semellante.
o Navegador web Firefox ou semellante.
Pxina 29 de 35
3.
Avaliacin
Criterios de avaliacin seleccionados para esta actividade
CA6.2.2 - Creronse aplicacins que establezan conexins con bases de datos
empregando PDO
Instrumento de avaliacin
PE.3 - Relativa a realizacin da conexin
empregando PDO nas tarefas propostas ao
alumnado e a proba prctica realizada ao rematar a
actividade
CA6.3.2 - Recuperouse informacin almacenada en bases de datos empregando PDO PE.5 - Relativa a realizacin de consultas
empregando PDO nas tarefas propostas ao
alumnado e a proba prctica realizada ao rematar a
actividade.
CA6.4 - Publicouse en aplicacins web a informacin recuperada
Pxina 30 de 35
Autoavaliacin
ConectarPDO.php
<?php
function dbConnect (){
$servidor = "localhost";
$base = "receitas";
$usuario = "alumno";
$contrasinal = "abc123.";
try {
$db = new PDO('mysql:host='.$servidor.';dbname='.$base,
$usuario, $contrasinal);
}
catch (PDOException $e) {
echo '<p>No conectado !!</p>';
echo $e->getMessage();
Pxina 31 de 35
exit;
}
return $db;
}
?>
infoLibros.php
<html>
<head>
<TITLE>Libros</TITLE>
<link rel="stylesheet" href="../public/tarefas.css" />
</head>
<body>
<div id="contido">
<h1>LISTAXE DE LIBROS</h1>
<div id="filtro">
<fieldset>
<legend>Filtrar por</legend>
<form action="" method="post">
<label for="titulo">Ttulo:</label>
<input type="text" name="titulo" id="titulo"/>
<label for="orde">Ordenar por:</label>
<select name="orde" id="orde">
<option value='titulo' >Ttulo</option>
<option value='editorial'>Editorial</option>
<option value='chef'>Chef</option>
</select>
<input type="radio" name="senso" value="ASC"
checked="checked">ASC</input>
<input type="radio" name="senso" value="DESC">DESC</input>
<button type="submit" name="filtrar">Filtrar</button>
</form>
</fieldset>
<br/>
</div>
<table>
<tr>
<th>TITULO</th>
<th>EDITORIAL</th>
<th>CHEF</th>
<th/>
</tr>
<?php
require_once 'ConectarPDO.php';
try{
$numRexistros = 7; //Rexistros por pxina
$paxina = 1; //por defecto a paxina ser a primeira
//primero obtemos o parmetro que nos d en qu pxina estamos
if(array_key_exists('pax', $_GET)){
$paxina = $_GET['pax'];
}
//Establecemos a conexin co servidor
$db=dbConnect();
$stmt = $db->query("SELECT * FROM libro");
$totalRexistros = $stmt->rowCount();
//calculamos o nmero de pxinas
$totalPaxinas = ceil($totalRexistros/$numRexistros);
$sql = "SELECT libro.codigo, titulo, editorial,
CONCAT(nome,' ',apelido1,' ',IFNULL(apelido2,''))
as chef FROM chef inner join libro on cod_chef=chef.codigo ";
if (array_key_exists("filtrar",$_POST)) {
$sql.=" WHERE titulo like ?";
$titulo="%".$_POST['titulo']."%";
}
if (array_key_exists("orde",$_POST)) {
$sql.=" ORDER BY ".$_POST['orde'].' '.$_POST['senso'];
Pxina 32 de 35
editarLibro.php
<html>
<head>
<TITLE>Editar libro</TITLE>
<link rel="stylesheet" href="../public/tarefas.css" />
</head>
<body>
<div id="contido">
<h1>EDITAR LIBRO</h1>
<?php
require_once 'ConectarPDO.php';
try{
//Establecemos a conexin co servidor
$db=dbConnect();
if (isset($_GET['cod'])) {
$sql = 'SELECT * FROM LIBRO WHERE CODIGO=? ';
$stmt = $db->prepare($sql);
//
$filas = $stmt->execute(array($_GET['cod']));
$fila=$stmt->fetch();
if (empty($fila)) {
$filas = "Non se atoparon resultados !!";
}
$chef="";
$sql2 = "SELECT codigo, CONCAT(nome,' ',apelido1,' ',
IFNULL(apelido2,''),' - ',
IFNULL(nomeartistico,'')) as chef
FROM CHEF";
$stmt2 = $db->query($sql2);
$filasc = $stmt2->fetchAll();
Pxina 33 de 35
Pxina 34 de 35
</form>
</div>
</body>
</html>
Pxina 35 de 35