You are on page 1of 30

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 de aplicacins web con acceso a bases de


datos

Actividade

A01

Acceso a base de datos MySQL

Autores

Victor M. Lourido Estvez. Margarita Pin Rodrguez

Nome do arquivo

CSIFC01_ MP0613_UD06_A01_BD

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 36

Pxina 2 de 36

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 MySQL..............................................................................8


1.1Introducin.........................................................................................................................8
1.2Actividade...........................................................................................................................8
Acceso a base de datos........................................................................................................................8
APIs de PHP para acceder s bases de datos de MySQL ...........................................................................8

A extensin mysqli.................................................................................................................................9
Configuracin de MySQLi...............................................................................................................................9
Conexin base de datos............................................................................................................................10
Erros.............................................................................................................................................................11
Execucin de consultas................................................................................................................................11
Transaccins................................................................................................................................................15
Consultas preparadas..................................................................................................................................16

Tarefas..................................................................................................................................19
1.2.1Tarefa 1. Creacin e conexin a base de datos de traballo.................................................................................20
Autoavaliacin.....................................................................................................................................20
1.2.2Tarefa 2. Realizacin de consultas de accin......................................................................................................22
Autoavaliacin.....................................................................................................................................23
1.2.3Tarefa 3. Realizacin de consultas de seleccin.................................................................................................24
Autoavaliacin.....................................................................................................................................24
1.2.4Tarefa 4. Realizacin de operacins que implican transaccins.........................................................................27
Autoavaliacin.....................................................................................................................................27
1.2.5Tarefa 5. Realizacin de operacins con consultas preparadas..........................................................................28
Autoavaliacin.....................................................................................................................................28

1.3Textos de apoio ou de referencia.....................................................................................30


1.4Recursos didcticos.........................................................................................................30

3.Avaliacin......................................................................................................................31
Exemplo de exercizo a realizar na proba prctica a realizar ao rematar a U.D...................................31
Autoavaliacin.....................................................................................................................................33

Pxina 3 de 36

Pxina 4 de 36

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_A01.pdf

Ttulo da actividade
N

Ttulo

Descricin

Duracin

A01

Acceso a base de datos MySQL

Nesta actividade explicarase como realizar operacins


sobre bases de datos centrndose no sistema xestor de
base de datos MySQL coa extensin mysqli.

14

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

Actividade

O1.1

Identificar as tecnoloxas que A1


permiten o acceso mediante
programacin informacin
dispoible en almacns de datos.

O1.2

Crear aplicacins que establezan


conexins con bases de datos.

O1.3

Recuperar informacin

Acceso a base de datos MySQL

dunha

Pxina 5 de 36

Descricin bsica

Duracin

Nesta actividade explicarase como


realizar operacins sobre bases de
datos centrndose no sistema xestor
de base de datos MySQL coa
extensin mysqli.

14

base de datos e visualizala nunha


pxina web.
O1.4

Crear aplicacins web que


permitan a actualizacin e a
eliminacin
de
informacin
dispoible nunha base de datos.

O1.5

Usar transaccins para manter a


consistencia da informacin.

Criterios de avaliacin
Criterios de avaliacin
CA6.1 - Analizronse as tecnoloxas que permitan o acceso mediante programacin informacin dispoible en almacns de datos.
CA6.2.1 - Creronse aplicacins que establezan conexins con bases de datos empregando mysqli
CA6.3.1 - Recuperouse informacin almacenada en bases de datos empregando mysqli
CA6.4 - Publicouse en aplicacins web a informacin recuperada.
CA6.5 - Utilizronse conxuntos de datos para almacenar a informacin.
CA6.6.1 - Creronse aplicacins web que permitan a actualizacin e a eliminacin de informacin dispoible nunha base de datos empregando
mysqli
CA6.7.1 - Utilizronse transaccins para manter a consistencia da informacin empregando mysqli
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.
APIs de PHP para acceder s bases de datos de MySQL
A extensin mysqli
Configuracin de mysqli
Conexin base de datos
Erros
Recuperacin e edicin de informacin.
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 36

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


Qu e para qu
Actividade
(ttulo e descricin)
A1 Acceso a base de datos
MySQL
Identificar as tecnoloxas que
permiten o acceso mediante
programacin informacin
dispoible en almacns de
datos.
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.

Cmo
Profesorado
(en termos de tarefas)
Tp1.1 Explicacin por parte do profesor das
distintas APIs de PHP para conectarse as
bases de datos, e en particular a extensin
mysqli..
Tp1.2 Explicacin por parte do profesor de
cmo realizar conexins a bases de datos
MySQL empregando a extensin mysqli.
Tp1.3 Explicacin sobre como realizar
consultas que non devolven valores
empregando a extensin mysqli (tanto de
xeito procedemental como empregando o
estilo orientado a obxectos).
Tp1.4 Explicacin sobre como realizar
consultas que devolven valores empregando
a extensin mysqli (tanto de xeito
procedemental como empregando o estilo
orientado a obxectos).
Tp1.5 Explicacin por parte do profesor de
cando convinte empregar transaccins e
cmo levalas a cabo empregando a
extensin mysqli.
Tp1.6 Explicacin por parte do profesor das
vantaxes do uso das consultas preparadas
empregando a extensin mysqli.

Alumnado
(tarefas)
Ta1.1. Creacin da base de datos coa que
imos traballar nesta actividade e
establecemento dunha conexin con esta
empregando a extensin mysqli.
Ta1.2 . Realizacin de consultas de accin
empregando a extensin mysqli.
Ta1.3 . Realizacin de consultas que
devolven valores empregando a extensin
mysqli.
Ta1.4 . Realizacin de operacins que
implican o uso de transaccins empregando
a extensin mysqli.
Ta1.5 . Realizacin de operacins
empregando consultas preparadas.
Ta1.6 . Realizacin dunha proba prctica
relativa ao explicado nesta actividade.

Resultados
ou produtos
Base de datos creada en
mysqli
Scripts coas solucins as
tarefas
Scripts coa solucin
proba prctica

Con qu

Cmo e con qu se
valora

Recursos

Instrumentos e
procedementos de
avaliacin

Software de servidor web


Apache ou semellante.
Intrprete da linguaxe
PHP.
Contorno
de
desenvolvemento
de
aplicacins
web
NetBeans ou semellante.
Navegador web Firefox
ou semellante
Apuntes proporcionados
polo profesor

Proba escrita relativa


realizacin das tarefas
propostas
ao
alumnado e proba
prctica relativa
actividade

Duracin
(sesins)

14

2.

A1. Acceso a base de datos MySQL

1.1

Introducin
Esta actividade ten como obxectivos:
Identificar as tecnoloxas que permiten o acceso mediante programacin informacin
dispoible en almacns de datos.
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.

1.2

Actividade
Acceso a base de datos

Como xa temos visto, unha API (Interface de Programacin de Aplicacins) define as


