Diferencia entre revisiones de «Usuario:ManuelRomero/PHP/Resumen»

De WikiEducator
Saltar a: navegación, buscar
(Sesiones)
(Sintaxis básica)
 
(6 revisiones intermedias por el mismo usuario no mostrado)
Línea 1: Línea 1:
 
===Instalación===
 
===Instalación===
 
*Apache
 
*Apache
*php
+
*php (cli y lib)
*mysql
+
*mysql (cliente y servidor)
 
+
 
*netbeans
 
*netbeans
*java
+
**(java)
 
*debug
 
*debug
  
Línea 51: Línea 50:
 
</source>
 
</source>
  
*Lenguaje fuertemente tipado de declaración dinámica
+
*Lenguaje tipado de declaración dinámica
 
*5 tipos básicos
 
*5 tipos básicos
 
*Los tipos pueden cambiar en cualquier momento
 
*Los tipos pueden cambiar en cualquier momento
Línea 63: Línea 62:
 
?>
 
?>
 
</source>
 
</source>
 +
;Visualizar mensajes (En realidad van al fichero html que se entrega al cliente)
 +
;En el mensaje puedo expresar variables que cuyo valor se visualizará
 +
<?php
 +
echo " Esto es un mensaje"
 +
$=rand (1,50);
 +
echo "Valor genarado aleatoriamente $a";
 +
 +
?>
  
 
===Array===
 
===Array===
Línea 410: Línea 417:
  
 
===Autentificación===
 
===Autentificación===
 +
*Apache tiene un módulo que permite autentificar
 +
*Para usarlo, hay que realizar una serie de pasos que hay que conocer
 +
;Habilitar el módulo AllowOverride
 +
*En el fichero de confituracion de apache hay que habilitar la directiva '''''AllowOverride'''''
 +
*En nuestro caso  vamos al fichero '''''000-default''''' que es donde tenemos la configuración de nuestro sitio web
 +
cd  /etc/apache2/sites-eneabled
 +
*Editamos el fichero
 +
sudo gedit 000-default
 +
*Añadimos la directiva
 +
*Donde ponía
 +
<source lang= php>
 +
        <Directory /var/www/>
 +
Options Indexes FollowSymLinks MultiViews
 +
Order allow,deny
 +
allow from all
 +
</Directory>
 +
</source>
 +
*Hacemos que ponga
 +
<source lang= php>
 +
        <Directory /var/www/>
 +
Options Indexes FollowSymLinks MultiViews
 +
                AllowOverride AuthConfig
 +
Order allow,deny
 +
allow from all
 +
</Directory>
 +
</source>
 +
*Con ello le estamos diciendo que cualquier página que haya en el directorio /var/www o cualquier subdirectorio de él, antes de que el servidor entregue la página que verifique si hay un fichero .htacces y que lo use para validar usuarios
 +
;Crear un fichero de usuarios
 +
*Para validar usuarios tendremos que tener una lista de usuarios y sus password
 +
*Se crean con la herramienta '''''htpasswd'''''
 +
*Si no está instalada se instala
 +
sudo apt-get install apache2-utils
 +
*Nos ubicamos en el directorio donde queremos crear el fichero de usuarios y password
 +
cd /home/manolo
 +
