Bases de Datos_Mysqli

download Bases de Datos_Mysqli

of 30

description

Teoria sobre bases de datos y PHP del modulo entorno servidor del ciclo de grado superior de diseño de aplicaciones WEB.

Transcript of Bases de Datos_Mysqli

  • 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 dedatos

    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 co-rrespondentes 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....................................................................................................................5Contexto 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..............................................................................81.1Introducin.........................................................................................................................81.2Actividade...........................................................................................................................8

    Acceso a base de datos........................................................................................................................8APIs de PHP para acceder s bases de datos de MySQL ...........................................................................8

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

    Tarefas..................................................................................................................................191.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.....................................................................................301.4Recursos didcticos.........................................................................................................30

    3.Avaliacin......................................................................................................................31Exemplo 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 tcnicaContexto da actividade

    Mdulo Duracin

    Unidade didctica. Sesins 50

    Actividades Sesins 50

    MP0613. Desenvolvemento web encontorno servidor.

    175

    UD06. Programacin de aplicacinsweb 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 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 operacinssobre bases de datos centrndose no sistema xestor debase 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 integridadeda informacin

    Non

    Obxectivos didcticos e ttulo e descricin da actividade

    Obxectivos especficos Actividade Descricin bsica Duracin

    O1.1 Identificar as tecnoloxas quepermiten o acceso medianteprogramacin informacindispoible en almacns de datos.

    A1 Acceso a base de datos MySQL Nesta actividade explicarase comorealizar operacins sobre bases dedatos centrndose no sistema xestorde base de datos MySQL coaextensin mysqli.

    14

    O1.2 Crear aplicacins que establezanconexins con bases de datos.

    O1.3 Recuperar informacin dunha

    Pxina 5 de 36

  • base de datos e visualizala nunhapxina web.

    O1.4 Crear aplicacins web quepermitan a actualizacin e aeliminacin de informacindispoible nunha base de datos.

    O1.5 Usar transaccins para manter aconsistencia 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 Cmo Con qu Cmo e con qu sevalora

    Duracin(sesins)

    Actividade(ttulo e descricin)

    Profesorado(en termos de tarefas)

    Alumnado(tarefas)

    Resultados ou produtos

    Recursos Instrumentos eprocedementos de

    avaliacin

    A1 Acceso a base de datos MySQL

    Identificar as tecnoloxas quepermiten o acceso medianteprogramacin informacindispoible en almacns dedatos.

    Crear aplicacins queestablezan conexins conbases de datos.

    Recuperar informacindunha base de datos evisualizala nunha pxinaweb.

    Crear aplicacins web quepermitan a actualizacin e aeliminacin de informacindispoible nunha base dedatos.

    Usar transaccins paramanter a consistencia dainformacin.

    Tp1.1 Explicacin por parte do profesor dasdistintas APIs de PHP para conectarse asbases de datos, e en particular a extensinmysqli..

    Tp1.2 Explicacin por parte do profesor decmo realizar conexins a bases de datosMySQL empregando a extensin mysqli.

    Tp1.3 Explicacin sobre como realizarconsultas que non devolven valoresempregando a extensin mysqli (tanto dexeito procedemental como empregando oestilo orientado a obxectos).

    Tp1.4 Explicacin sobre como realizar consultas que devolven valores empregandoa 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.

    Ta1.1. Creacin da base de datos coa queimos traballar nesta actividade eestablecemento dunha conexin con estaempregando a extensin mysqli.

    Ta1.2 . Realizacin de consultas de accinempregando a extensin mysqli.

    Ta1.3 . Realizacin de consultas quedevolven valores empregando a extensinmysqli.

    Ta1.4 . Realizacin de operacins queimplican o uso de transaccins empregandoa extensin mysqli.

    Ta1.5 . Realizacin de operacinsempregando consultas preparadas.

    Ta1.6 . Realizacin dunha proba prcticarelativa ao explicado nesta actividade.

    Base de datos creada enmysqli

    Scripts coas solucins astarefas

    Scripts coa solucin proba prctica

    Software de servidor webApache ou semellante.

    Intrprete da linguaxePHP.

    Contorno dedesenvolvemento deaplicacins webNetBeans ou semellante.

    Navegador web Firefoxou semellante

    Apuntes proporcionadospolo profesor

    Proba escrita relativa realizacin das tarefaspropostas aoalumnado e probaprctica relativa actividade

    14

  • 2. A1. Acceso a base de datos MySQL1.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 ActividadeAcceso a base de datos

    Como xa temos visto, unha API (Interface de Programacin de Aplicacins) define asclases, mtodos, funcins e variables que a aplicacin necesita empregar para realizar unhatarefa 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 procedimentalusar funcins para realizar tarefas, mentres que unha API orientada a obxectos instanciarclases e chamar aos mtodos sobre os obxectos resultantes.

    PHP soporta mis de 15 sistemas xestores de bases de datos: SQLite, Oracle, SQL Ser-ver, PostgreSQL, IBM DB2, MySQL, etc. Ata a versin 5 de PHP, o acceso s bases de da-tos facase principalmente utilizando extensins especficas para cada sistema xestor de basede datos (extensins nativas). dicir, que se queriamos acceder a unha base de datos dePostgreSQL, deberiamos instalar e utilizar a extensin dese xestor en concreto. As funcinse obxectos a utilizar eran distintos para cada extensin.

    A partir da versin 5 de PHP introduciuse na linguaxe unha extensin para acceder dunhaforma comn a distintos sistemas xestores: PDO. A gran vantaxe de PDO est clara: pode-mos seguir utilizando unha mesma sintaxe anda que cambiemos o motor da nosa base dedatos. Pola contra, nalgunhas ocasins preferiremos seguir usando extensins nativas nosnosos programas. Mentres PDO ofrece un conxunto comn de funcins, as extensins nati-vas normalmente ofrecen mis potencia (acceso a funcins especficas de cada xestor debase de datos) e nalgns casos tamn maior velocidade.

    Dos distintos SXBD existentes imos traballar con MySQL. MySQL un xestor de basesde datos relacionais de cdigo aberto baixo licenza GNU GPL. o xestor de bases de datosmis 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 unhaaplicacin 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 extensinnativa mysql. Esta extensin mantense na actualidade para dar soporte s aplicacins xaexistentes que a utilizan, pero non se recomenda utilizala para desenvolver novos progra-mas, xa que foi declarada obsoleta a partir de PHP 5.5.0 e vai ser eliminada no futuro. Omis habitual elixir entre mysqli (extensin nativa) e PDO.

    Con calquera de ambas as das extensins, poders realizar accins sobre as bases de da-tos 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 paracomunicarse co servidor MySQL. Ata hai pouco o nico driver dispoible para realizar estafuncin era libmysql, que non estaba optimizado para ser utilizado dende PHP. A partir daversin 5.3, PHP vn preparado para utilizar tamn un novo driver mellorado para realizaresta funcin, o Driver Nativo de MySQL, mysqlnd.

    A extensin mysqli

    A extensin mysqli, tamn coecida como extensin de MySQL mellorada, desenvolveusepara aproveitar as novas funcionalidades encontradas nos sistemas MySQL con versin4.1.3 ou posterior. Ven includa nas versins PHP5 e posteriores, e conta coas seguintesmelloras 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 decada 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 unhaconexin 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 abase 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 datoscoa que imos traballar. Para isto tamn se pode usar o mtodo select_db como se ve acontinuacin:

    $db->select_db("outra_bd");

    Comprobar que a conexin se estableceu correctamente

    importante verificar que a conexin se estableceu correctamente antes de realizarningunha operacin sobre a base de datos. Para comprobar o erro, en caso de que seproduza, 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 nullse non se produce ningn erro.

    connect_error mysqli_connect_error( ) Devolve a mensaxe de erro xerada polo ltimo intento de conexin, ounull se non se produce ningn erro.

    Por exemplo, o seguinte cdigo comproba o establecemento dunha conexin coa base dedatos "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 "Erro $error conectando base de datos: $db->connect_error"; exit();}

    Pechar a conexin base de datos

    Para pechar a conexin a base de datos podemos emplear a funcin mysqli_close como seamosa a continuacin:

    mysqli_close($db);

    ou empregando o estilo orientado a obxectos podemos invocar o mtodo close() e polotanto escribir algo como:

    $db->close();

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

    Erros

    Xa vimos as funcins que nos permiten controlar os erros producidos na conexin base dedato. A extensin MySQLi proporciona procedementos e propiedades de obxecto que daninformacin 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 seproduce ningn erro.

    error mysqli_error(mysqli $con) Devolve a ltima mensaxe de erro xerada na base de datos, ou null senon se produce ningn erro.

    Execucin de consultas

    Ao igual que cando fixemos a conexin base de datos, podemos executar consultasempregando mysqli de xeito procedimental e orientado a obxectos. Ademis, imosdistinguir 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 eDROP), e de actualizacin da informacin da base de datos (UPDATE, INSERT e DELETE) nondevolve ningn valor almacenado na base de datos. Unicamente devolver true ou falsepara indicar se se ten producido algn erro.

    A forma mis inmediata de executar unha consulta con MySQLi o mtodo query, em-pregando 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 aobxectos. Neste caso, a propiedade affected_rows conter o nmero de filas afectadaspola ltima consulta de actualizacin executada.

    $sentenza = "DROP TABLE IF EXISTS libro";

    Pxina 11 de 36

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

    No seguinte exemplo insertamos unha fila na base de datos e comprobamos que o nme-ro de filas afectadas 1 empregando a propiedade affected_rows. (Pode ser que a sintaxesexa 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('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 afuncin mysqli_query(mysqli $link, string $consulta) que devolve true no casode que non se produza ningn erro e false en caso contrario. Para consultar o nmero de fi-las 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('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 autoincre-mental, co cal non temos que definilo cando facemos a insercin pero podemos querer sabercal foi o ltimo valor que se insertou. Para facer isto, temos a propiedade insert_id candoestamos traballando coa interface orientada a obxectos, e a funcinmysqli_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 resultadosque haber que procesar ou mostrar.

    Para a execucin destas consultas emprganse os mesmos mtodos que os explicadospara as consultas de accin: query se usamos a interface orientada a obxectos e a funcinmysqli_query co estilo procedimental. Os datos devlvense en forma dun obxecto da clasemysqli_result. Ademis, se queremos coecer o nmero de filas que contn o resultado daconsulta podemos empregar o mtodo num_rows da clase mysqli_result para a interfaceorientada a obxectos, e mysqli_num_rows(mysqli_result $result) para a interface pro-cedimental.

    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 co-lumna 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('ERRO('.$db->errno.') ->'.$db->error);}while($fila = $resultado -> fetch_assoc()){ echo "CHEF: ".$fila['chef'] . " --> RECEITA:".$fila['receita'] .""; }

    O equivalente en estilo procedemental sera o array asociativo mysqli_fetch_assoc( mysqli_result $result ). Neste caso, o parmetro de entrada o resultado demysqli_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('ERRO('.mysqli_errno($db).') ->'.mysqli_error($db));}while($fila = mysqli_fetch_assoc($resultado)){ echo "CHEF: " . $fila['chef'] . "--> RECEITA:".$fila['receita'] ."";}

    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 ambosdependendo 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 asclaves do array.Array ( [chef] => XULIANICO [receita] => AMEIXAS VERDES)

    o MYSQLI_NUM: Devolve un array numrico. Cada ndice representa o contido dascolumnas 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, in-dicando a clave en funcin do parmetro que se lle pase:

    while($fila = $resultado -> fetch_array(MYSQLI_ASSOC)){ echo "CHEF: ".$fila['chef'] . " --> RECEITA:".$fila['receita'] ."";}

    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'] ."";}

    Pxina 13 de 36

  • Obxecto: mysqli_result::fetch_object ([string $nome_clase [ ,array$params ]])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 apasar ao construtor de dita clase.

    while ($obxecto = $resultado->fetch_object()) { echo $obxecto->chef . " --> " . $obxecto->receita . ""; }

    A vantaxe de usar este mtodo que nos permite instanciar unha clase, a que lle pasamosos datos da fila do obxecto, e que nos permite definir mtodos para traballar con estes. Scampos da fila pasan a ser atributos pblicos da clase, co cal poderemos acceder a estesdentro da clase sen necesidade de definilos.Por exemplo, se temos unha clase Consulta que recibe o resultado da nosa consulta, auto-mticamente esta ter como atributos pblicos chef e receita, co cal podemos definir unmtodo para amosalos como se ve a continuacin:

    class Consulta { function amosar(){ return "" . $this->chef . " --> " . $this->receita; } }

    E para amosar o contido usamos o mtodo feth_object ao que lle pasamos a clase creadapara 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 unobxecto cando utilizamos o interface procedimental, tamn se pode facer usando objectmysqli_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 desaclase.

    while ($obxecto = mysqli_fetch_object($resultado)) { echo $obxecto->chef . " --> " . $obxecto->receita . ""; }

    importante ter en conta que os resultados obtidos se almacenarn en memoria mentres osesteas a usar. Cando xa non os necesites, pdelos liberar co mtodo free da clasemysqli_result (ou coa funcin mysqli_free_result).

    $resultado->free();

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

    Pxina 14 de 36

  • Transaccins

    Cando traballamos con bases de datos pode suceder que nalgunhas ocasins queiramos queX operacins se executen como un bloque, isto , que ou ben se executen todascorrectamente, ou, se algunha falla, non queremos que se rexistre ningn cambio na base dedatos. Para isto debemos usar transaccins.

    Os motores de almacenamento de tablas en MySQL son MyISAM e InnoDB. O que fun-ciona por defecto o motor MyISAM, que excle a seguridade proporcionada pola integri-dade referencial e non permite transaccins. Por isto, para traballar con transaccins debe-mos traballar co motor InnoDB.

    Por defecto, MySQL exectase en modo de execucin automtica (autocommit), o quesignifica que cada consulta individual inclese dentro da sa propia transaccin. O que con-leva que tan pronto como se executa unha sentenza, se modifica a tboa de MySQL, facendoimposible a volta atrs. Para poder revertir os cambios das consultas (rollback) usando tran-saccins, 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 decando facer efectiva a modificacin ou de revertir as modificacins ocasionadas polas con-sultas.

    Para facer efectiva as modificacins chamaremos a funcin commit coa interface orienta-da a obxectos e mysqli_commit (mysqli $link) coa interface procedimental. E para re-vertir a transaccin actual chamaremos funcin rollback coa interface procedimental emysqli_rollback (mysqli $link) coa interface procedimental.

    A continuacin imos ver un exemplo de transaccin coa interface orientada a obxectospara 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 'ERRO na primeira operacin ('.$db->errno.')->'.$db->error; } $result = $db->query($sql2); if ($db->errno) { $bandeira = false; echo 'ERRO na segunda operacin ('.$db->errno.')->'.$db->error; } if ($bandeira == true){ $db->commit(); echo 'Transaccin executada con xito!.'; } else { $db->rollback(); echo 'Erro nalgn punto da transaccin.'; } $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 'ERRO na primeira operacin ('.mysqli_errno($db).

    ') ->'. mysqli_error($db); } $result = mysqli_query($db, $sql2); if (mysqli_errno($db) != 0) { $bandeira = false; echo '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 'Erro nalgn punto da transaccin.'; } 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, dandolugar execucin dun rollback, o campo auto_increment ter o contador como se osinserts s houbesen tido lugar. O rollback non o restaura ao valor inicial. Para facelodeberiamos 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 deforma habitual nun programa. Para acelerar este proceso, MySQL admite consultaspreparadas. Estas consultas almacnanse no servidor listas para ser executadas cando sexanecesario 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 in-terface orientada a obxectos, debes utilizar a clase mysqli_stmt. Utilizando o mtodostmt_init da clase mysqli obtense un obxecto da devandita clase.

    Os pasos que debes seguir para executar unha consulta preparada coa interface orientadaa 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 aanterior, se os valores que insire son sempre os mesmos. Por este motivo as consultas prepa-radas admiten parmetros. Para preparar unha consulta con parmetros, en lugar de poer osvalores 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 cadaparmetro polo seu valor. O primeiro parmetro do mtodo bind_param unha cadea detexto na que cada carcter indica o tipo dun parmetro, segundo a seguinte tboa:

    CARACTER TIPO DO PARMETRO

    I Nmero enteiro

    D Nmero real (dobre precisin)

    S Cadea de texto

    B 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 daconsulta preparada para almacenar o seu resultado. Temos dous mtodos para extraer o re-sultado 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

  • TarefasAs 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 unhaconexin con esta empregando a extensin mysqli.

    Tarefa 1_b. Creacin dunha clase conexin. Nesta tarefa crearemos unha claseconexin para conectarse a unha base de datos que se pasa como parmetro no servidorlocal.

    Tarefa 2. Realizacin de consultas de accin. Nesta tarefa realizaremos consultas deaccin sobre a base de datos receitas empregando a interface orientada a obxectos e oestilo procedemental.

    Tarefa 3. Realizacin de consultas que devolven valores. Nesta tarefa realizaremosconsultas que devolven valores sobre a base de datos receitas.

    Tarefa 4. Realizacin de operacins que implican transaccins. Nesta tarefarealizaremos operacins que deban executarse como un nico bloque.

    Tarefa 5. Realizacin de operacins con consultas preparadas. Nesta tarefaempregaremos consultas preparadas para axilizar a execucin cando se realiza a mesmaconsulta en mis dunha ocasin.

    Pxina 19 de 36

  • 1.2.1 Tarefa 1. Creacin e conexin a base de datos de traballoa) Tarefa 1_a

    Empregando o script crearReceitas.sql adxuntado como recurso crea a base de datosReceitas 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 sea conexin se estableceu con xito ou o erro producido ao conectarse. Pon un exemplo deconexin 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 dedatos, 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 marcamosa 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 recei-tas

    Conexin base de datos dende PHP empregando orientacin a obxectos:

    Conexin base de datos dende PHP empregando estilo procedimental:

  • 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 "Pechada a conexin coa base de datos"; } ?>

    b) Tarefa 1_b

    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 asregras 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 mesmottulo.

    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 quedebe 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 informa-

    cin : "Inserido 1 rexistro co cdigo XX".

    Autoavaliacin

    a) Tarefa 2_a

    b) Tarefa 2_b

  • 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 amosesegn 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 pxinacon 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

    Paxinar resultados - Tarefa 6_3a RECEITAS

    b) Tarefa 3_b

  • echo "A tboa Provincia non ten datos";}$db->close(); ?>

    Seleccin por provincia

    c) Tarefa 3_c

    Tarefa3c.php

    Seleccin por provincia

    Selecciona unha provincia para visualizar os chefs desta:

    Tarefa3c_2.php

    Cocieiros da provincia.

  • mysqli_connect_error($db)\n"; exit; } $sql = "select nome from provincia where codigo = '$provincia'"; $resultado = mysqli_query($db, $sql); if(mysqli_errno($db)) {die('ERRO('.mysqli_errno($db).') ->'.mysqli_error($db));} $fila = mysqli_fetch_assoc($resultado); echo 'Provincia de '.$fila['nome'].''; echo 'CHEFS'; $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('ERRO('.mysqli_errno($db).') ->'.mysqli_error($db));} echo "NOME" . "NOME ARTSCICO" . "LOCALIDADE"; while($fila = mysqli_fetch_assoc($resultado)){ echo "".$fila['chef']."" . "".$fila['nomeartistico']."" . "".$fila['localidade'].""; } mysqli_close($db); ?>

    1.2.4 Tarefa 4. Realizacin de operacins que implican transaccinsO chef con nome artstico SEOANE creou unha nova receita de nome 'ENSALADAESPECIAL' catalogada como 'ENTRANTE' e con dificultade 'MEDIA'. Esta receta constados seguintes ingredientes:o Garavanzos: 200 gramoso Pementos: 70 gramoso Cebola:40 gramoso 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 producidoalgn 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 '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 '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 '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 '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 'ERRO na quinta operacin ('.$db->errno.')->'.$db->error; } if ($bandeira == true){ $db->commit(); echo 'Transaccin executada con xito!.'; } else { $db->rollback(); echo 'Erro nalgn punto da transaccin.'; } $db->autocommit(TRUE); $db->close();}

    1.2.5 Tarefa 5. Realizacin de operacins con consultas preparadasModifica a tarefa 4 para que empregue consultas preparadas cando o consideres necesario.

    Autoavaliacin

    Tarefa5.php

  • (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 '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 'ERRO na segunda operacin ('.$db->errno.')->'.$db->error; }

    $cantidade = 70; $medida='gramos'; $ingrediente='PEMENTOS'; $stmt->execute(); if ($db->errno) { $bandeira = false; echo 'ERRO na terceira operacin ('.$db->errno.')->'.$db->error; }

    $cantidade = 40; $medida='gramos'; $ingrediente='CEBOLA'; $stmt->execute(); if ($db->errno) { $bandeira = false; echo 'ERRO na cuarta operacin ('.$db->errno.')->'.$db->error; }

    $cantidade = 1; $medida='pizca'; $ingrediente='SAL'; $stmt->execute(); if ($db->errno) { $bandeira = false; echo 'ERRO na cuarta operacin ('.$db->errno.')->'.$db->error; }

    if ($bandeira == true){ $db->commit(); echo 'Transaccin executada con xito!.'; } else { $db->rollback(); echo 'Erro nalgn punto da transaccin.'; } $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