PHP

Introducción

Lenguajes de guión (script)

Los lenguajes scripts son lenguajes que no necesitan ser compilados. En el caso de PHP, el servidor es capaz de interpretar el código fuente y ejecutarlo.

Según las estadísticas de la página w3techs.com, el lenguaje de programación PHP es utilizado por casi el ochenta por ciento de las páginas web. ¿Merece la pena aprender a programar en PHP?. Todo parece apuntar a que sí.

PHP se utiliza los gestores de contenido más importantes. Wordpress, Joomla, Drupal, Prestashop... todos han sido construídos con este lenguaje de programación. Por tanto, si quieres aprender a modificarlos en profundidad, parece obvio que necesitarás dominar este lenguaje.

'; $despues = '

¿Qué vas a aprender con este curso de PHP?

En este curso veremos los fundamentos de pogramación con PHP. Por tanto, si ya conocías otro lenguaje de programación, seguramente puedas completar el curso rápidamente. Si luego quisieras seguir profundizando, te recomiendo seguir con el curso de PHP y MySQL y estudiar algún framework. De entre las opciones que hay en el mercado, te recomiendo CodeIgniter, que es bastante sencillo. Además, lo que aprendas con CodeIgniter te servirá para serguir progresando hacia otros frameworks más complejos como Laravel o Symphony.

Con lo que aprendas en este curso tendrás de sobra para hacer pequeñas modificaciones en el código fuente de Wordpress y otros gestores de contenido. Yo personalmente, uso la plantilla Genesis, que está preparada para ser modificada cómodamente mediante pequeñas porciones de código, en lugar de mediante el uso de una herramienta visual. Esto mejora enormemente su velocidad de carga.

Instalar XAMPP (o Easy PHP)

phppinfo

<?php 
	phpinfo();
?>

phpinfo(); es una función que devuelve información en formato de página html de nuestro servidor web.

echo

<?php
	echo "Hola mundo";
?>

Podemos mezclar html y php

<!DOCTYPE html>
<html>
	<head>
	<link type='text/css' rel='stylesheet' href='style.css'/>
	<title>Get Started!</title>
</head>
<body>
	<p><?php echo "My first line of PHP!"; ?></p>
</body>
</html>

Ejercicio

Pintar una capa roja en la pantalla. Todo el código fuente debe estar escrito dentro de los símbolos <?php ?>. Para ello el código html necesario debe ser ejecutado desde la instrucción echo.

Comentarios

<?php
	echo "Hola mundo";
	//Esto es un comentario de una sola línea
	/*Y esto un comentario 
	de varias líneas*/
?>
Ver ejemplo

Operadores

Operador de concatenación

<?php
	echo "texto1 "."texto2";
?>
Operadores de concatenación

Operadores aritméticos

<?php
	echo (3+2)."<br/>";
	echo (3-2)."<br/>";
	echo (3*2)."<br/>";
	echo (3/2)."<br/>";
	echo 3%2;
?>
Operadores matemáticos

Operadores lógicos

<?php
	echo 3>2;
	echo "<br/>";
	echo 3<2;
	echo "<br/>";
	echo 3>=2;
	echo "<br/>";
	echo 3<=2;
	echo "<br/>";
	echo 3==2;
	echo "<br/>";
	echo 3!=2;
?>

Ejercicio

Añadir los operadores lógicos necesarios para que las siguientes expresiones evaluen siempre a true (mostrarán 1).

Añadir dos líneas más que evaluen a false.

<?php
	echo 15  4;
	echo 13  122;
	echo 8*2 16;
?>

Variables

Son zonas de la memoria del ordenador identificadas por un nombre y capaces de almacenar información que puede variar durante la ejecución del programa.

Variables de texto

<?php
	$texto="Soy una cadena";
	echo $texto;
	echo "$texto";
	echo '$texto';
	echo "Hola". $texto;
	echo "Hola $texto";
	echo 'Hola $texto';

?>
Variables de texto

Ejercicio

Que se muestre un mensaje que diga: "Buenas tardes Jose", dónde Jose será el valor de una variable llamada $nombre.

pista$nombre=...
echo "Buenas...

Variables numéricas

<?php 
	$i = 5;
	$j = 3;

	echo $i." + ".$j."=<br/>";
	echo "$i + $j =<br/>";
	echo "<br/>";
	echo $i.$j;
?>

Constantes

<?php 
	define("pi", 3.14);	

	echo pi;

	//La siguiente línea daría un warning
	define("pi", 5);

?>

Daría error

Formularios

Peticiones al servidor

GET: Hey servidor! Mira lo que te mando en la URL y haz algo, quieres?!

POST: Hey servidor! Mira lo que te mando en mi cuerpecito y haz algo quieres?!

GET vs POST

  • GET es más rápido que POST.
  • El número de caracteres que puedes enviar utilizando GET es limitado y depende del servidor.
  • La información enviada por GET se puede visualizar en la URL, y por tanto no podríamos enviar información delicada (passwords, etc.)
  • No es posible almacenar en favoritos la URL de una petición POST, ya que una petición POST no modifica la URL.

Enviar formulario

enviarFormulario.html<form method="post" action="procesaFormulario.php">
	Introduce tu nombre, porfa:
	<input type="text" name="nombre" />
	<input type="submit" />
</form>
procesaFormulario.php<?php
	$nombre = $_POST['nombre'];
	echo $nombre;
?>

Ejercicio – repetir el ejemplo de la diapositiva anterior utilizando un textarea

<textarea style="width:300px; height:100px"></textarea>

El name identifica a cada elemento; el value es la información que contiene.

Con $_POST recuperas el value del elemento cuyo name le estás pasando como parámetro.

Ejercicio – enviar y recoger la información de una combo

<select name="nombre">
	<option value="juan">Juan
	</option>
</select>

Ejercicio

Recuperar la información del textarea de una página y cargarla en un campo de texto de otra página distinta.

Estructuras condicionales

if

<?php 
	$dato1 = 3;
	$dato2 = 5;

	if($dato2 > $dato1){
		echo "dato2 es mayor que dato1";
	}
?>

Ejercicio

Modifica el símbolo en rojo para que se imprima el mensaje.

<?php
	$dato1 = 10;
	$dato2 = 10;
	if($dato1 > $dato2){
		echo "exito";
	}
?>

elseif

<?php
	$dato1 = 3;
	$dato2 = 5;
	if($dato1 > $dato2){
		echo "dato1 es mayor que dato2";
	}elseif($dato1 < $dato2){
		echo "Va a ser que no...";
	}
?>

else

<?php
	$dato1 = 3;
	$dato2 = 5;
	if($dato1 > $dato2){
		echo "dato1 es mayor que dato2";
	}else if($dato1 == $dato2){
		echo "dato1 es igual que dato2";
	}else{
		echo "dato1 es mayor que dato2";
	}
?>

Ejercicio

Completar el if con una expresión que permita que se ejecute el código del else. Hacer que en el else se muestre un mensaje cualquiera.