*Ahora creo el fichero (la primera vez con -c para crear el fichero, las siguientes sin -c
 +
htpasswd -c ficheroUsuario manolo
 +
*Me pedirá luego pass de '''manolo'''
 +
*Esto creará un fichero llamado '''''ficheroUsuario''''' con el usuario '''''manolo'''''
 +
*Ahora añadimos más usuarios
 +
htpasswd  ficheroUsuairo alicia
 +
*Y así sucesivamente. Observa que -c ya no aparece
 +
;establecer el fichero .htaccess en el directorio que quiero aplicar seguridad
 +
*En el directorio donde haya páginas que queremos que se pidan usuario y password para poder acceder a ellas, hay que poner un fichero llamado '''''.htaccess'''''
 +
*El contenido del fichero debe ser el siguiente
 +
<source lang = php>
 +
AuthName "Contenido restringido"
 +
AuthType Basic
 +
AuthUserFile /home/manolo/ficheroUsuario
 +
Require sara maria 
 +
</source>
 +
*'''''AuthName''''' Es el texto que aparecerá en el formulario que saldrá para autentificarnos
 +
*'''''AuthType'''''  Tipo de autentificación puede ser Basic o Digest, en nuestro caso Basic
 +
*'''''AuthUserFile'''''  El fichero que antes hemos creado con la lista de usuarios
 +
*'''''Require'''''  Para qué usuarios voy a dar permiso que accedas, previa identificación, es decir para otros usuarios aunque se acrediten no les dará acceso. valid-user especificaría todos los usuarios. En el ejemplo solo a sara y maria se les dejará acceso
 +
*Con esto ya funcionaría
 +
*Apache se encarga de sacar un formulario para que el usuario se autentifique en caso de que en el direcctorio donde se encuentra la página que el usuario ha solicitado se encuentre un fichero .htaccess
 +
*Si ese usuario está en la lista de '''''Require'''' y aporta de forma correcta el nombre y pass se le entregraá la página, en otro caso no
 +
 +
;Lanzar el formulario de autentificación de apache
 +
*Alternativamente  podemos decir a apache que antes de entregar la página lance un formulario
 +
*En nuestro programa  leeremos el usuario y password que el usuario aporte
 +
*Comparamos esos valores con los valores que consideremos (posteriormente los podemos buscar en una base de datos)
 +
*Y en función de esos valores decidimos en nuestro programa qué hacer (si le dejamos seguir o no a ese usuario)
 +
*'''''Enviar el formulario''''':  es decir que apache envie el lugar de la página un formulario para que el usuario se autentifique
 +
<source lang = php>
 +
    header('WWW-Authenticate: Basic Realm="Contenido restringido"');
 +
    header('HTTP/1.0 401 Unauthorized');
 +
    echo "Usuario no reconocido!";
 +
    exit;
 +
</source>
 +
*Esto enviaría un formulario al cliente y si le da al botón cancelar mostraría el echo y saldría
 +
*Pero claro si ya ha aportado el valor en el usuario no quiero volver a sacar el usuario, por lo que tendría que tener un if del tipo (si no ha enviado usuario muestra el formulario). Para ello tenemos que saber como leer el contenido de este usuario
 +
*'''''Leer los datos del formulario 401''''': para leer los datos de ese formulario
 +
*La matriz asociativa variable superglobal $_SERVER contiene esta información
 +
Concretamente los índices '''''PHP_AUTH_UER''''' Y '''''PHP_AUTH_PW'''''
 +
<source lang = php>
 +
$user = $_SERVER['PHP_AUTH_USER']//Almacena el la variable $user Es el nombre del usuario
 +
$pass = $_SERVER['PHP_AUTH_PW']; //Almacena el la variable $pass la password del usuario
 +
</source>
 +
*Por lo que el código correcto sería
 +
<source lang=php>
 +
<?php
 +
if (!isset($_SERVER['PHP_AUTH_USER'])) {
 +
    header('WWW-Authenticate: Basic Realm="Contenido restringido"');
 +
    header('HTTP/1.0 401 Unauthorized');
 +
    echo "Usuario no reconocido!";
 +
    exit;
 +
}
 +
?>
 +
</source>
 +
*Una forma de validar un usuario que se llame manolo y pass manolo sería
 +
<source lang=php>
 +
<?php
 +
if ($_SERVER['PHP_AUTH_USER']!='manolo' || $_SERVER['PHP_AUTH_PW']!='passManolo.') {
 +
    header('WWW-Authenticate: Basic Realm="Contenido restringido"');
 +
    header('HTTP/1.0 401 Unauthorized');
 +
    echo "Usuario no reconocido!";
 +
    exit;
 +
}
 +
//Aqui seguiría la página normal que quiero entregar al cliente en caso de que todo ok.
 +
 +
 +
?>
 +
</source>
  
 
===Objetos===
 
===Objetos===
 +
*Para crear objetos tengo que definir una clase
 +
*Definir o crear una clase es escribir cual va a ser la estructura de un componente software que va a tener una identidad (unos valores que lo definine un un comportamiento o acciones que sabrá hacer), dentro del programa
 +
*Es bueno crear cada clase en un fichero que se llame como la clase
 +
*Se recomienda empezar en mayúsculas en nombre de la clase
 +
<source lang = php>
 +
class MiClase {
 +
//Aquí pondré el contenido
 +
}
 +
</source>
 +
<source lang = php>
 +
class Racional {
 +
//Aquí pondré el contenido de la clase racional
 +
}
 +
</source>
 +
 
====atributos====
 
====atributos====
 +
*Detallan las características del objeto, lo que le va a diferenciar uno de otro
 +
*Por ejemplo el objeto Racional 5/6 es diferente del objeto Racional 7/9
 +
*Lo vemos porque tienen valores diferentes
 +
*Se definen como variables normales en php
 +
 +
<source lang = php>
 +
class Racional {
 +
private $num;
 +
private $den;
 +
}
 +
</source>
 +
*Se recomienda que sean privados
 
====métodos====
 
====métodos====
 +
*Detallan el comportamiento o las cosas que los objetos de esa clase van a saber hacer
 +
*Se declaran como funciones normales de php
 +
 +
<source lang = php>
 +
class Racional {
 +
  .......
 +
 +
/*
 +
Este método permite asignar un valor al racional
 +
*/
 +
public function asignar($numerador, $denominador
 +
    $this->num = $numerador;
 +
    $this->den = $denominador;
 +
}
 +
/*
 +
Este método me devuelve el valor real del número Racional
 +
*/
 +
public function calculaReal()
 +
    $valor = $this->num / $this->den;
 +
    return $valor
 +
}
 +
 +
</source>
 +
====$this====
 +
*Para poder acceder a los elementos de una clase usaremos la seudovariables $this
 +
*Es una manera de especificar que estoy accediendo al elemento concreto del objeto que se esté ejecutando en ese momento
 +
<source lang = php>
 +
class Racional {
 +
  private $num;
 +
  private $den;
 +
/*
 +
Este método permite asignar un valor al racional
 +
*/
 +
public function asignar($numerador, $denominador){
 +
    //Con $this estoy detallando que accedo al num del objeto
 +
    $this->num = $numerador;
 +
    $this->den = $denominador;
 +
    $num =8; //Esto creará una variable local al método llamada $num, que no tiene nada que ver con el atributo $num al cual accederé con $this->num
 +
}
 +
/*
 +
Este método me devuelve el valor real del número Racional
 +
*/
 +
public function calculaReal()
 +
    $valor = $this->num / $this->den;
 +
    return $valor
 +
}
 +
/*
 +
Este método visualiza el racional u su valor
 +
*/
 +
public function calculaReal()
 +
    $valor = $this->caluculaReal
 +
    $cadenaRetorno = $this->num."/".$this->den ."=".$valor;
 +
    return $cadenaRetorno;
 +
}
 +
