Anda di halaman 1dari 35

Direccin Xeral de Educacin, Formacin Profesional e Innovacin Educativa

Material para
a formacin profesional inicial
Familia profesional

IFC

Informtica e comunicacins

Ciclo formativo

CSIFC03

Desenvolvemento de aplicacins web

Grao

Superior

Mdulo profesional

MP0613

Desenvolvemento web en contorno servidor

Unidade didctica

UD6

Programacin orientada a obxectos en PHP

Actividade

A02

Acceso a base de datos empregando PDO

Autores

Victor M. Lourido Estvez. Margarita Pin Rodrguez

Nome do arquivo

CSIFC01_ MP0613_UD06_A02_PDO

2010 Xunta de Galicia.


Consellera de Educacin e Ordenacin Universitaria.
Aviso Legal: Reservados todos os dereitos.
A presente obra est protexida pola lei, que establece penas de prisin e/ou multas, ademais das correspondentes indemnizacins por danos e prexuzos, para quen reproduza, plaxie ou distriba o seu
contido en calquera tipo de soporte sen a preceptiva autorizacin.

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

2.A1. Acceso a base de datos em-pregando PDO............................................................8


1.1Introducin......................................................................................................................... 8
1.2Actividade........................................................................................................................... 8
A extensin PDO................................................................................................................................... 8
Conexin base de datos........................................................................................................................... 8
Execucin de consultas............................................................................................................................. 10
Consultas preparadas............................................................................................................................... 12
Funcins tiles PDO.................................................................................................................................. 13
Transaccins............................................................................................................................................. 13

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

1.3Textos de apoio ou de referencia.....................................................................................29


1.4Recursos didcticos.........................................................................................................29

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

MP0613. Desenvolvemento web en


contorno servidor.

Unidade didctica.

Sesi
ns 50

Actividades

Sesi
ns 50

175

UD06. Programacin de aplicacins


web con acceso a bases de datos

24

A01. Acceso a base de datos


MySQL.

14

A02. Acceso a base de datos


empregando PDO.

10

NOTA: Esta actividade est vinculada programacin recollida no arquivo CSIFC03_MP0613_UD06_A02.pdf

Ttulo da actividade
N

Ttulo

Descricin

Duracin

A02

Acceso a base de datos empregando PDO

Nesta actividade explicarase como realizar operacins


sobre bases de datos coa extensin PDO.

10

Resultados de aprendizaxe do currculo


Resultados de aprendizaxe do currculo

Completo

RA6. Desenvolve aplicacins de acceso a almacns de datos, aplicando medidas para manter a seguridade e a integridade
da informacin

Non

Obxectivos didcticos e ttulo e descricin da actividade


Obxectivos especficos
O1.1

Crear aplicacins que establezan A2


conexins con bases de datos.

O1.2

Recuperar informacin dunha


base de datos e visualizala nunha
pxina web

O1.3

Crear aplicacins web que


permitan a actualizacin e a
eliminacin
de
informacin

Actividade

Descricin bsica

Acceso a base de datos empregando Nesta actividade explicarase como


PDO
realizar operacins sobre bases de
datos coa extensin PDO.

Pxina 5 de 35

Duracin
10

dispoible nunha base de datos.


O1.4

Usar transaccins para manter a


consistencia da informacin.

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

Conexin base de datos


Comprobar que a conexin se estableceu correctamente
Recuperacin e edicin de informacin.

Funcins tiles PDO


Visualizacin da informacin en pxinas web.
Uso de conxuntos de resultados.
Mecanismos de edicin da informacin nun cliente web.
Execucin de sentenzas SQL.
Transaccins.
Consultas preparadas

Pxina 6 de 35

Actividades de ensino e aprendizaxe e de avaliacin, mtodos, recursos e instrumentos de avaliacin


Qu e para qu

Cmo

Actividade
(ttulo e descricin)

Profesorado
(en termos de tarefas)

A2. Acceso a base de datos


empregando PDO
Crear
aplicacins
que
establezan conexins con
bases de datos.
Recuperar
informacin
dunha base de datos e
visualizala nunha pxina
web.
Crear aplicacins web que
permitan a actualizacin e a
eliminacin de informacin
dispoible nunha base de
datos.
Usar transaccins para
manter a consistencia da
informacin.