clases, mtodos, funcins e variables que a aplicacin necesita empregar para realizar unha
tarefa concreta. No caso de aplicacins de PHP que necesiten acceder a unha base de datos,
as APIs necesarias son extensins de PHP.
As APIs poden ser procedimentais ou orientadas a obxectos. Unha API procedimental
usar funcins para realizar tarefas, mentres que unha API orientada a obxectos instanciar
clases e chamar aos mtodos sobre os obxectos resultantes.
PHP soporta mis de 15 sistemas xestores de bases de datos: SQLite, Oracle, SQL Server, PostgreSQL, IBM DB2, MySQL, etc. Ata a versin 5 de PHP, o acceso s bases de datos facase principalmente utilizando extensins especficas para cada sistema xestor de base
de datos (extensins nativas). dicir, que se queriamos acceder a unha base de datos de
PostgreSQL, deberiamos instalar e utilizar a extensin dese xestor en concreto. As funcins
e obxectos a utilizar eran distintos para cada extensin.
A partir da versin 5 de PHP introduciuse na linguaxe unha extensin para acceder dunha
forma comn a distintos sistemas xestores: PDO. A gran vantaxe de PDO est clara: podemos seguir utilizando unha mesma sintaxe anda que cambiemos o motor da nosa base de
datos. Pola contra, nalgunhas ocasins preferiremos seguir usando extensins nativas nos
nosos programas. Mentres PDO ofrece un conxunto comn de funcins, as extensins nativas normalmente ofrecen mis potencia (acceso a funcins especficas de cada xestor de
base de datos) e nalgns casos tamn maior velocidade.
Dos distintos SXBD existentes imos traballar con MySQL. MySQL un xestor de bases
de datos relacionais de cdigo aberto baixo licenza GNU GPL. o xestor de bases de datos
mis empregado coa linguaxe PHP.
APIs de PHP para acceder s bases de datos de MySQL

Existen varias opcins dispoibles para conectarse a un servidor MySQL dende unha
aplicacin en PHP. PHP ofrece 3 APIs diferentes ellas son mysql, mysqli, y PDO.
Pxina 8 de 36

Tradicionalmente as conexins entre PHP e MySQL establecanse utilizando a extensin


nativa mysql. Esta extensin mantense na actualidade para dar soporte s aplicacins xa
existentes que a utilizan, pero non se recomenda utilizala para desenvolver novos programas, xa que foi declarada obsoleta a partir de PHP 5.5.0 e vai ser eliminada no futuro. O
mis habitual elixir entre mysqli (extensin nativa) e PDO.
Con calquera de ambas as das extensins, poders realizar accins sobre as bases de datos como:
Establecer conexins.
Executar sentenzas SQL.
Obter os rexistros afectados ou devoltos por unha sentenza SQL.
Empregar transaccins.
Executar procedementos almacenados.
Xestionar os erros que se produzan durante a conexin ou no establecemento desta.
PDO e mysqli (e tamn a antiga extensin mysql) utilizan un driver de baixo nivel para
comunicarse co servidor MySQL. Ata hai pouco o nico driver dispoible para realizar esta
funcin era libmysql, que non estaba optimizado para ser utilizado dende PHP. A partir da
versin 5.3, PHP vn preparado para utilizar tamn un novo driver mellorado para realizar
esta funcin, o Driver Nativo de MySQL, mysqlnd.
A extensin mysqli

A extensin mysqli, tamn coecida como extensin de MySQL mellorada, desenvolveuse


para aproveitar as novas funcionalidades encontradas nos sistemas MySQL con versin
4.1.3 ou posterior. Ven includa nas versins PHP5 e posteriores, e conta coas seguintes
melloras con respecto extensin mysql:
Interface orientada a obxectos
Soporte para consultas preparadas.
Soporte para transaccins.
Mellores opcins de depuracin.
Configuracin de MySQLi

No ficheiro php.ini hai unha seccin especfica para as opcins de configuracin propias de
cada extensin. Entre as opcins que se poden configurar para a extensin MySQLi estn:
mysqli.allow_persistent:

Permite crear conexins persistentes.

mysqli.default_port: Nmero de porto TCP predeterminado a utilizar cando se


conecta ao servidor de base de datos.
mysqli.reconnect:

Indica se se debe volver conectar automaticamente en caso de que

se perda a conexin.
mysqli.default_host:

Host predeterminado a usar cando se conecta ao servidor de

base de datos.
mysqli.default_user:

Nome de usuario predeterminado a usar cando se conecta ao

servidor de base de datos.


mysqli.default_pw:

Contrasinal predeterminado a usar cando se conecta ao servidor

de base de datos.
Pxina 9 de 36

Conexin base de datos

Para poder acceder aos datos dunha base de datos, previamente temos que establecer unha
conexin co servidor MySQL.
Con MySQLi, existen dous xeitos de establecer unha conexin co servidor:
Crear unha instancia da clase mysqli. O construtor da clase pode recibir seis parmetros,
todos opcionais, anda que o mis habitual utilizar os catro primeiros:
o o nome ou direccin IP do servidor MySQL ao que che queres conectar.
o un nome de usuario con permisos para establecer a conexin.
o o contrasinal do usuario.
o o nome da base de datos que conectarse.
o o nmero do porto en que se executa o servidor MySQL.
o o socket ou a canalizacin con nome (named pipe) a usar.
$db = new mysqli('localhost', 'usuario', 'contrasinal', 'base_datos');

Ou tamn podemos facer:


$db = new mysqli();
$db->connect('localhost', 'usuario', 'contrasinal', 'base_datos');

Obter unha instancia da clase mysqli empregando a funcin mysqli_connect:


$db = mysqli_connect('localhost', 'usuario', 'contrasinal', 'base_datos');

Ou tamn podemos establecer a conexin co servidor e seleccionar a continuacin a


base de datos empregando a funcin mysqli_select_db:
$db=mysqli_connect('localhost', 'usuario', 'contrasinal');
mysqli_select_db('base_datos',$db);

A function mysqli_select_db tamn a podemos usar para cambiar a base de datos


coa que imos traballar. Para isto tamn se pode usar o mtodo select_db como se ve a
continuacin:
$db->select_db("outra_bd");

Comprobar que a conexin se estableceu correctamente

importante verificar que a conexin se estableceu correctamente antes de realizar


ningunha operacin sobre a base de datos. Para comprobar o erro, en caso de que se
produza, podes usar as seguintes propiedades (ou funcins equivalentes) da clase mysqli:
PROPIEDADE

FUNCIN

connect_errno

mysqli_connect_errno( )

Devolve o nmero de erro xerado polo ltimo intento de conexin, ou null


se non se produce ningn erro.

connect_error

mysqli_connect_error( )

Devolve a mensaxe de erro xerada polo ltimo intento de conexin, ou


null se non se produce ningn erro.

Por exemplo, o seguinte cdigo comproba o establecemento dunha conexin coa base de
datos "Empresa" e finaliza a execucin se se produce algn erro:
Pxina 10 de 36

$db = new mysqli('localhost', 'usuario', 'contrasinal', 'Empresa');


$error = $db->connect_errno;
if ($error != null) {
echo "<p>Erro $error conectando base de datos: $db->connect_error</p>";
exit();
}