</source>
 +
 
====concepto de sobrecarga====
 
====concepto de sobrecarga====
 +
*En php no existe la sobrecarga como tal
 +
*He de evaluar el valor de los parámetros y en función de ello hacer una cosa u otra
 
====Encapsulacion: delimitadores de acceso====
 
====Encapsulacion: delimitadores de acceso====
 +
*Lo implementan las palabras reservadas
 +
;private
 +
*Son elementos a los que solo el se puede acceder dentro de la clase
 +
;public
 +
*Son elementos a los que se puede acceder desde cualquire sitio que exista el objeto
 +
;protected
 +
*Para el exterior es como privado, para clases que se implementen con herencia son como públicos
 
====constructor====
 
====constructor====
 +
*Es el método __construct() que siempre que cree un objeto de la clase se va a ejecutar.
 +
*En el podemos hacer todo lo que queremos que se haga cuando creamos un objeto de la clase.
 +
*Normalmente nos preocuparemos que de los atributos de la clase tengan los varlores correspondientes.
 +
<source lang=php>
 +
class Racional{
 +
  private $num ;
 +
  private $den
 +
 
 +
  public function __construct($num, $den){
 +
        $this->num = $num;
 +
        $this->den = $den;
 +
  }
 +
}
 +
</source>
 +
 
====métodos mágicos====
 
====métodos mágicos====
 +
*Son métodos que sabemos que en determinadas circunstancias son invocados
 +
*Si los tenemos implementados en nuestra clase, se ejecutará su contenido
 +
*Si no no ocurrirá nada, o sea que no es obligatorio que los tengamos implementados
 +
*Los 4 que hemos visto son
 +
;__construct()
 +
*Se invoca siempre que creemos un objeto con el operador new
 +
;__call ($metodo , $parametros)
 +
*Se invoca siempre que invoquemos a un método que no existe en la clase
 +
*El primer argumento es el nombre del método invocado
 +
*El segundo argumento es un array indexado con los parámetros del método
 +
;__toString()
 +
*Cuando en el códgio se necesita  convertir el objeto en un string
 +
;__destruct()
 +
*Caundo el objeto se destruye
 +
 
====elementos estáticos====
 
====elementos estáticos====
 
====métodos mágicos====
 
====métodos mágicos====

Última revisión de 08:43 27 dic 2020

Instalación

  • Apache
  • php (cli y lib)
  • mysql (cliente y servidor)
  • netbeans
    • (java)
  • debug

Sintaxis básica

Código embebido
<?php
.....
?>
  • En un mismo fichero puedo abrir y cerrar etiquetas
  • El comportamiento es como si todo es un fichero, que es lo que es
