Bases de Datos_PDO

35
Dirección Xeral de Educación, Formación Profesional e Innovación Educativa Material para a formación profesional inicial Familia profesional IFC Informática e comunicacións Ciclo formativo CSIFC03 Desenvolvemento de aplicacións web Grao Superior Módulo profesional MP0613 Desenvolvemento web en contorno servidor Unidade didáctica UD6 Programación orientada a obxectos en PHP Actividade A02 Acceso a base de datos empregando PDO Autores Victor M. Lourido Estévez. Margarita Pin Rodríguez Nome do arquivo CSIFC01_ MP0613_UD06_A02_PDO © 2010 Xunta de Galicia. Consellería de Educación e Ordenación Universitaria. Aviso Legal: Reservados todos os dereitos. A presente obra está protexida pola lei, que establece penas de prisión e/ou multas, ademais das co- rrespondentes indemnizacións por danos e prexuízos, para quen reproduza, plaxie ou distribúa o seu contido en calquera tipo de soporte sen a preceptiva autorización. Páxina 1 de 35

description

Teoria sobre bases de datos usando metodo PDO del modulo de entorno servidor del ciclo de diseño de aplicaciones WEB.

Transcript of Bases de Datos_PDO

Page 1: Bases de Datos_PDO

Dirección Xeral de Educación, Formación Profesional e Innovación Educativa

Material para a formación profesional inicial

Familia profesional IFC Informática e comunicacións

Ciclo formativo CSIFC03 Desenvolvemento de aplicacións web

Grao Superior

Módulo profesional MP0613 Desenvolvemento web en contorno servidor

Unidade didáctica UD6 Programación orientada a obxectos en PHP

Actividade A02 Acceso a base de datos empregando PDO

Autores Victor M. Lourido Estévez. Margarita Pin Rodríguez

Nome do arquivo CSIFC01_ MP0613_UD06_A02_PDO

© 2010 Xunta de Galicia.

Consellería de Educación e Ordenación Universitaria.

Aviso Legal: Reservados todos os dereitos.

A presente obra está protexida pola lei, que establece penas de prisión e/ou multas, ademais das co-rrespondentes indemnizacións por danos e prexuízos, para quen reproduza, plaxie ou distribúa o seu contido en calquera tipo de soporte sen a preceptiva autorización.

Páxina 1 de 35

Page 2: Bases de Datos_PDO

Páxina 2 de 35

Page 3: Bases de Datos_PDO

Índice

1.Ficha técnica.....................................................................................................................5

Contexto da actividade.......................................................................................................................... 5Título da actividade............................................................................................................................... 5Resultados de aprendizaxe do currículo................................................................................................ 5Obxectivos didácticos e título e descrición da actividade......................................................................5Criterios de avaliación........................................................................................................................... 6Contidos................................................................................................................................................ 6Actividades de ensino e aprendizaxe e de avaliación, métodos, recursos e instrumentos de avaliación

................................................................................................................................................................. 7

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

1.1Introdución.........................................................................................................................8

1.2Actividade...........................................................................................................................8A extensión PDO................................................................................................................................... 8

Conexión á base de datos........................................................................................................................... 8Execución de consultas............................................................................................................................. 10Consultas preparadas............................................................................................................................... 12Funcións útiles PDO.................................................................................................................................. 13Transaccións............................................................................................................................................. 13

Tarefas..................................................................................................................................15Autoavaliación..................................................................................................................................... 16

1.2.1Tarefa 2. Execución de consultas preparadas..................................................................................................... 18Autoavaliación..................................................................................................................................... 20

1.2.2Tarefa 3. Uso de transaccións............................................................................................................................. 25Autoavaliación..................................................................................................................................... 25

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

1.4Recursos didácticos.........................................................................................................29

3.Avaliación........................................................................................................................30

Exemplo de exercizo a realizar na proba práctica a realizar ao rematar a U.D...................................30Autoavaliación..................................................................................................................................... 31

Páxina 3 de 35

Page 4: Bases de Datos_PDO

Páxina 4 de 35

Page 5: Bases de Datos_PDO

1. Ficha técnicaContexto da actividade

Módulo Duración

Unidade didáctica. Sesións 50´

Actividades Sesións 50´

MP0613. Desenvolvemento web encontorno servidor.

175

UD06. Programación de aplicaciónsweb con acceso a bases de datos