Pechar a conexin base de datos

Para pechar a conexin a base de datos podemos emplear a funcin mysqli_close como se
amosa a continuacin:
mysqli_close($db);

ou empregando o estilo orientado a obxectos podemos invocar o mtodo close() e polo


tanto escribir algo como:
$db->close();

Na tarefa 1 crearemos a base de datos coa que imos traballar nesta unidade didctica e
estableceremos unha conexin con esta empregando a extensin mysqli.
Erros

Xa vimos as funcins que nos permiten controlar os erros producidos na conexin base de
dato. A extensin MySQLi proporciona procedementos e propiedades de obxecto que dan
informacin do ltimo erro producido na base de datos:
PROPIEDADE

FUNCIN

errno

mysqli_errno(mysqli $con)

Devolve o nmero de erro xerado na base de datos, ou null se non se


produce ningn erro.

error

mysqli_error(mysqli $con)

Devolve a ltima mensaxe de erro xerada na base de datos, ou null se


non se produce ningn erro.

Execucin de consultas

Ao igual que cando fixemos a conexin base de datos, podemos executar consultas
empregando mysqli de xeito procedimental e orientado a obxectos. Ademis, imos
distinguir dous tipos de consultas: as que devolven valores e as que non os devolven.
Consultas que non devolven valores

A execucin de consultas de creaccin e eliminacin de bases de datos ou tboas (CREATE e


DROP), e de actualizacin da informacin da base de datos (UPDATE, INSERT e DELETE) non
devolve ningn valor almacenado na base de datos. Unicamente devolver true ou false
para indicar se se ten producido algn erro.
A forma mis inmediata de executar unha consulta con MySQLi o mtodo query, empregando o estilo orientado a obxectos, ou a funcin mysqli_query co estilo procedimental.
Imos ver primeiro un exemplo de execucin de consulta empregando o estilo orientado a
obxectos. Neste caso, a propiedade affected_rows conter o nmero de filas afectadas
pola ltima consulta de actualizacin executada.
$sentenza = "DROP TABLE IF EXISTS libro";

Pxina 11 de 36

$db->query($sentenza);
if($db->errno)
{die('<br/>ERRO('.$db->errno.') ->'.$db->error);}

No seguinte exemplo insertamos unha fila na base de datos e comprobamos que o nmero de filas afectadas 1 empregando a propiedade affected_rows. (Pode ser que a sintaxe
sexa correcta e a consulta funcione, pero que non produzca o resultado esperado)
$sentenza = "INSERT INTO provincia (codigo, nome)
VALUES ('37', 'Salamanca')";
$db->query($sentenza);
if($db->errno)
{die('<br/>ERRO('.$db->errno.') ->'.$db->error);}
if($db->affected_rows!=1)
{die ('Error: non o resultado esperado.');}

O equivalente procedemental, para o mtodo query da interface orientada a obxectos a


funcin mysqli_query(mysqli $link, string $consulta) que devolve true no caso
de que non se produza ningn erro e false en caso contrario. Para consultar o nmero de filas afectadas pola consulta temos a funcin mysqli_affected_rows(mysqli $link).
$sentenza = "INSERT INTO provincia (codigo, nome)
VALUES ('08', 'Barcelona')";
$resultado= mysqli_query($db, $sentenza);
if(mysqli_errno($db))
{die('<br/>ERRO('.mysqli_errno($db).') ->'.mysqli_error($db));}
if(mysqli_affected_rows($db)!=1)
{die ('Error: non o resultado esperado.');}

Cando realizamos unha insercin pode ser que o identificador da tboa sexa autoincremental, co cal non temos que definilo cando facemos a insercin pero podemos querer saber
cal foi o ltimo valor que se insertou. Para facer isto, temos a propiedade insert_id cando
estamos traballando coa interface orientada a obxectos, e a funcin
mysqli_insert_id(mysqli $link) para o estilo procedemental.
Na tarefa 2 realizaremos consultas de accin sobre a base de datos receitas.
Consultas que devolven valores

A execucin dunha senteza SELECT sobre a base de datos devolve un conxunto de resultados
que haber que procesar ou mostrar.
Para a execucin destas consultas emprganse os mesmos mtodos que os explicados
para as consultas de accin: query se usamos a interface orientada a obxectos e a funcin
mysqli_query co estilo procedimental. Os datos devlvense en forma dun obxecto da clase
mysqli_result. Ademis, se queremos coecer o nmero de filas que contn o resultado da
consulta podemos empregar o mtodo num_rows da clase mysqli_result para a interface
orientada a obxectos, e mysqli_num_rows(mysqli_result $result) para a interface procedimental.
A continuacin vemos os mtodos mis comns de manexar a informacin devolta:
Array asociativo: array mysqli_result::fetch_assoc( void )
Este mtodo manexa os datos de cada fila nun array asociativo, onde o nome de cada columna o ndice. Haber que crear un bucle para recorrer as filas e amosar o resultado:
$db = new mysqli("localhost", "alumno", "abc123.", "receitas");
$sql = "SELECT chef.nomeartistico as chef, receita.nome as receita

Pxina 12 de 36

FROM chef LEFT JOIN receita ON chef.codigo=cod_chef";


$resultado = $db->query($sql);
if($db->errno)
{die('<br/>ERRO('.$db->errno.') ->'.$db->error);}
while($fila = $resultado -> fetch_assoc()){
echo "CHEF: ".$fila['chef'] . " --> RECEITA:".$fila['receita'] ."<br/>";
}

O equivalente en estilo procedemental sera o array asociativo mysqli_fetch_assoc


( mysqli_result $result ). Neste caso, o parmetro de entrada o resultado de
mysqli_query() e non unha conexin.
$db = mysqli_connect("localhost", "alumno", "abc123.", "receitas");
$sql = "SELECT chef.nomeartistico as chef, receita.nome as receita
FROM chef LEFT JOIN receita ON chef.codigo=cod_chef";
$resultado = mysqli_query($db, $sql);
if(mysqli_errno($db))
{die('<br/>ERRO('.mysqli_errno($db).') ->'.mysqli_error($db));}
while($fila = mysqli_fetch_assoc($resultado)){
echo "CHEF: " . $fila['chef'] . "--> RECEITA:".$fila['receita'] ."<br/>";
}

Array asociativo, numrico ou ambos: mixed mysqli_result::fetch_array ([ int


$tiporesultado = MYSQLI_BOTH ] )
Este mtodo obtn os datos de cada fila como un array asociativo, numrico ou ambos
dependendo do parmetro que se lle pase. Os posibles valores son:
o MYSQLI_BOTH: o valor por defecto. Devolve un array mixto de ndices numricos
e claves (nomes das columnas).
Array (
[0] => XULIANICO
[chef] => XULIANICO
[1] => AMEIXAS VERDES
[receita] => AMEIXAS VERDES)

o MYSQLI_ASSOC: Devolve un array asociativo. Os nomes das columnas sern as


claves do array.
Array (
[chef] => XULIANICO
[receita] => AMEIXAS VERDES)

o MYSQLI_NUM: Devolve un array numrico. Cada ndice representa o contido das