Tp1.1 Explicacin por parte do profesor de


cmo realizar conexins a bases de datos
MySQL empregando a extensin PDO
Tp1.2 Explicacin sobre como realizar
consultas e as distintas posibilidades que
existen para tratar o conxunto de resultados
Tp1.3 Explicacin por parte do profesor do
uso das consultas preparadas empregando
PDO
Tp1.4 Explicacin por parte do profesor do
uso de transaccins empregando PDO

Alumnado
(tarefas)

Resultados
ou produtos

Ta1.1. Programacion de scripts que Scripts coas solucins as


executan consultas e amosan informacin da
tarefas
base de datos obtendo os resultados de Scripts coa solucin
diferentes maneiras empregando PDO.
proba prctica
Ta1.2 . Realizacin de operacins
empregando consultas preparadas
Ta1.3 . Realizacin de operacins que
implican o uso de transaccins empregando
PDO
Ta1.4 . Realizacin dunha proba prctica
relativa ao explicado nesta actividade

Con qu

Cmo e con qu se
valora

Recursos

Instrumentos e
procedementos de
avaliacin

Software de servidor web Proba escrita relativa


Apache ou semellante.
realizacin das tarefas
propostas
ao
Intrprete da linguaxe
alumnado e proba
PHP.
prctica relativa
Contorno
de
actividade
desenvolvemento
de
aplicacins
web
NetBeans ou semellante.
Navegador web Firefox
ou semellante
Apuntes proporcionados
polo profesor

Duracin
(sesins)

10

2.

A1. Acceso a base de datos empregando PDO

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.');

Se como no exemplo, se utiliza o controlador para MySQL, os parmetros especficos


para utilizar na cadea DSN (separada unhas doutras polo carcter punto e coma) a continuacin do prefixo "mysql:" son os seguintes:
host: Nome ou direccin IP do servidor.
Port: Nmero de porto TCP no que escoita o servidor.
dbname: Nome da base de datos.
unix_socket: Socket de MySQL en sistemas Unix.
Se quixeses indicar ao servidor MySQL utilice codificacin UTF-8 para os datos que se
transmitan, podes usar unha opcin especfica da conexin:
$opcions = array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8");
$db = new PDO('mysql:host=localhost;dbname= receitas', 'alumno',
'abc123.', $opcions);

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);

Comprobar que a conexin se estableceu correctamente

PDO permite notificar os erros lanzando excepcins a travs da clase PDOException. Se


temos activadas as excepcins, cando se produce un erro, sexa na conexin ou nunha
consulta, saltar unha excepcin que poderemos capturar.
Co mtodo setAttribute podemos modificar o atributo PDO::ATTR_ERRMODE para indicar
como ser o tratamento de excepcins. Este atributo pode tomar os seguintes valores:
PDO::ERRMODE_SILENT: o valor por defecto. PDO simplemente establecer l mismo o
cdigo de erro para a sa inspeccin usando os mtodos PDO::errorCode() y
PDO::errorInfo().

PDO::ERRMODE_WARNING: Ademis de establecer o cdigo de erro, PDO emitir unha


mensaxe E_WARNING tradicional. Esta configuracin til durante a depuracin e
probas, se queres ver qu problemas teen ocurrido sen interrumpir o fluxo da aplicacin.
Pxina 9 de 35

PDO::ERRMODE_EXCEPTION: ademis de establecer o cdigo de erro, PDO lanzar unha


excepcin de tipo PDOException e establecer as sas propiedades para reflexar o erro e
a informacin do mesmo.
try{
$db = new PDO('mysql:host=localhost;dbname=receitas', 'alumno',
'abc123.');
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
}catch(PDOException $e)
{
print $e->getMessage();
}

Desconexin da base de datos

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

por cada columna, indicando en cada chamada o nmero de columna (empezando en


1) e a variable a asignar.
$stmt = $db->query("SELECT nome, dificultade FROM receita");
$stmt->bindColumn(1, $nome);
$stmt->bindColumn(2, $dificultade);
while ($rexistro = $stmt->fetch(PDO::FETCH_BOUND)) {
echo $nome." (".$dificultade.")<br />";
}