<?php
	if ( ){
		echo "Esto no debería verse";
	}else{
		//poner aquí código
	}
?>

Ejercicio

Corrige los errores que hay en este código:

<?php
	if {10 == 10}(
		echo "You got a true!"
	) else (
		echo "You got a false!";
	)
?>

Ejercicio

Dada una variable que contiene la nota de un examen que va de 0 a 10...

  • Si es mayor que cinco mostrar el texto “Aprobado”.
  • Si es igual a cinco, mostrar el texto ''Aprobado por los pelos”.
  • Si es menor que cinco, mostrar el texto “Suspenso”.

Procesar el formulario en la propia página

<?php
	if(isset($_POST['botonEnviar'])){
		echo "boton pulsado!!!";
	}
?>
<form method="post" action="#">
	<input type="submit" name="botonEnviar" value="enviar">
</form>

Ejercicio

Añadiendo líneas al siguiente código, controlar que si el botón no fue pulsado se muestre el mensaje "el botón no fue pulsado! ". Por tanto, éste debería ser el mensaje que apareciese al entrar por primera vez en la página.

<?php
	if(isset($_POST['botonEnviar'])){
		echo "botón pulsado!!!";
	}else{
		//Añadir las líneas aquí
	}
?>
<form method="post" action="#">
	<input type="submit" name="botonEnviar" value="enviar">
</form>

Ejercicio

Si he pulsado el botón de enviar, imprimir el value del campo de texto; si no, imprimir
"Botón no pulsado"

Mandar un formulario

Ejercicio colores

El fichero html enviará la información a un fichero php que será el que cambie de color.

Código que pinta una página de rojo:

<style>body{background: red}</style>

Ejercicio

Juntar el php y el html en un único archivo.

Ejercicio

La combo debe recordar la opción seleccionada tras hacer submit.

Pista!:
Una opción de una combo está seleccionada si tiene su atributo selected con el siguiente valor:

selected = "selected"

Calculadora

Ejercicio Calculadora con If

Hacer una calculadora que haga uso de los operadores aritméticos +, -, *, /, mande la información a un nuevo documento php y determine la operación a realizar por medio de una estructura de control else if.

Ejercicio Calculadora con Switch

Hacer una calculadora que haga uso de los operadores aritméticos +, -, *, /, mande la información a un nuevo documento php y determine la operación a realizar por medio de una estructura de control switch.

Ejercicio

Rehacer la calculadora usando la función eval.

<?php
	$signo = "*";
	$a=3;
	$b=6;
	$resultado = eval("return ".$a.$signo.$b." ;");
	echo $resultado;
?>

bucle for

<?php
	for($i=0; $i<10; $i++){
		echo $i."<br/>";
	}
?>

Ejercicio

Imprimir los números pares que hay dentro de los 100 primeros números naturales.

Nota: No utilizar la estructura de control if para resolver este ejercicio.

Ampliaciones

  1. El bucle irá desde 0 hasta un número introducido.
  2. El bucle irá desde un número introducido hasta otro número introducido.

Ejercicio

Imprimir los números pares que hay dentro de los 100 primeros números naturales

Para ello tendremos un bucle for que en cada iteración irá evaluando si el bucle es par o impar. El operador “%” nos da el resto de dividir un número entre otro.
Ej: 7%3=1

  1. El bucle irá desde 0 hasta un número introducido.
  2. El bucle irá desde un número introducido hasta otro número introducido.

Ejercicio

Imprimir los números del 1 al 20.

  • Para números divisibles por 3, imprimir “Fizz”.
  • Para números divisibles por 5, imprimir “Buzz”.
  • Para números divisibles por 3 y 5, imprimir “FizzBuzz”.
  • En cualquier otro caso, imprimir el número.

  1. El bucle irá desde 0 hasta un número introducido.
  2. El bucle irá desde un número introducido hasta otro número introducido.

bucle while

<?php
	$i=1;
	while($i<10){
		echo $i;
		$i++;
	}
?>

Ejercicio bucle while Calcular el factorial de 5

El factorial de un número entero positivo se define como el producto de todos los números naturales anteriores o iguales a él. Se escribe n!, y se lee "n factorial". (Por definición el factorial de 0 es 1: 0!=1)

Por ejemplo, 5! = 5·4·3·2·1 = 120

Funciones

Son bloques de código reutilizables.

¿qué es una función?

Función que no devuelve nada, sin parámetros

<?php
	function saludar(){
		echo "Buenas tardes";
	}

	saludar();
?>

Función que no devuelve nada, con parámetros

<?php
	function saludar($nombre){
		echo "Buenas tardes ". $nombre;
	}

	saludar("Pablo");
?>

Ejercicio

Crear una función llamada "hoyQuieroComer" que recibe un parámetro "comida".

Cuando llamemos a la función se mostrará un mensaje indicándonos lo que deseamos comer.

Ejercicio

Crear una función que recibe un número y calcula su cubo.

Ejercicio

Crea una función que recibe el ancho y el alto de un rectángulo y calcula su perímetro.

Cuando una función recibe varios parámetros, estos irán separados por coma.
Ejemplo:

calculaPerimetro($alto, $ancho);

Función que devuelve un valor

<?php
	function saludar1(){
		$textoDevuelto = "buenos dias";
		return $textoDevuelto;
	}
	function saludar2(){
	$textoDevuelto = "buenas tardes";
}


echo saludar1();
echo saludar2();
?>

Pregunta:
¿Por qué el primer echo funciona y el segundo imprime "none"?.

Ejercicio

Reescribir el ejercicio de la calculadora utilizando funciones para las operaciones aritméticas.

El formulario no se llamará a sí mismo, si no a un archivo php externo.

function suma($operando1, $operando2){
	$solucion = $operando1 + $operando2;
	return $solucion;	
}

Ejercicio

Reescribir el ejercicio de la calculadora utilizando una única función que reciba 3 parámetros (los dos operandos y la operación a realizar). Dentro de esta función estará el switch que determina la operación a realizar.

Ejercicio viaje

Crea una función llamada coste_hotel que recibe como parámetro el número de noches. La función debe devolver cuanto es necesario pagar teniendo en cuenta que cada noche cuesta 140 euros.

$num_noches = $_REQUEST['num_noches'];

$resultado1 = coste_hotel($num_noches);

$resultadoTotal = $resultado1 + ...

Ejercicio

Continuando el ejercicio anterior, después de la función ya escrita añadiremos otra función llamada coste_avion. Esta función tiene como parámetro de entrada el nombre de una ciudad y devolverá un coste en función de dicho parámetro.

Los costes por ciudad son los siguientes:
"Oviedo": 183
"Tokyo": 220
"Madrid": 222
"Barcelona": 475

Ejercicio