columnas da consulta na orde na que estn especificadas nesta.
Array (
[0] => XULIANICO
[1] => AMEIXAS VERDES)

Para amosar todas as columnas teremos que facer de xeito similar ao mtodo anterior, indicando a clave en funcin do parmetro que se lle pase:
while($fila = $resultado -> fetch_array(MYSQLI_ASSOC)){
echo "CHEF: ".$fila['chef'] . " --> RECEITA:".$fila['receita'] ."<br/>";
}

O equivalente en estilo procedemental sera o array mixed mysqli_fetch_array


( mysqli_result $result [, int $tiporesultado = MYSQLI_BOTH ] ):
while($fila = mysqli_fetch_array($resultado, MYSQLI_ASSOC)){
echo "CHEF: " . $fila['chef'] . "--> RECEITA:".$fila['receita'] ."<br/>";
}

Pxina 13 de 36

Obxecto: mysqli_result::fetch_object
$params ]])

([string

$nome_clase

,array

Este mtodo obtn cada fila de resultados como se fose un obxecto, onde $nome_clase
o nome da clase a instanciar (opcional) e $params un array opcional de parmetros a
pasar ao construtor de dita clase.
while ($obxecto = $resultado->fetch_object()) {
echo $obxecto->chef . " --> " . $obxecto->receita . "<br/>";
}

A vantaxe de usar este mtodo que nos permite instanciar unha clase, a que lle pasamos
os datos da fila do obxecto, e que nos permite definir mtodos para traballar con estes. S
campos da fila pasan a ser atributos pblicos da clase, co cal poderemos acceder a estes
dentro da clase sen necesidade de definilos.
Por exemplo, se temos unha clase Consulta que recibe o resultado da nosa consulta, automticamente esta ter como atributos pblicos chef e receita, co cal podemos definir un
mtodo para amosalos como se ve a continuacin:
class Consulta {
function amosar(){
return "<br/>" . $this->chef . " --> " . $this->receita;
}
}

E para amosar o contido usamos o mtodo feth_object ao que lle pasamos a clase creada
para recoller o resultado:
$resultado = $db->query($sql);
while($fila = $resultado -> fetch_object("Consulta")){
echo $fila->amosar();
}

Inda que poda parecer extrao querer obter o resultado dunha fila da consulta como un
obxecto cando utilizamos o interface procedimental, tamn se pode facer usando object
mysqli_fetch_object (mysqli_result $result [,string $class_name[, array
$params ]]). E ao igual que coa interface orientada a obxetos tamn lle podemos indi-

car a clase que queremos instanciar e os parmetros que lle pasamos ao constructor desa
clase.
while ($obxecto = mysqli_fetch_object($resultado)) {
echo $obxecto->chef . " --> " . $obxecto->receita . "<br/>";
}

importante ter en conta que os resultados obtidos se almacenarn en memoria mentres os


esteas a usar. Cando xa non os necesites, pdelos liberar co mtodo free da clase
mysqli_result (ou coa funcin mysqli_free_result).
$resultado->free();

Na tarefa 3 realizaremos consultas que devolven valores sobre a base de datos


receitas.

Pxina 14 de 36

Transaccins

Cando traballamos con bases de datos pode suceder que nalgunhas ocasins queiramos que
X operacins se executen como un bloque, isto , que ou ben se executen todas
correctamente, ou, se algunha falla, non queremos que se rexistre ningn cambio na base de
datos. Para isto debemos usar transaccins.
Os motores de almacenamento de tablas en MySQL son MyISAM e InnoDB. O que funciona por defecto o motor MyISAM, que excle a seguridade proporcionada pola integridade referencial e non permite transaccins. Por isto, para traballar con transaccins debemos traballar co motor InnoDB.
Por defecto, MySQL exectase en modo de execucin automtica (autocommit), o que
significa que cada consulta individual inclese dentro da sa propia transaccin. O que conleva que tan pronto como se executa unha sentenza, se modifica a tboa de MySQL, facendo
imposible a volta atrs. Para poder revertir os cambios das consultas (rollback) usando transaccins, debemos desctivar o modo de execucin automtica, o que iniciar a transaccin.
$db->autocommit(false);

Ou co estilo procedemental:
mysqli_autocommit($db, false);

O importante cando traballamos con transaccins que o programador ten o control de


cando facer efectiva a modificacin ou de revertir as modificacins ocasionadas polas consultas.
Para facer efectiva as modificacins chamaremos a funcin commit coa interface orientada a obxectos e mysqli_commit (mysqli $link) coa interface procedimental. E para revertir a transaccin actual chamaremos funcin rollback coa interface procedimental e
mysqli_rollback (mysqli $link) coa interface procedimental.
A continuacin imos ver un exemplo de transaccin coa interface orientada a obxectos
para insertar un novo chef do que non estaba dada de alta a provincia:
$db = new mysqli("localhost", "alumno", "abc123.", "receitas");
if ($db->connect_error) {
echo "Erro na conexin a base de datos";
exit;
} else {
$bandeira=true;
$db->autocommit(FALSE);
$sql1="INSERT INTO PROVINCIA (CODIGO, NOME) VALUES ('45','Toledo')";
$sql2="INSERT INTO CHEF (CODIGO, NOME, APELIDO1, SEXO, LOCALIDADE,
COD_PROVINCIA) VALUES (12,'ANTA','NOGUEIRA','M','Toledo','45')";
$result = $db->query($sql1);
if ($db->errno) {
$bandeira = false;
echo '<br/>ERRO na primeira operacin ('.$db->errno.')->'.$db->error;
}
$result = $db->query($sql2);
if ($db->errno) {
$bandeira = false;
echo '<br/>ERRO na segunda operacin ('.$db->errno.')->'.$db->error;
}
if ($bandeira == true){
$db->commit();
echo 'Transaccin executada con xito!.';
} else {
$db->rollback();
echo '<div>Erro nalgn punto da transaccin.</div>';
}
$db->close();

Pxina 15 de 36

O mesmo exemplo coa interface procedemental sera:


$db = mysqli_connect("localhost", "alumno", "abc123.", "receitas");
if (mysqli_connect_error($db)) {
echo "Erro na conexin a base de datos";
exit;
} else {
$bandeira=true;
mysqli_autocommit($db, FALSE);
$sql1="INSERT INTO PROVINCIA (CODIGO, NOME) VALUES ('45','Toledo')";
$sql2="INSERT INTO CHEF (CODIGO, NOME, APELIDO1, SEXO, LOCALIDADE,
COD_PROVINCIA) VALUES (12,'ANTA','NOGUEIRA','M','Toledo','45')";
$result = mysqli_query($db, $sql1);
if (mysqli_errno($db) != 0) {
$bandeira = false;
echo '<br/>ERRO na primeira operacin ('.mysqli_errno($db).
') ->'. mysqli_error($db);
}
$result = mysqli_query($db, $sql2);
if (mysqli_errno($db) != 0) {
$bandeira = false;
echo '<br/>ERRO na segunda operacin ('. mysqli_errno($db).
') ->'. mysqli_error($db);
}
if ($bandeira == true){
mysqli_commit($db);
echo 'Transaccin executada con xito!.';
} else {
mysqli_rollback($db);
echo '<div>Erro nalgn punto da transaccin.</div>';
}
mysqli_close($db);
}

importante ter en conta algunhas cousas cando se traballa con transaccins:


O rollback unicamente afecta as operacins de manipulacin de datos, dicir, DELETE,
INSERT e UPDATE. Non afecta a CREATE, DROP ou ALTER.
Se temos un campo auto_increment e durante a transaccin se fai algn insert con
xito, e posteriormente falla algunha operacin realizada na mesma transaccin, dando
lugar execucin dun rollback, o campo auto_increment ter o contador como se os
inserts s houbesen tido lugar. O rollback non o restaura ao valor inicial. Para facelo
deberiamos executar un ALTER TABLE para establecer o valor ao seu estado actual.
Na tarefa 4 realizaremos operacins que impliquen o uso de transaccins.
Consultas preparadas

Cada vez que se enva unha consulta ao servidor, este debe analizala antes de executala.
Algunhas sentenzas SQL, como as que insiren valores nunha tboa, deben repetirse de
forma habitual nun programa. Para acelerar este proceso, MySQL admite consultas
preparadas. Estas consultas almacnanse no servidor listas para ser executadas cando sexa
necesario e presentan as seguintes vantaxes:
Optimizacin: xa que reducen o gasto de recursos na anlise e execucin de cada
consulta.
Seguridade: xa que ofrecen mis seguridade ante posibles inxeccins de SQL.
Pxina 16 de 36

Para traballar con consultas preparadas coa extensin MySQLi de PHP empregando a interface orientada a obxectos, debes utilizar a clase mysqli_stmt. Utilizando o mtodo
stmt_init da clase mysqli obtense un obxecto da devandita clase.
Os pasos que debes seguir para executar unha consulta preparada coa interface orientada
a obxectos son:
Preparar a consulta no servidor MySQL utilizando o mtodo prepare.
Executar a consulta, tantas veces como sexa necesario, co mtodo execute.
Unha vez que xa non se necesita mis, dbese executar o mtodo close.
Imos ver un exemplo:
$consulta = $db->stmt_init();
$consulta->prepare('INSERT INTO PROVINCIA (codigo, nome)
VALUES ("50", "Zaragoza")');
$consulta->execute();
$consulta->close();
$db->close();

O problema que de pouco serve preparar unha consulta de insercin de datos como a
anterior, se os valores que insire son sempre os mesmos. Por este motivo as consultas preparadas admiten parmetros. Para preparar unha consulta con parmetros, en lugar de poer os
valores debes indicar cun signo de interrogacin a sa posicin dentro da sentenza SQL.
$consulta->prepare('INSERT INTO PROVINCIA (codigo, nome) VALUES (?, ?) ');

E antes de executar a consulta tes que utilizar o mtodo bind_param para substitur cada
parmetro polo seu valor. O primeiro parmetro do mtodo bind_param unha cadea de
texto na que cada carcter indica o tipo dun parmetro, segundo a seguinte tboa:
CARACTER

TIPO DO PARMETRO

Nmero enteiro

Nmero real (dobre precisin)

Cadea de texto

Contido en formato binario (BLOB)

Por exemplo:
$consulta = $db->stmt_init();
$consulta->prepare('INSERT INTO PROVINCIA (codigo, nome) VALUES (?, ?)');
$codigo = "50";
$provincia = "Zaragoza";
$consulta->bind_param('ss', $codigo, $provincia);
$consulta->execute();
$consulta->close();
$db->close();

No caso das consultas que devolven valores temos que vincular as variables resultado da
consulta preparada para almacenar o seu resultado. Temos dous mtodos para extraer o resultado das columnas da consulta preparada:
bind_result:

vincula as columnas do resultado da columna coas variables que gardarn

ese resultado.
fetch: Permite obter os resultado desas variables, para o cal deberemos recorrer un bucle
que permita obter os datos de todas as filas resultantes da consulta.
Pxina 17 de 36

$consulta = $db->stmt_init();
$consulta->prepare('SELECT nome, dificultade, tempo
FROM receita WHERE tempo<50');
$consulta->execute();
$consulta->bind_result($receita, $dificultade, $tempo);
while($consulta->fetch()) {
print "<p> $receita ( $dificultade ) - $tempo minutos</p>";
}
$consulta->close();
$db->close();

Para empregar consultas preparadas coa extensin MySQLi de PHP empregando a interface procedemental usaremos a funcin mysqli_stmt_init(). Os pasos a seguir son os
mesmos que se indicaron anteriormente, pero as funcins a empregar neste caso son: mysqli_stmt_prepare, mysqli_stmt_execute e mysqli_stmt_close respectivamente.
Imos ver un exemplo:
$sql = "INSERT INTO PROVINCIA (codigo, nome) VALUES (?, ?)";
$stmt = mysqli_stmt_init($db);
if(mysqli_stmt_prepare($stmt,$sql)){ //para comprobar erros no prepare

A funcin para substituir cada parmetro polo seu valor mysqli_stmt_bind_param :


mysqli_stmt_bind_param($stmt, 'ss', $codigo, $provincia);
$codigo = "50";
$provincia = "Zaragoza";
mysqli_stmt_execute($stmt);
$codigo = "38";
$provincia = " Santa Cruz de Tenerife";
mysqli_stmt_execute($stmt);
mysqli_stmt_close($stmt);
} //fin do if do prepare

E para para asignar a variables os campos que se obteen tras a execucin temos mysqli_stmt_bind_result, usando mysqli_stmt_fetch() para recorrelos:
$db = mysqli_connect("localhost", "alumno", "abc123.", "receitas");
$sql = "SELECT nome, dificultade, tempo FROM receita WHERE tempo<50";
$stmt = mysqli_stmt_init($db);
if(mysqli_stmt_prepare($stmt,$sql)){
mysqli_stmt_execute($stmt);
$receita = "";
$dificultade = "";
$tempo = 0;
mysqli_stmt_bind_result($stmt,$receita, $dificultade, $tempo);
while (mysqli_stmt_fetch($stmt)) {
print "<p> $receita ( $dificultade ) - $tempo minutos</p>";
}
mysqli_stmt_close($stmt);
$db->close();
}

Na tarefa 5 realizaremos operacins con consultas preparadas.

Pxina 18 de 36

Tarefas
As tarefas propostas son as seguintes.
Tarefa 1_a. Creacin e conexin a base de datos de traballo. Nesta tarefa crearemos a
base de datos coa que imos traballar nesta unidade didctica e estableceremos unha
conexin con esta empregando a extensin mysqli.
Tarefa 1_b. Creacin dunha clase conexin. Nesta tarefa crearemos unha clase
conexin para conectarse a unha base de datos que se pasa como parmetro no servidor
local.
Tarefa 2. Realizacin de consultas de accin. Nesta tarefa realizaremos consultas de
accin sobre a base de datos receitas empregando a interface orientada a obxectos e o
estilo procedemental.
Tarefa 3. Realizacin de consultas que devolven valores. Nesta tarefa realizaremos
consultas que devolven valores sobre a base de datos receitas.
Tarefa 4. Realizacin de operacins que implican transaccins. Nesta tarefa
realizaremos operacins que deban executarse como un nico bloque.
Tarefa 5. Realizacin de operacins con consultas preparadas. Nesta tarefa
empregaremos consultas preparadas para axilizar a execucin cando se realiza a mesma
consulta en mis dunha ocasin.

Pxina 19 de 36

1.2.1

Tarefa 1. Creacin e conexin a base de datos de traballo


a) Tarefa 1_a

Empregando o script crearReceitas.sql adxuntado como recurso crea a base de datos


Receitas en mySQL, que ser a que usaremos para aprender a traballar coas bases de datos.
A continuacin crea un usuario para esta base de datos de nome "alumno" e contrasinal
"abc123.", e intenta conectarte dende php a base de datos, dando unha mensaxe indicando se
a conexin se estableceu con xito ou o erro producido ao conectarse. Pon un exemplo de
conexin empregando estilo procedimental e outro empregando orientacin a obxectos.
b) Tarefa 1_b

Crea unha clase de nome accesoBD na que o construtor recibe como parmetro a base de
datos, o usuario e a contrasinal, e aemis ten:
Un mtodo abrirConexion que devolve un obxecto coa conexin establecida base de
datos no servidor local.
Un mtodo pecharConexion que pecha a conexin coa base de datos
Autoavaliacin
a) Tarefa 1_a