fecthAll(): Devolve un array que contn todas as filas do conxunto de resultados.


Mentras que con fecth obtiamos un array cos campos dunha fila, agora obtemos unha
matriz (array de arrays) de das dimensins.
$stmt = $db->query("SELECT nome, dificultade FROM receita");
$resultado = $stmt->fetchAll();
foreach ($resultado as $fila) {
echo $fila["nome"]." (".$fila["dificultade"].")<br />";
}

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

$stmt = $db->query('SELECT nome FROM receita


WHERE nome like ' . $db->quote($cadea));

Na tarefa 1 executaremos consultas e amosaremos informacin da base de datos


obtendo os resultados de diferentes maneiras.
Consultas preparadas

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=?');

Ou pode indicarse o nome do parmetro de substitucin precedido por dous (:).


$stmt = $db->prepare('SELECT * FROM chef
WHERE nome=:param_nome and Apelido1=:param_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);

E se optamos polos signos de consulta (?) o primeiro parmetro indica a posicin na


consulta do campo a vincular, mentras que coa sintaxe (:) especificamos o campo a vincular na consulta:
$stmt->bindValue(1, $nome);
$stmt->bindValue(2, $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);

Funcins tiles PDO

A continuacin imos ver algunhas funcins tiles cando usamos PDO:


lastInsertId

A funcin lastInsertId()devolve o id da ltima fila insertada na base de datos. Pode


pasrselle como parmetro o nome da columna e, como PDO depende dos drivers do sistema xestor de base de datos que se est a usar, nalgns casos necesario especificar o nome
da columna que almacena os identificadores. Esta unha funcin da clase PDO.
$stmt = $db->prepare('INSERT INTO libro (titulo, editorial,cod_chef)
VALUES (:tit,:edi,:chef)');
$stmt->execute([':tit' => 'Recetas para nenos',
':edi' => 'Rico-Rico',':chef' => 4]);
var_dump($db->lastInsertId());

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

tarefa 2 usaremos consultas preparadas para aquelas consultas que tean


parmetros.

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;

if($bandeira) $db->commit(); // Se todo foi ben confirma os cambios


else $db->rollback();
// e se non, revrteos

Na tarefa 3 executaremos operacins que implican o uso de transaccins.

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

Tarefa 1. Execucin de consultas


a) Tarefa 1_a

Empregando PDO amosa a seguinte informacin da base de datos receitas. O resultado


debes obtelo como unha matriz onde cada fila un rexistro devolto pola consulta:

b) Tarefa 1_b

Agora amosa o mesmo resultado pero asignando os valores do rexistro a variables.


c) Tarefa 1_c

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

$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 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>".$fila['nome']."</td>
<td>".$fila['dificultade']."</td>
<td>".$fila['tempo']."</td>
<td>".$fila['nomeartistico']."</td>
</tr>";
}
echo '</table>';
$db = null;
}catch(PDOException $e)
{
print $e->getMessage();
}
?>

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

Tarefa 2. Execucin de consultas preparadas.


a) Tarefa 2_a

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:

Ao seleccionar unha receita levaranos seguinte pxina:

Pxina 18 de 35

b) Tarefa 2_b

Empregando PDO amosa a seguinte informacin dos cocieiros:

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

": ".$fila['cantidade']." ".$fila['medida']."</p>";


while($fila = $stmt->fetch()) {
echo "<p class='ingredientes'>".$fila['ingrediente'].
": ".$fila['cantidade']." ".$fila['medida']."</p>";
}
echo "</div>";
}
?>
<div id="paxinado">
<p><a href="tarefa2.php">&lt;&lt; Volver</a></p>
</div>
<body>
</html>

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

<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">Data de nacemento:</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" disabled="disabled">
Actualizar</button>
<button type="submit" name="delete" disabled="disabled">
Eliminar</button>
<button formaction="tarefa2b.php">Cancelar</button>
</td></tr>
</table>
</form>
</div>
</body>
</html>

c) Tarefa 2_c

Temos que modificar a pxina editarChef.php para implementar o botn:


html>
<head>
<TITLE>Cocieiros</TITLE>
<link rel="stylesheet" href="../../public/tarefas.css" />
</head>
<body>
<div id="contido">
<h1>LISTADO 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') {

Pxina 23 de 35

$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 = :nome, apelido1 = :ape1, '.
'apelido2 = :ape2, nomeartistico=:art, sexo=:sexo, '.
'data_nacemento=:data, localidade=:local, '.
' cod_provincia=:prv WHERE codigo = :codigo';
$stmt = $db->prepare($sql);
$stmt->bindValue(':nome', $_POST['nome'],PDO::PARAM_STR);
$stmt->bindValue(':ape1', $_POST['apelido1'],PDO::PARAM_STR);
$stmt->bindValue(':ape2', $_POST['apelido2'],PDO::PARAM_STR);
$stmt->bindValue(':art', $_POST['nomeArtistico'],
PDO::PARAM_STR);
$stmt->bindValue(':sexo', $_POST['sexo'],PDO::PARAM_STR);
$stmt->bindValue(':data', $_POST['data'],PDO::PARAM_STR);
$stmt->bindValue(':local', $_POST['localidade'],PDO::PARAM_STR);
$stmt->bindValue(':prv', $_POST['provincia'],PDO::PARAM_STR);
$stmt->bindValue(':codigo', $_GET['cod'], PDO::PARAM_INT);
$resultado = $stmt->execute();
if ($resultado==1) {
header("refresh: 2;editarChef.php?cod=".$_GET['cod']);
exit;
} else {
echo '<p>Produciuse un erro na actualizacin..</p>';;
}
}
}catch(PDOException $e)
{
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>

Pxina 24 de 35

<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" disabled="disabled">
Eliminar</button>
<button formaction="tarefa2c.php">Cancelar</button></td></tr>
</table>
</form>
</div>
</body>
</html>

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

Tarefa 3. Uso de transaccins


Agora tes que codificar o botn de Eliminar da tarefa anterior. Para elo debes ter en conta
que para eliminar un cocieiro debes eliminar todas as dependencias deste:
Ten en conta que a base de datos debe quedar consistente, co cal ou ben se elimina toda a
informacin do cocieiro, ou non se far ningunha modificacin.
Solicita unha confirmacin antes de proceder a facer a operacin.
Unha vez eliminado o cocieiro da unha mensaxe informativa dos distintos elementos
eliminados da base de datos, que debe permanecer 4 segundos en pantalla, antes de
devolvernos listaxe de cocieiros.
Autoavaliacin

Temos que engadir a parte correspondiente eliminacin ao script editarChef.php:

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

Textos de apoio ou de referencia


http://www.php.net/, documentacin sobre a linguaxe PHP.
http://www.w3schools.com/php/default.asp, documentacin sobre a linguaxe PHP

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

PE.6 - Relativa publicacin da informacin


recuperada nas tarefas propostas ao alumnado e a
proba prctica realizada ao rematar a actividade

CA6.5 - Utilizronse conxuntos de datos para almacenar a informacin

PE.7 - Relativa utlilizaci nde conxuntos de datos


nas tarefas propostas ao alumnado e a proba
prctica realizada ao rematar a actividade

CA6.6.2 - Creronse aplicacins web que permitan a actualizacin e a eliminacin de


informacin dispoible nunha base de datos empregando PDO

PE.9 - Relativa realizacin de consultas de accin


empregando PDO nas tarefas propostas ao
alumnado e a proba prctica realizada ao rematar a
actividade

CA6.7.2 - Utilizronse transaccins para manter a consistencia da informacin


empregando PDO

PE.11 - Relativa utilizacin de transaccins


empregando PDO nas tarefas propostas ao
alumnado e a proba prctica realizada ao rematar a
actividade

CA6.8 - Probronse e documentronse as aplicacins

PE.12 - Relativa documentacin das tarefas


propostas ao alumnado e da proba prctica realizada
ao rematar a actividade

CA6.9 - Identificouse a necesidade do uso de consultas preparadas

PE.13 - Relativa utilizacin de consultas


preparadas nas tarefas propostas ao alumnado e a
proba prctica realizada ao rematar a actividade

Exemplo de exercizo a realizar na proba prctica a realizar ao rematar a U.D.

Sobre a base de datos receitas realiza os seguintes scripts en php:


A conexin base de datos faraa nun script de nome conectarPDO.
Un script que amose un listado de libros segundo se ve na imaxe:

Pxina 30 de 35

o A informacin aparecer paxinada (no exemplo 7 rexistros por pxina)


o Inicialmente amosar toda a informacin en orde ascendente por ttulo, pero permitir:
Filtrar os libros, amosando unicamente os que conteen o texto escrito no cadro
Ttulo.
Ordenar a informacin por ttulo, editorial ou chef de xeito ascendente ou
descendente.
Cando se prema en Editar amosarase unha ficha do libro segundo se amosa a
continuacin:

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

} else $sql.=" ORDER BY titulo";


