Sesión 1: PHP

¿Qué es PHP?

Acrónimo recursivo en inglés de PHP: Hypertext Preprocessor (preprocesador de hipertexto), es un lenguaje de programación de propósito general de código del lado del servidor originalmente diseñado para el desarrollo web de contenido dinámico. Fue uno de los primeros lenguajes de programación del lado del servidor que se podían incorporar directamente en un documento HTML en lugar de llamar a un archivo externo que procese los datos. El código es interpretado por un servidor web con un módulo de procesador de PHP que genera el HTML resultante.

Caracteristicas
  • Lenguaje del lado del servidor mas extendido en la web.
  • Potente y simple.
  • Gran comunidad de soporte.
  • Open source.
  • Es seguro.
  • Disponible en casi todos los servicios de web hosting.
  • Es gratis.
Orientación de programación
  • Multiplataforma.
  • Estilo de programación totalmente libre.
  • Programación estructurada.
  • Programación orientada a objetos.
  • Filosofía de código abierto.
  • Multitud de herramientas, librerias y frameworks gratuitos.
Utilidades y servicios que ofrece
  • Funciones de correo electrónico.
  • Administración de usuarios.
  • Creación y uso de plantillas.
  • Editores de texto.
  • Gestión de bases de datos.
  • Gestión de archivos.
  • Tramiento de imagenes.
  • Manejo de cookies, sesiones y url.
