Cesta de la compra sesiones

funciones.php

function verCesta($cesta) {
 ?>
 <table border="1">
 <tr><td>Producto</td><td>Precio</td></tr>
 <?php foreach ($cesta as $elemento) {
 ?>
 <tr><td><?= $elemento['producto'] ?></td><td><?= $elemento['precio'] ?></td>
 </tr> <?php } ?>
 </table> <?php
}

index.php

<?php
 include_once "funciones.php";
 session_start();
 $producto = filter_input(INPUT_GET, 'producto');
 $precio = filter_input(INPUT_GET, 'precio');
 if (!empty($producto) && !empty($precio)) {
 $_SESSION['cesta'][] = ['producto' => $producto, 'precio' => $precio];
 }
 if (isset($_SESSION['cesta'])) {
 verCesta($_SESSION['cesta']);
 }
 ?>

<form>
 <p>Producto:<input type="text" name="producto"></p>
 <p>Precio:<input type="text" name="precio"></p>
 <input type="submit">
 </form>

Ejemplo login

<?php
 session_start();

//Si hay un usuario no hago nada. Si no hay usuario le pongo un enlace al login
 if (empty($_SESSION['user'])) {
 ?>
 <h2>No estás autorizado. Por favor haz login</h2>
 <a href="index.php">Página de login</a>
 <?php
 }
 else{
 echo "Yupiiii!";
 }
 ?>
<?php
 session_start();
 
 //Si me han mandado un usuario y un pass y son 'JUAN' y '1234'
 //El login es correcto, creo una variable de sesión usuario y le pongo 'JUAN'

$user = filter_input(INPUT_GET, 'user');
 $password = filter_input(INPUT_GET, 'password');
 if ($user == 'JUAN' && $password == '1234') {
 $_SESSION['user'] = $user;
 }
 ?>

<form>
 <p>Usuario:<input type="text" name="user"></p>
 <p>Password:<input type="password" name="password"></p>
 <input type="submit">
 </form>

PHP DateTime y DateInterval

Vamos a ver algunas propiedades del objeto DateTime para manejar fechas y horas y del objeto DateInterval que se usa para algunas propiedades.

El objeto DateTime se instancia con la palabra clave new. Por defecto tendrá la fecha actual, pero podemos pasarle una cadena que nos indicará la fecha que queramos. Esta es similar a las que pasamos en strtotime y permite palabras como ‘tomorrow’, o ‘next month’:

$currentDateTime = new DateTime(); 
$yesterday = new DateTime('yesterday'); 
$twoDaysLater = new DateTime('+ 2 days'); 
$oneWeekEarly = new DateTime('- 1 week'); 
$dateTime = new DateTime('2015-01-01 12:30:12');

Otros ejemplos:

$valid_time_formats = ['now', 'jan 1 2016', '12 hours ago', 'next year', 'first day of next month', 'last day of this month', '12/25/2015', '@612835200'];

Una vez tenemos un objeto DateTime podemos formatearlo como se hacía con date():

$now = new DateTime();   
$ymdNow = $now->format('Y-m-d'); 
print_r($now->format('jS F Y'));   
print_r($now->format('ga jS M Y'));   
print_r($now->format('Y/m/d s:i:H'));

Podemos comparar dos fechas:

$today = new DateTime('today'); 
$yesterday = new DateTime('yesterday');  

var_dump($today > $yesterday); 
var_dump($today < $yesterday); 
var_dump($today == $yesterday);

// Output 
bool(true) 
bool(false) 
bool(false)

Podemos modificar una fecha con la propiedad modify, que permite añadir o quitar elementos igual que en strtotime:

$today = new DateTime('today');

$today->modify('-2 days');

Ejemplos de modificadores:

$modifiers = ['now', '+10 seconds', '+10 minutes', '+1 day', 'last second tomorrow', 'last day of this month', '12/31', '+3 months', '+1 year'];

Las fechas se pueden restar. Esto nos devuelve un objeto de tipo DateInterval, que veremos más adelante:

$today = new DateTime('today'); 
$yesterday = new DateTime('yesterday');  

$interval = $today->diff($yesterday);
echo $interval->format('%d day ago')

El formato de interval es parecido al de date, pero con el %.

También podemos añadir o restar intervalos a las fechas:

$today = new DateTime('today');
 
$today->add(new DateInterval('P2D'));
$today->sub(new DateInterval('P2D'));

El objeto DateInterval merece apartado propio. Se crea con una duración de un periodo determinado:

PYMDTHMS
P: period
Y: years
M: months
D: days
T: time
H: hours
M: minutes
S: seconds

Ejemplos:

P1Y 1 año
P1M 1 mes
P1D 1 día
P30D 30 días
PT1H 1 hora
PT5M 5 minutos
PT35S 35 segundos
P1Y6M29DT4H34M23S 1 año, 6 meses, 29 días, 4 horas, 34 minutos, 23 segundos

$Duration = new DateInterval( "P1Y2M3DT4H5M6S" );
print_r( $Duration );
Resultado:

DateInterval Object
(
[y] => 1
[m] => 2
[d] => 3
[h] => 4
[i] => 5
[s] => 6
...
)

$Duration = new DateInterval('P345D');
echo $Duration->format('P%yY%mM%dDT%hH%iM%sS'); // P0Y0M345DT0H0M0S

Algunos enlaces de utilidad:

https://www.startutorial.com/articles/view/master-php-datetime

http://www.bonify.io/blog/2014/09/its-about-time-we-talk-about-phps-datetime

http://php.net/manual/es/class.datetime.php

https://www.webpagefx.com/blog/web-design/php-dateinterval-class/

http://php.net/manual/es/class.dateinterval.php

Ejemplos cookie e include

Archivo muestracookie:

<?php
//Comprueba si hay una cookie llamada nombre y muestra el valor
$nombre = filter_input(INPUT_COOKIE, "nombre");
if (!empty($nombre)) {
 ?>
 <h4>Usuario: <?= $nombre ?></h4>
 <?php
}
?>

Index.php:

<?php
 //Comprueba que me hayan pasado un nombre, y si es así lo guarda en la cookie
 $nombre = filter_input(INPUT_GET, "nombre");

if (!empty($nombre)) {
 setcookie("nombre", $nombre, time() + 86400);
 }

include "muestracookie.php";
 ?>
 <form>
 Pon tu nombre: <input type="text" name="nombre">
 <input type="submit">
 </form>

Uso en otras páginas:

<?php
 include "muestracookie.php";
 ?>

Otro ejemplo filter_input

<?php
 $nombre = filter_input(INPUT_POST, "nombre");
 $password = filter_input(INPUT_POST, "password");

$error = [];

if (empty($nombre)) {
 $error[] = "Falta nombre";
 }
 if (empty($password)) {
 $error[] = "Falta password";
 }
 if ($nombre != "Juan" || $password != "1234") {
 $error[] = "Nombre / contraseña incorrecto";
 }
 if (!empty($error)) {
 ?>
 <p>Se han encontrado los siguientes errores</p>
 <p><?= implode(". ", $error) ?></p>
 <a href="index.php">Volver</a>
 <?php
 } else {
 echo "Adelante";
 }
 ?>

Ejemplo filter_input

<form action="contenido.php" method="post">
 Introduce Nombre: <input type="text" name="nombre">
 Introduce Password: <input type="password" name="password">
 <input type="submit">

</form>

 

<?php
 $nombre = filter_input(INPUT_POST, "nombre");
 $password = filter_input(INPUT_POST, "password");

if (empty($nombre)) {
 ?>
 <p>Introduce el nombre, por favor</p>
 <a href="index.php">Volver</a>
 <?php
 die();
 }
 if (empty($password)) {
 ?>
 <p>Introduce el password, por favor</p>
 <a href="index.php">Volver</a>
 <?php
 die();
 }
 if ($nombre=="Juan" && $password=="1234"){
 echo "Adelante";
 }
 else{
 ?>
 <p>Datos incorrectos</p>
 <a href="index.php">Volver</a>
 <?php 
 }
 ?>

Función ajedrez PHP

<?php
function ajedrez($tam) {
 ?>
 <table border="1">
 <?php for ($i = 0; $i < $tam; $i++) {
 ?>
 <tr>
 <?php for ($j = 0; $j < $tam; $j++) {
 ?>
 <td <?=($i + $j) % 2 == 0?'style="background-color:black"':''?>></td>
 <?php } ?>
 </tr> <?php } ?>
 </table> <?php
 }

ajedrez(8);

Lanzamiento moneda

<?php

function lanzamiento($num = 3) {
 $caras = 0;
 $tiradas = 0;
 while ($caras < $num) {
 $moneda = rand(1, 2);
 if ($moneda == 1) {
 // echo "C";
 $caras++;
 } else {
 // echo "X";
 $caras = 0;
 }
 $tiradas++;
 }
 return $tiradas;
 }

for ($j = 1; $j <= 8; $j++) {
 $tiradas = 0;
 for ($i = 0; $i < 1000000; $i++) {
 $tiradas += lanzamiento($j);
 }
 echo $j." : ".($tiradas / 1000000)."<br/>";
 }
 ?>