Diferencia entre revisiones de «Usuario:ManuelRomero/PHP/Resumen»
De WikiEducator
< Usuario:ManuelRomero | PHP
(→Sintaxis básica) |
|||
(10 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 | + | *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 118: | Línea 125: | ||
*La posición de cada elemento la especifico con un número | *La posición de cada elemento la especifico con un número | ||
$misNotasIndexado =[6,7,8,7,6,7,8,7]; | $misNotasIndexado =[6,7,8,7,6,7,8,7]; | ||
− | *Es | + | *Es igual que hacer |
$misNotasIndexado =[0=>6,1=>7,2=>8,3=>7,4=>6,5=>7,6=>8,7=>7]; | $misNotasIndexado =[0=>6,1=>7,2=>8,3=>7,4=>6,5=>7,6=>8,7=>7]; | ||
:'''''asociativo''''' | :'''''asociativo''''' | ||
*La posición de cada elemento la especifico con una cadena de caracteres | *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 | *En este caso a la hora de insertar un array, hay que especificar obligatoriamente en valor del índice | ||
+ | <source lang=php> | ||
$misNotasAsociativo =["maria"=>6,"ana"=>7,"nieves"=>8,"luis"=>7,"ester"=>6,"carlos"=>7,"pedro"=>8,"nieves"=>7]; | $misNotasAsociativo =["maria"=>6,"ana"=>7,"nieves"=>8,"luis"=>7,"ester"=>6,"carlos"=>7,"pedro"=>8,"nieves"=>7]; | ||
+ | </source> | ||
Línea 134: | Línea 143: | ||
echo "Valor de la nota : $nota"; | echo "Valor de la nota : $nota"; | ||
} | } | ||
+ | </source> | ||
*También podría acceder a los índices | *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 | '''para el array $misNotasIndexado coge cada indice y guardalo en $indice y cada elemento de esa posición y almacénalo en $nota | ||
Línea 140: | Línea 150: | ||
echo "Valor de la nota $indice : $nota"; | echo "Valor de la nota $indice : $nota"; | ||
} | } | ||
+ | </source> | ||
*En el caso de arrays asociativo nos interesará la mayoría de las veces acceder al valor del índice y del elemento | *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 | '''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 | ||
Línea 286: | Línea 297: | ||
echo "Esto es false porque $a se adapta a true"; | echo "Esto es false porque $a se adapta a true"; | ||
$a = "pedro" | $a = "pedro" | ||
− | if ($a == | + | if ($a == true) |
− | echo "Esto es cierto porque $a | + | echo "Esto es cierto porque $a no es nulo y al transformar en booleano se toma como true"; |
− | if ($a === | + | if ($a === true) |
− | echo "Esto no es cierto ya que $a no es | + | echo "Esto no es cierto ya que $a no es true ya que es de tipo string y no booleano "; |
</source> | </source> | ||
Línea 303: | Línea 314: | ||
*Una vez descrita la puedo invocar donde quira | *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 | *Solo las variables internas definidas como '''''global''''' las puedo utilizar fuera de la función con el valor que ésta hubiera dejado | ||
− | *parámetros | + | *parámetros: una función adminte parámetros que son los valores con los que la función puede operar |
− | *return, | + | *Estos valores son pasados cuando invocamos a la función |
+ | <source lang=php> | ||
+ | .... | ||
+ | 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 ''''' | ||
+ | </source> | ||
+ | |||
+ | *Pueden tener un valor por defecto, en cuyo caso si no paso valor cuando la invoque se toma ese valor | ||
+ | <source lang=php> | ||
+ | .... | ||
+ | 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 ''''' | ||
+ | </source> | ||
+ | |||
+ | *return, en un momento dado la función puede devolver un valor | ||
+ | <source lang=php> | ||
+ | .... | ||
+ | function calculaMayor ( $p1, $p2){ | ||
+ | if ($p1> $p2) | ||
+ | return $p1; | ||
+ | else | ||
+ | return $p2; | ||
+ | } | ||
+ | $mayor = calculaMayor(58, 45); | ||
+ | echo "El mayor es $mayor); | ||
+ | </source> | ||
+ | |||
===Cookies=== | ===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 | ||
+ | #quién escribe la cookie (el servidor) | ||
+ | #donde la escribe (en el cliente : una ip en un navegador) | ||
+ | #qué escribe (una pareja variable = valor p.e. nombre = "maria") | ||
+ | #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 | ||
+ | <source lang=php> | ||
+ | ..... | ||
+ | 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. | ||
+ | </source> | ||
+ | |||
+ | ;Leer una coockie: | ||
+ | <source lang=php> | ||
+ | ..... | ||
+ | |||
+ | $nombre = $_COOKIE['nombre']; | ||
+ | //Esta acción almacenará en la variable $nombre el valor de la cookie, siguiendo con el ejemplo almacenará maría. | ||
+ | </source> | ||
+ | |||
+ | ;Borrar una cookie | ||
+ | *Tendré que escribirla con un tiempo negativo | ||
+ | <source lang=php> | ||
+ | ..... | ||
+ | setCookie("nombre", "maria",time()-1); | ||
+ | //Esta acción tendrá el efecto de borrar o anular la cookie | ||
+ | </source> | ||
+ | |||
===Sesiones=== | ===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 | ||
+ | <source lang=php> | ||
+ | .... | ||
+ | //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"; | ||
+ | </source> | ||
+ | ;Leer una variable de sesion | ||
+ | *En proximas conexiones podré saber el nombre del usuario | ||
+ | <source lang=php> | ||
+ | .... | ||
+ | // leo el nombre de la sesion | ||
+ | $nombre = $_SESSION['nombre`]; | ||
+ | ... | ||
+ | </source> | ||
+ | ;Borrar una variable de sesion | ||
+ | *Se elmina con la función ya conocida unset(..) | ||
+ | <source lang=php> | ||
+ | .... | ||
+ | //Ahora elmino la variable de sesion | ||
+ | unset($_SESSION['nombre']); | ||
+ | </source> | ||
+ | |||
===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
Contenido
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
- quién escribe la cookie (el servidor)
- donde la escribe (en el cliente : una ip en un navegador)
- qué escribe (una pareja variable = valor p.e. nombre = "maria")
- 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