Diferencia entre revisiones de «ManuelRomero/DAW/distancia/tutorias/Tutoria2»

De WikiEducator
Saltar a: navegación, buscar
(Ejecutar php en un solo fichero)
(Agenda)
Línea 193: Línea 193:
 
echo “nota media = $suma/10;
 
echo “nota media = $suma/10;
 
?>
 
?>
 +
====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
 +
{{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.
 +
 +
envío todo lo anterior el servidor no sabe nada
 +
====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
 +
{{Actividad|
 +
Hacer un programa que lea 10 enteros de 10 cajas de texto y me visualice la media
 +
<source lang=php>
 +
<!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>
 +
</source>
 +
 +
}}
 +
 +
*En el caso de la agenda, fijaros que tenemos la siguiente situación.
 +
*Al principio tengo la agenda sin valores
 +
[[Imagen: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
 +
<source lang=php>
 +
<?php
 +
 +
....
 +
$nombre=$_POST['nombre']
 +
$telefono = $_POST['telefono']
 +
....
 +
echo (" CONTACTOS ACTUALES : 1<br>");
 +
    echo "<ul>";
 +
    echo "<li>". $nombre.': '.$telefono."</li>";
 +
    echo"</ul>";
 +
?>
 +
[[Imagen: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
 +
<source lang=php>
 +
<?php
 +
//Esta variable son los input hidden descritos más abajo
 +
$agenda = $_POST['agenda'];
 +
 +
....
 +
$nombre=$_POST['nombre']
 +
$telefono = $_POST['telefono']
 +
$agendda[$nombre]=$telefono;
 +
....
 +
 +
 +
</source>
 +
*Y Lo cargo en input de tipo hidden
 +
<source lang=php>
 +
foreach ($agenda as $nom => $tel) {
 +
        echo'<input type="hidden" name="agenda[\'$nom\']" value=\'$tel\'/>';
 +
        echo "<br>";
 +
            }
 +
</source>

Revisión de 10:01 14 nov 2014





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>






//MRM Poner ejemplo formulario.

Enviar datos con input de tipo hidden Supongamos que tenemos un dato que queremos pasar a un programa php, es un valor conocido por la página cliente. Para enviar datos al servidor, estos han de ir en un formulario. Si no queremos que en la página cliente se vean los datos los insertaremos en input de tipo hidden <form action=”index.php” method=”POST”>

 <intput type=hidden value=8 name =edad1>
 <intput type=hidden value=12 name =edad2>
 <intput type=submit value=”enviar datos” name=”enviar”

</form>

en la ejecucion del fichero en el servidor podremos obtener esos valores <?php …. $edadPrimera = $_POST['edad1']; $edadSegunda = $_POST['edad2']: …. ?>

En el caso de la agenda observamos que cada nombre y teléfono que rellene en el input de tipo text lo podré leer directamente del input, pero también los anteriores los tengo que ir leyendo para visualizarlos , ya que partimos de que todo el mundo tiene claro que http es un protocolo sin estado.

insertar imágenes de la aplicación de la agenda

Pasar varios valores en una única variable usando un array Supongamos que queremos pasar 10 números de diez notas para calcular la media en el cliente tendríamos que tener 10 cajas de texto

<form action=”index.php” method=”POST”>

 <intput type=text name =notas[]>
 <intput type=text name =notas[]>
 <intput type=text name =notas[]>
 <intput type=text name =notas[]>
 <intput type=text name =notas[]>
 <intput type=text name =notas[]>
 <intput type=text name =notas[]>
 <intput type=text name =notas[]>
 <intput type=text name =notas[]>
 <intput type=text name =notas[]>
 <intput type=submit value=”enviar datos” name=”enviar”

</form>

En el servidor leeré todas las notas y se amacenarán en un array <?php $notas =$_POST['notas']; $suma=0; foreach($notas as $nota) {

    $suma=$suma+$nota;

} echo “nota media = $suma/10; ?>

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.
envío todo lo anterior el servidor no sabe nada

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>";
?>
[[Imagen: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
<source lang=php>
<?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>";
             }