Continuando con el ejercicio anterior, después de las dos funciones ya escritas añadiremos otra función llamada coste_alquiler_coche. Esta función tiene como parámetro de entrada el número de noches y devolverá un coste en función de dicho parámetro, teniendo los siguientes aspectos en cuenta:

  • Cada día de alquiler cuesta 40 €.
  • Si alquilas un coche por 3 días o más, obtienes un descuento de 20€ sobre el total.
  • Si alquilas un coche por 7 días o más, obtienes un descuento de 50€ sobre el total (no acumulable con los 20€ de haber alquilado por más de 3 días).

Calcular también el coste total de todo el viaje.

Mandar mail

// To send HTML mail, the Content-type header must be set
$headers  = 'MIME-Version: 1.0' . "\r\n";
$headers .= 'Content-type: text/html; charset=UTF-8' . "\r\n";

// Additional headers
$headers .= 'To: Mary <mary@example.com>, Kelly <kelly@example.com>' . "\r\n";
$headers .= 'From: Birthday Reminder <birthday@example.com>' . "\r\n";
$headers .= 'Cc: birthdayarchive@example.com' . "\r\n";
$headers .= 'Bcc: birthdaycheck@example.com' . "\r\n";

if(mail("pablomonteserin@pablomonteserin.com", "mail de mi página web", $msg, $headers)){
}
Ver video de la resolución.

Para mandar un correo es necesario que la página HTML del formulario de envío, la página PHP que lo procesa, el servidor PHP que procesa el mail y el servidor de correo que lo recibe utilicen la misma codificación.

Para comprobar que el mail se envía si no tenemos cuenta de correo, podemos usar mailinator

Subir un fichero al servidor

<form action="form.php" method="post"  enctype="multipart/form-data">
	<input type="file" name="foto">
</form>
form.phpif(isset($_FILES['foto'])){
	$errors= array();
	$file_name = $_FILES['foto']['name'];
	$file_size = $_FILES['foto']['size'];
	$file_tmp = $_FILES['foto']['tmp_name'];
	$file_type = $_FILES['foto']['type'];
	$file_ext=strtolower(end(explode('.',$_FILES['foto']['name'])));
   
	$url = dirname(__FILE__)."/uploads/".$file_name;
   
	$extensions= array("jpeg","jpg","png","pdf","zip", "rar");
   
	if(in_array($file_ext,$expensions)=== false){
		$errors[]="Estensión no permitida.";
	}
   
	if($file_size > 10485760) {
		$errors[]='File size must be excately 10 MB';
	}

	if (empty($errors)==true) {
		if(move_uploaded_file($file_tmp,$url)){
			echo "subida con exito";
			chmod($url, 0777);
		}else{
			echo "problema en la subida";
		}
	}
}

Mandar un mail con con ficheros adjuntos

Usaremos la librería PHPMailer.

Subiremos los ficheros al servidor y luego los adjuntaremos al mail.

form.php$mail = new PHPMailer(true);

try {
	//Server settings
	$mail->SMTPDebug = 2;                                       	// Enable verbose debug output
	$mail->isSMTP();                                            	// Set mailer to use SMTP
	$mail->Host       = 'smtp.server.com';  // Specify main and backup SMTP servers
	$mail->SMTPAuth   = true;                                   	// Enable SMTP authentication
	$mail->Username   = 'mail@examle.com';                     	// SMTP username
	$mail->Password   = "*********";                                // SMTP password
	$mail->SMTPSecure = 'ssl';                                  	// Enable TLS encryption, `ssl` also accepted
	$mail->Port       = 465;                                    	// TCP port to connect to
   
	//Recipients
	$mail->setFrom('contact@sonowat.com', 'Contacto Sonowat');
	$mail->addAddress('paramonty@gmail.com');     			// Add a recipient
	// $mail->addAddress('ellen@example.com');               	// Name is optional
	$mail->addReplyTo($email, 'Information');
	// $mail->addCC('cc@example.com');
	// $mail->addBCC('bcc@example.com');
	$mail->addAttachment($url);         				// Add attachments
   
	// Content
	$mail->isHTML(true);                                  		// Set email format to HTML
	$mail->Subject = 'Contacto desde www.sonowat.com';
	$mail->Body    = $msg;						// $mail->AltBody = 'This is the body in plain text for non-HTML mail clients';
	$mail->send();
	echo 'Message has been sent';
} catch (Exception $e) {
	echo "Message could not be sent. Mailer Error: {$mail->ErrorInfo}";
}

Añadir el Captcha de google al formulario

Necesitamos dos claves que obtendremos en esta página de google.

pagina.html<script src='https://www.google.com/recaptcha/api.js?render=CLAVE-SITIO-WEB'></script>
<script>
grecaptcha.ready(function() {
grecaptcha.execute('CLAVE-SITIO-WEB', {action: 'comentario'})
.then(function(token) {
var recaptchaResponse = document.getElementById('recaptchaResponse');
recaptchaResponse.value = token;
});
});
</script>
form.php$recaptcha_url = 'https://www.google.com/recaptcha/api/siteverify'; 
$recaptcha_secret = 'CLAVE-SECRETA'; 
$recaptcha_response = $_POST['recaptcha_response']; 
$recaptcha = file_get_contents($recaptcha_url . '?secret=' . $recaptcha_secret . '&response=' . $recaptcha_response); 
$recaptcha = json_decode($recaptcha); 
// Miramos si se considera humano o robot: 
if($recaptcha->score >= 0.6){
	echo 'Hay un 60% de probabilidad de que seas un humano';
	if(move_uploaded_file($file_tmp,$url)){
		echo "subida con exito";
		chmod($url, 0777);
		echo "Success";
	}else{
		echo "problema en la subida";
	}  
}else{
	echo 'Estás por debajo del 60% de probabilidad de que seas humano, mejor no me fío.';
}

Funciones para trabajo con cadenas

<?php

	$nombre = "Ramón";

	echo "Las dos primeras letras son: ".substr($nombre, 0, 2);

	echo "<br/>La palabra tiene ".strlen($nombre) ." letras.";

	echo "<br/>La palabra pasada a mayúsculas es: ".strtoupper($nombre);

	echo "<br/>La palabra pasada a minúsculas es: ".strtolower($nombre);

	echo strtr(strtoupper($nombre),"àèìòùáéíóúçñäëïöü","ÀÈÌÒÙÁÉÍÓÚÇÑÄËÏÖÜ");

?>

Ejercicios substring

Wonderful

Utilizando el método substr imprimir las letras que van desde la posición 4 a la 7 de la cadena "wonderful day", es decir "derf".

lastIndexOf con PHP

$url = "http://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]";
$pos_ultima_barra = strrpos($url, "/");

Ejercicios

Ejercicio

En una urbanización respetuosa con el medio ambiente, en el sótano de cada casa hay un depósito de recogida de las aguas pluviales para aprovecharlas para regar.

El depósito tiene un volumen que depende del modelo de vivienda y el usuario tiene que tener consciencia del volumen de agua que contiene, no sea que con el agua que recoja en una lluvia desborde y empantane el garaje del chalé.

