ManuelRomero/DAW/distancia/tutorias/Tutoria2

De WikiEducator
Saltar a: navegación, buscar





Icon objectives.jpg

Objetivos

Se han tratado los siguientes temas
  1. Agenda
  2. Ejercicios básicos de php
  3. Presentación del tema de bases de datos




Agenda

  • Sobre la agenda hemos comentado tres conceptos
  1. Cómo ejecutar código php en un solo fichero
  2. Cómo pasar información en input de tipo hidden
  3. Cómo pasar varios datos de información usando una sola variable que sería un array

Ejecutar php en un solo fichero

  • Muchas ocasiones queremos que el código php se ejecute en la misma página php.
  • Esto implica que de alguna manera el servidor tiene que saber si esta página es la primera vez o sea que se pide por que un usuario ha tecleado el url de la página en el navegador
  • O bien se solicita la página por que se ha invocado la ejecución del fichero como resultado de hacer un submit en un forfmulario.
  • En la página index.php tendrá que haber un formulario p.e.
<form action=”index.php” method=”POST”> 
   …..
  <intput type=submit value=”enviar datos” name=”enviar”
 
</form>

El código necesario dentro de la página sería

<?php
  if ($_POST['enviar']){...
}
?>
  • De esta forma vemos si se ha enviado el formulario.
  • Por su puesto hay varias maneras pero esta es una de ellas
  • Cuando se quiere invocar al mismo fichero se puede ver en el elemento form lo siguiente
  • O bien escribier el nombre del fichero
<form action=”index.php” method=”POST”>
  • También odemos escribir un punto
<form action=”." method=”POST”>
  • Podemos tomar el valor de la variable superglobal $_SERVER, escribiendo un código php
<form action=<?php echo $_SERVER['PHP_SELF']; ?> method=”POST”>
  • Aquí ponemos un ejemplo que es uno de los que vimos en la tutoría


Icon activity.jpg

Actividad

  • Escribir un programa en php que en un solo fichero se nos solicite nombre de usuario y password
  • Al ejecutar la parte de php se verificarán las siguietes condiciones
  1. Que el usuario y password no estén vacíos
  2. Que el usuario tenga más de 7 caracteres
  3. que la password tenga al menos un dígito
  • En caso de que todo esté ok, simplemente se dejará el nombre de usuario y password en las casillas de texto
  • En caso de que haya algún error, se informará del error que haya (solo del primero que se encuentre), y se mostrará las cajas de texto vacías
<!DOCTYPE html>
<html>
    <head>
        <title>Formulario de datos  </title>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
    </head>
    <body>
        <!-- Aqui empieza el código php -->
        <?php 
        //Si es la primera vez que se ejecuta el formulario
        if (!(isset($_POST['enviar']))){
            //Primera vez
            $usuario="";
            $pass="";
        }
        else{
            if (errores()){
                //Segunda o siguientes veces con error
            $usuario="";
            $pass="";
 
            }else{
 
                //Todo ok y no es la primera vez que se carga la página
                 $usuario=$_POST['usuario'];
                 $pass=$_POST['pass'];
 
            }
        }
 
        /*Esta función analiza los datos de usuario y passoword para ver si hay algún error
          En caso de error muestra un mensaje y retorna un booleano con valor true
          En caso de que no haya error retorna el booleano false
        */
        function errores(){
            $usuario = $_POST['usuario'];
            $pass = $_POST['pass'];
            if ((empty($usuario))||(empty($pass))){
                echo "Los campos de usuariio y pass no pueden estar vacíos";
                return true;
            }
            if (strlen($usuario)<=7){
                echo "La cadena de usuario debe tener más de 7 caracteres y no ".strlen($usuario);
                return true;
            }
            //Establemcesmos la expresión regular de números 
            $expresion='/[0-9]/';
            //Con esta función analizamos a ver si el texto $pass tiene la expresión regular $expreson
            if (preg_match($expresion,$pass)!=true){
                echo "La pass debe tener al menos un dígito y no lo tienen ".($pass);
                return true;
 
            }
            return false;
        }
        ?>
 
         <form action=<?php echo $_SERVER['PHP_SELF'] ?> method="POST">
            Inserta un numero <br>
           <!--Observar que el valor de las cajas de texto la obtengo ejecutando php -->
            usuario : <input type="text" name="usuario" value="<?php echo "$usuario"; ?>"/>
            Pass:    <input type="text" name="pass" value="<?php echo "$pass" ;?>"/>
            <br>
            <input type="submit" value="Enviar" name="enviar"/> 
        </form>
 
    </body>