24

A01. Acceso a base de datosMySQL.

14

A02. Acceso a base de datosempregando PDO.

10

NOTA: Esta actividade está vinculada á programación recollida no arquivo CSIFC03_MP0613_UD06_A02.pdf

Título da actividade

Nº Título Descrición Duración

A02 Acceso a base de datos empregando PDO Nesta actividade explicarase como realizar operaciónssobre bases de datos coa extensión PDO.

10

Resultados de aprendizaxe do currículo

Resultados de aprendizaxe do currículo Completo

RA6. Desenvolve aplicacións de acceso a almacéns de datos, aplicando medidas para manter a seguridade e a integridadeda información

Non

Obxectivos didácticos e título e descrición da actividade

Obxectivos específicos Actividade Descrición básica Duración

O1.1 Crear aplicacións que establezanconexións con bases de datos.

A2 Acceso a base de datos empregandoPDO

Nesta actividade explicarase comorealizar operacións sobre bases dedatos coa extensión PDO.

10

O1.2 Recuperar información dunhabase de datos e visualizala nunhapáxina web

O1.3 Crear aplicacións web quepermitan a actualización e aeliminación de información

Páxina 5 de 35

Page 6: Bases de Datos_PDO

dispoñible nunha base de datos.

O1.4 Usar transaccións para manter aconsistencia da información.

Criterios de avaliación

Criterios de avaliación

CA6.2.2 - Creáronse aplicacións que establezan conexións con bases de datos empregando PDO CA6.3.2 - Recuperouse información almacenada en bases de datos empregando PDO CA6.4 - Publicouse en aplicacións web a información recuperada. CA6.5 - Utilizáronse conxuntos de datos para almacenar a información. CA6.6.2 - Creáronse aplicacións web que permitan a actualización e a eliminación de información dispoñible nunha base de datos empregando

PDO CA6.7.2 - Utilizáronse transaccións para manter a consistencia da información empregando PDO CA6.8 - Probáronse e documentáronse as aplicacións. CA6.9 - Identificouse a necesidade do uso de consultas preparadas

Contidos

Contidos

Establecemento de conexións con bases de datos relacionais.– A extensión PDO– Conexión á base de datos– Comprobar que a conexión se estableceu correctamente

Recuperación e edición de información.– Funcións útiles PDO

Visualización da información en páxinas web. Uso de conxuntos de resultados. Mecanismos de edición da información nun cliente web. Execución de sentenzas SQL. Transaccións. Consultas preparadas

Páxina 6 de 35

Page 7: Bases de Datos_PDO

Actividades de ensino e aprendizaxe e de avaliación, métodos, recursos e instrumentos de avaliación

Qué e para qué Cómo Con qué Cómo e con qué sevalora

Duración(sesións)

Actividade(título e descrición)

Profesorado(en termos de tarefas)

Alumnado(tarefas)

Resultados ou produtos

Recursos Instrumentos eprocedementos de

avaliación

A2. Acceso a base de datos empregando PDO Crear aplicacións que

establezan conexións conbases de datos.

Recuperar informacióndunha base de datos evisualizala nunha páxinaweb.

Crear aplicacións web quepermitan a actualización e aeliminación de informacióndispoñible nunha base dedatos.

Usar transaccións paramanter a consistencia dainformación.

Tp1.1 Explicación por parte do profesor decómo realizar conexións a bases de datosMySQL empregando a extensión PDO

Tp1.2 Explicación sobre como realizarconsultas e as distintas posibilidades queexisten para tratar o conxunto de resultados

Tp1.3 Explicación por parte do profesor douso das consultas preparadas empregandoPDO

Tp1.4 Explicación por parte do profesor douso de transaccións empregando PDO

Ta1.1. Programacion de scripts queexecutan consultas e amosan información dabase de datos obtendo os resultados dediferentes maneiras empregando PDO.

Ta1.2 . Realización de operaciónsempregando consultas preparadas

Ta1.3 . Realización de operacións queimplican o uso de transaccións empregandoPDO

Ta1.4 . Realización dunha proba prácticarelativa ao explicado nesta actividade

Scripts coas solucións astarefas

Scripts coa solución áproba práctica

Software de servidor webApache ou semellante.

Intérprete da linguaxePHP.

Contorno dedesenvolvemento deaplicacións webNetBeans ou semellante.