O script podemos executalo dende phpMyAdmin, na pestaa SQL:

Unha vez creada a base de datos, seleccionmola e imos a pantalla de Privilexios:

Pxina 20 de 36

Nesta pantalla prememos en Agregar usuario para engadir o usuario alumno e marcamos
a opcin "Otorgar todos los privilegios para la base de datos receitas":

Isto engade o usuario alumno e otrgalle todos os privilexios sobre a base de datos receitas

Conexin base de datos dende PHP empregando orientacin a obxectos:


<?php
$db = new mysqli("localhost", "alumno", "abc123.", "receitas");
/* comproba a conexin */
if ($db->connect_error) {
printf("Fallou a conexin a base de datos receitas. ERRO(%d): %s\n",
$db->connect_errno, $db->connect_error);
exit();
}
printf("Conectado a base de datos receitas con xito");
$db->close();
?>

Conexin base de datos dende PHP empregando estilo procedimental:


<?php
$db = mysqli_connect("localhost", "alumno", "abc123.", "receitas");
/* comproba a conexin */
if (mysqli_connect_errno()) {

Pxina 21 de 36

printf("Fallou a conexin a base de datos receitas. ERRO(%d): %s\n",


mysqli_connect_errno(),mysqli_connect_error());
exit();
}
printf("Conectado a base de datos receitas con xito");
if(mysqli_close($db)){
print "<br>Pechada a conexin coa base de datos";
} ?>