Se considera que el depósito, después de la lluvia puede estar en uno de los 4 potenciales estados:

  • SEGURO, si contiene menos del 80% de su capacidad nominal
  • ALERTA, si contiene entre el 80 y 90 % de su capacidad nominal
  • PELIGRO, si contiene entre el 90 y el 100% de su capacidad nominal
  • DAÑOS EXTREMOS, si llega a contener más del 100% de la capacidad nominal

Nos encomiendan crear un programa que reciba como datos la previsión de lluvia (en litros/m2) y que tan pleno está el depósito (en porcentaje) y nos informe de:

  • La cantidad de agua que hay al depósito antes de llover
  • La cantidad total de litros que caerán al tejado
  • La cantidad de litros totales que podría haber al depósito después de llover
  • El estado en que quedará el depósito. En el supuesto de que quede en estado seguro se indicará que se está en zona segura. En cualquier de los otros estados se indicará el estado y qué es la cantidad de agua a desaiguar previamente para quedar en estado seguro.

Ejemplo: El depósito tiene una capacidad nominal de 12000 litros, el tejado de la casa una superficie de 125 m2, se prevé una lluvia de 15 litros/m2 y el depósito está al 75% de su capacidad nominal el resultado sería:

DANGER

Porque el depósito contiene inicialmente 9000 litros (el 75% de 12000)
Lloverá sobre el tejado 1875 litros ( 125 m2 15 l/m2)
La cantidad total de agua para el depósito será 10875 litros (9000 + 1875)
Lo cual trae a un estado de Peligro (por encima de 10800 litros, el 90% de 12000)
Y se tendrá que desaiguar 1275 litros para quedar en situación segura (9600 litros, el 80% de 12000).

El llamamiento tendrá la forma lluvia.php?rain=15&filled=75

Ver ejercicio resuelto
  • rain : es un número que indica la lluvia prevista en litros por metro cuadrado
  • filled : indica qué tan pleno está el depósito (en porcentaje) .

Ejercicio

Vamos a simular el desplazamiento de un objeto esférico dentro de un tablero cuadriculado con movimientos rectilíneos y rebotando al llegar a cualquier margen.

El desplazamiento de la bola siguiendo un determinado itinerario

ejercicio php que usa bolasbola

se tiene que mostrar como una secuencia de imágenes con las posiciones consecutivas de la bola

ejercicio php
Tarea:

A partir de las coordenadas iniciales (initx, inity) de la bola y de la velocidad inicial (xspeed, yspeed), mostrar la secuencia de imágenes desde la posición inicial hasta que se vuelve a repetir esta posición inicial.

El llamamiento en el programa tiene que ser del tipo

index.php?initx=2&inity=3&xspeed=1&yspeed=1
Indicaciones:
  • El tablero tiene unas dimensiones de 6x5 casillas. Cada casilla viene determinada por sus coordenadas (x, y) según la imagen. La coordenada x corresponde a las posiciones horizontales y la coordenada y a las verticales. bola
  • Se facilitan las 30 imágenes correspondientes a todas las posibles posiciones de la bola. El nombre de cada fichero corresponde a las coordenadas xy de donde se encuentra la esfera.Descargar.
  • Los ficheros de imagen se tienen que ubicar en la misma carpeta donde esté el fichero php y no se pueden cambiar de nombre.
  • La bola tendrá la velocidad inicial xspeed, yspeed. xspeed corresponde a la velocidad horizontal (el sentido positivo es hacia la derecha). yspeed corresponde a la velocidad vertical (el sentido positivo es hacia abajo). bolas
  • Tanto las velocidades vertical como horizontal pueden tener sólo tres valores, -1, 0 y 1.
    Ejemplos:
    1. Si la bola está en la posición 3,3 y xspeed tiene el valor 1 y yspeed tiene el valor-1, se desplazará a la derecha y pasará a la posicón 4,2.
    2. Si xspeed tiene el valor 0 la bola se desplaza sólo verticalmente
    3. Si yspeed tiene el valor 0 la bola se desplaza sólo horizontalmente
  • Cuando en su desplazamiento la bola llega a uno de los lados (laterales, superior o inferior), rebota, de forma que se modifica su movimiento
    1. Si xspeed tiene el valor 1 y choca al lado derecho, xspeed pasa a valer -1
    2. Si xspeed tiene el valor -1 y choca al lado izquierdo, xspeed pasa a valer 1
    3. Si yspeed tiene el valor 1 y choca al lado inferior, yspeed pasa a valer -1
    4. Si yspeed tiene el valor -1 y choca al lado superior, yspeed pasa a valer 1
    5. Evidentemente, si choca contra un rincón, cambian de sentido las dos velocidades
  • Ejercicio

    Leer todo el enunciado antes de comenzar a programar.

    Le pasaremos a la URL dos números enteros positivos y el programa los listará en orden creciente junto con los números intermedios.

    Todos los números mostrados deben cumplir las siguientes condiciones:

    • Si un número es divisible por 4, en la siguiente línea escribiremos una línea integrada por tantos números consecutivos como indique la parte de las unidades, comenzando por el número en cuestión. Además se añadirá un último número que será la suma de todos los números componentes de la lista.
      Por ejemplo, si el número es 44, se sumarán 4 números: 44, 45, 46, 47, 182
    • Si el número es divisible por 5, en la siguiente línea escribiremos una lista integrada por tantos números anteriores como indique la parte de las unidades, comenzando por el número en cuestión. Además se añadirá un último número que será el producto de los anteriores.
      Por ejemplo, si el número es 45, se multiplicarán 5 números: 45, 44, 43, 42, 41, 146611080
    • Si el número es divisible por 4 y por 5 tendrá ambos comportamientos.

    Para resolver el ejercicio crearemos:

    • una función llamada divisible() que recibirá dos parámetros numéricos y devolverá true si el primer número es divisible por el segundo y false en caso contrario.
    • una función llamada suma() que recibirá un parámetro numérico n, obtendrá su última cifra e imprimirá una cadena de números consecutivos ordenados de menor a mayor y separados por un espacio en blanco. El primer número será n. Una vez terminada la lista se añadirá el texto: "suma = " seguido de la suma de todos los números anteriores.
    • una función llamada producto() que recibirá un parámetro numérico n, obtendrá su última cifra e imprimirá una cadena de números consecutivos mayor a menor y separados por un espacio en blanco. El primer número será n. Una vez terminada la lista se añadirá el texto: "producto = " seguido del producto de todos los números anteriores.

    Si lo ves conveniente, puedes crear más funciones para resolver el ejercicio.

    Números aleatorios

    Obtener un número aleatorio: rand

    Devuelve un número aleatorio que va de 7 a 15

    $var = rand(7, 15);

    Ejercicio

    Utilizando las funciones strlen(), substr() y rand(), obtener una letra aleatoria de tu nombre.

    Ejercicio mapa

    Teniendo en cuenta que con el siguiente código html puedo pintar una moneda sobre en mapa en cierta posición:

    <div style="width:725px; height:483px; background: url(Bluemap.jpg); margin:auto; overflow:hidden; position:relative">
    	<img src="goldCoin.png" style="width:50px;position:absolute; margin-left:577px; margin-top:75px">
    </div>

    Pintar 10 monedas en coordenadas aleatorias sobre la superficie de un mapa.

    mapa del tesoro moneda de oro

    Ejercicio máquina tragaperras

    El programa recibe por la url un parámetro que será un número entero llamado capital.

    El juego implica una cantidad variable de partidas. El juego terminará cuando el jugador se quede sin dinero o supere el doble de la cantidad inicial de su capital.

    Al iniciar el juego se mostrará el capital inicial.

    En cada tirada se mostrará el número de jugada, las tres figuras obtenidas, la ganancia de la tirada y el capital total después de haber pagado/cobrado la apuesta.

    La apuesta siempre será 0.5 veces el capital actual.

    La tabla de premios será la siguiente:

    • Tres sietes -> 100 veces la apuesta
    • Tres figuras iguales (a excepción del siete) -> 6 veces la apuesta
    • Dos sietes -> 4 veces la apuesta
    • Dos figuras iguales (a excepción del siete) -> 2 veces la apuesta

    Descargar las fotos

Lectura / Escritura de ficheros

fopen

$fp = fopen($file, "r+");
r Abre el archivo para lectura. Coloca el puntero al principio del archivo.
r+ Abre el archivo para lectura y escritura. Coloca el puntero al principio del archivo.

Fopen – append (añadir)

$fp = fopen($file, "a+");
a Abre el archivo para escritura. Coloca el puntero al final del archivo. Si el fichero no existe lo crea
a+ Abre el archivo para lectura y escritura. Coloca el puntero al final del archivo. Si el fichero no existe, lo crea

Nota: Si el archivo es abierto en uno de estos modos, cualquier información que sea escrita siempre será añadida al final del archivo.

Escribir en disco (I)

<?php
	$file = "1-escribirEnDisco.txt";
	/*Creamos un puntero a partir del cual vamos a escribir*/	
	$fp = fopen($file, "r+");

	/*El documento de texto en el que escribo debería estar en la misma codificación que el presente php*/
	fputs($fp, "fputs es más rápida que fwrite");
	fwrite($fp, "fputs es más rápida que fwrite");
	/*cerrar el archivo*/
	fclose($fp);
?>

Escribir en disco (II) Ejemplo de un libro de visitas

<?php
	$file = "2-libroVisitasNombre.txt";
	if(isset($_POST['enviar'])){
		$nombre = $_POST['nombre'];
		/*Creamos un puntero a partir del cual vamos a escribir*/
		$fp = fopen($file, "r+");
		$old = fgets($fp);
		/*Llevamos el cursor al principio del texto*/
		rewind($fp);
		/*Escribir la nueva entrada antes que las antiguas en el archivo*/
		fputs($fp, $nombre." \n ".$old);
		fclose($fp);
	}
	readfile($file);
?>

Ejercicio – Hacer un libro de visitas

Para escribir la fecha: $dateOfEntry = date("j-n-y")

Para leer todo el archivo de texto, incluso después de cerrar el archivo: readfile($file);

Ejercicio contador

Hacer un contador.

Ejercicio contador con imágenes

Haciendo uso de las funciones de cadena substr y strlen, hacer un contador que imprima una fotografía para cada uno de los dígitos.

Redireccionamiento

header("Location: https://pablomonteserin.com")

Una vez que hayamos impreso por pantalla algún caracter (espacio en blanco, letra, etc.) no será posible ejecutar los métodos header.

Para poder ejecutarlos podemos introducirlos en el buffer. Para ello, ejecutaremos el siguiente método antes de cualquier espacio en blanco o letra:

ob_start();

Y el siguiente método después de los headers:

ob_end_flush();

Variables del servidor

<?php
	echo "Servidor al que se conecta es: ".$_SERVER['SERVER_NAME']."<br/>";
	echo "Navegador y SO: ".$_SERVER['HTTP_USER_AGENT']."<br/>";
	echo "Lenguaje del navegador (no del SO): ".$_SERVER['HTTP_ACCEPT_LANGUAGE']."<br/>";
	echo "Puerto por el que el cliente se conecta a internet: ".$_SERVER['SERVER_PORT']."<br/>";
	echo "Dirección IP (LAN) del usuario: ".$_SERVER['REMOTE_ADDR']."<br/>";
	echo "Ubicación del fichero actual: ".$_SERVER['PHP_SELF']."<br/>";
?>

include

Permite incluir el código de otros ficheros en nuestra página web.

La diferencia entre require() e include() es que en caso de no encontrar el fichero a incluir include() produce un Warning mientras que require() produce un Error Fatal.

La función require_once() se comporta de manera similar a require(), con la única diferencia que si el código ha sido ya incluido, no se volverá a incluir.

<?php 
	include "1-hola.html";
	//No es posible incluir una dirección web
	include "http://csszengarden.com/";
?>

con fpdf

Página de fpdf
<?php
	require 'fpdf/fpdf.php';
	$pdf = new FPDF();
	$pdf->AddPage();
	$pdf->SetFont('Arial','B',16);
	$pdf->Cell(40,10,'Hello World!');
	$pdf->Cell(100,100,utf8_decode('Adeu Món'));
	$pdf->Multicell(0,10,"This is a multi-line text string\nNew line\nNew line");
	$pdf->Output();
?>

Plantillas

Ejercicio

Hacer dos páginas web cuyas secciones cabecera y botonera sean cargadas con dos includes respectivamente.

Ejercicio: Plantilla con Index

Ahora los links de la botonera enlazarán con la propia página, pasándole un parámetro que será recogido y usado en un include para que cargue el contenido correspondiente.

Para realizar este ejercicio necesitaremos 3 páginas:

  • contenido1.php
  • contenido2.php
  • index.php

Nota:
Si quisiera evaluar si un fichero existe antes de cargarlo podría usar el método file_exists()

Idiomas

Perdiendo la página en la que estoy al pulsar en el botón de idioma

<?php 
	$lang = "es";
	if(isset($_REQUEST["lang"])){
		$lang = $_REQUEST["lang"];
	}
	include "langs/".$lang.".php";

	$p = "contenido1";
	if(isset($_REQUEST['p'])){
		$p = $_REQUEST['p'];
	}
?>
...
<?php include $p.".php"; ?>
…

<a href="index.php?p=contenido1">Contenido 1</a><br>
<a href="index.php?p=contenido2">Contenido 2</a>
…
<a href="index.php?lang=es">ES</a> | <a href="index.php?lang=en">EN</a>

Manteniendo la página en la que estoy

<a href="index.php?p=<?=$p ?>&lang=es">ES</a> | 
<a href="index.php?p=<?=$p ?>&lang=en">EN</a>

Recordando el idioma seleccionado en la sesión

<?php
	session_start();
	if(isset($_REQUEST["lang"])){
		$_SESSION["lang"] = $_REQUEST["lang"];
	}else if(!isset($_SESSION["lang"])){
		$_SESSION["lang"] = "es";	
	}
	include "langs/".$_SESSION["lang"].".php";

Detección del idioma del navegador

<?php
	session_start();
	if(isset($_REQUEST["lang"])){
		$_SESSION["lang"] = $_REQUEST["lang"];
	}else if(!isset($_SESSION["lang"])){
		$_SESSION['lang'] = substr($_SERVER['HTTP_ACCEPT_LANGUAGE'], 0, 2);
	}
	if(!in_array($_SESSION['lang'], array("es", "en"))){
		$_SESSION['lang']="en";
	}
	include "langs/".$_SESSION["lang"].".php";

phpmailer

Es un script de php que nos permitirá mayor control sobre el envío de correos.

Descarga: https://github.com/PHPMailer/PHPMailer

Para usarlo con una cuenta de gmail:

require("PHPMailer-master/PHPMailerAutoload.php");
$mail = new PHPMailer();
$mail->CharSet = 'utf-8';
$mail->Host = "smtp.googlemail.com";
$mail->From = "pablomonteserin@pablomonteserin.com";
$mail->IsSMTP();
$mail->SMTPAuth = true;
$mail->Username = "usuario@gmail.com";
$mail->Password = "password";
$mail->SMTPSecure = "tls";
$mail->Port = 587;
$mail->AddAddress("mailDestinatario@example.com");
$mail->AddAddress("paramonty@gmail.com");
$mail->SMTPDebug  = 1;   //Muestra las trazas del mail, 0 para ocultarla
$mail->isHTML(true);                                  // Set email format to HTML
$mail->Subject = 'Here is the subject';
$mail->Body    = 'This is the HTML message body <b>in bold!</b>';
$mail->AltBody = 'This is the body in plain text for non-HTML mail clients';

/*if ($archivoName != "") {
	$mail->AddAttachment($archivoTemp, $archivoName);
}*/
if(!$mail->send()) {
	echo 'Message could not be sent.';
	echo 'Mailer Error: ' . $mail->ErrorInfo;
} else {
	echo 'Message has been sent';
}

Debemos probar esta librería en el servidor remoto, ya que en localhost a menudo nos hace falta una librería para poder enviar los mails.

Si todo va bien, nos llegará un mail a nuestra cuenta de google informándonos de que han intentado acceder a nuestra cuenta. Si pulsamos en el enlace que se nos ofrece, podremos permitir el acceso a la cuenta de google desde localhost.

Ejercicio

Utilizando la plantilla adjunta (o un diseño propio), hacer una web con idiomas y por la que navegaremos redireccionando siempre a index.php y cargando con include los contenidos según sea oportuno.

La web estará compuesta de dos páginas; una con información y otra que nos permitirá mandar un mail al pulsar el botón de envío.

Descargar plantilla Ejercicio solución

Ejercicio imágenes

Ejercicio

Disponemos de una serie de imágenes

ejercicio bolas con PHP

y de unas secuencias que se inician con una cifra, se continúan con letras y finalizan con un punto como por ejemplo:

"8artfeubjhdttshgdyeggukjnfuigJHQWEUYEÑLJFHggvvvabc."

y con ellas queremos dibujar unos tableros siguiendo las siguientes normas:

  • La cifra inicial corresponderá a la anchura del tablero en casillas
  • El resto de los caracteres (salvo el punto final) se interpretará como información para poner las casillas de la siguiente manera:
    • Si un carácter no está dentro del conjunto {'B', 'b', 'G', 'g', 'R', 'r', 'Y', 'y' } indicará que se tiene que poner una celda gris.
    • Si un carácter está dentro del conjunto {'B', 'b', 'G', 'g', 'R', 'r', 'Y', 'y' } y el siguiente no, estará codificando por una celda que contiene una bola del color codificado.
    • Si un carácter está dentro del conjunto {'B', 'b', 'G', 'g', 'R', 'r', 'Y', 'y' } y el siguiente también y corresponden a diferentes colores, entre los dos codifican la celda con bola bicolor de los dos colores (y en el mismo orden que aparecen en la secuencia).
    • Si un carácter está dentro del conjunto {'B', 'b', 'G', 'g', 'R', 'r', 'Y', 'y' } y el siguiente es el mismo color, se tratarán los dos caracteres de forma independiente.

Tarea: Crear un programa que sea capaz de mostrar en pantalla los tableros siguiendo dichas normas a partir de la secuencia que se leerá de un archivo de datos que lo carga a la variable $cadena.

ejercicio bolas con PHP

Indicaciones preceptivas

  • La llamada a la función será del tipo:
    index.php?filename=data40
  • Se creará la function putImg que recibirá el código de una celda y pondrá en pantalla la imagen que le corresponde. Siempre que se tenga que poner una imagen en pantalla se hará con un llamamiento a esta function.
  • Se creará la function isImgCode que recibirá como parámetro un carácter y devolverá true en caso de que corresponda al código de una imagen y false de lo contrario.
  • Se facilitan los ficheros de imagen en formato png necesarios para el desarrollo del ejercicio. Descargar
  • Se facilitan archivos de texto de prueba con nombres data40, data41, ..., data43. Los archivos, que son archivos de texto, se tendrán que ubicar en la misma carpeta que el fichero php. Descargar
  • PHP facilita la función strlen($cadena) que devuelve la longitud en caracteres de la cadena de texto $cadena
  • PHP facilita las funciones strtoupper y strtolower que reciben una cadena y la devuelven sustituyendo minúsculas por mayúsculas o bien mayúsculas por minúsculas. Puede ser útil para simplificar el código del programa.

Consejos

  • El programa tiene que hacer un recorrido por la cadena buscando en cada posición si se trata de un carácter del conjunto {'B', 'b', 'G', 'g', 'R', 'r', 'Y', 'y' }. En el supuesto de que lo sea, no se tiene que poner inmediatamente la imagen, antes se tiene que comprobar si este carácter, junto con el siguiente, codifican por una bola de dos colores.
  • Tened presente que cuando ponéis una bola de dos colores, las dos letras de la cadena, ya han sido tratadas y la segunda no tiene que trata

Arrays

<?php 
	$day[0]="domingo";
	$day[1]="lunes";
	$day[2]="martes";
	$day[3]="miercoles";
	$day[4]="jueves";
	$day[5]="viernes";
	$day[6]="sabado";

	//La funcion date, en conjunto con el modificador "w", devuelve el numero de día que es hoy
	$dayNumber=date("w");

	echo "Hoy es ". $day[$dayNumber];
?>
<?php 
	$day = array("domingo", "lunes", "martes", "miercoles", "jueves", "viernes", "sabado");

	$dayNumber=date("w");

	echo "Hoy es ".$day[$dayNumber];
?>

Ejercicio

Dado el siguiente código:

$languages = array("HTML/CSS", "JavaScript", "PHP", "Python", "Ruby");
print_r($languages);

Modifica el item PHP del array y vuelve a usar print_r() para ver su contenido.

Eliminar un elemento de un array

<?php
	$array = array("red", "blue", "green");
	//El siguiente método borra el elemento “green”
	unset($array[2]);
?>

Ejercicio

Borrar Python del array y luego volver a ejecutar print_r() para comprobar que ya no se encuentra en el array.

<?php
	$languages = array("HTML/CSS","JavaScript", "PHP", "Python", "Ruby");
	print_r($languages);
?>

Convertir un array en texto y un texto en array

Array a texto:

$array = array("afsdf", "asdf", "asdf", "asdf");
$txt = join(", ", $array);

Texto a Array:

$pizza  = "piece1 piece2 piece3 piece4 piece5 piece6";
$pieces = explode(" ", $pizza)

Arrays asociativos

<?php 
	$capital['DE'] = "Berlin";
	$capital['DK'] = "Copenhague";
	$capital['ES'] = "Madrid";

	echo $capital['ES'];
?>
<?php 
	$capital =array("DE"=>"Berlín", "DK" =>"Copenhage", "ES" =>"Madrid");

	echo $capital['ES'];
?>

Recorrer y contar elementos del array

<?php 

	$capital['JP'] = "Tokyo";
	$capital['DK'] = "Copenhague";
	$capital['ES'] = "Madrid";

	foreach($capital as $value){ 		//foreach($capital as $index=>$value){
		echo $value."<br/>";		
	}

	$elementosArray = count($capital);
	echo "El array tiene ". $elementosArray." elementos";

?>

Ejercicio

Crea un array con cinco nombres de persona y recórrelo mostrando el texto "Conozco a alguien llamado".

Ejercicio

Recorrer la siguiente lista con un bucle imprimiendo el doble de cada número:

$my_list = array(1,9,3,8,5,7);

Ejercicio

En estadística, la media aritmética de una colección de datos (muestra) se calcula:

formula

Es decir, sumando cada uno de los valores y dividiendo por la totalidad de valores existentes.

En las siguientes muestras:

Muestra 1: 5 5 5 5 5
Muestra 2: 1 1 5 9 9

Ambas tienen una media de 5 pero, en cambio, son dos muestras bastantes diferentes. Por este motivo es interesante observar la desviación respeto la media que tiene cada valor

Media 5
Muestra 1 5 5 5 5 5
Desviaciones M1 0 0 0 0 0
Muestra 2 1 1 5 9 9
Desviaciones M2 -4 -4 0 4 4

Con la media y las desviaciones ya tenemos una información más exacta de cómo es cada muestra, pero parece que no hemos ganado demasiado porque si la muestra tenía n valores ahora tenemos 1 media y n valores de desviaciones.

Si se quieren resumir las desviaciones de la muestra a un solo valor y hacemos la media de las desviaciones nos encontramos que las desviaciones negativas compensan las positivas y en la segunda muestra del ejemplo resulta que el cómputo (-4-4+0+4+4)/5 da cero igual que la media de la muestra 1 en que no había desviación.

La relevancia de la desviación es independiente de su signo, por ello, calculamos su cuadrado.

Mediana 5
Muestra 1 5 5 5 5 5
Desviaciones M1 0 0 0 0 0
Muestra 2 1 1 5 9 9
Desviaciones M2 16 16 0 16 16

Y si calculamos la media de los cuadrados, los resultados son bien diferentes. En el caso de la muestra 1 es cero y en el de la muestra 2 es 12.8. Este último cómputo que hemos hecho es la varianza de la muestra:

fórmula

La raíz cuadrada de esta varianza es lo que se denomina desviación típica de la muestra y que vendría a ser la media de las desviaciones tomadas en valor absoluto.

Tarea: Calcular la media, las desviaciones de la media, las desviaciones al cuadrado, la varianza y la desviación típica de un conjunto de números que se leerán desde un fichero cuyo nombre se pasará como parámetro.

El ejercicio consistirá en la creación de una serie de módulos en php que desarrollen, cada uno, un determinado trabajo según el detalle que se hará a continuación.

  • Módulo getData

    Este módulo no tiene que recibir ningún parámetro. El llamamiento en el programa tendrá que ser del tipo:

    index.php?filename=data10

    el fichero de datos consta de una única instrucción de php en que la variable $cadena recibe como valor una cadena de texto integrada por una serie de números que están separados por un espacio en blanco, como por ejemplo

    $cadena = "0 1 2 3 4 5 6 7 8 9";

    el fichero de datos consta de una única instrucción de php en que la variable $cadena recibe como valor una cadena de texto integrada por una serie de números que están separados por un espacio en blanco.

  • Módulo round2

    Recibe como parámetro un número y lo devuelve con un máximo de 2 decimales.

  • Módulo showNumbers
    Este módulo recibe como parámetro una array de números y una cadena de texto. En una primera hilera mostrará la cadena de texto a modo de título y en una segunda muestra los números separados por espacios. Por ejemplo, al llamamiento showNumbers($data, "Original data") si el array $data es | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |, mostrará
    ejercicio php
  • Módulo tableAverage
    Este módulo recibirá una mesa de números y devolverá su media.
  • Mòdul createDeviationTable
    Este módulo tiene que recibir un array de números y su media y creará un nuevo array, de la misma longitud y llenará sus posiciones con las desviaciones a la media correspondientes a los valores del array entrado.
    createDeviationTable($in, $average) devolvería el array $out.
    $in 1 1 5 9 9
    $out -4 -4 0 4 4
  • Módulo createVarianceTable
    Este módulo tiene que recibir un array de números y su media y creará una nueve array, de la misma longitud y llenará sus posiciones con el cuadrado de las desviaciones a la media correspondientes a los valores del array entrada. createVarianceTable($in, $media) devolvería la array $out.
    $in 1 1 5 9 9
    $out 16 16 0 16 16
Indicaciones preceptivas
  1. No se puede hacer uso de variables globales
  2. En PHP existe la function count($arg) que recibe como argumento un array y devuelve la cantidad de elementos que tiene el array $arg.
    Por ejemplo si la mesa es (89, 7, 3, 4, 5, 9) devolvería un 6.
  3. Queda especialmente prohibido hacer uso de las funciones de arrays de php salvo count.
  4. Se facilitan los 5 ficheros de datos, de data10 a data14

Ejercicio

Disponemos de una secuencia de números positivos cada uno de ellos separado del siguiente por un espacio y que finaliza con un cero

Tarea: Se pide un programa que sea capaz de leer un fichero que contenga una cadena de números y escriba en pantalla, a uno por línea, los números primos que forman parte de la secuencia, hasta que se encuentre un cero.

Indicaciones preceptivas
  • La llamada al programa será del tipo:
    index.php?filename=data30 por lo cual se tendrá que emplear la instrucción $filename=$_GET["filename"]; para cargar el nombre del fichero que incorpora la instrucción que asigna valor a la variable $cadena.
  • Los ficheros de datos constan de una única instrucción de php en que la variable $cadena recibe como valor una cadena de texto integrada por series de números enteros y positivos que están separados por un espacio y finaliza en un 0
    Por ejemplo el fichero data30 tiene el siguiente contenido
    <?php
     $cadena = "1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 0";
    ?>
Descargar ficheros
Otras indicaciones
  • Un número primo es aquel diferente a 1 y que sólo es divisible por 1 y por sí mismo.
  • Puede resultar útil construir una función que permita saber si un número es primo o no.

Ejercicio

El tesorero de un partido político ha encontrado una manera de codificar las cuentas de la caja B a partir de códigos de colores en que cada color de una bola corresponde a una cifra de un número según la traducción

Codi ejercicio php - bola azul ejercicio php - bola roja ejercicio php - bola verde ejercicio php - bola amarilla ejercicio php - bola azul y verde ejercicio php - bola roja y verde ejercicio php - bola verde y amarilla ejercicio php - bola verde y azul ejercicio php - bola azul y amarilla ejercicio php - bola amarilla y roja
valor 0 1 2 3 4 5 6 7 8 9 Separador
Nombre fichero B R G Y BG RG GY GB BY YR E

La secuencia que crea está formada por los nombres de los ficheros que codifican los colores y es del tipo

{c11 c12 ... c1n E c21 c22 ... c2n E c31 c32 ... c3n E ... E cm1 cm2 ... cmn .} on

  • cij : nombre del fichero de color correspondiente a la cifra j de la cantidad y.
  • E es el carácter que indica que se ha acabado las cifras de un número
  • . es el carácter '.' que indica el fin de la secuencia imagen de como debería quedar el ejercicio de las bolas de PHP
  • Esta imagen muestra la codificación de colores y los valores asociados a la secuencia {R G BY Y B B B @E YR RG B B @E RG RG RG RG .} hemos marcado los separadores con color azul para #ver que la secuencia contiene tres números

Tarea: Crear un programa que reciba un fichero con la secuencia correspondiente a una serie de cantidades y muestre en pantalla, a una línea por cantidad:

  • la codificación en bolas de colores
  • la palabra Value y el valor de la cantidad codificada

Al acabar de mostrar las cantidades, en la línea siguiente, se mostrará el total. Optativamente, se puede mostrar debajo, el código de color correspondiente al total.
Por ejemplo:

ejemplo de como quedaría el ejercicio de las bolas con PHP resuelto
Indicaciones preceptivas
  • El llamamiento en el programa será del tipo:
    index.php?filename=data50
  • Las instrucciones para cargar el fichero de datos y crear la lista $data a partir de la variable $cadena ya forman parte del programa principal de la plantilla .
  • Con los ficheros del enunciado, se facilitan 10 ficheros de imagen que corresponden a cada cifra y que también se usan al ejercicio 4.
  • B.png R.png G.png Y.png BG.png RG.png GY.png GB.png BY.png YR.png
  • Se tiene que crear la function putImg que, a partir del nombre del código mostrará una celda de color a la pantalla.
  • Se tiene que crear la function colorToValue que recibe un texto correspondiente al al código de una cifra y devuelve la cifra que le corresponde según el array mostrado al principio. Por ejemplo, si recibe "BY" devolvería un 8.
  • No se pueden emplear variables globales.

Consejos

Este problema se tiene que considerar como un problema de trabajo con una secuencia (que nombraremos externa) en que cada elemento es también una secuencia (interna).

Partiendo del ejemplo {R G BY Y B B B E YR RG B B E RG RG RG RG .}, la secuencia externa tiene tres elementos que están limitados por la letra 'E' o bien '.'. Así los elementos de la secuencia externa son:

  • R G BY Y B B B
  • YR RG B B
  • RG RG RG RG

Cada uno de ellos es una secuencia interna

El tratamiento de esta secuencia de secuencias se hace directamente a partir del uso de array_shift sobre la lista $data y los elementos que podemos obtener pueden ser:

  • El '.' implica el fin de una secuencia interna (un número) y de la secuencia externa (acabamos la secuencia de números).
  • La 'E' que indica el fin de un número
  • Cualquier otro código, corresponderá a una bola

Así, para tratar la secuencia de secuencias, tendremos que trabajar con dos bucles, uno de grande (externo) que contendrá uno más pequeño (interno).

El bucle grande, evidentemente, se tendrá que ejecutar hasta que no se coja de la secuencia lo '.', que indica el final de la secuencia total.

El bucle interno se tendrá que ejecutar hasta que se encuentre una 'E' o un '.' que indica el final de una secuencia interna (un número).

  • Tenéis que tener en cuenta, que cuando se lee una 'E', para poder entrar al bucle interno, tendréis que recoger otro elemento de la lista.
  • Para calcular un número cuando recibimos las cifras por orden desde la de más valor a la de menos valor el mecanismo iterativo no es complejo, a pesar de que no es directo.
    Por ejemplo: recibimos las cifras 4, 8, 2 y queremos obtener el 482.
    • numero := 0
    • numero := numero * 10 + 4 → 0 * 10 + 4 → 0 + 4 → 4
    • numero := numero * 10 + 8 → 4 * 10 + 8 → 40 + 8 → 48
    • numero := numero * 10 +2 → 48 * 10 + 2 → 480 + 2 → 482

Cookies

Son archivos de texto almacenados en el ordenador del cliente y que contienen información que será utilizada por la página web para cuando el cliente se vuelva a conectar.

Gracias a ellas un sitio web puede almacenar información acerca de tu perfil.

<?php
	$nombre = "Juan";
	setcookie("nombre", $nombre, time()+3600);
	echo $_COOKIE['nombre'];
?>

El array $_COOKIE contiene las cookies en el momento de hacer la petición, por ello, no podrás ver los valores que acabas de almacenar en la petición actual.

Para ver las cookies almacenadas por cierto dominio → pulsamos en el ícono justo a la izquierda de la URL → More information → Security → View cookies

Ejercicio Cookies

Añadir al ejercicio de detección de idiomas el uso de Cookies, para que el idioma seleccionado quede almacenado una vez cerrado el navegador.

Nota: el primer if, nos quedará así:

if(isset($_REQUEST["lang"])){
	$_SESSION["lang"] = $_REQUEST["lang"];
	setcookie("lang", $_REQUEST["lang"], time()+3600);
}

Con cookies broma política de cookies

Composer con jwt

<?php
//Cargamos los módulos de Composer
require __DIR__ . '/vendor/autoload.php';
// A continuación, ya podremos usar Composer
use \Firebase\JWT\JWT;

$token = array (
  'sub' => '1234567890',
  'name' => 'John Doe',
  'admin' => true,
  'jti' => '79f6c158-7c50-4943-b2dd-e6817f3ee274',
  'iat' => 1571252215,
  'exp' => 1571255815,
);

$jwt = JWT::encode($token, "secret");
echo $jwt;
?>
Descargar recurso
icono de mandar un mail¡Contacta conmigo!
Pablo Monteserín
contacta conmigoPablo Monteserín

Para dudas técnicas sobre los ejercicios de mis cursos es necesario estar suscrito.