<?php
$titulo= "El título  de la página "
$trozosCodigo =0;
?>
<source lang=php>
<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title>Probando cosas con título <?php echo $titulo; $trozosCodigo++;?></title>
    </head>
    <body>
        <?php
              echo "Otro trozo de código php ";
              $trozosCodigo+;
         ?>
 
    </body>
        <?php
              $trozosCodigo+;
              echo "En total hay $trozosCodigo de código;";
 
         ?>
</html>
Variables
  • Identificadores que empiezan por $
<?php
$variable = "valor";
?>
  • Lenguaje tipado de declaración dinámica
  • 5 tipos básicos
  • Los tipos pueden cambiar en cualquier momento
<?php
$a= 5;       // $a de tipo  entero
$a="maria"; // $a de tipo  string
$a=true; // $a de tipo  booleano
$a=5.5; // $a de tipo  float
$a=null; // $a de tipo  null
?>
Visualizar mensajes (En realidad van al fichero html que se entrega al cliente)
En el mensaje puedo expresar variables que cuyo valor se visualizará

<?php echo " Esto es un mensaje" $=rand (1,50); echo "Valor genarado aleatoriamente $a";

?>

Array

  • Son estructuras o colecciones de alguna manera ordenadas de valores de cualquier tipo
  • Existen muchas funciones para trabajar con ellas
Definirlo
<?php
 $miArray = array();//Crea un array vacío
 $otroArray = array("Maria", "Luis", "Pedro", "Marta", "Carol");
 $otroArrayVacio = [];
 $array4 = [1,5,4,3,2];
?>
<7source>
;Añadir elementos después del último que hubiera
<source lang=php>
<?php
 $miArray[] =10 ;
 $otroArray[] = "Marga";
 $otroArrayVacio[] =8;
 $array4 []=15;
?>
Añadir elementos en una posición concreta
<?php
 $miArray[5] =10 ; //El próximo elemento se añadirá en la posicón 6 aunque solo haya 2 elementos
 $otroArray[2] = "Marga"; //Si ya existiera la posición 2 se sustituiría
 $otroArrayVacio[10] =8;
 $array4 [1]=15;
?>
Eliminar una posición del array
  • Se usa la conocida función unset(...)
  • Por ejemplo eliminar las posición previamente añadidas
Añadir elementos en una posición concreta
<?php
 unset($miArray[5]); //Elimina el elemento de la posicón 6 Si fuera el último el siguiente que añadamos sin indexar cubrirá esa posición, si no se dejará un hueco
 unset($otroArray[2]);
 unset($otroArrayVacio[10]);
 unset($array4 [1]);
?>
Funciones que más hemos usado con array
count($array) o size($array) 
  • Nos dice el número de elementos de un array, que no tiene porqué coincidir con el siguiente elemento a añadir.
Tipos de array
  • Es importante tener clara la diferencia entre array asociativo y array indexado
  • Ambos casos son colección de elementos por que son array
  • Se diferencian en la forma que voy a indicar cada posición de los diferentes elementos
indexado
  • La posición de cada elemento la especifico con un número
$misNotasIndexado =[6,7,8,7,6,7,8,7];
  • Es igual que hacer
$misNotasIndexado =[0=>6,1=>7,2=>8,3=>7,4=>6,5=>7,6=>8,7=>7];
asociativo
  • La posición de cada elemento la especifico con una cadena de caracteres
  • En este caso a la hora de insertar un array, hay que especificar obligatoriamente en valor del índice
 $misNotasAsociativo =["maria"=>6,"ana"=>7,"nieves"=>8,"luis"=>7,"ester"=>6,"carlos"=>7,"pedro"=>8,"nieves"=>7];


Recorrer un array foreach(....)
  • Hay diferentes maneras de recorre un array, pero esta estructura es la más cómoda
  • La forma de interpretarla narrativamente sería
para el array $misNotasIndexado coge cada elemento y almacénalo en $nota 
foreach ($misNotasIndexado as $nota){
        echo "Valor de la nota : $nota";
}
  • También podría acceder a los índices
para el array $misNotasIndexado coge cada  indice y guardalo en $indice y cada elemento de esa posición  y almacénalo en $nota 
foreach ($misNotasIndexado as $indice => $nota){
        echo "Valor de la nota $indice : $nota";
}
  • En el caso de arrays asociativo nos interesará la mayoría de las veces acceder al valor del índice y del elemento
para el array $misNotasAsociativo coge cada  indice y guardalo en la variable  $persona y cada elemento de esa posición  y almacénalo en $nota 
foreach ($misNotasAsociativo as $persona => $nota){
        echo "Valor de la nota $persona : $nota";
}
  • Es importante marcar que las variables $indice, $persona o $nota, son variables que creamos nosotros y pueden lógicamente tener cualquier nombre