b) Tarefa 1_b
<?php
/** Xestin do acceso a bases de datos no servidor local empregando mysqli
**/
class accesoBD {
private $usuario;
private $contrasinal;
private $bd;
public function __construct($usuario, $contrasinal, $bd) {
$this->usuario=$usuario;
$this->contrasinal=$contrasinal;
$this->bd=$bd;
}
/** Mtodo para establecer a conexin cunha base de datos **/
public function abrirConexion () {
$con = new mysqli('localhost',$this->usuario,$this->contrasinal,
$this->bd);
if ($con ->connect_error) {
echo "Erro na conexin a base de datos $this->bd:
($con->connect_errno) $con->connect_error\n";
exit;
}
return $con;
}
/** Mtodo para pechar a conexin cunha base de datos **/
public function pecharConexion ($con) {
$con->close();
}
}
?>

1.2.2

Tarefa 2. Realizacin de consultas de accin.


a) Tarefa 2_a

Crear unha tboa Libro coa seguinte estrutura na base de datos receitas, establecendo as
regras de integridade que sexan necesarias, empregando a interface orientada a obxectos.
Usa a clase conexin definida na tarefa 1_b.
Atributo

Descripcin

Codigo

Autoincremental

Titulo

Contn o ttulo do libro. Todos os libros deben ter un ttulo. Poden existir dous libros co mesmo
ttulo.

Editorial

Contn a editorial que publicou este libro. obrigatorio introducila para todos os libros.

Paxinas

Nmero de pxinas de que consta o libro. Pode ser que non teamos esta informacin

Cod_chef

Cdigo do chef que escribiu este libro. Todos os libros foron escritos por un nico chef que
debe existir na base de datos.

Pxina 22 de 36

b) Tarefa 2_b

Empregando estilo procedimental inserta o seguinte libro na base de datos:


'Receitas imaxinativas' da editorial 'Cocia hoxe', escrito polo chef ' EL TITO ' e do que
non coecemos o nmero de pxinas.
Comproba que se realizou a insercin dunha fila na tboa e imprime a seguinte informacin : "Inserido 1 rexistro co cdigo XX".
Autoavaliacin
a) Tarefa 2_a
<?php
require_once 'accesoBD.php';
$db = new accesoBD('alumno', 'abc123.', 'receitas');
$mysqli = $db->abrirConexion();
$consulta='CREATE TABLE libro
(codigo SMALLINT NOT NULL AUTO_INCREMENT,
titulo VARCHAR(100) NOT NULL,
editorial VARCHAR(50) NOT NULL,
paxinas SMALLINT NULL,
cod_chef tinyint NOT NULL,
CONSTRAINT pk_libro PRIMARY KEY(codigo),
CONSTRAINT fk_libro_chef FOREIGN KEY(cod_chef)
REFERENCES chef(codigo));';
$mysqli->query($consulta);
if($mysqli->errno)
{die('<br/>ERRO('.$mysqli->errno.') ->'.$mysqli->error);}
$con->pecharConexion($mysqli);
?>

b) Tarefa 2_b
<?php
/* establecemos conexin coa base de datos receitas */
$db = mysqli_connect("localhost", "alumno", "abc123.", "receitas");
/* comproba a conexin */
if (mysqli_connect_errno()) {
printf("Fallou a conexin a base de datos receitas. ERRO(%d): %s\n",
mysqli_connect_errno(),mysqli_connect_error());
exit();
}
/* executamos a consulta de insercin */
$consulta = "INSERT INTO libro (titulo, editorial, paxinas, cod_chef)
VALUES ('Receitas imaxinativas','Cocina hoxe', NULL,
(select codigo from chef where nomeartistico='EL TITO'));";
$resultado= mysqli_query($db, $consulta);
/* comprobamos se houbo algn erro */
if(mysqli_errno($db))
{die('<br/>ERRO('.mysqli_errno($db).') ->'.mysqli_error($db));}
/* comprobamos que o nmero de filas afectadas foi 1 */
if(mysqli_affected_rows($db)!=1)
{die ('Error: non o resultado esperado.');}
else {printf("<br/>Inserido %d rexistro co cdigo
%d",mysqli_affected_rows($db),
mysqli_insert_id($db));}
mysqli_close($db);
?>