Navegador web Firefoxou semellante

Apuntes proporcionadospolo profesor

Proba escrita relativa árealización das tarefaspropostas aoalumnado e probapráctica relativa áactividade

10

Page 8: Bases de Datos_PDO

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

1.1 IntroduciónEsta actividade ten como obxectivos:

Identificar os principios básicos da programación en capas e a súa aplicaciónempregando a linguaxe PHP.

Coñecer as vantaxes da programación en capas fronte a programación estruturadatradicional.

1.2 Actividade

A extensión PDO

PDO (PHP Data Objects) é unha extensión de PHP que permite abstraerse do sistema xestorde base de datos que se esté a usar.

A extensión MySQLi é unha boa opción para programar unha aplicación que utilicecomo sistema xestor de bases de datos MySQL: Ofrece acceso a todas as características domotor de base de datos, á vez que reduce os tempos de espera na execución de sentenzas.

Non obstante, se no futuro tes que cambiar o SXBD por outro distinto, terás que volverprogramar gran parte do código desta. Por iso, antes de comezar o desenvolvemento, é moiimportante revisar as características específicas do proxecto. No caso de que exista a posibi-lidade, presente ou futura, de utilizar outro servidor como almacenamento, deberás adoptarunha capa de abstracción para o acceso aos datos. Existen varias alternativas como ODBC,pero sen dúbida a opción máis recomendable na actualidade é PDO.

O obxectivo é que se chegado o momento necesitas cambiar o servidor de base de datos,as modificacións que debas realizar no teu código sexan mínimas. Mesmo é posible desen-volver aplicacións preparadas para utilizar un almacenamento ou outro segundo se indiqueno momento da execución, pero este non é o obxectivo principal de PDO. PDO non abstraede forma completa o sistema xestor que se utiliza. Por exemplo, non modifica as sentenzasSQL para adaptalas ás características específicas de cada servidor. Se isto fose necesario,habería que programar unha capa de abstracción completa.

A extensión PDO debe utilizar un driver ou controlador específico para o tipo de base dedatos que se utilice. Podes consultar os controladores dispoñibles na túa instalación de PHPna información que proporciona a función phpinfo.

Mentres que a extensión MySQLi permite programación estructurada e programaciónorientada a obxectos, PDO baséase unicamente nas características de orientación a obxectosde PHP. Para acceder ás funcionalidades da extensión tes que empregar os obxectos queofrece, cos seus métodos e propiedades. Non existen funcións alternativas.

Conexión á base de datos

Para establecer unha conexión cunha base de datos utilizando PDO, debes instanciar unobxecto da clase PDO pasándolle os seguintes parámetros (só o primeiro é obrigatorio):

Páxina 8 de 35

Page 9: Bases de Datos_PDO

orixe de datos (DSN): É unha cadea de texto que indica o tipo de xestor de base de datosao que se vai conectar PDO, seguido do nome da base de datos e do host no que se atopaa base de datos.

nome de usuario con permisos para establecer a conexión.

contrasinal do usuario.

opcións de conexión, almacenadas en forma de array.

Por exemplo, para establecer unha conexión coa base de datos 'receita' fariamos o seguin-te:

$db = new PDO('mysql:host=localhost;dbname=receitas', 'alumno', 'abc123.');

Se como no exemplo, se utiliza o controlador para MySQL, os parámetros específicospara utilizar na cadea DSN (separada unhas doutras polo carácter punto e coma) a continua-ción do prefixo "mysql:" son os seguintes:

host: Nome ou dirección IP do servidor.

Port: Número 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 codificación UTF-8 para os datos que setransmitan, podes usar unha opción específica da conexión:

$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 conexión, podes utilizar o método getAttribute para obter in-formación do estado da conexión e setAttribute para modificar algúns dos parámetrosque afectan a esta. Por exemplo, para obter a versión do servidor podes facer:

$version = $db->getAttribute(PDO::ATTR_SERVER_VERSION);print "Versión: $version";

E se queres por exemplo que che devolva todos os nomes de columnas en maiúsculas:

$db->setAttribute(PDO::ATTR_CASE, PDO::CASE_UPPER);

Comprobar que a conexión se estableceu correctamente

