11. Conceptos de PHP

11.1. Sintaxis

  • Para usar PHP los archivos deben tener el formato .php y el código debe contenerse dentro de la siguiente etiqueta:
    • <?php include('ruta/archivo.php'); (código) ?>

11.1.1. Software necesario

  • Editor de código
  • Servidor con php instalado (en ubuntu: php7.x o php7.x-fpm)

11.1.2. Estructura del código

  • El código debe enmarcarse entre las etiquetas de inicio y cierre
    • <?php … ?>
  • Cada sentencia se termina con punto y coma
  • Se usan llaves para los bloques
  • Los comentarios se indican con //# (una línea) o /* */ (multilínea).

11.1.3. Variables y constantes

  • No necesitan declararse
    • $x;
    • $x = 5;
    • $x = “Hola”;
    • $x, $y;
  • Variables globales
    • $_GET[]
    • $_POST[]
    • $_FILES[]
    • $_SERVER[]
      • HTTP_REFERER: url anterior
  • Constantes
    define("nombre", "valor”)
    echo nombre;

11.1.4. Imprimir texto - concatenación

  • echo
    • echo “Hola Mundo”;
    • echo $x;
    • echo “Hola $x”;
    • No añade nueva línea automáticamente
      • echo “Hola Mundo\n”;
  • Concatenación con .
    • echo “Hola “ . $x;

11.1.5. Arrays

  • Permiten guardar varios datos en la misma variable
    • $x = [];
    • $x = [1, 2];
    • $x = [“Jose”=>45000, “Ricardo”=>50000];
  • Índices empiezan en cero
    • echo $x[1]; => 2
  • Añadir elemento
    • x[0] = 3;
    • Al principio: array_unshift($x, 3);
    • Al final: array_push($x, 5);
  • Quitar elemento
    • Al principio: array_shift($x);
    • Al final array_pop($x);
    • Otra posición array_splice($x, índice);
  • Imprimir array
    • print_r($x);
  • Otras opciones
    • count($x); => cuenta los elementos del array
    • sort($x); => ordena los elementos de forma ascendente(devuelve true o false, aunque imprima el array)
    • array_merge($arr1, $arr2, ...): combina arrays en uno nuevo
    • array_unique($x, [opc]) => General un array con los valores repetidos eliminados.
      • NOTA: No reinicia los índices, por lo que es importante crear un nuevo array añadiendo uno a uno (array_push) los elementos del array de salida.
    • array_search($busqueda, $arr) => devuelve el primer índice que coincide o false (Si el índice es cero, puede confundirse con "false", así que en condicionales usa "===")
    • array_reverse($arr) => invierte el orden de los elementos de un array, devuelve el array invertido

11.1.6. Operadores

  • Aritméticos
    + - * / %
  • Booleanos
    ==
    ===
    !=
    >
    >=
    <
    <=
  • Otros
    • && ; and
    • || ; or

11.1.7. Condicionales

  • If
    if ($x== 3){
       echo $x;
    }
    $y = true;
    if ($y){
        echo $y;
    }
  • Else if y Else
    if ($x<=3){
        echo “menor o igual a tres”;
    }else if($x<=6){
        echo “menor o igual a seis”;
    }else{
        echo “mayor que seis”;
    }
  • switch

11.1.8. Bucles

  • For
    for($i = 0; $i < 5; $i++){
        echo “$in”;
    }
  • Foreach
    foreach($array as $value){
    echo “El valor es $value”;
    }
    foreach($array as $key => $value){
    echo “El valor de $key es $valuen”;
    }
  • While
    while($i < 5){
    echo “$in”;
    $i++;
    }
  • Break
    • Interrumpe el bucle por completo
      while ($x < 5){
      if ($x == 3){
          break;
      }
      echo “$in”;
      $x++;
      }
  • Continue
    • Salta una parte del bucle

11.1.9. Funciones

  • Definición
    function mifuncion(){
    echo “Hola”;
    }
    function mifuncion(n1, n2){
    return n1 + n2;
    }
  • Llamar a la función
    mifuncion();

11.1.10. Clases y objetos

  • Definición de una clase
    class miclase{
        public $propiedad=”hola”;
        public function mifuncion(){
            …
        }
        final public function funcnoheredable(){...}
    }
  • Método constructor
    class Person {
        public function __construct() {
            echo "Object created";
        }
    }
  • Propiedades y métodos estáticos
    • public static $variable = 3;
  • Nuevo objeto a partir de una clase
    • $objeto = new miclase();
  • Crear una propiedad de un objeto sin clase
    • $objeto -> propiedad = "ricardo";
  • Acceder a una propiedad
    • $objeto -> propiedad;
    • Clase::$propiedad (propiedades estáticas, pertenecen a la clase)
    • Clase::constante
  • Acceder a un método
    • $objeto -> mifuncion();
    • Clase::mifuncion();

11.1.11. Operaciones con archivos

  • Referencia a un archivo seleccionado en un formulario
    • $_FILES(["nombre_input"].["name"])
  • Subir archivo
    • move_uploaded_file($_FILES['fichero_usuario']['tmp_name'], $fichero_subido)
  • Copiar archivo
    • copy("origen", "destino")
  • Borrar archivo
    • unlink("archivo")
  • Otros
    • $file = fopen("archivo", "r")
    • fread($file, filesize("archivo"))
    • fclose($file)
    • basename()
    • dirname()
    • file_exists()
    • filesize()

11.1.12. Otras funciones útiles

  • substr($string, inicio, longitud): recorta una cadena de texto.
  • explode("delimitador",$string): divide una cadena de texto según un delimitador. Se debe asignar a una variable (array).
  • strtolower($str): cambia letras a minúsculas, salvo las que tengan tildes.
  • preg_match($patron, $string): devuelve 0 ó 1.
    • $patron'/(jpg)$/'
  • preg_split('//u', $string, -1, PREG_SPLIT_NO_EMPTY): convierte una cadena de texto en un array (para texto en UTF-8)
  • parse_url(url, componente)
  • componente: PHP_URL_SCHEMEPHP_URL_HOSTPHP_URL_PORTPHP_URL_USERPHP_URL_PASSPHP_URL_PATHPHP_URL_QUERY o PHP_URL_FRAGMENT
  • ini_set('display_errors', 1): muestra errores
  • exec("comando"): ejecuta un comando en el servidor.
  • round(<<numero>>): redondea un número.
  • Búsqueda recursiva de archivos en el servidor:
    $it = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($directory));     $it->rewind();     while($it->valid()) {         if (!$it->isDot()) {             echo $it->key(); (Existen más métodos además de key)         }         $it->next();     }

