No es un bug, es una característica no documentada

lunes, 11 de enero de 2016

Acceso a datos. Aplicaciones web servidor. PHP (Ejercicio)

1:11 Posted by Inazio , 1 comment
En la sección de PHP hemos visto poquísimo. Básicamente, un ejercicio para realizar consultar basadas en la interfaz PDO para conexión con bases de datos.

Os lo pongo a continuación:

Sobre un proyecto nuevo PHP (PracticaPDO), realiza las siguientes tareas:

  • Lanza el script practicaPDO.sql
  • Crea el siguiente script conexion.php:

<?php
$servidor = 'localhost';
$bd = 'practicapdo';
$usuario = 'root';
$contrasenia = '';
?>
  • Agrega el siguiente script index.php que permita crear el siguiente menú que lanzará los scripts de los siguientes apartados:


  • Crea el siguiente script consulta-comun.php que visualice todos los registros de la tabla item:


Nota: Para cada apartado de los siguientes, crear un fichero .html que recoja el argumento o argumentos con los que trabajará el script .php.
  • Crea el siguiente script consulta-con-parametros.php que visualice el registro que se le pasa como argumento (6 en el ejemplo).
  • Ídem para un script insertar.php que reciba un ítem y lo inserte. A continuación visualizar todos los ítems (en este ejemplo el ítem añadido sería Android)

  • Ídem del anterior para un script actualizar.php que reciba un identificador (que deberá existir) y un ítem, y actualice el valor del ítem de la tabla con el nuevo valor recibido (en el ejemplo se recibe el 2 y ASP)

  • Ídem del anterior para un script borrar.php que reciba un identificador (que deberá existir) y lo borre (en el ejemplo se recibe el identificador 3)


Estructura del proyecto:


El código de todos los archivos es bastante extenso, así que lo mejor para no sobrecargar la entrada es ponerlo en modo "spoiler". Para ver todo el código, pulsa en el siguiente botón, y para ocultarlo, vuelve a darle.




ARCHIVO SQL PARA LA BASE DE DATOS