PDO permite notificar os erros lanzando excepcións a través da clase PDOException. Setemos activadas as excepcións, cando se produce un erro, sexa na conexión ou nunhaconsulta, saltará unha excepción que poderemos capturar.

Co método setAttribute podemos modificar o atributo PDO::ATTR_ERRMODE para indicarcomo será o tratamento de excepcións. Este atributo pode tomar os seguintes valores:

PDO::ERRMODE_SILENT: é o valor por defecto. PDO simplemente establecerá él mismo ocódigo de erro para a súa inspección usando os métodos PDO::errorCode() yPDO::errorInfo().

PDO::ERRMODE_WARNING: Ademáis de establecer o código de erro, PDO emitirá unhamensaxe E_WARNING tradicional. Esta configuración é útil durante a depuración eprobas, se queres ver qué problemas teñen ocurrido sen interrumpir o fluxo da aplicación.

Páxina 9 de 35

Page 10: Bases de Datos_PDO

PDO::ERRMODE_EXCEPTION: ademáis de establecer o código de erro, PDO lanzará unhaexcepción de tipo PDOException e establecerá as súas propiedades para reflexar o erro ea información 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(); }

Desconexión da base de datos

Unha vez rematado o traballo coa base de datos, basta con eliminar as referencias aoobxecto para que se peche a conexión e se liberen os recursos.

$db = null;

Execución de consultas

Na súa forma máis básica, executar unha consulta con PDO pode ser exactamente igual quecon calquera das outras extensións. Se a consulta xera un conxunto de datos, como é o casode SELECT usaremos o método query, que devolve un obxecto da clase PDOStatement.

Ao igual que coa extensión MySQLi, en PDO tes varias posibilidades para tratar co con-xunto de resultados devolto polo método query.

fetch() : Obten a seguinte fila dun conxunto de resultados (ou false cando xa nonquedan máis rexistros). Polo que teremos que empregar un bucle para percorrer todos osresultados (filas) da execución 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 método fetch xera e devolve a partir de cada rexistro un array con cla-ves numéricas e asociativas. Para cambiar o seu comportamento, admite un parámetroopcional 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 numéricas.

o PDO::FETCH_BOTH: Devolve un array con claves numéricas e asociativas. É ocomportamento por defecto.

o PDO::FETCH_OBJ: Devolve un obxecto cuxas propiedades se corresponden coscampos 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 método bindColumn. Este método debe ser chamado unha vez

Páxina 10 de 35

Page 11: Bases de Datos_PDO

por cada columna, indicando en cada chamada o número de columna (empezando en1) 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 contén todas as filas do conxunto de resultados.Mentras que con fecth obtiñamos un array cos campos dunha fila, agora obtemos unhamatriz (array de arrays) de dúas dimensións.

$stmt = $db->query("SELECT nome, dificultade FROM receita"); $resultado = $stmt->fetchAll(); foreach ($resultado as $fila) { echo $fila["nome"]." (".$fila["dificultade"].")<br />"; }

Ao igual ca función fetch(), admite un valor como parámetro que determinará cómodevolverá a función os resultados. Novamente FETCH_BOTH é o valor por defecto.

fetchObject(): Obtén a seguinte fila e devólvea como un obxecto. Do mesmo xeitoque coa función fetch_object da extensión mysqli, podemos pasar dous parámetros(opcionais) a esta función: O primeiro sería o nome da clase a instanciar, e o segundo, unarray opcional de parámetros a pasar ao construtor de dita clase. Os campos da fila doconxunto de resultados. Os campos da fila pasan a ser atributos públicos da clase, co calpoderemos acceder a estes dentro da clase sen necesidade de definilos. Pero é unha boapráctica definilos na clase. No caso de definilos, o nome debe coincidir co nome dacolumna.