11.1.13. Subir archivos al servidor

  • En php.ini:
    • file_uploads=On
    • upload_max_filesize=<<tamaño máximo>>
  • (NGINX) en la configuración de la web:
    • client_max_body_size=<<tamaño máximo>>
  • Permisos de escritura para el usuario PHP en la carpeta de subida
  • En formulario:
    • OPCIÓN 1:
      <form action="upload.php" method="post" enctype="multipart/form-data"> Select file to upload: <input type="file" name="fileToUpload"> <input type="submit" value="Upload" name="submit"> </form>
    • OPCIÓN 2:
      <form class="form-inline" action="search.php" method="get"> <input class="form-control" name="fs" type="search" placeholder="Busca archivos..."             aria-label="Buscar"/> <button class="btn btn-primary ml-sm-1 mt-1 mt-sm-0"             type="submit">Buscar</button>         </form>
  • En la página de acción o respuesta:
    • OPCIÓN 1:
      <?php // En versiones de PHP anteriores a la 4.1.0, debería utilizarse $HTTP_POST_FILES en lugar // de $_FILES. $dir_subida = '/var/www/uploads/'; $fichero_subido = $dir_subida . basename($_FILES['fileToUpload']['name']); if (move_uploaded_file($_FILES['fileToUpload']['tmp_name'], $fichero_subido)) {     echo "El fichero es válido y se subió con éxito.n"; } else {     echo "¡Posible ataque de subida de ficheros!n"; }             ?>
    • OPCIÓN 2:
      <?php $base_path = "files/"; $prev_url = $_SERVER['HTTP_REFERER']; $url = parse_url($prev_url, PHP_URL_QUERY); if($url != null){             $url_arr = explode("=", $url);             $base_path = $url_arr[1] . "/"; } $new_filename = strtolower($_FILES["upl_file"]["name"]); if(!move_uploaded_file($_FILES["upl_file"]["tmp_name"], $base_path . $new_filename)){             echo "error";         } ?>

11.2. El archivo php.ini

  • Existen varios archivos php.ini según en qué situación se este usando PHP. Por ejemplo, dentro de /etc/php/7.2/ podemos ver un php.ini en la carpeta apache2, otro para la interfaz de comandos (en la carpeta cli), etc.

11.3. Conceptos básicos de MySQL con PHP

11.3.1. Conexión con la base de datos

<?php
$link = mysqli_connect("localhost", "usuario", "contraseña", "basedatos");
        if (!$link) {
      die("Connection failed: " . mysqli_connect_error());
        }
        $tildes = $link->query("SET NAMES 'utf8'");
        //Para que se muestren las tildes
    ?>
  • Posible error "No such file or directory", cambia "localhost" por "127.0.0.1"

11.3.2. Hacer una consulta a la tabla que devuelve un solo resultado

<?php
    $result = mysqli_query ($link, "SELECT * FROM tabla");
    $extraido = mysqli_num_rows ($result);
    echo "<h2 class='gen'>$extraido</h2>";
?>

11.3.3. Hacer una consulta a la tabla que puede devolver varios resultados

<?php
    $result = mysqli_query ($link, "SELECT * FROM tabla");
    while ( $extraido = mysqli_fetch_array ( $result )) {
            echo "<p>" . $extraido ['columna1'] . "</p>";
        }
?>

11.3.4. Cerrar la conexión con la base de datos cuando deje de utilizarse

<?php
    mysqli_close ($link);
?>

11.3.5. Notas a tener en cuenta al usar bases de datos con PHP

  • Evitar que los usuarios utilicen comillas u otros caracteres al hacer búsquedas para evitar hackeos de tipo "injection".
  • Solución (utilizando expresiones regulares ‘RegExp’):
     
 <form id="form1" method="post" action="signup.php" onsubmit="return comprueba_regex('form1');">             (...) <script>     function comprueba_regex(formulario){         var regex = /([^A-Za-z0-9_-])/;         var usuario = document.getElementById(formulario)[0].value;         var contrasena = document.getElementById(formulario)[1].value;         if (regex.test(usuario) || regex.test(contrasena)){             alert("Ha usado caracteres no permitidos");             return false;         }else{             return true;         }      } </script>
 

11.4. Composer

  • Instalación: https://getcomposer.org/download/
  • Recuerda instalar globalmente:
    sudo php composer-setup.php --install-dir=/bin --filename=composer
  • Uso: composer [opciones]

11.5. Frameworks de PHP

  • Facilitan tareas complejas en entornos de gran tamaño
  • Existen varios “frameworks” populares en PHP: Zend, Symphony,…

11.5.1. Zend