Pxina 23 de 36

1.2.3

Tarefa 3. Realizacin de consultas de seleccin


a) Tarefa 3_a

Fai un script que lea da base de datos a seguinte informacin relativa as receitas e a amose
segn se ve na imaxe:
o A informacin debe de visualizarse pxinada (No exemplo, a variable que indica o
nmero de rexistros por pxinas ten valor 5)

b) Tarefa 3_b

Fai un script que cargue un desplegable coa informacin das provincias


c) Tarefa 3_c

Imos ampliar a tarefa anterior. Cando se seleccione unha provincia cargarase unha pxina
con informacin da provincia como se amosa na seguinte imaxe:

Autoavaliacin

O arquivo css empregado para estas tarefas o seguinte:


body {font-family: Verdana, sans-serif; font-size: 14px;
text-align: justify; }
div#contido {width:700px; margin-left:auto;margin-right:auto; }
h1 {text-align: left; color:grey; margin:1em;}
h2 {padding-left: 1em; color:rosybrown;}
table { margin: 0px 10px 10px; background-color: LightGrey;
border-collapse: collapse; border-bottom: maroon 3px solid; }
tr { border-top: maroon 3px solid; }
td,th { padding: 10px 15px; color: maroon; text-align:left; }
td a { color: SlateGrey; text-decoration: none; }
#paxinado {text-align: left;padding-left: 20em;}
.ingredientes {padding-left:3em; color:slategrey}

Pxina 24 de 36

a) Tarefa 3_a
<html>
<head>
<title>Paxinar resultados - Tarefa 6_3a</title>
<link rel="stylesheet" href="tarefa6_3.css" />
</head>
<body>
<div id="contido">
<h1>RECEITAS</h1>
<?php
$numRexistros = 5; //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'];
}
// necesitamos saber o nmero de rexistros que devolve a consulta
$db = mysqli_connect("localhost", "alumno", "abc123.",
"receitas");
$resultado = mysqli_query($db,"SELECT * FROM receita");
$totalRexistros = mysqli_num_rows($resultado);
//dividimos o total de rexistros que devolve a consulta polo
//nmero de rexistros que queremos por pxina(redondeando alza)
$totalPaxinas = ceil($totalRexistros/$numRexistros);
// obtenemos o segmento paxinado que corresponde a esta pxina
$resultado = mysqli_query($db,"SELECT nome, dificultade, tempo
FROM receita
LIMIT ".(($paxina-1)*$numRexistros).", $numRexistros ");
echo '<table>';
while($row = mysqli_fetch_array($resultado))
{
echo '<tr>
<td>'.$row['nome'].'</td>
<td>'.$row['dificultade'].'</td>
<td>'.$row['tempo'].' minutos</td>
</tr>';
}
echo '</table><br/><br/><div id="paxinado">';
//enlaces para o paxinado
for($i=0; $i<$totalPaxinas;$i++){
echo '<a href="paginarBD.php?pax='.($i+1).'">'.($i+1).'</a> | ';
}
echo '</div>'
?>
</div>
</body>
</html>

b) Tarefa 3_b
<?php
$db = @new mysqli('localhost', 'alumno', 'abc123.', 'receitas');
if ($db->connect_error)
{die('Error de conexin: ' . $db->connect_error);}
$sql="SELECT * from provincia";
$resultado = $db->query($sql);
if ($resultado->num_rows > 0)
{
$combo="";
while ($row = $resultado->fetch_array(MYSQLI_ASSOC))
{
$combo .= " <option value='"
.$row['codigo']."'>".$row['nome']."</option>";
}
}
else
{

Pxina 25 de 36

echo "A tboa Provincia non ten datos";


}
$db->close();
?>
<html>
<head>
<title>Seleccin por provincia</title>
</head>
<body>
<select name="provincia">
<?php echo $combo; ?>
</select>
</body>
</html>

c) Tarefa 3_c
Tarefa3c.php
<?php
$db = @new mysqli('localhost', 'alumno', 'abc123.', 'receitas');
if ($db->connect_error)
{die('Error de conexin: ' . $db->connect_error);}
$sql="SELECT * from provincia";
$resultado = $db->query($sql);
if ($resultado->num_rows > 0)
{
$combo="";
while ($row = $resultado->fetch_array(MYSQLI_ASSOC))
{
$combo .=" <option value='".
$row['codigo']."'>".$row['nome']."</option>";
}
}
else
{
echo "A tboa Provincia non ten datos";
}
$db->close(); //cerramos la conexin
?>
<html>
<head>
<title>Seleccin por provincia</title>
</head>
<body>
<form method="post" action="Tarefa6_3c2.php">
<p> Selecciona unha provincia para visualizar os chefs desta:</p>
<select name="provincia">
<?php echo $combo; ?>
</select>
<input type="submit" value="Enviar"/>
</form>
</body>
</html>

Tarefa3c_2.php
<html>
<head>
<TITLE>Cocieiros da provincia.</TITLE>
<link rel="stylesheet" href="tarefa6_3.css" />
</head>
<body>
<div id="contido">
<?php
$provincia = $_POST['provincia'];
$db = mysqli_connect('localhost','alumno','abc123.','receitas');
if (mysqli_connect_error($db)) {
echo "Erro na conexin a base de datos: (mysqli_connect_errno($db))

Pxina 26 de 36

mysqli_connect_error($db)\n";
exit;
}
$sql = "select nome from provincia where codigo = '$provincia'";
$resultado = mysqli_query($db, $sql);
if(mysqli_errno($db))
{die('<br/>ERRO('.mysqli_errno($db).') ->'.mysqli_error($db));}
$fila = mysqli_fetch_assoc($resultado);
echo '<h1>Provincia de '.$fila['nome'].'</h1>';
echo '<h2>CHEFS</h2>';
$sql = "select CONCAT(nome,' ',apelido1,' ',IFNULL(apelido2,''))
. " as chef, nomeartistico, localidade "
. "from chef where cod_provincia = '$provincia'";
$resultado = mysqli_query($db, $sql);
if(mysqli_errno($db))
{die('<br/>ERRO('.mysqli_errno($db).') ->'.mysqli_error($db));}
echo "<table><tr><th>NOME</th>"
. "<th>NOME ARTSCICO</th>"
. "<th>LOCALIDADE</th></tr>";
while($fila = mysqli_fetch_assoc($resultado)){
echo "<tr><td>".$fila['chef']."</td>"
. "<td>".$fila['nomeartistico']."</td>"
. "<td>".$fila['localidade']."</td></tr>";
}
mysqli_close($db);
?>
</div>
</body>
</html>

1.2.4

Tarefa 4. Realizacin de operacins que implican transaccins