Se non lle pasamos ningún parámetro, simplemente accederemos ás columna da filacomo se esta fose un obxecto e as columnas fosen propiedades (o que é similar a usar ométodo 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 método query para sentenzas con parámetros externos. Nocaso de usalo, deberemos acompañalo do método quote() para indicar que queremos esca-par (antepoñer '\' aos caracteres problemáticos) un valor. Tamén poderiamos usar mysq-li_real_escape_string() ou real_escape_string(), dependendo de se estamos a usarunha interface procedemental ou orientada a obxectos.

Páxina 11 de 35

Page 12: Bases de Datos_PDO

$stmt = $db->query('SELECT nome FROM receita WHERE nome like ' . $db->quote($cadea));

Na tarefa 1 executaremos consultas e amosaremos información da base de datosobtendo os resultados de diferentes maneiras.

Consultas preparadas

Ao igual que con MySQLi, tamén utilizando PDO podemos preparar consultas parametrizadasno servidor para executalas de forma repetida. O procedemento é similar e mesmo osmétodos a executar teñen practicamente os mesmos nomes.

Para preparar unha consulta no servidor MySQL, deberás utilizar o método prepare daclase PDO. Este método devolve un obxecto da clase PDOStament e encárgase de escapar osparámetros que se lle pasen, evitando problemas coa inxección de SQL. Este obxecto é oque imos usar nas posteriores vinculacións, execucións e recollida de resultados.

Os parámetros pódense 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 parámetro de substitución 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 parámetrosde substitución. E para isto usaremos a función bindValue() ou bindParam().

Así, se usamos parámetros 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 parámetro indica a posición naconsulta do campo a vincular, mentras que coa sintaxe (:) especificamos o campo a vincu-lar na consulta:

$stmt->bindValue(1, $nome); $stmt->bindValue(2, $apelido1);

Ademáis do nome do párametro e o seu valor pdemos indicar o tipo dos parámetros em-pregando 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 funcións 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 parámetros por referencia(e un valor non é unha referencia válida en PHP).

Con bindValue() pódense pasar tanto valores como variables.

Páxina 12 de 35

Page 13: Bases de Datos_PDO

Unha vez preparada a consulta e enlazados os parámetros cos seus valores, execútase aconsulta utilizando o método execute().

$stmt->execute();

Unha característica importante desta función é que permite opcionalmente asignar valo-res dos parámetros no momento de executar a consulta. Para isto, usaremos un array (aso-ciativo ou con claves numéricas dependendo da forma en que indicases os parámetros) nachamada a execute.

$parametros = array(':nome' => 'XOEL', ':apelido1' => 'GARCÍA');$consulta->execute($parametros);

Funcións útiles PDO

A continuación imos ver algunhas funcións útiles cando usamos PDO:

lastInsertId

A función lastInsertId()devolve o id da última fila insertada na base de datos. Podepasárselle como parámetro o nome da columna e, como PDO depende dos drivers do siste-ma xestor de base de datos que se esté a usar, nalgúns casos é necesario especificar o nomeda columna que almacena os identificadores. Esta é unha función 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 función rowCount() devolve o número de filas afectadas pola ultima sentenza de in-serción, borrado ou actualización. Esta é unha función da clase PDOStatement.

$stmt = $db->prepare('DELETE FROM LIBRO WHERE cod_chef=:chef'); $stmt->execute([':chef' => 4]); $count = $stmt->rowCount(); print("Borráronse $count filas.\n");

PDO non asegura que a función rowCount() funcione correctamente en todos os siste-mas xestores de bases de datos para sentenzas de tipo SELECT.

Na tarefa 2 usaremos consultas preparadas para aquelas consultas que teñanparámetros.

Transaccións

Como xa vimos na actividade anterior, as transaccións son un mecanismo que nos aseguraque todas as consultas que forman parte dunha operación se executan de forma segura e, nocaso de que falle algunha das consultas a transacción non se levará a cabo.

Como PDO é unha capa de abstracción sobre múltiples tipos de xestores de bases de datose cada un dos xestores ten regras diferentes, pode suceder que algún destes non admita omecanismo de transaccións. Por exemplo, en MySQL non todos os motores de almacena-mento de táboas soportan transaccións. Os tipos de táboas MyISAM non permiten transac-cións, mentras que as táboas InnoDB sí as permiten.

Páxina 13 de 35

Page 14: Bases de Datos_PDO

Ao igual que pasaba con MySQLi, por defecto PDO traballa en modo autocommit, isto é,confirma de forma automática cada sentenza que executa o servidor. Polo tanto o primeiroque teremos que facer e desactivar o modo autocommit para poder indicar onde remata anosa transacción. Isto faise coa función beginTransaction() que marca o inicio dunhanova transacción.

A transacción finalizará cando se execute un dos seguinte métodos: commit() para con-firmar a transacción actual, ou rollback() para reverter os cambios levados a cabo natransacción actual en caso de producirse algún erro.

A clase PDO ten unha función exec(string $statement), que executa unha sentenzasql e devolve o numero de filas afectadas por esta. E similar a query() pero unicamente éadecuada para consultas de acción xa que non devolve os resultados dunha sentenza SE-LECT.

Debemos ter en conta, que sexa cal sexa o resultado dunha transacción, a conexión á basede datos volve estar en modo autocommit ata que iniciemos unha nova transacción con be-ginTransaction().

$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 cambioselse $db->rollback(); // e se non, revérteos

Na tarefa 3 executaremos operacións que implican o uso de transaccións.

Páxina 14 de 35

Page 15: Bases de Datos_PDO

TarefasAs tarefas propostas son as seguintes.

Tarefa 1. Execución de consultas. Nesta tarefa 1executaremos consultas e amosaremosinformación da base de datos obtendo os resultados de diferentes maneiras.

Tarefa 2. Execución de consultas preparadas. Nesta tarefa usaremos consultaspreparadas para aquelas consultas que teñan parámetros.

Tarefa 3. Uso de transaccións. Nesta tarefa executaremos operacións que implican ouso de transaccións.

Páxina 15 de 35

Page 16: Bases de Datos_PDO

Tarefa 1. Execución de consultas

a) Tarefa 1_a

Empregando PDO amosa a seguinte información da base de datos receitas. O resultadodebes 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 eque terá dous métodos para dar formato ao nome da receita e do chef como se ve a continua-ción:

Autoavaliación

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 conexión co servidor

Páxina 16 de 35

Page 17: Bases de Datos_PDO

$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 acontinuación:

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

Páxina 17 de 35

Page 18: Bases de Datos_PDO

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 conexión 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. Execución de consultas preparadas.

a) Tarefa 2_a