Ventajas y desventajas
  • Ventajas:
    • Es un lenguaje multiplataforma.
    • Completamente orientado al desarrollo de aplicaciones web dinámicas con acceso a información almacenada en una Base de Datos.
    • El código fuente escrito en PHP es invisible al navegador y al cliente ya que es el servidor el que se encarga de ejecutar el código y enviar su resultado HTML al navegador. Esto hace que la programación en PHP sea segura y confiable.
    • Capacidad de conexión con la mayoría de los motores de base de datos que se utilizan en la actualidad, destaca su conectividad con MySQL y PostgreSQL. 
    • Capacidad de expandir su potencial utilizando la enorme cantidad de módulos (llamados ext's o extensiones).
  • Desventajas:
    • Como es un lenguaje que se interpreta en ejecución para ciertos usos puede resultar un inconveniente que el código fuente no pueda ser ocultado. La ofuscación es una técnica que puede dificultar la lectura del código pero no la impide y, en ciertos casos, representa un costo en tiempos de ejecución.
    • El lugar mas seguro para ejecutar una aplicacion es en un servidor propio, por lo cual si un cliente o usuario requiere su codigo en su pc, tendriamos que dejar su codigo, sin manera de ocultarlo, aunque hay muchas aplicaciones que nos ayuda a encriptar el codigo fuente.
    • Se debe saber cuando menos HTML para poder hacer un trabajo medianamente funcional.
    • Si no es bien configurado correctamente dejas abiertas muchas brechas de seguridad.
    • Se necesita instalar un servidor web.
Aplicaciones que utilizan PHP
  • WordPress.
  • Joomla!.
  • Drupal.
  • Prestashop.
  • Woocommerce.
  • Magento.
  • Yahoo INC.
  • Wikipedia.
  • Friendster.
  • Facebook.
Sintáxis del lenguaje
  • Un script PHP se escribe en cualquier parte del documento HTML.
  • Inicia con <?php y termina con ?>.
  • No se sensitivo a mayúscula a excepción de las variables.
  • Las variables se inician con $.
  • Las instrucciones deben terminar con ;.
  • Tipos de datos:
    • Escalares:
      • boolean: Almacenan valores verdadero o falso (true / false).
      • integer: Números enteros.
      • float: Números con decimales, usando el punto como separador decimal.
      • string: Cadenas de texto.
    • Compuestos:
      • array: Usados para almacenar varios valores.
      • object: Almacena objetos en PHP.
    • Especiales:
      • resource: hace referencia a recursos tales como archivos abiertos, conexiones establecidas con bases de datos, etc.
      • null: indique el valor está vacío (no contiene nada).
  • Operadores aritméticos:
    • Adición (+): $x + #y
    • Sustracción (-): $x - $y
    • Multiplicación (*): $x * $y
    • División (/): $x / $y
    • Módulo (%): $x % $y
    • Exponencianción (**): $x ** $y
  • Operadores de comparación:
    • Igual: $a == $b
    • Idéntico: $a === $b
    • Diferemte: $a != $b
    • Diferente: $a <> $b
    • No idéntico: $a !== $b
    • Menor que: $a < $b
    • Mayor que: $a > $b
    • Menor o igual que: $a <= $b
    • Mayor o igual que: $a >= $b
Conexión con una Base de Datos
Se utilizan las funciones disponibles en la biblioteca MySQLi:
  • mysqli(): Se indican: servidor, usuario, password y esquema de base de datos.
  • conn->close(): Para desconectar la comunicación luego de la transacción.
Ejemplo de implementación:

<?php
    $servername = "localhost";
    $username = "usuario";
    $password = "contrasenia";
    $dbname = "phpmyadmin";

    // Create connection
    $conn = new mysqli($servername, $username, $password, $dbname);

    // Check connection
    if ($conn->connect_error) {
        die("Connection failed: " . $conn->connect_error);
    }
    echo "Connected successfully <br>";


    $sql = "SELECT id, nombre, correo, website FROM Contactos";
    $result = $conn->query($sql);

    echo "Retrieving data from Contactos <br>";

    if ($result->num_rows > 0) {
        // output data of each row
        while($row = $result->fetch_assoc()) {
            echo "Id: " . $row["id"]. " - Name: " . $row["nombre"] . " ";
            echo "- Correo: " . $row["correo"]. " - WebSite: " . $row["website"]."<br>";
        }
    } else {
        echo "0 results";
    }

    echo ("Closing connection");
    $conn->close();
?>

Manejo de formularios
  • Métodos:
Existen dos métodos HTTP que un cliente puede utilizar para pasar los datos del formulario al servidor: GET y POST. El método que utiliza un formulario particular, se especifica con el atributo method en la etiqueta form.

La solicitud GET codifica los parámetros del formulario en la dirección URL en lo que se llama una cadena de consulta, el texto que sigue al carácter ? es la cadena de consulta:
/path/to/page.php?keyword=bell&length=3
Una solicitud POST pasa los parámetros del formulario en el cuerpo de la solicitud HTTP, dejando intacta la URL. El tipo de método que se utilizó para solicitar una página PHP está disponible a través de $_SERVER[“REQUEST_METHOD”].
if ($_SERVER['REQUEST_METHOD'] == 'GET') {
  // handle a GET request
} else {
  die("You may only GET this page.");
}
  • Parámetros:
Se utilizan los arreglos _POST, _GET y _FILES para acceder a los parámetros de formulario desde el código PHP. Las llaves son los nombres de los parámetros y los valores son los valores de esos parámetros. Por ejemplo, considere la siguiente página utilizada para separar una palabra:
<html>
<head><title>Formulario</title></head>
<body>
    <form action="separar.php" method="POST">
        Ingrese una palabra:
        <input type="text" name="word"/><br/>
        Largo de las separaciones:
        <input type="text" name="number" /><br/>
        <input type="submit" value="Dividir">
    </form>
</body>
</html>
El programa PHP para procesar dicho formulario sería el siguiente:
$word = $_POST['word'];
$number = $_POST['number'];
$chunks = ceil(strlen($word) / $number);
echo "The {$number}-letter chunks of '{$word}' are:
\n";
for ($i = 0; $i < $chunks; $i++) {
  $chunk = substr($word, $i * $number, $number);
  printf("%d: %s
\n", $i + 1, $chunk);
}

Ejemplo práctico (Laboratorio 3)
El desarrollo del laboratorio 3 consistió en, por medio de una página construida en php, interactuar con una base de datos, donde se le diera persistencia a una tabla.

Primeramente, se definió una php con la información necesaria para realizar la conexión con la base de datos:
<?php

define('DB_HOST','localhost');
define('DB_NAME','***');
define('DB_USER','***');
define('DB_PASSWORD','***');

class DB {

    private static $db = null;
    private static $pdo;

    final private function __construct() {
        try {
            self::getDB();
        } catch (PDOException $e) {

        }
    }

    public static function getInstance() {
        if (self::$db === null) {
            self::$db = new self();
        }
        return self::$db;
    }

    public function getDB() {
        if (self::$pdo == null) {
            self::$pdo = new PDO(
                'mysql:dbname=' . DB_NAME . ';host=' . DB_HOST . ';',
                DB_USER, DB_PASSWORD,
                array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8")
            );
            self::$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        }
        return self::$pdo;
    }

    final protected function __clone() {

    }

    function _destructor() {
        self::$pdo = null;
    }
}
?>

Luego, se utilizó otro documento php que contuviera la forma de la consulta de la base de datos:
<?php
require 'ClassConnection.php';
class Suceso {
    function __construct() {

    }
    
    public static function crearSuceso($pTitular, $pDescripcion, $pSospechosos, $pFecha, $pHora, $pUbicacion) {
        $query="INSERT INTO SUCESO (IdUsuario, IdGrupo, Titular, Descripcion, Sospechosos, Fecha, Hora, Ubicacion, ImgGPS) values('01','01','{$pTitular}','{$pDescripcion}','{$pSospechosos}', '{$pFecha}', '{$pHora}', '{$pUbicacion}', 'Proximamente')";
        $command = DB::getInstance()->getDB()->prepare($query);
        $command->execute();
  return TRUE;
    }
}
?>

Luego, un documento que realizara la trasacción del método post para obtener la información dentro del form:
<?php
    require 'ClassSuceso.php';
  
 if($_SERVER['REQUEST_METHOD'] == 'POST')
 {
  // $pTitular, $pDescripcion, $pSospechosos, $pFecha, $pHora, $pUbicacion

     $titular = $_POST['titular'];
        $descripcion = $_POST['descripcionSuceso'];
        $sospechosos = $_POST['descripcionSospechosos'];
        $fecha = $_POST['fecha'];
        $hora = $_POST['hora'];
        $ubicacion = $_POST['ubicacionTxt'];
  
  try {
   $ret = Suceso::crearSuceso($titular, $descripcion, $sospechosos, $fecha, $hora, $ubicacion);
            if ($ret) {
                $data['status']='true';
                $data['value']=$ret;
                print json_encode($data);
            } else {
                print json_encode(array('status'=>'false654'));
            }
        } catch (PDOException $e) {
         print json_encode(array('status'=>$e));
        }
 }
?>

Por último, la construcción del form con todos los elementos para la efectuar la captura de información:
<div class="main">
<div class="jumbotron vertical-center">
  <div class="container">

    <form id="crearSucesoForm" action="procesarCrearSuceso.php" method="post" enctype="multipart/form-data">
      <h1>Publicar suceso:</h1>
      <!-- One "tab" for each step in the form: -->
      <div class="tab">
        <p><input placeholder="Titular" oninput="this.className = ''" name="titular"></p>
        <p><textarea rows="4" cols="50" name="descripcionSuceso" form="crearSucesoForm" placeholder="Descripción del suceso"></textarea></p>
        <p><textarea rows="4" cols="50" name="descripcionSospechosos" form="crearSucesoForm" placeholder="Descripción de los sospechosos"></textarea></p>
        <p><input id="date" type="date" name="fecha"></p>
        <p><input type="time" name="hora"></p>
      </div>
      <div class="tab">
        <p><textarea rows="4" cols="50" name="ubicacionTxt" form="crearSucesoForm" placeholder='Ubicación del acontecimiento'></textarea></p>
      </div>
      <div style="overflow:auto;">
        <div style="float:right;">
          <button type="button" id="prevBtn" onclick="nextPrev(-1)">Anterior</button>
          <button type="button" id="nextBtn" onclick="nextPrev(1)">Siguiente</button>
        </div>
      </div>
      <!-- Circles which indicates the steps of the form: -->
      <div style="text-align:center;margin-top:40px;">
        <span class="step"></span>
        <span class="step"></span>
      </div>

    </form>
  </div>
</div>
</div>

Referencias bibliográficas:
PHP | 18 características de PHPUtilidades en PHP que todo desarrollador debe conocer Grandes webs que utilizan PhpTipos de datos en PHPOperadores de comparación | Procesamiento de formularios

Comentarios