Estructuras de control

  • Ya sabemos que hay 3 tipos de estructuras de control
selectivas
 if (expresión_booleana) {
    instrucciones a ejecutar en el caso 
    de que expresión_booleana retorne true
    Si solo hubiera una instrucción podemos omitir las llaves
 }else{
    instrucciones a ejecutar en el caso 
    de que expresión_booleana retorne false
    Esta parte no es obligatoria
  }
  • Tenemos también el llamado selector múltiple
 switch $variable{
        case valor1 : 
                    //instrucciones
                    break;
        case valor2 : 
                    //instrucciones
                    break;
       // .......
       default: 
                    //instrucciones_default
                    break;
 
}
  • Recordad que si no ponemos el braek, se ejecutarán todos los case hasta encontrar un break o fin del switch
  • La sección default es opcional y se entrará en ella si no hay coincidencia previa
  • Lo que se hace en cada case es mirar a ver si el valor de la variable coincide
bucle
  • Como ya sabemos tenemos tres tipos
  • El bucle clásico
  • Recordemos las tres reglas de hora (inicializar, comparar correctamente, actualizar).
while (expresion_booleana){
  //instrucciones
}
  • El bucle contador
  • Ponemos un ejemplo que se va incrementando la variable de 11
  • Podemos mocificar cada una de las tres partes del for
for ($var = valor_inicial; $var < valor_final; $var++){
  //instrucciones
}
  • El bucle que ejecuta una iteración segurao
do{
  //instrucciones
}while (expresion_booleana);
  • Observar que en este caso al final va un ; pues separamos de la siguiente instrucción
Secuenciales
  • Son instrucciones que van una detrás de otra
  • Usamos el ; para separar una de otra
//instruccion de asignacion
$variable = valor  o expresion ;
//instruccion de invocacion funcion  del sistema o creada por nosotros
mail ($destino, $submit, $mensaje, $from) ;
//instruccion de escribir
echo "hola valientes y entusiastas de la programacion";
//instruccion de lectura
$variable = $_POST['variable'];
//instruccion de inicio fin de bloque en este caso sin punto y coma
{
}

Leer valores

  • Para leer valores necesitamos un formulario (no es la única forma pero si la más usada)
  • Otras maneras leer de ficheros por ejemplo
  • La idea es que al hacer una solicitud web vienen también todos los contenidos de los diferentes input de un formulario
form
<form action="ficheroPhpAEjecutar.php" method="POST"
     <input type = "text|radio| ..."   name="id_para_leer_en_php"  value ="valor_por_defecto"
     <input type=submit     value="enviar">
<form>
  • Recordad los atributos importantes
  • El name de los input es la forma de leer en servidor
  • Cuando hacemos click en el submit es cuando invocamos al fichero especificado
leer
$variable =$_POST["id_para_leer_en_php"] ;
$variable =$_GET["id_para_leer_en_php"] ;
$variable =$_REQUEST["id_para_leer_en_php"] ;
$variable = intput_filter (INPUT_POST, "id_para_leer_en_php", FILTER.....) ;
$variable = intput_filter (INPUT_GET, "id_para_leer_en_php", FILTER.....) ;
  • Si pasamos un filtro, no podemos leer arrays.
  • Siempre leeremos como una cadena de caracteres

Escribir mensajes