Imos modificar a táboa da tarefa 1 para que o nome sexa un enlace que nos leve a unhanova páxina que amosa información relativa aos ingredentes que ten a receita como se amo-sa a continuación:

Ao seleccionar unha receita levaranos á seguinte páxina:

Páxina 18 de 35

Page 19: Bases de Datos_PDO

b) Tarefa 2_b

Empregando PDO amosa a seguinte información dos cociñeiros:

Ao premer no enlace Editar dun cociñeiro deberase abrir a páxina de edición do rexistroque amosará a información como se ve a continuación:

Todos os campos deben ser editables salvo o código que identifica a cada cociñeiro.

Sexo e localidade deben ser desplegables que permiten elexir entre os posibles valores.

O botón Cancelar debe devolver á Listaxe de cociñeiros

Os botóns de Actualizar e Eliminar de momento están desactivados.

c) Tarefa 2_c

Agora imos implementar o botón de Actualizar para que reflexe na base de datos as mo-dificacións que teñamos feito nos campos:

Usa parámetros con nome e unha función para asociar os valores aos parámetros.

d) Tarefa 2_d

Agora fai o mesmo que na tarefa 2c pero pasa non uses nomes para os parámetros e pása-os como un array.

Páxina 19 de 35

Page 20: Bases de Datos_PDO

Ademáis debes engadir unha mensaxe que indique o número de rexistros afectados polaactualización que se mostre 4 segundos antes de recargar o rexistro actualizado da base dedatos.

Autoavaliación

a) Tarefa 2_a

O script que amosa a táboa sería similar ao da tarefa 1. Unicamente cambiaría en queneste caso debemos coller o código, que será o que usemos no enlace a páxina que amosa osingredientes 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 código 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 pasándolle como parámetro o código$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'].

Páxina 20 de 35

Page 21: Bases de Datos_PDO

": ".$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

<?phpfunction 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>Cociñeiros</TITLE> <link rel="stylesheet" href="../../public/tarefas.css" /></head> <body> <div id="contido"> <h1>LISTAXE DE COCIÑEIROS</h1> <table> <tr> <th>NOME</th> <th>APELIDOS</th> <th>NOMEARTÍSTICO</th> <th/> </tr><?php require_once 'ConectarPDO.php'; try{ //Establecemos a conexión 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>

Páxina 21 de 35

Page 22: Bases de Datos_PDO

<td>".$fila['nomeartistico']."</td> <td><a href=editarChef.php?cod=".$fila['codigo']. " title='Editar a información do chef'>" .'Editar'. "</a></td> </tr>"; } $db = null; }catch(PDOException $e) { print $e->getMessage(); } ?> </table> </div></body></html>

editarChef.php

<html> <head> <TITLE>Editar cociñeiro</TITLE> <link rel="stylesheet" href="../../public/tarefas.css" /></head> <body> <div id="contido"> <h1>EDITAR COCIÑEIRO</h1> <?php require_once 'ConectarPDO.php'; try{ //Establecemos a conexión 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(); } ?>

Páxina 22 de 35

Page 23: Bases de Datos_PDO

<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 artístico:</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 páxina editarChef.php para implementar o botón:

html> <head> <TITLE>Cociñeiros</TITLE> <link rel="stylesheet" href="../../public/tarefas.css" /></head> <body> <div id="contido"> <h1>LISTADO DE COCIÑEIROS</h1> <?php require_once 'ConectarPDO.php'; try{ //Establecemos a conexión 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') {

Páxina 23 de 35

Page 24: Bases de Datos_PDO

$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 actualización..</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 artístico:</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>

Páxina 24 de 35

Page 25: Bases de Datos_PDO

<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 actualización de editarChef.php para que quede como seve a continuación:

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 actualización..</p>';; } }

1.2.2 Tarefa 3. Uso de transaccións

Agora tes que codificar o botón de Eliminar da tarefa anterior. Para elo debes ter en contaque para eliminar un cociñeiro debes eliminar todas as dependencias deste:

Ten en conta que a base de datos debe quedar consistente, co cal ou ben se elimina toda ainformación do cociñeiro, ou non se fará ningunha modificación.

Solicita unha confirmación antes de proceder a facer a operación.

Unha vez eliminado o cociñeiro da unha mensaxe informativa dos distintos elementoseliminados da base de datos, que debe permanecer 4 segundos en pantalla, antes dedevolvernos á listaxe de cociñeiros.

Autoavaliación

Temos que engadir a parte correspondiente á eliminación ao script editarChef.php:

Páxina 25 de 35

Page 26: Bases de Datos_PDO

editarChef.php

<html> <head> <TITLE>Cociñeiros</TITLE> <link rel="stylesheet" href="../public/tarefas.css" /></head> <body> <div id="contido"> <h1>LISTAXE DE COCIÑEIROS</h1> <?php require_once 'ConectarPDO.php'; try{ //Establecemos a conexión 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 actualización..</p>';; } } else if (array_key_exists('delete', $_POST)) { //como o cociñeiro pode ter dependenzas, temos que eliminar // primeiro éstas para poder borralo da base de datos //Para que non quede a medias empregamos transaccións $bandeira = true;

Páxina 26 de 35

Page 27: Bases de Datos_PDO

$db->beginTransaction(); // Borramos os libros que teña escritos este cociñeiro $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'>Borráronse $count libros.</p>"); }

// Borramos os restaurantes que teña este cociñeiro $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'>Borráronse $count restaurantes. </p>"); }

//Borramos as receitas deste cociñeiro $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'>Borráronse $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'>Borráronse $count receitas.</p>"); } // Unha vez eliminadas as dependenzas, borramos o cociñeiro $sql2 = 'DELETE FROM CHEF WHERE CODIGO=?'; $stmt2 = $db->prepare($sql2);

if($stmt2->execute( array($_GET['cod'])) == 0) { $bandeira = false; echo 'estoy aquí2'; } else { $count = $stmt2->rowCount(); print("<p class='mensaxe'>Borrouse $count cociñeiro.</p>"); }

if($bandeira) { $db->commit(); // Se todo foi ben confirma os cambios echo '<p class="mensaxe">Eliminado o cociñeiro con código '.$_GET['cod'].'</p>'; header("refresh: 4;url=tarefa3.php"); exit; } else { $db->rollback(); // e se non, revérteos echo '<p class="mensaxe">Produciuse un erro no borrado...</p>'; } } }catch(PDOException $e) {

Páxina 27 de 35

Page 28: Bases de Datos_PDO

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 artístico:</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 cociñeiro?')">Eliminar </button> <button formaction="tarefa3.php">Cancelar</button></td></tr> </table> </form> </div></body></html>

Páxina 28 de 35

Page 29: Bases de Datos_PDO

1.3 Textos de apoio ou de referencia http://www.php.net/, documentación sobre a linguaxe PHP.

http://www.w3schools.com/php/default.asp, documentación sobre a linguaxe PHP

1.4 Recursos didácticos Apuntes do profesor

Ordenador persoal con:

o Software de servidor web Apache ou semellante.

o Intérprete da linguaxe PHP.

o Contorno de desenvolvemento de aplicacións web NetBeans ou semellante.

o Navegador web Firefox ou semellante.

Páxina 29 de 35

Page 30: Bases de Datos_PDO

3. AvaliaciónCriterios de avaliación seleccionados para esta actividade Instrumento de avaliación

CA6.2.2 - Creáronse aplicacións que establezan conexións con bases de datos empregando PDO

PE.3 - Relativa a realización da conexión empregando PDO nas tarefas propostas ao alumnado e a proba práctica realizada ao rematar a actividade

CA6.3.2 - Recuperouse información almacenada en bases de datos empregando PDO PE.5 - Relativa a realización de consultas empregando PDO nas tarefas propostas ao alumnado e a proba práctica realizada ao rematar a actividade.

CA6.4 - Publicouse en aplicacións web a información recuperada PE.6 - Relativa á publicación da información recuperada nas tarefas propostas ao alumnado e a proba práctica realizada ao rematar a actividade

CA6.5 - Utilizáronse conxuntos de datos para almacenar a información PE.7 - Relativa á utlilizació nde conxuntos de datos nas tarefas propostas ao alumnado e a proba práctica realizada ao rematar a actividade

CA6.6.2 - Creáronse aplicacións web que permitan a actualización e a eliminación de información dispoñible nunha base de datos empregando PDO

PE.9 - Relativa á realización de consultas de acción empregando PDO nas tarefas propostas ao alumnado e a proba práctica realizada ao rematar a actividade

CA6.7.2 - Utilizáronse transaccións para manter a consistencia da información empregando PDO

PE.11 - Relativa á utilización de transaccións empregando PDO nas tarefas propostas ao alumnado e a proba práctica realizada ao rematar a actividade

CA6.8 - Probáronse e documentáronse as aplicacións PE.12 - Relativa á documentación das tarefas propostas ao alumnado e da proba práctica realizadaao rematar a actividade

CA6.9 - Identificouse a necesidade do uso de consultas preparadas PE.13 - Relativa á utilización de consultas preparadas nas tarefas propostas ao alumnado e a proba práctica realizada ao rematar a actividade

Exemplo de exercizo a realizar na proba práctica a realizar ao rematar a U.D.

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

A conexión á base de datos faraa nun script de nome conectarPDO.

Un script que amose un listado de libros segundo se ve na imaxe:

Páxina 30 de 35

Page 31: Bases de Datos_PDO

o A información aparecerá paxinada (no exemplo 7 rexistros por páxina)

o Inicialmente amosará toda a información en orde ascendente por título, pero permitirá:

– Filtrar os libros, amosando unicamente os que conteñen o texto escrito no cadro Título.

– Ordenar a información por título, editorial ou chef de xeito ascendente ou descendente.

Cando se prema en Editar amosarase unha ficha do libro segundo se amosa acontinuación:

Autoavaliación

ConectarPDO.php

<?phpfunction 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();

Páxina 31 de 35

Page 32: Bases de Datos_PDO

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">Título:</label> <input type="text" name="titulo" id="titulo"/> <label for="orde">Ordenar por:</label> <select name="orde" id="orde"> <option value='titulo' >Título</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 páxina $paxina = 1; //por defecto a paxina será a primeira //primero obtemos o parámetro que nos dí en qué páxina estamos if(array_key_exists('pax', $_GET)){ $paxina = $_GET['pax']; } //Establecemos a conexión co servidor $db=dbConnect(); $stmt = $db->query("SELECT * FROM libro"); $totalRexistros = $stmt->rowCount(); //calculamos o número de páxinas $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'];

Páxina 32 de 35

Page 33: Bases de Datos_PDO

} else $sql.=" ORDER BY titulo"; // obtenemos o segmento paxinado que corresponde a esta páxina $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 información 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 conexión 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();

Páxina 33 de 35

Page 34: Bases de Datos_PDO

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 actualización..</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'>Borráronse $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">Título:</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">Páxinas:</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>

Páxina 34 de 35

Page 35: Bases de Datos_PDO

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

Páxina 35 de 35