DROP DATABASE IF EXISTS practicaPDO;
CREATE DATABASE practicaPDO;
USE practicaPDO;
DROP TABLE IF EXISTS `items`;
CREATE TABLE `items` (
`id_item` int(11) NOT NULL auto_increment,
`item` varchar(40) collate utf8_unicode_ci NOT NULL,
PRIMARY KEY (`id_item`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci
AUTO_INCREMENT=7 ;
INSERT INTO `items` (`id_item`, `item`) VALUES
(1, 'PHP'),
(2, 'Mootools'),
(3, 'Google Maps'),
(4, 'Javascript'),
(5, 'Actionscript'),
(6, 'c#');

ARCHIVO SCREEN.CSS

@font-face{
    font-family: "indieFlower";
    src: url('../fuentes/IndieFlower.ttf');
}

/* CONFIGURACIÓN BÁSICA */

*{
    margin: 0;
    padding: 0;
}

html, body{
    height: 100%;
}

body{
    background-color: #47555f;
    color: #8a9cb8;
    font-size: 16px;
    font-family: "indieFlower";
}

a{
    text-decoration: none;
}

/* FIN CONFIGURACIÓN BÁSICA */

/* HEADER */

header{
    background-color: #303F9F;
    color: #FFF;
    height: 10%;
}

ul{
    text-align: center;
    height: 100%;
    vertical-align: middle;
    line-height: 350%;
}

ul.menu li{
    box-sizing: border-box;
    -moz-box-sizing: border-box;
    -webkit-box-sizing: border-box;
    display: inline-block;
    padding-left: .5%;
    padding-right: .5%;
    height: 100%;
}

ul.menu li a{
    font-size: 1.5em;
    color: #FFF;
}

ul.menu li:hover{
    background-color: #FFF;
    transition-duration: .3s;
    background-color: #0a0d1c;
    border-bottom: thick solid #4357c2;
}

ul.menu li:hover a{
    color: #C5CAE9;
    transition-duration: 1s;
}
/* FIN HEADER */

/* CONTENIDO PRINCIPAL*/

div.contenido{
    width: 100%;
    height: 90%;
    text-align: center;
}

div.contenido img{
    margin-top: 15%;
}

table.resultados{
    text-align: center;
    margin: 0 auto;
    width: 50%;
    padding-top: 2%;
}

table.resultados tr td, table.resultados tr th{
    min-width: 50%;
}

table.resultados thead tr{
    background-color: #000;
    color: #b1c3d2;
}

table.resultados tbody tr.par{
    background-color: #b1d2c3;
    color: #1f2023;
}

table.resultados tbody tr.impar{
    background-color: #87a7b6;
    color: #1f2023;
}
/* FIN CONTENIDO PRINCIPAL */

ARCHIVO SUBPAGINAS.CSS

.pedirDatos{
    width: 30%;
    margin: 0 auto;
    padding-top: 5%;
    text-align: center;
}

.pedirDatosTitle{
    font-size: 2.5em;
}

.pedirDatosInput{
    display: inline-block;
    width: 60%;
    margin: 0 auto;
    margin-top: 1%;
    font-size: 1.3em;
    border-radius: 15px;
    text-align: center;
}

.pedirDatosSubmit{
    display: inline-block;
    margin: 0 auto;
    width: 60%;
    font-size: 1.3em;
    margin-top: 5%;
    border: 1px solid #1f2f47;
    border-radius: 25px;
    transition-duration: .5s;
    background-color: #2e466e;
    color: #FFF;
    box-shadow:inset 0px 0px 15px 3px #23395e;
    background:linear-gradient(to bottom, #2e466e 5%, #415989 100%);
    cursor:pointer;
    padding:2% 5%;
    text-shadow:0px 1px 0px #263666;
}

.pedirDatosSubmit:hover{
    width: 100%;
}

.botonRetorno{
    display: inline-block;
    margin: 0 auto;
    text-align: center;
}

ARCHIVO SCRIPTS.JS

function ajaxFunction() {
  var xmlHttp;
 
  try {
  
    xmlHttp=new XMLHttpRequest();
    return xmlHttp;
  } catch (e) {
   
    try {
      xmlHttp=new ActiveXObject("Msxml2.XMLHTTP");
      return xmlHttp;
    } catch (e) {
     
       try {
        xmlHttp=new ActiveXObject("Microsoft.XMLHTTP");
        return xmlHttp;
      } catch (e) {
        alert("Tu navegador no soporta AJAX!");
        return false;
      }}}
}

function Enviar(_pagina,capa) {
    var ajax;
    ajax = ajaxFunction();
    ajax.open("POST", _pagina, true);
    ajax.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");

    ajax.onreadystatechange = function() {
          if (ajax.readyState==1){
                document.getElementById(capa).innerHTML = " Aguarde por favor...";
                     }
          if (ajax.readyState == 4) {
            
                document.getElementById(capa).innerHTML=ajax.responseText;
               }}
                 
     ajax.send(null);
}

ARCHIVO INDEX.PHP

<!DOCTYPE html>
<!--
To change this license header, choose License Headers in Project Properties.
To change this template file, choose Tools | Templates
and open the template in the editor.
-->
<html lang="es">
    <head>
        <meta charset="UTF-8">
        <title>Consultas PDO</title>
        <link type="text/css" rel="stylesheet" href="css/screen.css">
        <link type="text/css" rel="stylesheet" href="css/subpaginas.css">
        <script type="text/javascript" src="js/jquery-1.11.3.js"></script>
        <script type="text/javascript" src="js/scritps.js"></script>
    </head>
    <body>
        <header>
            <ul class="menu">
                <li><a href="javascript:Enviar('comun.php','contenido')">Consulta común</a></li>
                <li><a href="javascript:Enviar('subpaginas/consultaConParametros.html','contenido')">Consulta con parámetros</a></li>
                <li><a href="javascript:Enviar('subpaginas/insertar.html','contenido')">Insertar</a></li>
                <li><a href="javascript:Enviar('subpaginas/actualizar.html','contenido')">Actualizar</a></li>
                <li><a href="javascript:Enviar('subpaginas/borrar.html','contenido')">Borrar</a></li>
            </ul>
        </header>
       
        <div class="contenido" id="contenido">
            <a href="http://programandoapasitos.blogspot.com" target="_blank"><img src="img/iconoWeb.PNG" alt="Programando a pasitos"></a>
        </div>
    </body>
</html>



ARCHIVO CONEXION.PHP

<?php
    $servidor = 'localhost';
    $bd = 'practicapdo';
    $usuario = 'root';
    $password = 'root';
?>

ARCHIVO COMUN.PHP

<!DOCTYPE html>
<!--
To change this license header, choose License Headers in Project Properties.
To change this template file, choose Tools | Templates
and open the template in the editor.
-->
<html>
    <head>
        <meta charset="UTF-8">
        <link type="text/css" rel="stylesheet" href="css/screen.css">
        <title></title>
    </head>
    <body>
        <?php
            include 'conexion.php';
            $contador = 0; // Para clases en los resultados
            try{
                // Conexión a la base de datos
                $baseDatos = new PDO("mysql:host=$servidor;dbname=$bd", $usuario, $password);

                // Atributo para reportar error
                $baseDatos->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

                // Sentencia SQL
                $stmt = $baseDatos->prepare("SELECT * FROM items");

                // Ejecutar la consulta
                $stmt->execute();

                // Imprimir resultados
                echo '<table class="resultados">';
                echo '<thead>';
                echo '<tr>';
                echo '<th>Id</th>';
                echo '<th>Item</th>';
                echo '<tr>';
                echo '</thead>';
                echo '<tbody>';
                while ($row = $stmt->fetch()){
                    if ($contador % 2 == 0){
                        echo '<tr class="par">';
                    }
                    else{
                        echo '<tr class="impar">';
                    }
                   
                    echo '<td>' . $row['id_item'] . '</td>';
                    echo '<td>' . $row['item'] . '</td>';
                    echo '</tr>';
                   
                    $contador++;
                }
                echo '</tbody>';
                echo '</table>';
            }
            catch (PDOException $e) {
                echo $e->getMessage();
            }
            finally {
                if ($baseDatos != NULL)
                    $baseDatos = NULL;
            }
        ?>
    </body>
</html>

ARCHIVO ACTUALIZAR.HTML

<!DOCTYPE html>
<!--
To change this license header, choose License Headers in Project Properties.
To change this template file, choose Tools | Templates
and open the template in the editor.
-->
<html>
    <head>
        <meta charset="UTF-8">
        <title>Consultas PDO</title>
        <link type="text/css" rel="stylesheet" href="../css/subpaginas.css">
    </head>
    <body>
        <div>
            <form class="pedirDatos" action="subpaginas/actualizar.php" method="POST">
                <h1 class="pedirDatosTitle">ACTUALIZAR CAMPO</h1>
                <input class="pedirDatosInput" type="text" name="id" placeholder="Id del lenguaje">
                <input class="pedirDatosInput" type="text" name="lenguaje" placeholder="Nuevo Lenguaje">
                <input class="pedirDatosSubmit" type="submit" name="enviar" value="Actualizar">
            </form>
        </div>
    </body>
</html>

ARCHIVO ACTUALIZAR.PHP

<?php

include '../conexion.php';

/* Función para capturar los datos pasados */
function recoge($var){
    $tmp = (isset($_REQUEST[$var]))
        ? trim(htmlspecialchars($_REQUEST[$var], ENT_QUOTES, "UTF-8"))
        : "";
    return $tmp;
}

$identificador = recoge("id");
$lenguaje = recoge("lenguaje");
$consulta = "UPDATE items SET item = ? WHERE id_item = ?";

try{
    // Conexión a la base de datos
    $baseDatos = new PDO("mysql:host=$servidor;dbname=$bd", $usuario, $password);

    // Atributo para reportar error
    $baseDatos->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

    // Sentencia SQL
    if ($identificador != ""){
        $stmt = $baseDatos->prepare($consulta);
        $stmt->execute(array($lenguaje,$identificador));
    }
}
catch (PDOException $e) {
    echo $e->getMessage();
}
finally {
    if ($baseDatos != NULL)
        $baseDatos = NULL;
    header('Location: consultaConParametros.php');
}

ARCHIVO BORRAR.HTML

<!DOCTYPE html>
<!--
To change this license header, choose License Headers in Project Properties.
To change this template file, choose Tools | Templates
and open the template in the editor.
-->
<html>
    <head>
        <meta charset="UTF-8">
        <title>Consultas PDO</title>
        <link type="text/css" rel="stylesheet" href="../css/subpaginas.css">
    </head>
    <body>
        <div>
            <form class="pedirDatos" action="subpaginas/borrar.php" method="POST">
                <h1 class="pedirDatosTitle">BORRAR REGISTRO</h1>
                <input class="pedirDatosInput" type="text" name="id" placeholder="Id del lenguaje">
                <input class="pedirDatosInput" type="text" name="lenguaje" placeholder="Nuevo Lenguaje">
                <input class="pedirDatosSubmit" type="submit" name="enviar" value="Borrar">
            </form>
        </div>
    </body>
</html>

ARCHIVO BORRAR.PHP

<?php

include '../conexion.php';

/* Función para capturar los datos pasados */
function recoge($var){
    $tmp = (isset($_REQUEST[$var]))
        ? trim(htmlspecialchars($_REQUEST[$var], ENT_QUOTES, "UTF-8"))
        : "";
    return $tmp;
}

$identificador = recoge("id");
$lenguaje = recoge("lenguaje");
$consulta = "DELETE FROM items WHERE id_item = ? OR item = ?";

try{
    // Conexión a la base de datos
    $baseDatos = new PDO("mysql:host=$servidor;dbname=$bd", $usuario, $password);

    // Atributo para reportar error
    $baseDatos->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

    // Sentencia SQL
    $stmt = $baseDatos->prepare($consulta);
    $stmt->execute(array($identificador,$lenguaje));
}
catch (PDOException $e) {
    echo $e->getMessage();
}
finally {
    if ($baseDatos != NULL)
        $baseDatos = NULL;
    header('Location: consultaConParametros.php');
}

ARCHIVO CONSULTACONPARAMETROS.HTML

<!DOCTYPE html>
<!--
To change this license header, choose License Headers in Project Properties.
To change this template file, choose Tools | Templates
and open the template in the editor.
-->
<html>
    <head>
        <meta charset="UTF-8">
        <title>Consultas PDO</title>
        <link type="text/css" rel="stylesheet" href="../css/subpaginas.css">
    </head>
    <body>
        <div>
            <form class="pedirDatos" action="subpaginas/consultaConParametros.php" method="POST">
                <h1 class="pedirDatosTitle">BUSCAR</h1>
                <input class="pedirDatosInput" type="text" name="id" placeholder="Id del lenguaje">
                <input class="pedirDatosInput" type="text" name="lenguaje" placeholder="Nombre del lenguaje">
                <input class="pedirDatosSubmit" type="submit" name="enviar" value="Consultar">
            </form>
        </div>
    </body>
</html>

ARCHIVO CONSULTACONPARAMETROS.PHP

<!DOCTYPE html>
<!--
To change this license header, choose License Headers in Project Properties.
To change this template file, choose Tools | Templates
and open the template in the editor.
-->
<html>
    <head>
        <meta charset="UTF-8">
        <link type="text/css" rel="stylesheet" href="../css/screen.css">
        <link type="text/css" rel="stylesheet" href="../css/subpaginas.css">
        <title></title>
    </head>
    <body>
        <?php
            include '../conexion.php';

            /* Función para capturar los datos pasados */
            function recoge($var){
                $tmp = (isset($_REQUEST[$var]))
                    ? trim(htmlspecialchars($_REQUEST[$var], ENT_QUOTES, "UTF-8"))
                    : "";
                return $tmp;
            }

            $identificador = recoge("id");
            $lenguaje = recoge("lenguaje");
            $consulta = "SELECT * FROM items WHERE id_item = ? OR item = ?";
            $consultaNormal = "SELECT * FROM items";

            $contador = 0; // Para clases en los resultados
            try{
                // Conexión a la base de datos
                $baseDatos = new PDO("mysql:host=$servidor;dbname=$bd", $usuario, $password);

                // Atributo para reportar error
                $baseDatos->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

                // Sentencia SQL
                if ($identificador == "" && $lenguaje == ""){
                    $stmt = $baseDatos->prepare($consultaNormal);
                }
                else{
                    $stmt = $baseDatos->prepare($consulta);
                }

                // Ejecutar la consulta
                $stmt->execute(array($identificador, $lenguaje));

                // Imprimir resultados
                echo '<table class="resultados">';
                echo '<thead>';
                echo '<tr>';
                echo '<th>Id</th>';
                echo '<th>Item</th>';
                echo '<tr>';
                echo '</thead>';
                echo '<tbody>';
                while ($row = $stmt->fetch()){
                    if ($contador % 2 == 0){
                        echo '<tr class="par">';
                    }
                    else{
                        echo '<tr class="impar">';
                    }

                    echo '<td>' . $row['id_item'] . '</td>';
                    echo '<td>' . $row['item'] . '</td>';
                    echo '</tr>';

                    $contador++;
                }
                echo '</tbody>';
                echo '</table>';
            }
            catch (PDOException $e) {
                echo $e->getMessage();
            }
            finally {
                if ($baseDatos != NULL)
                    $baseDatos = NULL;
            }
        ?>
        <div class="pedirDatos" action="subpaginas/consultaConParametros.php" method="POST">
            <a href="../index.php"><input class="pedirDatosSubmit" type="submit" name="enviar" value="Volver al inicio"></a>
        </div>
    </body>
</html>

ARCHIVO INSERTAR.HTML

<!DOCTYPE html>
<!--
To change this license header, choose License Headers in Project Properties.
To change this template file, choose Tools | Templates
and open the template in the editor.
-->
<html>
    <head>
        <meta charset="UTF-8">
        <title>Consultas PDO</title>
        <link type="text/css" rel="stylesheet" href="../css/subpaginas.css">
    </head>
    <body>
        <div>
            <form class="pedirDatos" action="subpaginas/insertar.php" method="POST">
                <h1 class="pedirDatosTitle">NUEVO REGISTRO</h1>
                <input class="pedirDatosInput" type="text" name="lenguaje" placeholder="Lenguaje">
                <input class="pedirDatosSubmit" type="submit" name="enviar" value="Insertar">
            </form>
        </div>
    </body>
</html>

ARCHIVO INSERTAR.PHP

<?php

include '../conexion.php';

/* Función para capturar los datos pasados */
function recoge($var){
    $tmp = (isset($_REQUEST[$var]))
        ? trim(htmlspecialchars($_REQUEST[$var], ENT_QUOTES, "UTF-8"))
        : "";
    return $tmp;
}

$lenguaje = recoge("lenguaje");
$consulta = "INSERT INTO items (item) VALUES(?)";

try{
    // Conexión a la base de datos
    $baseDatos = new PDO("mysql:host=$servidor;dbname=$bd", $usuario, $password);

    // Atributo para reportar error
    $baseDatos->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

    // Sentencia SQL
    if ($lenguaje != ""){
        $stmt = $baseDatos->prepare($consulta);
        $stmt->execute(array($lenguaje));
    }
}
catch (PDOException $e) {
    echo $e->getMessage();
}
finally {
    if ($baseDatos != NULL)
        $baseDatos = NULL;
    header('Location: consultaConParametros.php');
}


1 comentario: