Subir archivos con PHP

Necesitamos, en primer lugar, un formulario que debe ser de tipo post y multipart/form-data:

 <form method="post" enctype="multipart/form-data">
<!-- opcionalmente podemos poner un límite en bytes del fichero, esto se comprueba antes de subir -->
            <input type="hidden" name="MAX_FILE_SIZE" value="2048">
            Selecciona una foto (tamaño máximo 2K):
            <input type="file" name="foto">
            <input type="submit">

        </form>

Después lo recogemos en PHP dentro de la variable superglobal $_FILES. Contiene la siguiente información:

$_FILES[‘fichero_usuario’][‘name’]
El nombre original del fichero en la máquina del cliente.

$_FILES[‘fichero_usuario’][‘type’]
El tipo MIME del fichero, si el navegador proporcionó esta información. Un ejemplo sería “image/gif”. Este tipo MIME, sin embargo, no se comprueba en el lado de PHP y por lo tanto no se garantiza su valor.

$_FILES[‘fichero_usuario’][‘size’]
El tamaño, en bytes, del fichero subido.

$_FILES[‘fichero_usuario’][‘tmp_name’]
El nombre temporal del fichero en el cual se almacena el fichero subido en el servidor.

$_FILES[‘fichero_usuario’][‘error’]
El código de error asociado a esta subida.

Los códigos de error son los siguientes:

UPLOAD_ERR_OK
Valor: 0; No hay error, fichero subido con éxito.

UPLOAD_ERR_INI_SIZE
Valor: 1; El fichero subido excede la directiva upload_max_filesize de php.ini.

UPLOAD_ERR_FORM_SIZE
Valor: 2; El fichero subido excede la directiva MAX_FILE_SIZE especificada en el formulario HTML.

UPLOAD_ERR_PARTIAL
Valor: 3; El fichero fue sólo parcialmente subido.

UPLOAD_ERR_NO_FILE
Valor: 4; No se subió ningún fichero.

UPLOAD_ERR_NO_TMP_DIR
Valor: 6; Falta la carpeta temporal. Introducido en PHP 5.0.3.

UPLOAD_ERR_CANT_WRITE
Valor: 7; No se pudo escribir el fichero en el disco. Introducido en PHP 5.1.0.

UPLOAD_ERR_EXTENSION
Valor: 8; Una extensión de PHP detuvo la subida de ficheros. PHP no proporciona una forma de determinar la extensión que causó la parada de la subida de ficheros; el examen de la lista de extensiones cargadas con phpinfo() puede ayudar. Introducido en PHP 5.2.0.

Comprobamos si nos han enviado un fichero, si es así tenemos que moverlo de la carpeta temporal al destino que queramos:

 if (isset($_FILES['foto'])) {
         //En este caso lo muevo a la carpeta 'fotos'
            move_uploaded_file($_FILES['foto']['tmp_name'],
                    "fotos/" . $_FILES['foto']['name']);
}          

Opcionalmente podemos hacer otro tipo de comprobaciones, tipo, tamaño, etcétera:

 if (isset($_FILES['foto'])) {
            if (strpos($_FILES['foto']['type'], "image")!==false &&
                    $_FILES['foto']['size']<2048){
            move_uploaded_file($_FILES['foto']['tmp_name'],
                    "fotos/" . $_FILES['foto']['name']);
            echo "Imagen subida";
            } else {
                echo "Formato de archivo incorrecto. Debe enviar una imagen menor de 2K";
            }       

Ejemplos ordenar

https://www.toptal.com/developers/sorting-algorithms


$a=[3,1,8,5,2,6];
print_r($a);
sort($a);
print_r($a);
$b=["juan","ana","pepe","eva"];
sort($b);
print_r($b);
$c="en un lugar de la mancha De cuyo nombre no quiero acordarme";
$d= explode(" ", $c);
sort($d);
print_r($d);

$asoc=["aa"=>10,"bb"=>5,"cc"=>3,"dd"=>9];
asort($asoc);
print_r($asoc);
ksort($asoc);
print_r($asoc);
$array1 = $array2 = array("img12.png", "img10.png", "img2.png", "img1.png");

asort($array1);
echo "Ordenación estándar\n";
print_r($array1);

natsort($array2);
echo "\nOrdenación de orden natural\n";
print_r($array2);

function comparacion($a,$b){
    if (strlen($a)==strlen($b)){
        return 0;
    }
    if (strlen($a)<strlen($b)){
        return -1;
    }
    if (strlen($a)>strlen($b)){
        return 1;
    }
}
echo comparacion("cacahuete","hola");
usort($d,"comparacion");
print_r($d);

Ordenar arrays

Nombre de la función Ordena por Mantiene asociación con las key Orden de la clasificación Funciones relacionadas
array_multisort() valor sí si es asociativa, no si es númerica primer array u opciones de clasificación array_walk()
asort() valor menor a mayor arsort()
arsort() valor mayor a menor asort()
krsort() key mayor a menor ksort()
ksort() key menor a mayor asort()
natcasesort() valores natural, insensible a mayúsculas y minúsculas natsort()
natsort() valor natural natcasesort()
rsort() valor no mayor a menor sort()
shuffle() valor no aleatorio array_rand()
sort() valor no menor a mayor rsort()
uasort() valor definido por el usuario uksort()
uksort() key definido por el usuario uasort()
usort() valor no definido por el usuario uasort()

Ejercicio empleados

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title></title>
    </head>
    <body>
        <form>
            Nombre: <input type="text" name="nombre">
            Sueldo: <input type="number" name="sueldo">
            <input type="submit">
        </form>
        <?php
        session_start();
        $nombre = filter_input(INPUT_GET, "nombre");
        $sueldo = filter_input(INPUT_GET, "sueldo", FILTER_VALIDATE_INT);
        $borrar = filter_input(INPUT_GET, "borrar");
        if (!empty($borrar)) {
            unset($_SESSION['empleados'][$borrar]);
        }
        if (!empty($nombre) && is_numeric($sueldo)) {
            //Si empleados está vacía añadimos directamente el valor
            if (empty($_SESSION['empleados'])) {
                $_SESSION['empleados'][$nombre] = $sueldo;
            } else {
                //Creamos un array para copiar empleados
                $auxiliar = [];
                foreach ($_SESSION['empleados'] as $c => $v) {
                    //Si el sueldo es menor lo metemos antes
                    if ($sueldo < $v) {
                        $auxiliar[$nombre] = $sueldo;
                    }
                    //Y siempre copiamos el elemento, lo que pasa es
                    //Que si el sueldo era menor lo hemos añadido en
                    //el if anterior
                    $auxiliar[$c] = $v;
                }
                //Si después de recorrer el array no lo hemos introducido
                //Es que debe ir al final
                if (!isset($auxiliar[$nombre])) {
                    $auxiliar[$nombre] = $sueldo;
                }
                //Sustituimos el array empleados por la copia
                $_SESSION['empleados'] = $auxiliar;
            }
       }
            if (!isset($_SESSION['empleados'])) :
                $_SESSION['empleados'] = [];
            endif;
            ?>
            <table>
                <tr><th>Empleado</th><th>Sueldo</th><th>Acciones</th></tr>
                <?php
                foreach ($_SESSION['empleados'] as $c => $v):
                    ?>
                    <tr><td><?= $c ?></td><td><?= $v ?></td>
                        <td><a href="?borrar=<?= $c ?>">Borrar</a></td></tr>
                    <?php
                endforeach;
                ?>
        </table>
    </body>
</html>

Ejercicio empleados

Vamos a realizar un ejercicio en el cual tendremos el mantenimiento de una lista de empleados. Tendremos una caja con el nombre y una con el sueldo. Cuando el usuario le de a enviar nos añadirá el empleado a la variable de sesión ‘Empleados’ con la clave el nombre del empleado y valor el sueldo.

Ej: Juan   3000

$_SESSION[‘empleados’][‘Juan’]=>3000;

Hay que hacer las siguientes opciones:

1.- Poder dar de alta empleados

2.- Visualizarlos en una tabla

3.- Añadir la opción para borrarlos

4.- Poder cambiar el sueldo de un empleado

5.- (Complicada) Poner el empleado justo antes del primer empleado que tenga más sueldo que él.

Funciones Array (V)

Funciones de búsqueda en arrays:

in_array()

array_search()

array_key_exists()

Ejemplos:

 $tabla=range("a","j");
 
 if (in_array("b",$tabla)){
 echo "Está la b<br/>";
 }
 if (in_array("w",$tabla)){
 echo "Está la w<br/>";
 }
 
 $pos= array_search("b", $tabla);
 echo "|".$pos."|<br/>";
 $pos= array_search("w", $tabla);
 echo "|".$pos."|<br/>";
 
 $asociativa=array("a"=>1,"b"=>2,"c"=>3,"d"=>4,);
 $pos= array_search(3, $asociativa);
 echo "|".$pos."|<br/>";
 
 if (array_key_exists("d",$asociativa)){
 echo "Existe la clave d<br/>";
 }

Ejercicio añadir nombres a variable de sesión


<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
</head>
<body>
<form method="get">
Nombre:
<input type="text" name="nombre">
<input type="submit">
<input type="submit" name="reset" value="reset">
</form>
<?php
session_start();
$nombre = filter_input(INPUT_GET, "nombre");
$reset = filter_input(INPUT_GET, "reset");
$borrar = filter_input(INPUT_GET, "borrar");
if (is_numeric($borrar)){
//unset($_SESSION['lista'][$borrar]);
array_splice($_SESSION['lista'],$borrar,1);

}
if (empty($reset)) {
if (!empty($nombre)) {
$_SESSION['lista'][] = $nombre;
}
foreach ($_SESSION['lista'] as $c=>$elemento) {
echo $elemento." |<small><a href='?borrar=$c'>Borrar</a></small> |<br>";
}
} else {
$_SESSION['lista'] = [];
}
?>
</body>
</html>

Lo mismo con form

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title></title>
    </head>
    <body>
        <form method="get">
            Nombre:
            <input type="text" name="nombre">
            <input type="submit">
            <input type="submit" name="reset" value="reset">
        </form>
        <?php
        session_start();
        $nombre = filter_input(INPUT_GET, "nombre");
        $reset = filter_input(INPUT_GET, "reset");
        $borrar = filter_input(INPUT_POST, "borrar");
        if (is_numeric($borrar)) {
            //unset($_SESSION['lista'][$borrar]);
            array_splice($_SESSION['lista'], $borrar, 1);
        }
        if (empty($reset)) {
            if (!empty($nombre)) {
                $_SESSION['lista'][] = $nombre;
            }
            foreach ($_SESSION['lista'] as $c => $elemento) {
                ?>
                <form method="post" action="<?=$_SERVER['PHP_SELF']?>"><?= $elemento ?>
                    <input type="hidden" name="borrar" value="<?= $c ?>">
                    <input type="submit" name="reset" value="Borrar">
                </form>
                <?php
            }
        } else {
            $_SESSION['lista'] = [];
        }
        ?>
    </body>
</html>

Funciones Array (IV)

Obtener partes de un array y modificarlo:

array_slice()

array_splice()

Ejemplos:

 function muestraTabla($tabla) {
 echo "<pre>";
 print_r($tabla);
 echo "</pre>";
 }

 $entrada = array("rojo", "verde", "azul", "amarillo");
 array_splice($entrada, 2);
 // $entrada ahora es array("rojo", "verde")
 muestraTabla($entrada);
 $entrada = array("rojo", "verde", "azul", "amarillo");
 array_splice($entrada, 2,1);
 // $entrada ahora es array("rojo", "verde","amarillo")
 muestraTabla($entrada);
 $entrada = array("rojo", "verde", "azul", "amarillo");
 array_splice($entrada, 1, -1);
 // $entrada ahora es array("rojo", "amarillo")
 muestraTabla($entrada);

 $entrada = array("rojo", "verde", "azul", "amarillo");
 $foo=array_splice($entrada, 1, count($entrada), "naranja");
 // $entrada ahora es array("rojo", "naranja")
 //$foo es array("verde","azul","amarillo")
 muestraTabla($entrada);
 muestraTabla($foo);

 $entrada = array("rojo", "verde", "azul", "amarillo");
 array_splice($entrada, -1, 1, array("negro", "granate"));
 // $entrada ahora es array("rojo", "verde",
 // "azul", "negro", "granate")
 muestraTabla($entrada);

 $entrada = array("rojo", "verde", "azul", "amarillo");
 array_splice($entrada, 3, 0, "púrpura");
 // $entrada ahora es array("rojo", "verde",
 // "azul", "púrpura", "amarillo");
 muestraTabla($entrada);
 
 $tabla=range("a","j");
 $a=array_slice($tabla,3);
 muestraTabla($a);
 $a=array_slice($tabla,3,2);
 muestraTabla($a);
 $a=array_slice($tabla,-3);
 muestraTabla($a);
 $a=array_slice($tabla,-3,1);
 muestraTabla($a);
 $a=array_slice($tabla,-4,-2);
 muestraTabla($a);

Funciones Array (III)

Funciones para crear arrays con rangos o valores:

range()

array_fill()

array_pad()

Ejemplos:

 function muestraTabla($tabla) {
 echo "<pre>";
 print_r($tabla);
 echo "</pre>";
 }

 $a = range(1, 5);
 muestraTabla($a);
 $b = range(1, 100, 10);
 muestraTabla($b);
 $c = range('a', 'e');
 muestraTabla($c);

 $d = array_fill(2, 10, "pepe");
 muestraTabla($d);


 $input = array(12, 10, 9);

 $result = array_pad($input, 5, 0);
 // el resultado es array(12, 10, 9, 0, 0)
 muestraTabla($result);
 $result = array_pad($input, -7, 4);
 // el resultado es array(4, 4, 4, 4, 12, 10, 9)
 muestraTabla($result);

 $result = array_pad($input, 2, "noop");
 // sin relleno
 muestraTabla($result);