echo"texto ", "mas texto, " tercer parámetro mas texto";
print "solo puedo leer con un parámetro";
printf ("Este me permite escribir con formato usando \%);

Expresiones

  • PHP es un lenguaje orientado a expresiones
  • Esto quiere decir que en php todo se consideran expresiones
  • una expresión es un conjunto de valores (operadorandos) y operadores
  • Los operadores actúan sobre los operandos y obtengo un valor como resultado de evaluar y realizar los cálculos de la expresión

Expresiones de asignación

  • Dan como resultado el valor que asigno
$a = 5;
echo "Quiero ver el valor de esta expresion ".$a=5;
//Veré que me imprime 5

Expresiones aritméticas

  • Dan como resultado el cálculo obtenido
$b = ($a+5*$c-8 /5)%3// .... (+-*/%)

Expresiones booleanas

  • Esta expresión da como resultado un valor true o false
  • Puenden ser de dos tipos
comparación
  • <, > <=, >=, !=, ==, ===, !==
  • Hay qu tener cuidado con la igualdad de valor (==) y la igualdad de valor y tipo (===)
$a = 10;
if ($a == true)
   echo "Esto es cierto porque $a se adapta a true";
if ($a === true)
   echo "Esto es false porque $a se adapta a true";
$a = "pedro"
if ($a == true)
   echo "Esto es cierto porque $a no es nulo y al transformar en booleano se toma como true";
if ($a === true)
   echo "Esto no es cierto ya que $a no es true ya que es de tipo string y no booleano ";
  • Ver la siguiente tabla para mas detalle
http://php.net/manual/es/types.comparisons.php
lógicas
  • and && or || xor


Funciones

  • Escribir con un nombre un conjunto de instrucciones
  • Una vez descrita la puedo invocar donde quira
  • Solo las variables internas definidas como global las puedo utilizar fuera de la función con el valor que ésta hubiera dejado
  • parámetros: una función adminte parámetros que son los valores con los que la función puede operar
  • Estos valores son pasados cuando invocamos a la función
....
function miFuncion ( $param_valor1, $param_valor2){
   echo "valor de los parámetros : $param_valor1, $param_valor2";
}
miFuncion(54, 86);
//En este caso se imprimirá:  '''''valor de los parámetros : 54, 86 '''''
  • Pueden tener un valor por defecto, en cuyo caso si no paso valor cuando la invoque se toma ese valor
....
function miFuncion ( $param_valor1 = 1, $param_valor2 = 1){
   echo "valor de los parámetros : $param_valor1, $param_valor2";
}
miFuncion(54); //La invoco solo con un parámetro
//En este caso se imprimirá:  '''''valor de los parámetros : 54, 1 '''''
  • return, en un momento dado la función puede devolver un valor
....
function calculaMayor ( $p1, $p2){
   if ($p1> $p2)
      return $p1;
   else
      return $p2;
}
$mayor = calculaMayor(58, 45);
echo "El mayor es $mayor);

Cookies

  • son ficheros que se guardan el el cliente
  • Lo escribe un servidor concreto en un cliente concreto (una ip de un navegador )
  • Estos ficheros son parejas variable-valor
  • Es importante tener claro
  1. quién escribe la cookie (el servidor)
  2. donde la escribe (en el cliente : una ip en un navegador)
  3. qué escribe (una pareja variable = valor p.e. nombre = "maria")
  4. cuando la tendré displible y como. En la superglobal $_COOKIE['nombre_variable'], el servidor la recibe la próxima vez que el cliente acceda a él.

Recuerda como operar con ellas

Escribir una coockie
esta acción escribirá una cookie en el cliente
.....
setCookie("nombre", "maria",time()+3600);
//Escribo una cookie con la pareja nombre = maria y una duracción de 3600 segundos
//Recuerda que la duracción es a partir de este instante time() 
//Si no establezco este parámetro o pongo 0, la cookie durará lo que dure la sesión.
Leer una coockie
.....
 
$nombre = $_COOKIE['nombre'];
//Esta acción almacenará en la variable $nombre el valor de la cookie, siguiendo con el ejemplo almacenará maría.
Borrar una cookie
  • Tendré que escribirla con un tiempo negativo
.....
setCookie("nombre", "maria",time()-1);
//Esta acción tendrá el efecto de borrar o anular la cookie

Sesiones

  • Crear una variable de sesión es poder almacenar y disponer de esa variable mientras dure la conversación entre cliente y servidor
  • El cliente va enviando solicitudes al servidor y el servidor le va respondiendo
Cuando hablamos de enviar solicitudes, hablamos de solicitar páginas
El cliente siempre se comunica con el servidor solicitándole una página
Cuando hablamos de que el servidor responde, hablamos de le entrega una página solicitada
El servidor entrega una página al cliente. Si esa página tiene código php, antes de entregarla lo ejecuta 
  • Cada entrega se pierde todo lo que el servidor hubiera ejecutado antes
  • Si quiero almacenar algún valor, una manera de hacerlo es con sesiones
crear una variable de sesion
....
//Aquí leo el nombre que me puede venir de un formulario
$nombre = $_POST['nombre`];
//Ahora guardo esta variable y así conoceré ese nombre en veces sucesivas de esta conversación entre cliente y servidor
$_SESSION['nombre']= "maria";
Leer una variable de sesion
  • En proximas conexiones podré saber el nombre del usuario
....
// leo el nombre de la sesion
$nombre = $_SESSION['nombre`];
...
Borrar una variable de sesion
  • Se elmina con la función ya conocida unset(..)
....
//Ahora elmino la variable de sesion
   unset($_SESSION['nombre']);

Autentificación

  • Apache tiene un módulo que permite autentificar
  • Para usarlo, hay que realizar una serie de pasos que hay que conocer
Habilitar el módulo AllowOverride
  • En el fichero de confituracion de apache hay que habilitar la directiva AllowOverride
  • En nuestro caso vamos al fichero 000-default que es donde tenemos la configuración de nuestro sitio web
cd  /etc/apache2/sites-eneabled
  • Editamos el fichero
sudo gedit 000-default
  • Añadimos la directiva
  • Donde ponía
        <Directory /var/www/>
		Options Indexes FollowSymLinks MultiViews
		Order allow,deny
		allow from all
	</Directory>
  • Hacemos que ponga
        <Directory /var/www/>
		Options Indexes FollowSymLinks MultiViews
                AllowOverride AuthConfig
		Order allow,deny
		allow from all
	</Directory>
  • Con ello le estamos diciendo que cualquier página que haya en el directorio /var/www o cualquier subdirectorio de él, antes de que el servidor entregue la página que verifique si hay un fichero .htacces y que lo use para validar usuarios
Crear un fichero de usuarios
  • Para validar usuarios tendremos que tener una lista de usuarios y sus password
  • Se crean con la herramienta htpasswd
  • Si no está instalada se instala
sudo apt-get install apache2-utils
  • Nos ubicamos en el directorio donde queremos crear el fichero de usuarios y password
cd /home/manolo
  • Ahora creo el fichero (la primera vez con -c para crear el fichero, las siguientes sin -c
htpasswd -c ficheroUsuario manolo
  • Me pedirá luego pass de manolo
  • Esto creará un fichero llamado ficheroUsuario con el usuario manolo
  • Ahora añadimos más usuarios
htpasswd  ficheroUsuairo alicia
  • Y así sucesivamente. Observa que -c ya no aparece
establecer el fichero .htaccess en el directorio que quiero aplicar seguridad
  • En el directorio donde haya páginas que queremos que se pidan usuario y password para poder acceder a ellas, hay que poner un fichero llamado .htaccess
  • El contenido del fichero debe ser el siguiente
AuthName "Contenido restringido" 
AuthType Basic
AuthUserFile /home/manolo/ficheroUsuario
Require sara maria
  • AuthName Es el texto que aparecerá en el formulario que saldrá para autentificarnos
  • AuthType Tipo de autentificación puede ser Basic o Digest, en nuestro caso Basic
  • AuthUserFile El fichero que antes hemos creado con la lista de usuarios
  • Require Para qué usuarios voy a dar permiso que accedas, previa identificación, es decir para otros usuarios aunque se acrediten no les dará acceso. valid-user especificaría todos los usuarios. En el ejemplo solo a sara y maria se les dejará acceso
  • Con esto ya funcionaría
  • Apache se encarga de sacar un formulario para que el usuario se autentifique en caso de que en el direcctorio donde se encuentra la página que el usuario ha solicitado se encuentre un fichero .htaccess
  • Si ese usuario está en la lista de Require' y aporta de forma correcta el nombre y pass se le entregraá la página, en otro caso no
Lanzar el formulario de autentificación de apache
  • Alternativamente podemos decir a apache que antes de entregar la página lance un formulario
  • En nuestro programa leeremos el usuario y password que el usuario aporte
  • Comparamos esos valores con los valores que consideremos (posteriormente los podemos buscar en una base de datos)
  • Y en función de esos valores decidimos en nuestro programa qué hacer (si le dejamos seguir o no a ese usuario)
  • Enviar el formulario: es decir que apache envie el lugar de la página un formulario para que el usuario se autentifique
    header('WWW-Authenticate: Basic Realm="Contenido restringido"');
    header('HTTP/1.0 401 Unauthorized');
    echo "Usuario no reconocido!";
    exit;
  • Esto enviaría un formulario al cliente y si le da al botón cancelar mostraría el echo y saldría
  • Pero claro si ya ha aportado el valor en el usuario no quiero volver a sacar el usuario, por lo que tendría que tener un if del tipo (si no ha enviado usuario muestra el formulario). Para ello tenemos que saber como leer el contenido de este usuario
  • Leer los datos del formulario 401: para leer los datos de ese formulario
  • La matriz asociativa variable superglobal $_SERVER contiene esta información

Concretamente los índices PHP_AUTH_UER Y PHP_AUTH_PW

$user = $_SERVER['PHP_AUTH_USER']//Almacena el la variable $user Es el nombre del usuario
$pass = $_SERVER['PHP_AUTH_PW']; //Almacena el la variable $pass la password del usuario
  • Por lo que el código correcto sería
 <?php
if (!isset($_SERVER['PHP_AUTH_USER'])) {
    header('WWW-Authenticate: Basic Realm="Contenido restringido"');
    header('HTTP/1.0 401 Unauthorized');
    echo "Usuario no reconocido!";
    exit;
}
?>
  • Una forma de validar un usuario que se llame manolo y pass manolo sería
<?php
if ($_SERVER['PHP_AUTH_USER']!='manolo' || $_SERVER['PHP_AUTH_PW']!='passManolo.') {
    header('WWW-Authenticate: Basic Realm="Contenido restringido"');
    header('HTTP/1.0 401 Unauthorized');
    echo "Usuario no reconocido!";
    exit;
}
//Aqui seguiría la página normal que quiero entregar al cliente en caso de que todo ok.
 
 
?>

Objetos

  • Para crear objetos tengo que definir una clase
  • Definir o crear una clase es escribir cual va a ser la estructura de un componente software que va a tener una identidad (unos valores que lo definine un un comportamiento o acciones que sabrá hacer), dentro del programa
  • Es bueno crear cada clase en un fichero que se llame como la clase
  • Se recomienda empezar en mayúsculas en nombre de la clase
class MiClase {
//Aquí pondré el contenido
}
class Racional {
//Aquí pondré el contenido de la clase racional
}

atributos

  • Detallan las características del objeto, lo que le va a diferenciar uno de otro
  • Por ejemplo el objeto Racional 5/6 es diferente del objeto Racional 7/9
  • Lo vemos porque tienen valores diferentes
  • Se definen como variables normales en php
class Racional {
 private $num;
 private $den;
}
  • Se recomienda que sean privados

métodos

  • Detallan el comportamiento o las cosas que los objetos de esa clase van a saber hacer
  • Se declaran como funciones normales de php
class Racional {
  .......
 
/*
Este método permite asignar un valor al racional
*/
public function asignar($numerador, $denominador
     $this->num = $numerador;
     $this->den = $denominador;
}
/*
Este método me devuelve el valor real del número Racional
*/
public function calculaReal()
     $valor = $this->num / $this->den;
     return $valor
}

$this

  • Para poder acceder a los elementos de una clase usaremos la seudovariables $this
  • Es una manera de especificar que estoy accediendo al elemento concreto del objeto que se esté ejecutando en ese momento
class Racional {
  private $num;
  private $den;
/*
Este método permite asignar un valor al racional
*/
public function asignar($numerador, $denominador){
     //Con $this estoy detallando que accedo al num del objeto 
     $this->num = $numerador; 
     $this->den = $denominador;
     $num =8; //Esto creará una variable local al método llamada $num, que no tiene nada que ver con el atributo $num al cual accederé con $this->num
}
/*
Este método me devuelve el valor real del número Racional
*/
public function calculaReal()
     $valor = $this->num / $this->den;
     return $valor
}
/*
Este método visualiza el racional u su valor
*/
public function calculaReal()
     $valor = $this->caluculaReal
     $cadenaRetorno = $this->num."/".$this->den ."=".$valor;
     return $cadenaRetorno;
}

concepto de sobrecarga

  • En php no existe la sobrecarga como tal
  • He de evaluar el valor de los parámetros y en función de ello hacer una cosa u otra

Encapsulacion: delimitadores de acceso

  • Lo implementan las palabras reservadas
private
  • Son elementos a los que solo el se puede acceder dentro de la clase
public
  • Son elementos a los que se puede acceder desde cualquire sitio que exista el objeto
protected
  • Para el exterior es como privado, para clases que se implementen con herencia son como públicos

constructor

  • Es el método __construct() que siempre que cree un objeto de la clase se va a ejecutar.
  • En el podemos hacer todo lo que queremos que se haga cuando creamos un objeto de la clase.
  • Normalmente nos preocuparemos que de los atributos de la clase tengan los varlores correspondientes.
class Racional{
   private $num ;
   private $den
 
   public function __construct($num, $den){
         $this->num = $num;
         $this->den = $den;
   }
}

métodos mágicos

  • Son métodos que sabemos que en determinadas circunstancias son invocados
  • Si los tenemos implementados en nuestra clase, se ejecutará su contenido
  • Si no no ocurrirá nada, o sea que no es obligatorio que los tengamos implementados
  • Los 4 que hemos visto son
__construct()
  • Se invoca siempre que creemos un objeto con el operador new
__call ($metodo , $parametros)
  • Se invoca siempre que invoquemos a un método que no existe en la clase
  • El primer argumento es el nombre del método invocado
  • El segundo argumento es un array indexado con los parámetros del método
__toString()
  • Cuando en el códgio se necesita convertir el objeto en un string
__destruct()
  • Caundo el objeto se destruye

elementos estáticos

métodos mágicos