O chef con nome artstico SEOANE creou unha nova receita de nome 'ENSALADA
ESPECIAL' catalogada como 'ENTRANTE' e con dificultade 'MEDIA'. Esta receta consta
dos seguintes ingredientes:
o Garavanzos: 200 gramos
o Pementos: 70 gramos
o Cebola:40 gramos
o Sal: 1 pizca.
Garda esta informacin na base de datos tendo en conta que non queremos que a receta
quede almacenada 'a medias'. Ademis, o programa debe indicar, no caso de terse producido
algn erro, a operacin na que se produciu ese erro e cal a descricin deste.
Autoavaliacin
/** Insercin dunha nova receita empregando transaccins **/
$db = new mysqli("localhost", "alumno", "abc123.", "receitas");
if ($db->connect_error) {
die ('Erro na conexin base de datos.');
} else {
$bandeira=true;
$sql="SELECT MAX(CODIGO)+1 AS COD FROM RECEITA";
$resultado = $db->query($sql);
$fila = $resultado -> fetch_array();
$codigo=$fila["COD"];
$db->autocommit(FALSE);
$sql1="INSERT INTO RECEITA (CODIGO,NOME, COD_GRUPO, DIFICULTADE,
COD_CHEF) VALUES (".$codigo.",'ENSALADA ESPECIAL',
(SELECT CODIGO FROM GRUPO WHERE NOME='ENTRANTES'),'Media',
(SELECT CODIGO FROM CHEF WHERE NOMEARTISTICO='SEOANE'))";
$resultado = $db->query($sql1);
if ($db->errno) {
$bandeira = false;

Pxina 27 de 36

echo '<br/>ERRO na primeira operacin ('.$db->errno.')->'.$db->error;


}
$sql2="INSERT INTO RECEITA_INGREDIENTE (COD_RECEITA, COD_INGREDIENTE,
CANTIDADE, MEDIDA) VALUES (".$codigo.",(SELECT CODIGO
FROM INGREDIENTE WHERE NOME='GARAVANZOS'),200,'gramos')";
$resultado = $db->query($sql2);
if ($mysqli->errno) {
$bandeira = false;
echo '<br/>ERRO na segunda operacin ('.$db->errno.')->'.$db->error;
}
$sql3="INSERT INTO RECEITA_INGREDIENTE (COD_RECEITA, COD_INGREDIENTE,
CANTIDADE, MEDIDA) VALUES (".$codigo.",(SELECT CODIGO
FROM INGREDIENTE WHERE NOME='PEMENTOS'),70,'gramos')";
$resultado = $db->query($sql3);
if ($mysqli->errno) {
$bandeira = false;
echo '<br/>ERRO na terceira operacin ('.$db->errno.')->'.$db->error;
}
$sql4="INSERT INTO RECEITA_INGREDIENTE (COD_RECEITA, COD_INGREDIENTE,
CANTIDADE, MEDIDA) VALUES (".$codigo.",(SELECT CODIGO
FROM INGREDIENTE WHERE NOME='CEBOLA'),40,'gramos')";
$resultado = $db->query($sql4);
if ($mysqli->errno) {
$bandeira = false;
echo '<br/>ERRO na cuarta operacin ('.$db->errno.')->'.$db->error;
}
$sql5="INSERT INTO RECEITA_INGREDIENTE (COD_RECEITA, COD_INGREDIENTE,
CANTIDADE, MEDIDA) VALUES (".$codigo.",(SELECT CODIGO
FROM INGREDIENTE WHERE NOME='SAL'),1,'pizca')";
$resultado = $db->query($sql5);
if ($mysqli->errno) {
$bandeira = false;
echo '<br/>ERRO na quinta operacin ('.$db->errno.')->'.$db->error;
}
if ($bandeira == true){
$db->commit();
echo 'Transaccin executada con xito!.';
} else {
$db->rollback();
echo '<div>Erro nalgn punto da transaccin.</div>';
}
$db->autocommit(TRUE);
$db->close();
}

1.2.5

Tarefa 5. Realizacin de operacins con consultas preparadas


Modifica a tarefa 4 para que empregue consultas preparadas cando o consideres necesario.
Autoavaliacin
Tarefa5.php
<?php
/** Insercin dunha nova receita empregando transaccins **/
$db = new mysqli("localhost", "alumno", "abc123.", "receitas");
if ($db->connect_error) {
die ('Erro na conexin base de datos.');
} else {
$bandeira=true;
$sql="SELECT MAX(CODIGO)+1 AS COD FROM RECEITA";
$resultado = $db->query($sql);
$fila = $resultado -> fetch_array();
$codigo=$fila["COD"];
$db->autocommit(FALSE);
$sql1="INSERT INTO RECEITA (CODIGO,NOME, COD_GRUPO, DIFICULTADE,
COD_CHEF) VALUES (".$codigo.",'ENSALADA ESPECIAL',

Pxina 28 de 36

(SELECT CODIGO FROM GRUPO WHERE NOME='ENTRANTES'),'Media',


(SELECT CODIGO FROM CHEF WHERE NOMEARTISTICO='SEOANE'))";
$resultado = $db->query($sql1);
if ($db->errno) {
$bandeira = false;
echo '<br/>ERRO na primeira operacin ('.$db->errno.')->'.$db->error;
}
/** Como temos que insertar varios ingredientes para cada receta faremos
* unha consulta preparada**/
$stmt = $db->stmt_init();
if (!$stmt->prepare('INSERT INTO RECEITA_INGREDIENTE
(COD_RECEITA, COD_INGREDIENTE, CANTIDADE, MEDIDA)
SELECT ?, CODIGO, ?, ?
FROM INGREDIENTE WHERE NOME=?')) {
echo "Fallou o prepare de stmt: (" . $db->errno . ") "
. $db->error;
}
if (!$stmt->bind_param('iiss', $codigo, $cantidade, $medida ,
$ingrediente)) {
echo "Fallou a vinculacin de parmetros: (" . $db->errno . ") "
. $db->error;
}
$cantidade = 200;
$medida='gramos';
$ingrediente='GARAVANZOS';
$stmt->execute();
if ($db->errno) {
$bandeira = false;
echo '<br/>ERRO na segunda operacin ('.$db->errno.')->'.$db->error;
}
$cantidade = 70;
$medida='gramos';
$ingrediente='PEMENTOS';
$stmt->execute();
if ($db->errno) {
$bandeira = false;
echo '<br/>ERRO na terceira operacin ('.$db->errno.')->'.$db->error;
}
$cantidade = 40;
$medida='gramos';
$ingrediente='CEBOLA';
$stmt->execute();
if ($db->errno) {
$bandeira = false;
echo '<br/>ERRO na cuarta operacin ('.$db->errno.')->'.$db->error;
}
$cantidade = 1;
$medida='pizca';
$ingrediente='SAL';
$stmt->execute();
if ($db->errno) {
$bandeira = false;
echo '<br/>ERRO na cuarta operacin ('.$db->errno.')->'.$db->error;
}
if ($bandeira == true){
$db->commit();
echo 'Transaccin executada con xito!.';
} else {
$db->rollback();
echo '<div>Erro nalgn punto da transaccin.</div>';
}
$stmt->close();
$db->autocommit(TRUE);
$db->close();
}
?>

Pxina 29 de 36

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 30 de 36

You might also like