// obtenemos o segmento paxinado que corresponde a esta pxina
$sql.=" LIMIT ".(($paxina-1)*$numRexistros).", $numRexistros ";
$stmt = $db->prepare($sql);
$stmt->bindParam(1,$titulo, PDO::PARAM_STR);
$stmt->execute();
//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>".$fila['titulo']."</td>
<td>".$fila['editorial']."</td>
<td>".$fila['chef']."</td>
<td><a href=editarLibro.php?cod=".$fila['codigo'].
" title='Editar a informacin do libro'>"
.'Editar'.
"</a></td>
</tr>";
}
$db = null;
echo '</table><br/><br/><div id="paxinado">';
//enlaces para o paxinado
for($i=0; $i<$totalPaxinas;$i++){
echo '<a href="aval.php?pax='.($i+1).'">'.($i+1).'</a> | ';
}
echo '</div>';
}catch(PDOException $e)
{
print $e->getMessage();
}
?>
</div>
</body></html>

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

foreach ($filasc as $filac) {


$chef.="<option value='".$filac['codigo']."'";
if (strcmp($filac['codigo'],$fila['cod_chef'])==0){
$chef.=" selected='selected' ";
}
$chef.=">".$filac['chef']."</option>";
}
}
if (array_key_exists('update', $_POST)) {
$sql = 'UPDATE libro SET titulo = ?, editorial = ?, '.
'paxinas=?, cod_chef=? WHERE codigo = ?';
$stmt = $db->prepare($sql);
$resultado = $stmt->execute(array($_POST['titulo'],
$_POST['editorial'], $_POST['paxinas'],
$_POST['chef'],$_GET['cod']));
if ($resultado==1) {
$count = $stmt->rowCount();
print("Actualizouse $count rexistro.\n");
header("refresh: 4;editarLibro.php?cod=".$_GET['cod']);
exit;
} else {
echo '<p>Produciuse un erro na actualizacin..</p>';;
}
}
else if (array_key_exists('delete', $_POST)) {
$sql = 'DELETE FROM libro WHERE codigo = ?';
$stmt = $db->prepare($sql);
if($stmt->execute(array($_GET['cod'])) == 0)
{ print("<p class='mensaxe'>Erro ao eliminar o libro.</p>");
}
else {
$count = $stmt->rowCount();
print("<p class='mensaxe'>Borrronse $count libros.</p>");
}
}
}catch(PDOException $e)
{
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="titulo">Ttulo:</label></td>
<td><input type="text" name="titulo" id="titulo"/
value="<?php echo $fila['titulo'];?>"><br/>
</td></tr>
<tr><td><label for="editorial">Editorial:</label></td>
<td><input type="text" name="editorial" id="editorial"/
value="<?php echo $fila['editorial'];?>"><br/>
</td></tr>
<tr><td><label for="paxinas">Pxinas:</label></td>
<td><input type="text" name="paxinas" id="paxinas"/
value="<?php echo $fila['paxinas'];?>"><br/>
</td></tr>
<tr><td><label for="chef">Chef:</label></td>
<td><select name="chef" id="chef"><?php echo $chef; ?></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 libro?')">
Eliminar</button>
<button formaction="aval.php">Cancelar</button></td></tr>
</table>

Pxina 34 de 35

</form>
</div>
</body>
</html>

Pxina 35 de 35

Anda mungkin juga menyukai