</html>






Cómo pasar información en input de tipo hidden

  • Para pasar información entre el cliente y el servidor puedo usar un input de tipo hidden.
  • Esto puede ser muy interesante en muchas ocasiones.
  • Es muy importante recordar que http es un protocolo sin estado


Icon key points.gif

Puntos clave

http es un protocolo sin estado


  • Por eso en determinadas ocasiones para recordar cosas del úlimo envío puedo usar esta sencilla estrategia
  • Lógicamente hay muchas más y mas sofisticadas que iremos viendo como Bases de datos, ficheros cookies, sesiones o usar Ajax para recargar solo parte de la página manteniendo intacta el resto de información.
  • Cada vez que hago una solicitud a un servidor , este me atiende como si fuera la primera vez, aunque sea la solicitud 300 y todas seguidas.
  • Si por ejemplo me he validado y quiero pasar al servidor mi nombre de usuario y no volverlo a escribir se lo puedo pasar en un input de tipo hidden.
  • El hecho de enviarlo en un hidden es por que sólo dentro de los formularios podemos enviar información al servidor
  • Sobre este tema no pongo ejemplo, ya que lo hago en el siguiente sobre la agenda.


Cómo pasar varios valores en una sola variable

  • Esto se consigue poniendo a los diferentes input el mismo nombre con corchetes.
  • Cuando el servidor lea esa variable de $_POST leeré todo en un array


Icon activity.jpg

Actividad

Hacer un programa que lea 10 enteros de 10 cajas de texto y me visualice la media

<!DOCTYPE html>
<html>
    <head>
        <title>Medias de notas</title>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width">
    </head>
    <body>
        <form  method="POST" action="medias.php"> 
            Valores de notas<br/>
            Nota 1<input type="text" name ="notas[]"/><br/>
            Nota 2<input type="text" name ="notas[]"/><br/>
            Nota 3<input type="text" name ="notas[]"/><br/>
            Nota 4<input type="text" name ="notas[]"/><br/>
            Nota 5<input type="text" name ="notas[]"/><br/>
            Nota 6<input type="text" name ="notas[]"/><br/>
            Nota 7<input type="text" name ="notas[]"/><br/>
            Nota 8<input type="text" name ="notas[]"/><br/>
            Nota 9<input type="text" name ="notas[]"/><br/>
            Nota 10<input type="text" name ="notas[]"/><br/>
 
            <input type=submit value="enviar datos" name="enviar"/>
 
    </form>
    <?php
    if (isset($_POST['enviar'])){
        $notas = $_POST['notas'];
        $suma = 0;
        foreach ($notas as $nota) {
            $suma = $suma + $nota;
        }
        echo "nota media = ".($suma / 10);
    }
    ?>
</body>
</html>





  • En el caso de la agenda, fijaros que tenemos la siguiente situación.
  • Al principio tengo la agenda sin valores

Agenda1.png

  • Ahora inserto un nombre y teléfono.
  • En el servidor es fácil leer ese nombre y teléfono que están en las cajas de texto
  • y visualziar ahora que tengo ese nombre y teléfono
<?php
 
....
$nombre=$_POST['nombre']
$telefono = $_POST['telefono']
....
echo (" CONTACTOS ACTUALES : 1<br>");
     echo "<ul>";
     echo "<li>". $nombre.': '.$telefono."</li>";
     echo"</ul>";
?>

Agenda2.png

  • Pero claro cuando vuelva a enviar otro nombre y teléfono perderé lo anterior
  • Para evitar esto ya sabemos que podemos poner input de tipo hidden.
  • Pero claro tendré que poner tantos input como contactos tenga, y se me presenta el problema de qué nombres les pongo a cada uno y como lo recupero luego
  • La solución, como hemos visto antes es usar un array asociativo

Mirad la idea Cada vez que lea el nombre y teléfono, además lo guardo en un array asociativo

<?php
//Esta variable son los input hidden descritos más abajo
$agenda = $_POST['agenda'];
 
....
$nombre=$_POST['nombre']
$telefono = $_POST['telefono']
$agendda[$nombre]=$telefono;
....
  • Y Lo cargo en input de tipo hidden
foreach ($agenda as $nom => $tel) {
        echo'<input type="hidden" name="agenda[\'$nom\']" value=\'$tel\'/>';
        echo "<br>";
             }