Professional Documents
Culture Documents
UNIDADES DIDÁCTICAS:
Unidad 3
Índice de la unidad:
2. Tratamiento de fechas
3. Tratamiento de matriculas
6. Resumen
Curso de Iniciación a PHP: Unidad 3
- Más funciones del lenguaje PHP -
Introducción
En esta Unidad vamos a conocer y saber aplicar correctamente las
principales funciones para tratar cadenas de caracteres.
- 155 -
Curso de Iniciación a PHP: Unidad 3
- Más funciones del lenguaje PHP -
En la Unidad 2, dentro del apartado Lectura de datos desde una página web,
ya nos hemos referido a la función urlencode(), que preserva los espacios de
un texto para que HTML los respete como tales. Veamos ahora con mayor
detalle esta función y su contraria.
- 156 -
Curso de Iniciación a PHP: Unidad 3
- Más funciones del lenguaje PHP -
Conviene observar que los espacios se representan con el signo +, las letras,
excepto la ñ, y los números se dejan igual, y los demás signos, como <, =, ),
etcétera, son sustituidos por el signo % seguido de dos dígitos en base
hexadecimal.
$c='SELECT+ALL+FROM+tabla+WHERE+nombre%3D%22JUANA%22';
$d=urldecode($c);
echo $d."<P>";
La función nl2br() se utiliza también para dar formato a las salidas en HTML.
Esta función transforma los códigos de salto de línea de los ficheros de texto en
códigos de salto de línea propios de HTML conservando los anteriores. Se
utiliza principalmente para organizar el texto introducido en TEXTAREA de un
formulario. Cambia, pues, la orden \n (salto de línea en un fichero de texto) en
<br> (salto de línea en código HTML) produciendo un salto de línea real, tanto
en el código HTML devuelto al interpretarse el código PHP como en la página
web que se muestra.
<HTML>
<HEAD></HEAD>
<BODY>
<br>
- 157 -
Curso de Iniciación a PHP: Unidad 3
- Más funciones del lenguaje PHP -
Segundo
Tercero"<br>
Segundo <br>
Tercero"
</BODY>
</HTML>
Se puede observar que los saltos de línea del fichero de texto \n mediante la
función nl2br() han sido sustituidos en el código HTML por saltos de línea
<br>.
La función chop() elimina los espacios en blanco que haya al final de una
cadena de caracteres, incluyendo los códigos de fin de línea si los hubiere.
- 158 -
Curso de Iniciación a PHP: Unidad 3
- Más funciones del lenguaje PHP -
La función ltrim() elimina los espacios en blanco que haya al principio de una
cadena de caracteres.
$i=ltrim($i);
Por ejemplo, si $limpia contiene " casa ", la instrucción echo trim($limpia)
devuelve "casa".
Texto grande
Negrita
- 159 -
Curso de Iniciación a PHP: Unidad 3
- Más funciones del lenguaje PHP -
- 160 -
Curso de Iniciación a PHP: Unidad 3
- Más funciones del lenguaje PHP -
Ejemplo: si $frase contiene " Deberías comer pizza, refrescos, y helado todos
los días." y necesitamos sustituir la comida no saludable por saludable,
podemos escribir las sentencias siguientes:
La función devolverá la cadena " Deberías comer fruta, vegetales, y fibra todos
los días.".
- 161 -
Curso de Iniciación a PHP: Unidad 3
- Más funciones del lenguaje PHP -
Hay funciones que permiten buscar dentro de una cadena. No se usan con
frecuencia, por lo cual quien lo necesite puede obtener información en el
Manual sobre las mismas. Nos limitamos a enumerar las principales y a indicar
para qué sirven:
- 162 -
Curso de Iniciación a PHP: Unidad 3
- Más funciones del lenguaje PHP -
Por ejemplo,
$variables="nom=Nacho&ape1=Roa&ape2=Bastos",
parse_str($variables);
define las variables $nom, $ape1 y $ape2, y les asigna los valores "Nacho", "Roa"
y "Bastos", respectivamente. Así puede pasarlas a otra página.
Comparar cadenas
- 163 -
Curso de Iniciación a PHP: Unidad 3
- Más funciones del lenguaje PHP -
- 164 -
Curso de Iniciación a PHP: Unidad 3
- Más funciones del lenguaje PHP -
En este programa se incluye la mayoría de los ejemplos cuyo código hemos ido
escribiendo junto a las funciones explicadas y otros nuevos que no aparecen
en el texto anterior. Es importante que lo estudies en detalle.
- 165 -
Curso de Iniciación a PHP: Unidad 3
- Más funciones del lenguaje PHP -
Tratamiento de fechas
Se considera como válida una fecha cuando su año está comprendido entre los
años 0 y el 32767, su mes entre 1 y 12, y su día entre 1 y 28 para febrero no
bisiesto, 29 para febrero bisiesto, 30 para abril, junio, septiembre y noviembre,
y 31 para el resto de los meses. Así pues, esta función controla los años
bisiestos al comprobar la validez de una fecha.
La función date() devuelve una cadena de texto que refleja una fecha y una
hora formateadas como se indique en el primer parámetro. En el segundo
argumento puede indicarse la fecha que se quiere mostrar utilizando un valor
de tipo timestamp (instante calculado como número de segundos transcurridos
desde el 1/1/1970, época UNIX). Si no se especifica este segundo parámetro,
se muestra la hora actual.
- 166 -
Curso de Iniciación a PHP: Unidad 3
- Más funciones del lenguaje PHP -
Conviene observar que esta cadena no utiliza categorías locales, por lo cual los
nombres de los días y los meses aparecen en inglés. Para formatear una fecha
y mostrar su resultado, es mejor utilizar la función strftime(), que se explica
después.
- 167 -
Curso de Iniciación a PHP: Unidad 3
- Más funciones del lenguaje PHP -
6. “year”: año
mktime(horas,minutos,segundos,mes,día,año);
La función strftime() se usa para formatear una fecha teniendo en cuenta las
especificaciones y categorías locales. Así soslayamos los problemas de este
tipo que plantean las funciones date() y getdate().
strftime(cadena de formato,instante);
- 168 -
Curso de Iniciación a PHP: Unidad 3
- Más funciones del lenguaje PHP -
La función idate() se usa para obtener el número entero de una fecha según el
formato escrito en el primer parámetro.
- 169 -
Curso de Iniciación a PHP: Unidad 3
- Más funciones del lenguaje PHP -
En este programa se incluye la mayoría de los ejemplos cuyo código hemos ido
escribiendo junto a las funciones explicadas y otros nuevos que no aparecen
en el texto anterior. Te invitamos a que lo estudies en profundidad.
- 170 -
Curso de Iniciación a PHP: Unidad 3
- Más funciones del lenguaje PHP -
Tratamiento de matrices
Hemos visto que una variable tiene un nombre que debe iniciarse por el signo
dólar ($) y un valor de uno de los tipos que soporta PHP. Pero en una variable
sólo podemos introducir un valor. ¿Hay alguna forma de asignar más de un
valor a un identificador? Sí, pero hay que usar matrices (arrays), que son
conjuntos de datos de diferentes tipos que se asignan a un solo nombre.
• Tiene un índice (key o index) para referirse a cada uno de sus elementos.
Este índice, también llamado subíndice, puede ser de tipo numérico entero o de
tipo cadena. En PHP el índice del primer elemento tiene el valor 0, si es de tipo
numérico entero.
• Cada elemento tiene un contenido (value), que puede ser de diferente tipo
que el resto de los elementos.
Suponemos que el alumno o alumna que hace este curso ya está familiarizado
con las matrices, por lo cual damos por explicados los principales conceptos
sobre los arrays. Aquí nos vamos a limitar a resumir brevemente las principales
funciones con las que PHP trata este tipo de datos.
$persona["nombre"] = "Josefa";
$persona["apellido1"] = "Pérez";
$persona["apellido2"] = "Rubio";
$persona["edad"] = 60;
$persona[] = "Josefa";
$persona[] = "Pérez";
$persona[] = "Rubio";
$persona[] = 60;
- 171 -
Curso de Iniciación a PHP: Unidad 3
- Más funciones del lenguaje PHP -
$persona[0] = "Josefa";
$persona[1] = "Pérez";
$persona[2] = "Rubio";
$persona[3] = 60;
Como puede verse, esta sintaxis utiliza la palabra reservada array, pone entre
comillas los índices de cadena y usa el signo => para asignar el valor a los
elementos.
Para crear una matriz bidimensional con las calificaciones obtenidas por una
alumna en las tres evaluaciones de Matemáticas, Lengua y Dibujo usando
índices alfanuméricos, podemos escribir lo siguiente:
$notas["Mat"]["Pri"] = "Suficiente";
$notas["Mat"]["Seg"] = "Bien";
$notas["Mat"]["Ter"] = "Notable";
$notas["Len"]["Pri"] = "Sobresaliente";
$notas["Len"]["Seg"] = "Sobresaliente2;
$notas["Len"]["Ter"] = "Notable";
$notas["Dib"]["Pri"] = "Notable";
$notas["Dib"]["Seg"] = "Bien";
$notas["Dib"]["Ter"] = "Suficiente";
$notas = array("Mat"=>array("Pri"=>"Suficiente",
"Seg"=>"Bien",
"Ter"=>"Notable"),
"Len"=>array("Pri"=>"Sobresaliente",
"Seg"=>"Sobresaliente",
"Ter"=>"Notable"),
"Dib"=>array("Pri"=>"Notable",
"Seg"=>"Bien",
"Ter"=>"Suficiente"));
- 172 -
Curso de Iniciación a PHP: Unidad 3
- Más funciones del lenguaje PHP -
$notas[0][0] = 1;
$notas[0][1] = 2;
$notas[0][2] = 3;
$notas[1][0] = 4;
$notas[1][1] = 5;
$notas[1][2] = 6;
$notas[2][0] = 7;
$notas[2][1] = 8;
$notas[2][2] = 9;
Es más breve, si bien hay que saber a qué asignatura y evaluación pertenece
cada índice. En la sintaxis precedente quedaría así:
$notas = array(0=>array(0=>1,1=>2,2=>3),
1=>array(0=>4,1=>5,2=>6),
2=>array(0=>7,1=>8,2=>9));
Como hemos visto, pues, la función array() permite crear e inicializar matrices,
si bien no es la única forma de hacerlo.
Su sintaxis es
La función range() devuelve una matriz que sólo contiene los elementos
indicados entre dos números, ambos incluidos.
Su sintaxis es
Las matrices tienen un puntero que apunta a uno de sus elementos. Cuando se
accede o usa por primera vez una matriz, el puntero está posicionado sobre el
primer elemento. Pero no siempre está sobre este elemento, ya que el puntero
puede haberse movido para leer o modificar el contenido de la matriz.
- 173 -
Curso de Iniciación a PHP: Unidad 3
- Más funciones del lenguaje PHP -
Pero podemos crear una matriz asignándole un índice numérico que no esté
ordenado o incluso un índice de tipo cadena desordenado. Por ejemplo,
podíamos haber creado e inicializado así la matriz $persona:
$persona[10] = "Josefa";
$persona[2] = "Pérez";
$persona[5] = "Rubio";
$persona[1] = 60;
$numero_elementos=count($persona);
for ($i=0; $i < $numero_elementos; $i++)
echo $persona[$i]."<P>";
1. Evitar que se ejecute la función cada vez que se pase por el bucle con la
consiguiente pérdida de tiempo al contar siempre lo mismo.
- 174 -
Curso de Iniciación a PHP: Unidad 3
- Más funciones del lenguaje PHP -
$datos=array("nombre"=>"Josefa","apellido1"=>"Pérez",
"apellido2"=>"Rubio","edad"=>60);
- 175 -
Curso de Iniciación a PHP: Unidad 3
- Más funciones del lenguaje PHP -
$numero_elementos=count($persona);
for ($i=0; $i < $numero_elementos; $i++)
{
$indice=key($datos);
echo "Indice:<B> $indice. </B>Contenido: <B>$persona[$i]</B><P>";
next($datos);
}
Su sintaxis es
Su sintaxis es
Ordenar matrices
Su sintaxis es
arsort(matriz);
- 176 -
Curso de Iniciación a PHP: Unidad 3
- Más funciones del lenguaje PHP -
$palabras=array("1"=>"amazona","2"=>"león","3"=>"zozobra",
"4"=>"sabueso", "5"=>"bondad","6"=>"obús");
$palabras=array("3"=>"zozobra","4"=>"sabueso","6"=>"obús",
"2"=> "león", "5"=>"bondad","1"=>"amazona");
Su sintaxis es
asort(matriz);
$palabras=array("1"=>"amazona","2"=>"león","3"=>"zozobra",
"4"=>"sabueso", "5"=>"bondad","6"=>"obús");
Su sintaxis es
krsort(matriz);
$palabras=array("1"=>"amazona","2"=>"león","3"=>"zozobra",
"4"=>"sabueso","5"=>"bondad","6"=>"obús");
$palabras=array("6"=>"obús","5"=>"bondad","4"=>"sabueso",
"3"=>"zozobra","2"=>"león","1"=>"amazona");
- 177 -
Curso de Iniciación a PHP: Unidad 3
- Más funciones del lenguaje PHP -
Su sintaxis es
ksort(matriz);
$palabras=array("1"=>"amazona","2"=>"león","3"=>"zozobra",
"4"=>"sabueso","5"=>"bondad","6"=>"obús");
Su sintaxis es
shuffle(matriz);
Su sintaxis es
uasort(matriz,función de usuario);
function compara($a,$b)
{
return (substr($a,3,1)>substr($b,3,1))
}
$colores=array("a"=>"blanco","b"=>"azul","c"=>"rojo",
"d"=>"amarillo","e"=>"verde");
uasort($colores,"compara");
for (reset($colores);$indice=key($colores);next($colores))
echo "Indice: <B>$indice</B> Contenido:<B>$colores[$indice]
</B><P>";
- 178 -
Curso de Iniciación a PHP: Unidad 3
- Más funciones del lenguaje PHP -
$colores=array("e"=>"verde","b"=>"azul","a"=>"blanco",
"c"=>"rojo","d"=>"amarillo");
Su sintaxis es
uksort(matriz,función de usuario);
function compara($a,$b)
{
return (substr($a,3,1)>substr($b,3,1));
}
$colores=array("primero"=>"blanco","segundo"=>"azul",
"tercero"=>"rojo","cuarto"=>"amarillo",
"quinto"=>"verde");
uasort($colores,"compara");
for (reset($colores);$indice=key($colores);next($colores))
echo "Indice: <B>$indice</B> Contenido:<B>$colores[$indice]
</B><P>";
$colores=array("segundo"=>"azul","cuarto"=>"amarillo",
"quinto"=>"verde","primero"=>"blanco",
"tercero"=>"rojo");
Modificar matrices
- 179 -
Curso de Iniciación a PHP: Unidad 3
- Más funciones del lenguaje PHP -
Su sintaxis es
array_merge(matriz1,matriz2...);
Su sintaxis es
$sabores=array("dulce","amargo","salado","soso","menta");
la instrucción
$completa=array_pad($sabores,8,"indeterminado");
genera la matriz
$completa=array("dulce","amargo","salado","soso","menta",
"indeterminado","indeterminado", "indeterminado");
- 180 -
Curso de Iniciación a PHP: Unidad 3
- Más funciones del lenguaje PHP -
forma que el primero pasa a ser el último y el último pasa a ser el primero.
Hace, pues, lo mismo que la función rsort().
Su sintaxis es
array_reverse(matriz);
Su sintaxis es
donde:
$matriz1=array("muy alto","alto","medio",
"bajo","muy bajo");
$matriz2=array("óptimo","bueno","malo");
array_splice($matriz1,2,2);
genera la matriz
array_splice($matriz1,2);
genera la matriz
- 181 -
Curso de Iniciación a PHP: Unidad 3
- Más funciones del lenguaje PHP -
$matriz1=array("muy alto","alto");
array_splice($matriz1,-2);
genera la matriz
$matriz1=array(("muy alto","alto","medio");
array_splice($matriz1,2,1);
genera la matriz
array_splice($matriz1,3,3,$matriz2);
genera la matriz
array_splice($matriz1,count($matriz1),3,$matriz2);
genera la matriz
$matriz1=array("muy alto","alto","medio","bajo",
"muy bajo","óptimo","bueno","malo");
$nueva=array_splice($matriz1,3,3,$matriz2);
genera la matriz
$nueva=("bajo","muy bajo");
- 182 -
Curso de Iniciación a PHP: Unidad 3
- Más funciones del lenguaje PHP -
Su sintaxis es
Su sintaxis es
Su sintaxis es
array_count_values(matriz);
Su sintaxis es
array_keys(matriz,valor);
Su sintaxis es
- 183 -
Curso de Iniciación a PHP: Unidad 3
- Más funciones del lenguaje PHP -
donde
genera la matriz
$nueva=array("medio","bajo");
Su sintaxis es
array_values(matriz original);
Lógicamente, como no puede haber una matriz sin índices, a cada elemento se
le asignan índices numéricos desde 0 en adelante y se eliminan los que tuviera
antes, sean cadenas u otros valores numéricos.
Su sintaxis es
each(matriz original);
- 184 -
Curso de Iniciación a PHP: Unidad 3
- Más funciones del lenguaje PHP -
$con_indices=array("uno"=>"muy alto","dos"=>"alto",
"tres"=>"medio","cuatro"=>"bajo",
"cinco"=>"muy bajo");
$nueva=array(0=>"tres","key"=>"tres", 1=>"medio","value"=>"medio")
Como puede verse, los dos últimos elementos de la matriz resultante hacen
referencia al contenido del elemento actual de la matriz original. De esta forma
podemos referirnos a su contenido de dos formas: como $nueva[1] o como
$nueva("value").
Su sintaxis es
- 185 -
Curso de Iniciación a PHP: Unidad 3
- Más funciones del lenguaje PHP -
Su sintaxis es
Su sintaxis es
list(lista de variables);
$comunidad=array("CA1"=>"Aragón","CA2"=>"Andalucía",
"CA3"=>"Galicia","CA4"=>"Murcia",
"CA5"=>"Valencia","CA6"=>"Canarias");
while (list($indice,$valor)=each($comunidad))
{
print ("El elemento <B>$indice</B> contiene el valor <B>$valor
</B><P>");
}
PHP permite tratar las matrices como si fueran pilas de tipo LIFO (Last In First
Out, Último en Entrar Primero en Salir) mediante cuatro funciones. El concepto
de pila ya es clásico en Informática y se refiere a la forma de almacenar
información en forma de montón o pila, Si tenemos muchos platos, podemos
almacenarlos apilándolos unos encima de otros. En este caso lo más usual
será que el último plato colocado en la pila sea el primero que se retira. Las
matrices también pueden considerarse como pilas de datos, que son sus
elementos.
Veamos las funciones que nos permiten realizar operaciones de tipo pila con
las matrices.
- 186 -
Curso de Iniciación a PHP: Unidad 3
- Más funciones del lenguaje PHP -
Su sintaxis es
array_pop(matriz);
Su sintaxis es
Su sintaxis es
array_shift(matriz);
Su sintaxis es
La función array_combine() crea una matriz usando una matriz para las claves
y otra para sus valores.
En este programa se incluye la mayoría de los ejemplos cuyo código hemos ido
escribiendo junto a las funciones explicadas y otros nuevos que no aparecen
en el texto anterior. Te invitamos a que lo estudies en profundidad.
- 187 -
Curso de Iniciación a PHP: Unidad 3
- Más funciones del lenguaje PHP -
Las funciones de usuario son bloques de código que pueden ser utilizados en
cualquier momento dentro del código PHP.
function ver_cuadrado_y_doble($num=2)
{
$cuadrado=($num*$num);
$doble=($num*2);
- 188 -
Curso de Iniciación a PHP: Unidad 3
- Más funciones del lenguaje PHP -
$num1=4;
ver_cuadrado_y_doble($num1);
$num2=5;
ver_cuadrado_y_doble($num2);
$num3=6;
ver_cuadrado_y_doble($num3);
$num4=7;
ver_cuadrado_y_doble($num4);
ver_cuadrado_y_doble();
- 189 -
Curso de Iniciación a PHP: Unidad 3
- Más funciones del lenguaje PHP -
function hacer_matriz($pal1,$pal2,$pal3)
{
$todas="$pal1,$pal2,$pal3";
$matriz=explode(",",$todas);
reset($matriz);
return $matriz;
}
$texto1="perro";
$texto2="rinoceronte";
$texto3="jirafa";
array_walk(hacer_matriz($texto1,$texto2,$texto3),'ver');
Hay varias cosas que debemos tener en cuenta al crear y utilizar funciones de
usuario. Son éstas:
array_walk(hacer_matriz($texto1,$texto2,$texto3),'ver');.
En el siguiente ejemplo vamos a usar el mismo código, casi, para pasar datos
por referencia.
function cambiar(&$pal1,&$pal2,&$pal3)
{
$pal1=strtr($pal1,'aeiou','.....');
$pal2=strtr($pal2,'aeiou','.....');
- 190 -
Curso de Iniciación a PHP: Unidad 3
- Más funciones del lenguaje PHP -
$pal3=strtr($pal3,'aeiou','.....');
$pal1=strrev($pal1);
$pal2=strrev($pal2);
$pal3=strrev($pal3);
}
$texto1="perro";
$texto2="rinoceronte";
$texto3="jirafa";
echo "<H3><CENTER>Inicialmente las variables \$texto1,
\$texto2 y \$texto3 contienen:</H3></CENTER>";
echo "<B>$texto1</B><P>";
echo "<B>$texto2</B><P>";
echo "<B>$texto3</B><P>";
echo "<H3><CENTER>Después de la transformación las variables
\$texto1,\$texto2 y \$texto3 contienen:</H3></CENTER>";
cambiar($texto1,$texto2,$texto3);
echo "<B>$texto1</B><P>";
echo "<B>$texto2</B><P>";
echo "<B>$texto3</B><P>";
En este código hemos pasado los datos por referencia, es decir, las variables
que se escriben como parámetros en la función también pueden ser
modificadas en el código PHP de la citada función. Para conseguir esto, hay
que utilizar el signo andpersand (&) delante de los parámetros de la función.
Cuando, después de haber ejecutado la función cambiar(), mostramos los
mismos datos en la página, podemos observar que sí han cambiado como
necesitamos.
- 191 -
Curso de Iniciación a PHP: Unidad 3
- Más funciones del lenguaje PHP -
- 192 -
Curso de Iniciación a PHP: Unidad 3
- Más funciones del lenguaje PHP -
Sobre este asunto conviene recordar que hay una gran similitud entre lo que
llamamos en informática objetos y los objetos de la vida real. Las clases son un
conjunto o colección de variables que describen algo y de funciones que
acceden a esas variables para actuar sobre ellas. Aplicando este concepto a la
vida real, podemos decir que una clase informática es como un diseño, modelo
o proyecto de algo, que describe ese algo y determina las operaciones o
funcionalidades que pueden llevarse a cabo con eso.
- 193 -
Curso de Iniciación a PHP: Unidad 3
- Más funciones del lenguaje PHP -
Para declarar una clase hay que usar la palabra reservada class seguida del
nombre de la clase que se quiere crear. Todas las instrucciones que integran la
nueva clase deben ir entre los signos {…}. Además, para definir las
propiedades de la clase, las variables tienen que ir precedidas de las palabras
reservadas public, protected o private. Observa el ejemplo siguiente:
class carro_compra
{
public $productos = array();
function __construct($clase="zumo",$numero=5)
{
$this->incluir_productos($clase,$numero);
}
function __destruct()
{
unset($this->productos);
}
function incluir_productos($clase,$numero)
{
$this->productos[$clase]+=$numero;
}
function retirar_productos($clase,$numero)
{
if($this->productos[$clase] > $numero)
{
$this->productos[$clase]-=$numero;
return true;
} else
{
return false;
}
}
}
- 194 -
Curso de Iniciación a PHP: Unidad 3
- Más funciones del lenguaje PHP -
En este ejemplo definimos una clase llamada carro_compra. Está integrada por
una matriz ($productos), en cuyos elementos se guardan los productos, y dos
funciones para meter (incluir_productos) estos productos en el carro y
sacarlos (retirar_productos) del mismo. Observa que usamos también el
prefijo $this->, que es un puntero especial que nos permite citar cada
elemento de la matriz. Es una forma breve de sustituir el nombre de la clase.
En lugar de codificar la instrucción escribiendo carro_compra->productos
podemos escribir, de forma más breve, $this->productos.
function __construct($clase="zumo",$numero=5)
{
$this->incluir_productos($clase,$numero);
}
donde hacemos que, cada vez que se instancie la clase en un nuevo objeto,
nuestra compra del carro incluya 5 unidades del producto "zumo".
Sin embargo, a partir de PHP 5.3.3, los métodos con el mismo nombre que el
último elemento de una clase en un nombre de espacios no serán más tratados
como un constructor y serán una función más.
function carro_compra($clase,$numero)
{
$this->incluir_productos($clase,$numero);
}
Además, también opcionalmente, las clases pueden incluir una función especial
denominada destructor. Esta función se ejecuta automáticamente cada vez
que se destruye un objeto. Generalmente, se usa para llevar a cabo las
operaciones para liberar los recursos y las variables del objeto. Para que una
función de las creadas dentro de una clase se convierta en destructor, es
preciso que llame __destruct. En el ejemplo anterior el destructor es la función
- 195 -
Curso de Iniciación a PHP: Unidad 3
- Más funciones del lenguaje PHP -
function __destruct()
{
unset($this->productos);
}
Hemos dicho que las clases son como plantillas o diseños o proyectos,
colecciones de variables, propiedades y funciones que forman un conjunto.
Pero aún no existen como objetos reales. Para ello, hay que instanciar la clase,
es decir, concretarla en un objeto. Los objetos son, pues, instancias a una
clase, es decir, tipos de datos que asumen las variables, propiedades, atributos
y métodos de la clase a la que pertenecen. Cada objeto es único e
independiente de otro que pueda crearse como instancia de la misma clase.
En PHP se crea un objeto usando la palabra reservada new. Con esta sentencia
se asigna a una variable o clave las características de la clase que se instancia.
Por ejemplo, para crear un objeto de la carro_clase debemos escribir
- 196 -
Curso de Iniciación a PHP: Unidad 3
- Más funciones del lenguaje PHP -
En PHP todas las propiedades y métodos de la clase pueden ser vistos desde
fuera de la misma, siempre y cuando sean son públicos (ver apartado más
abajo sobre Ámbito de variables y funciones). Esto significa que podemos
acceder a ellos desde fuera de la clase citando directamente la propiedad o el
método precedidos del nombre del objeto y del signo apuntador ->. Por
ejemplo, podemos escribir lo siguiente:
// Creamos el objeto.
$mi_compra = new carro_compra;
Observa que los métodos de un objeto son llamados de la misma forma que las
funciones normales pasándoles, cuando los haya, los parámetros que
necesiten. Los métodos son funciones que pertenecen al objeto, por lo que es
preciso indicar el nombre del objeto al que pertenecen. Así pues, la forma de
llamar a un método es igual que la de llamar a una propiedad de un objeto.
Si los métodos devuelven algún valor, podemos asignarlo a una variable. Por
ejemplo, en lugar de mostrar el número de productos del objeto $mi_compra,
podíamos haberlo asignado a la variable $producto_cafe de esta forma:
$producto_cafe = $mi_compra->productos["café"];
Las variables definidas e incluso inicializadas con algún valor dentro de la clase
pueden usarse directamente dentro de la propia clase por las funciones
internas de la misma, sin necesidad de usar el signo ->. En este caso, tendrán
un ámbito exclusivamente local, no serán públicas.
Ejemplos
Ejemplo 1
<?
class suma
{
public $numero1=15;
public $numero2=23;
- 197 -
Curso de Iniciación a PHP: Unidad 3
- Más funciones del lenguaje PHP -
function opera()
{
echo $this->numero1+$this->numero2;
}
?>
Ejemplo 2
Veamos otro ejemplo parecido, pero algo más complejo, en el que se crean dos
objetos a partir de la misma clase y se amplía el número de métodos.
<?
class resta
{
public $diferencia;
function calcula($x,$y)
{
$this->diferencia=$x-$y;
}
function muestra()
{
- 198 -
Curso de Iniciación a PHP: Unidad 3
- Más funciones del lenguaje PHP -
echo $this->diferencia,"<br>";
}
$dife->muestra();
$dife1->muestra();
?>
En la segunda parte del código, fuera ya del código donde se crea la clase, se
crean dos objetos de la clase anterior: $dife y $dife1. Además, se usan los
métodos de la misma, enviando en el primero de éstos los operandos con los
que deben realizarse las operaciones de la resta.
Ejemplo 3
<?
class producto
{
public $resul=array();
public $i=0;
function opera($v,$s)
{
$this->resul[$this->i]=$v*$s;
$this->i++;
}
function muestra()
{
foreach($this->resul as $numero)
{
echo $numero,"<br>";
}
- 199 -
Curso de Iniciación a PHP: Unidad 3
- Más funciones del lenguaje PHP -
}
}
?>
Ten en cuenta que, si llamamos varias veces a una función del mismo objeto,
los resultados de la última llamada se sobrescriben sobre los de la llamada
anterior. Si queremos, pues, conservar la información anterior, será preciso
crear varios objetos o bien usar una matriz, como hemos hecho en el ejemplo
último.
Ejemplo 4
<?
class varios
{
public $valor_inicial=20;
public $numero_1=array();
public $numero_2=array();
public $suma=array();
public $resta=array();
public $producto=array();
public $division=array();
public $control=0;
- 200 -
Curso de Iniciación a PHP: Unidad 3
- Más funciones del lenguaje PHP -
$this->producto[$a]=$valor_1*$valor_2;
$this->division[$a]=$this->valor_inicial*$valor_1/$valor_2;
function muestra()
{
echo "<table align=center border=1>";
echo "<td>Número 1</td><td>Número 2</td><td>Suma</td>";
echo "<td>Resta</td><td>Multiplicación</td>
<td>División</td><tr>";
foreach($this->numero_1 as $indice=>$valor)
{
$n2=$this->numero_2[$indice];
$s=$this->suma[$indice];
$r=$this->resta[$indice];
$p=$this->producto[$indice];
$d=$this->division[$indice];
echo "<td align=center>$valor</td>";
echo "<td align=center>$n2</td>";
echo "<td align=center>$s</td>";
echo "<td align=center>$r</td>";
echo "<td align=center>$p</td>";
echo "<td align=center>$d</td><tr>";
}
echo "</table>";
}
}
$calculos->muestra($i,$j);
?>
Otros ejemplos
<?
- 201 -
Curso de Iniciación a PHP: Unidad 3
- Más funciones del lenguaje PHP -
class vehiculo
{
// Propiedades.
public $velocidad, $color, $gama;
// Constructor: asignación de velocidad inicial,
// color y gama.
function __construct()
{
$this->velocidad = 0;
$this->color = "blanco";
$this->gama = "alta";
}
?>
La herencia
PHP puede crear clases extendidas, es decir, clases que pueden heredar las
propiedades (variables) y métodos (funciones) de la clase original, a la vez que
pueden tener otras propiedades y métodos propios. Esta posibilidad recibe en
la POO el nombre de herencia. Así pues, se pueden crear nuevas clases
basadas en otra anterior, cuyas propiedades y métodos son recogidos en la
nueva sin necesidad de repetir todo el código.
- 202 -
Curso de Iniciación a PHP: Unidad 3
- Más funciones del lenguaje PHP -
A partir de ahora la clase camion tendrá las mismas propiedades y métodos que
vehiculo, además de los propios.
Ejemplo
<?
class vehiculo
{
// Propiedades.
public $velocidad, $color, $gama;
// Constructor: asignación de velocidad inicial,
// color y gama.
function __construct()
{
$this->velocidad = 0;
$this->color = "blanco";
$this->gama = "alta";
}
- 203 -
Curso de Iniciación a PHP: Unidad 3
- Más funciones del lenguaje PHP -
function __construct()
{
// Es necesario invocar el constructor de la clase padre ya
// que PHP no lo hace automáticamente
parent::__construct()
$this->peso_max=1000;
}
function ver_datos()
{
echo "Los datos del camión son: <BR>".
"velocidad: <b>". $this->velocidad . "</b><BR>"
"color: <b>". $this->color . "</b><BR>"
"gama: <b>". $this->gama . "</b><BR>"
"peso máx: <b>". $this->peso_max . "</b><BR>";
}
?>
Como puedes ver, la clase camion recibe de la clase original vehiculo las
propiedades que tiene ($velocidad, $color y $gama). Por su parte incorpora al
diseño de la clase original otra propiedad (variable $peso_max) y una nueva
función, que es su constructor, llamado en esta caso ver_datos().
Algunos lenguajes POO permiten la herencia múltiple, esto significa que una
subclase puede heredar de varias clases padres. PHP no permite esto y una
subclase solo puede heredar de una clase padre, sin embargo en PHP no hay
ningún tipo de restricción en cuanto al número de subclases que pueden
heredar de una misma clase padre o superclase.
- 204 -
Curso de Iniciación a PHP: Unidad 3
- Más funciones del lenguaje PHP -
Polimorfismo en PHP 5
class coche {
function avanza() {
}
function para() {
}
function girar_derecha() {
}
}
class ciclomotor {
function avanza() {
}
function para() {
}
function girar_derecha() {
}
}
class movimiento {
function mover_adelante($obj) {
$obj->avanza();
}
}
- 205 -
Curso de Iniciación a PHP: Unidad 3
- Más funciones del lenguaje PHP -
Como podemos ver el mismo método del objeto movimiento actúa de dos
formas diferentes dependiendo del objeto que le pasamos como parámetro.
<?
function imprimir_variables()
{
echo $this->variable_publica;
echo $this->variable_protegida;
echo $this->variable_privada;
}
}
- 206 -
Curso de Iniciación a PHP: Unidad 3
- Más funciones del lenguaje PHP -
function imprimir_variables()
{
echo $this->variable_publica;
echo $this->variable_protegida;
echo $this->variable_privada;
}
}
?>
<?
- 207 -
Curso de Iniciación a PHP: Unidad 3
- Más funciones del lenguaje PHP -
?>
PHP tiene ya diseñadas algunas funciones útiles para trabajar con clases y
objetos. Son las siguientes:
- 208 -
Curso de Iniciación a PHP: Unidad 3
- Más funciones del lenguaje PHP -
En PHP también es posible llamar a una función definida dentro de una clase
sin que sea necesario crear previamente un objeto. Para ello, hay que usar el
símbolo :: de la forma siguiente:
clase :: funcion
<?
class X
{
public static function mensaje()
{
echo "Esta función muestra un texto<br>";
}
}
?>
Fíjate que hemos usado la palabra reservada static antes de function dentro
de la clase. Declarar variables o funciones de clases como estáticos, los hace
accesibles desde afuera del contexto del objeto sin necesidad de crear el
objeto previamente. Debido a que los métodos estáticos son accesibles sin que
se haya creado una instancia del objeto, la pseudo variable $this no está
disponible dentro de los métodos declarados como estáticos.
- 209 -
Curso de Iniciación a PHP: Unidad 3
- Más funciones del lenguaje PHP -
- 210 -
Curso de Iniciación a PHP: Unidad 3
- Más funciones del lenguaje PHP -
Resumen
- 211 -
Curso de Iniciación a PHP: Unidad 3
- Más funciones del lenguaje PHP -
- 212 -
MÓDULO 2
Unidad 4
Índice de la unidad:
7. Resumen
Curso de Iniciación a PHP: Unidad 4
- Operaciones con ficheros y directorios -
Introducción
En esta Unidad vamos a aprender a abrir y a cerrar ficheros, así como
saber mostrar su contenido.
- 215 -
Curso de Iniciación a PHP: Unidad 4
- Operaciones con ficheros y directorios -
Su sintaxis es la siguiente:
if (chdir($directorio_trabajo))
echo "El directorio \"$directorio_trabajo\" existe y ha quedado
fijado como actual.</TD></TR>";
else
die ("El directorio \"$directorio_trabajo\" no existe y no se
ha podido fijar como actual. NO SE CONTINUA LA
EJECUCUION.</TD></TR>");
Abrir un fichero
1. Abrir el fichero.
3. Cerrar el fichero.
- 216 -
Curso de Iniciación a PHP: Unidad 4
- Operaciones con ficheros y directorios -
En el primer caso esta función devuelve True; en el segundo, False. Por ello,
conviene incluir también esta función dentro de una estructura condicional que
nos informe de la apertura o no del fichero especificado.
Ésta es su sintaxis:
donde
'r' - Abre el fichero para sólo lectura; sitúa el puntero del fichero al
comienzo del mismo.
'r+' - Abre el fichero para lectura y escritura; sitúa el puntero del fichero
al comienzo del fichero.
'w' - Abre el fichero para sólo escritura; sitúa el puntero del fichero al
comienzo del fichero y trunca el fichero con longitud cero. Si el fichero no
existe, trata de crearlo.
'w+' - Abre el fichero para lectura y escritura; sitúa el puntero del fichero
al comienzo del mismo y trunca el fichero con longitud cero. Si el fichero
no existe, trata de crearlo.
'a' - Abre el fichero sólo para escribir (añadir); sitúa el puntero del fichero
al final del mismo. Si el fichero no existe, trata de crearlo.
'a+' - Abre el fichero para lectura y escritura (añadiendo); sitúa el puntero
del fichero al final del mismo. Si el fichero no existe, trata de crearlo.
Veamos un ejemplo:
if (fopen("Ficheros_1.php","r"))
echo "<B>El fichero \"Ficheros_1.php\" existe
- 217 -
Curso de Iniciación a PHP: Unidad 4
- Operaciones con ficheros y directorios -
y ha quedado abierto.</B>";
else
echo "<B>El fichero \"Ficheros_1.php\" no existe.</B>";
Conviene observar que, al igual que ocurre con las matrices, en los ficheros
también hay un puntero o apuntador que señala una de las posiciones del
fichero.
@fopen("Fichero_1.php","r") or
die("<B>El fichero \"Fichero_1.php\" no se ha podido abrir.</B><P>");
$fichero1="Ficheros_1.php";
$id_fichero1=@fopen($fichero1,"r")
or die("<B>El fichero \"Fichero_1.php\" no se
ha podido abrir.</B><P>");
echo "<B>El fichero \"Ficheros_1.php\" existe y ha quedado
abierto en modo lectura.</B><P>";
- 218 -
Curso de Iniciación a PHP: Unidad 4
- Operaciones con ficheros y directorios -
$fichero2="Ficheros_2.txt";
$id_fichero2=@fopen($fichero2,"w");
$fichero3="Ficheros_3.txt";
$id_fichero3=@fopen($fichero3,"a");
Cerrar un fichero
Todo fichero que ha sido abierto debe ser cerrado una vez que se ha acabado
de realizar con él las operaciones previstas.
fclose(nombre de identificador);
- 219 -
Curso de Iniciación a PHP: Unidad 4
- Operaciones con ficheros y directorios -
En este programa se incluyen los ejemplos cuyo código hemos ido escribiendo
junto a las funciones explicadas.
- 220 -
Curso de Iniciación a PHP: Unidad 4
- Operaciones con ficheros y directorios -
Recorrer un fichero
Su sintaxis es la siguiente:
La función ftell() se utiliza para conocer en qué posición del fichero está el
puntero. Tiene esta sintaxis:
- 221 -
Curso de Iniciación a PHP: Unidad 4
- Operaciones con ficheros y directorios -
fseek("Ficheros_1.php",ftell("Ficheros_1.php")+10);
Esta función es muy útil para leer uno a uno o línea a línea todos los
caracteres de un fichero usando un bucle while (!feof()), como estudiaremos
más adelante.
Hasta ahora sólo hemos accedido a un fichero y nos hemos movido por sus
caracteres, posiciones o bytes, pero en ningún momento hemos visto o
modificado su contenido. Veamos ahora cómo podemos leer un fichero.
La función fread() se utiliza para leer una cadena de un fichero abierto. Tiene
esta sintaxis:
- 222 -
Curso de Iniciación a PHP: Unidad 4
- Operaciones con ficheros y directorios -
Con esta función incluida dentro de un bucle podemos leer línea a línea un
fichero de esta forma:
rewind("Ficheros_3.txt");
while (!feof("Ficheros_3.txt"))
{
$linea=fgets("Ficheros_3.txt",256);
echo "<B>$linea </B><P>";
}
Usando esta función dentro de un bucle que recorra desde la primera posición
hasta la marca de final de fichero puede mostrarse el contenido completo de
éste.
- 223 -
Curso de Iniciación a PHP: Unidad 4
- Operaciones con ficheros y directorios -
$matriz=file("Ficheros_3.txt");
for ($i=0;$i<count($matriz);$i++)
{
print ("<B> Elemento $i:</B> $matriz[$i]<P>");
}
En este programa se incluyen los ejemplos cuyo código hemos ido escribiendo
junto a las funciones explicadas.
- 224 -
Curso de Iniciación a PHP: Unidad 4
- Operaciones con ficheros y directorios -
Su sintaxis es la siguiente:
En este programa se incluyen los ejemplos cuyo código hemos ido escribiendo
junto a las funciones explicadas y otros nuevos.
- 225 -
Curso de Iniciación a PHP: Unidad 4
- Operaciones con ficheros y directorios -
Copiar un fichero
La función copy() sirve para hacer una copia física de un fichero en otro. Para
poder realizar esta operación, el fichero original no debe estar abierto. Esta
función devuelve el valor lógico True si se ha podido realizar la operación sin
problemas o False si no se ha podido.
Su sintaxis es la siguiente:
Su sintaxis es la siguiente:
- 226 -
Curso de Iniciación a PHP: Unidad 4
- Operaciones con ficheros y directorios -
Su sintaxis es la siguiente:
Las tres operaciones que hemos explicado antes sólo pueden ejecutarse si el
fichero, caso de que exista, tiene el atributo de sólo lectura en estado de False.
Además, es preciso saber otras cosas para poder tratar un fichero, como si
existe o no, si el nombre indicado es un de un fichero o de un directorio y el tipo
de fichero que es. Todo esto lo vamos a ver en este apartado.
- 227 -
Curso de Iniciación a PHP: Unidad 4
- Operaciones con ficheros y directorios -
En este programa se incluyen los ejemplos cuyo código hemos ido escribiendo
junto a las funciones explicadas y otros nuevos.
- 228 -
Curso de Iniciación a PHP: Unidad 4
- Operaciones con ficheros y directorios -
Abrir un directorio
Su sintaxis es la siguiente:
$id_dircurso=opendir("cursoPHP5");
$id_dircurso= @opendir($_SERVER['DOCUMENT_ROOT']."/curso/")
or die("<B>El directorio \"/curso/\" no se ha podido
abrir.</B><P>");
- 229 -
Curso de Iniciación a PHP: Unidad 4
- Operaciones con ficheros y directorios -
PHP dispone también de una clase que nos permite acceder y tratar los
directorios. Es la clase dir(). Para abrir un directorio funciona igual que
opendir(). Además, tiene dos propiedades, que son handle (puntero) y path
(camino), y tres métodos, que son read() (leer el nombre de un fichero o
subdirectorio), rewind() (llevar el puntero al principio de directorio) y close()
(cerrar el directorio). Dentro de esta clase pueden usarse, además, las
funciones estándar de manejo de directorios. En la Unidad anterior se explican
las clases, donde el alumno puede repasar estos contenidos, si lo necesita.
Cerrar un directorio
Su sintaxis es la siguiente:
Leer un directorio
Su sintaxis es la siguiente:
Esta función lee el nombre del fichero o directorio sobre el que esté el puntero
y avanza éste al siguiente. Lo normal es usar esta función dentro de un bucle
que vaya leyendo uno a uno los elementos (ficheros o subdirectorios) del
directorio.
$id_dircurso= @opendir($_SERVER['DOCUMENT_ROOT']."/curso/")
or die("<B>El directorio \"/curso/\" no se ha podido
abrir.</B><P>");
$directorio = dir($directorio_trabajo);
// Aquí creamos un objeto de la clase dir().
echo "Puntero: <B>".$directorio->handle."</B><P>";echo "Camino:
<B>".$directorio->path."</B><P>";
while($fichero=$directorio->read())
{
echo "$fichero<P>";
}
$directorio->close();
- 230 -
Curso de Iniciación a PHP: Unidad 4
- Operaciones con ficheros y directorios -
Crear un directorio
En UNIX hay que poner un segundo parámetro (número entero en base octal),
que indica el modo o permisos de creación. No es el caso de este curso. En
Windows debemos poner 0 en este parámetro.
$nuevo_dir="Pruebas";
mkdir($nuevo_dir,0);
crean el directorio “Pruebas” dentro del directorio del proyecto PHP. Desde
Eclipse PDT, con la tecla F5 para actualizar el proyecto, puede comprobarse
que realmente se ha creado.
Si el directorio ya existe, se produce un error. Por eso, al igual que ocurre con
los ficheros, conviene comprobar con la función file_exists() si ya existe,
para no intentar crearlo en este caso.
Borrar un directorio
- 231 -
Curso de Iniciación a PHP: Unidad 4
- Operaciones con ficheros y directorios -
$directorio="Pruebas";
rmdir($nuevo_dir);
$directorio="Pruebas";
if (file_exists($directorio)) @rmdir($directorio)
or die("<B>El directorio \"Pruebas\" no se ha podido borrar
al no estar vacío.</B><P>");
Si el problema consiste en que no está vacío, hay que eliminar todos los
ficheros con la función unlink() antes de intentar borrar el directorio.
Con PHP el cliente de una página web también puede subir ficheros al servidor
desde su ordenador, es decir, se puede convertir en emisor de información.
- 232 -
Curso de Iniciación a PHP: Unidad 4
- Operaciones con ficheros y directorios -
Vamos a estudiar los pasos que se dan cuando se sube un fichero al servidor:
<?
include "uni4_eje6_configura.php";
echo "<FORM ENCTYPE=multipart/form-data METHOD=post ACTION=$destino>
Nombre del fichero: <INPUT TYPE=File NAME=fichero SIZE=35>
<INPUT TYPE='hidden' name='MAX_FILE_SIZE' VALUE='51200'>
<INPUT TYPE=submit NAME=submit VALUE=Subir_al_Servidor>";
?>
En primer lugar, se usa la orden include para acceder a los datos de un fichero
de configuración (uni4_eje6_configura.php) donde hemos definido e
inicializado algunas variables que usaremos luego en este script, como
$destino, en la que se guarda el nombre del script que debe ejecutarse para
subir el fichero elegido al servidor ("uni4_eje6_sube.php") y otras que se usan
también en este último fichero, como $directorio, que es el destino del fichero
que se sube o $fr_repetida, donde se guarda la frase que se muestra al
usuario si el fichero no se ha podido subir por haber uno ya en el servidor con
el mismo nombre.
2. Recepción de
fichero en el servidor. Al ejecutarse el script
uni4_eje6_sube.php, el servidor recibe este fichero en un directorio temporal,
especificado en la variable de entorno upload_tmp_dir. En nuestro caso, este
directorio es C:\xampp\tmp. Al fichero se le pone un nombre que se inicia por
- 233 -
Curso de Iniciación a PHP: Unidad 4
- Operaciones con ficheros y directorios -
$fichero_destino="$directorio".$_FILES['fichero']['name'];
move_uploaded_file($_FILES['fichero']['tmp_name'], $fichero_destino);
if ($_FILES['fichero']['size']>51200 or $_FILES['fichero']['size']<1)
{
die ("<B>El fichero ocupa más de 51.200 bytes o no ha indicado
su nombre en el formulario. No puede copiarse.</B>");
}
if ($subir_cualquiera=="SI")
{
$fichero_destino="$directorio".$_FILES['fichero']['name'];
move_uploaded_file($_FILES['fichero']['tmp_name'],
$fichero_destino);
}
- 234 -
Curso de Iniciación a PHP: Unidad 4
- Operaciones con ficheros y directorios -
unlink($_FILES['fichero']['tmp_name']);
- 235 -
Curso de Iniciación a PHP: Unidad 4
- Operaciones con ficheros y directorios -
Resulta muy cómo seleccionar uno entre varios ficheros si en una etiqueta
SELECT de HTML pueden incluirse todos los ficheros del directorio o sólo
algunos, según su tipo. En el código siguiente puede verse cómo se hace:
while ($fichero)
{
$fichero=readdir($puntero);
if (ereg("$",$fichero))
$origen_html=fopen("uni4_eje7_fichero.html","r");
$destino_txt=fopen("uni4_eje7_fichero.txt","w")
or die ("No se puede crear el fichero destino.");
while (!feof($origen_html))
{
$linea=fgetss($origen_html,256,"");
echo "$linea <P>";
fputs($destino_txt,trim($linea)."\n");
}
- 236 -
Curso de Iniciación a PHP: Unidad 4
- Operaciones con ficheros y directorios -
En este programa se incluyen los ejemplos cuyo código hemos ido escribiendo
junto a las funciones explicadas en este apartado.
Permisos y propietarios
- 237 -
Curso de Iniciación a PHP: Unidad 4
- Operaciones con ficheros y directorios -
Resumen
- 238 -
Curso de Iniciación a PHP: Unidad 4
- Operaciones con ficheros y directorios -
file_exists().
- 239 -
Curso de Iniciación a PHP: Unidad 4
- Operaciones con ficheros y directorios -
- 240 -
MÓDULO 2
Unidad 5
Índice de la unidad:
1. Cookies
2. Cabeceras
4. Gestión de sesiones
5. Control de conexiones
6. Resumen
Curso de Iniciación a PHP: Unidad 5
- Gestión Usuarios y sesiones -
Introducción
En esta Unidad vamos a conocer qué son las cookies, para qué se usan y
sus limitaciones. Además, distinguiremos los elementos que integran las
cookies, las crearemos, modificaremos y las borraremos.
Aprenderemos qué son las sesiones de usuario, para qué se usan y cómo se
gestionan.
Las cookies
El sistema de trabajo basado en la comunicación entre cliente y servidor web a
través de Internet puede realizarse sin que sea necesario que el primero, que
hace una solicitud al segundo y recibe de él información, necesite identificarse.
Así lo hemos hecho hasta ahora en los ejercicios de las Unidades anteriores,
más por motivos didácticos que técnicos.
Concepto de cookie
- 243 -
Curso de Iniciación a PHP: Unidad 5
- Gestión Usuarios y sesiones -
Las cookies son usadas con bastante frecuencia por las web que necesitan
llevar un control de los usuarios que las visitan y las consultas que hacen,
sobre todo las que se dedican al comercio electrónico, que almacenan en ellas
los códigos de los productos que consultan, para poder recuperarlos
directamente de este fichero si el cliente vuelve a visitarlas.
Casi todos los navegadores, como Firefox, Chrome o Internet Explorer, sólo
admiten un número máximo de cookies en total (unas 300 dependiendo del tipo
de navegador y sin cumple la directiva de estándar RFC 2109). Además, el
tamaño máximo por cookie es de 4 Kb (4.096 bytes), por lo cual no hay que
tener miedo de que saturen la capacidad del disco duro.
1. Nombre de la cookie.
5. Ruta: por defecto es “/”, es decir, el directorio raíz de las páginas a las que
se devuelve la cookie.
- 244 -
Curso de Iniciación a PHP: Unidad 5
- Gestión Usuarios y sesiones -
Hay que tener en cuenta que, cuando se crea una cookie, es enviada al
cliente, por lo cual no se puede ver hasta que se carga de nuevo la
página. Si se han incluido en el mismo script las dos operaciones (crear cookie
y ver su contenido), debe ejecutarse la página dos veces para que se muestre
el valor que tenga en la segunda carga.
- 245 -
Curso de Iniciación a PHP: Unidad 5
- Gestión Usuarios y sesiones -
<?php
// La sentencia siguiente es incorrecta
print "<p>Hola mundo</p>\n";
setcookie("frase", "Adios");
?>
<p>Hola mundo</p>
Warning: Cannot modify header information – headers already sent by
(output started at index.php on line 2) in index.php on line 3
Hay que tener en cuenta que unas líneas en blanco al principio del fichero PHP
(antes de la etiqueta <?PHP) también se considera contenido de la página web
y aparecerá el error anteriormente mostrado.
$usuario="Jorge";
setcookie("Nombre", $usuario);
crea una cookie denominada nombre que contiene el valor “Jorge”. También
podíamos haber escrito más directamente
setcookie("Nombre","Jorge");
$pieza="Tornillo";
- 246 -
Curso de Iniciación a PHP: Unidad 5
- Gestión Usuarios y sesiones -
Al crearse la cookie anterior se crea a la vez una variable, que tiene como
nombre el nombre de la cookie ($_COOKIE["Nombre"]) y como contenido su
valor ("Jorge"). Esta variable permanece con un ámbito global hasta que
caduque la cookie.
Las variables que contienen cookies son almacenadas por PHP en un array
denominado $_COOKIE["nombre de la variable"]. De esta forma podemos
leer y mostrar cada cookie si conocemos su nombre:
<?
if ( (isset($_POST["accion"])) && ($_POST["accion"]=="crearcookie") )
{
setcookie("usuario",$_POST["tu_nombre"],time()+60);
echo "Hola, ".$_POST["tu_nombre"].". Bienvenido a nuestra
página web. ¡Actualiza la página para ver
los datos de la cookie almacenada!<P>";
if (isset($_COOKIE["usuario"]) and $_COOKIE["usuario"]!="")
print ("La cookie <B>usuario</B> tiene el valor
<B>".$_COOKIE["usuario"]."</B><P>");
}
else
?>
- 247 -
Curso de Iniciación a PHP: Unidad 5
- Gestión Usuarios y sesiones -
Como hemos visto, a las cookies se les puede poner limitaciones de tiempo
(parámetro expire de caducidad), de camino dentro del cual pueden ser vistas
- 248 -
Curso de Iniciación a PHP: Unidad 5
- Gestión Usuarios y sesiones -
También podemos asignar varios valores a una misma cookie. Esto es útil y
necesario para no alcanzar el límite de cookies permitido por el navegador del
usuario. Para hacerlo, usamos una matriz que tenga tantos elementos como
valores queramos que contenga la misma cookie. Podemos crearla así:
setcookie("Libro[0]","El médico",time()+300);
setcookie("Libro[1]","Noah Gordon",time()+300);
setcookie("Libro[2]","1992",time()+300);
Si ejecutas este programa puedes ver una página que, mediante una cookie de
tipo matriz, muestra las últimas visitas que ha realizado el visitante a la página
en orden cronológico y permite eliminar las cookies almacenadas en el
navegador:
- 249 -
Curso de Iniciación a PHP: Unidad 5
- Gestión Usuarios y sesiones -
Las cabeceras contienen diversos datos, unos para ofrecer información y otros
para que la página se muestre con determinadas características. Por ejemplo,
pueden incluir textos que deben aparecer, claves para que los buscadores
puedan encontrarlas, información sobre los créditos de la aplicación, control de
la memoria caché de navegador, especificación del tiempo de refresco de la
página, etcétera. En la Cabecera reside información acerca del documento y,
generalmente, el usuario no aprecia su contenido cuando navega en Internet.
Es importante recordar que estos elementos son opcionales, es decir, no son
obligatorios o necesarios para la realización de una página web.
PHP dispone de la función header() para enviar cabeceras HTTP desde este
lenguaje. Su sintaxis es sencilla:
Al igual que pasa con setcookie(), para que funcione correctamente, hay
que poner esta instrucción al principio del script, antes de que se envíe
ninguna salida al navegador del cliente.
- 250 -
Curso de Iniciación a PHP: Unidad 5
- Gestión Usuarios y sesiones -
La instrucción
header("Content-Type: text/html");
- 251 -
Curso de Iniciación a PHP: Unidad 5
- Gestión Usuarios y sesiones -
- 252 -
Curso de Iniciación a PHP: Unidad 5
- Gestión Usuarios y sesiones -
Como puede ocurrir que ninguna de las dos variables de entorno citadas
($_SERVER['PHP_AUTH_USER'] y $_SERVER['PHP_AUTH_PW']) esté definida porque
el usuario todavía no se ha validado, conviene utilizar el control condicional if
(!isset( $_SERVER['PHP_AUTH_USER'])) para prevenir posibles errores.
- 253 -
Curso de Iniciación a PHP: Unidad 5
- Gestión Usuarios y sesiones -
- 254 -
Curso de Iniciación a PHP: Unidad 5
- Gestión Usuarios y sesiones -
Para configurar el servidor Apache para que sea capaz de autenticar a los
usuarios y verificar la autorización del mismo al recurso solicitado, es necesario
realizar las siguientes operaciones:
C:\xampp\apache\bin>htpasswd -c C:\xampp\apache\conf\usuarios
admin
New password: *****
Re-type new password: *****
Adding password for user admin
- 255 -
Curso de Iniciación a PHP: Unidad 5
- Gestión Usuarios y sesiones -
El parámetro -c se indica que se debe crear un fichero nuevo, por lo que sólo
se deberá poner la primera vez que se crea el fichero. En este caso hemos
almacenado el nuevo usuario “admin” en el directorio “conf” del servidor Web.
Para acceder al nuevo fichero de usuarios creado, abrimos el Panel de control
de XAMPP y pulsamos en la opción mostrada en la siguiente captura de
pantalla:
- 256 -
Curso de Iniciación a PHP: Unidad 5
- Gestión Usuarios y sesiones -
admin:$apr1$IvxgJjXC$TLlxWN/GZhyGJ7Q2odIcd/
- 257 -
Curso de Iniciación a PHP: Unidad 5
- Gestión Usuarios y sesiones -
AuthType Basic
AuthName "Curso PHP 5"
AuthBasicProvider file
AuthUserFile C:\xampp\apache\conf\usuarios
Require valid-user
- 258 -
Curso de Iniciación a PHP: Unidad 5
- Gestión Usuarios y sesiones -
Gestión de sesiones
La gestión de las sesiones de usuario facilita considerablemente el trabajo del
desarrollador de una aplicación web para controlar la navegación del usuario
por las páginas del servidor.
session.save_path = "C:\xampp\tmp"
Hay dos maneras de propagar el id del usuario entre las diferentes páginas :
Mediante Cookies.
A través de Parámetros URL.
- 259 -
Curso de Iniciación a PHP: Unidad 5
- Gestión Usuarios y sesiones -
Utilización de la sesión
Una vez está establecida la sesión, las páginas solicitadas por el mismo
navegador pueden guardar y recuperar información del servidor usando
el identificador de usuario. Esta información se guarda hasta que el
usuario o el servidor destruyen la sesión.
session_start();
IMPORTANTE: de igual forma que ocurre con las cookies, hay que tener la
precaución de utilizar la función session_start() antes de empezar a escribir
el contenido de la página, ya que si no PHP mostrará un mensaje de aviso y no
se creará la sesión. Como hemos comentado, el identificador de la sesión se
utiliza en las cabeceras de respuesta HTTP (como Cookie o como parámetro
GET) y las cabeceras se envían antes del texto de la página.
Todas las páginas que quieran gestionar sesiones de usuario deben incorporar
esta función o bien se puede establecer en el fichero php.ini dentro de la
variable session.autostart=1 para no tener que incluir esta sentencia en los
scripts php.
Una vez ejecutada esta función, se crea una cookie en el ordenador del usuario
o se lee la almacenada. Además, se guarda la información de la sesión en un
- 260 -
Curso de Iniciación a PHP: Unidad 5
- Gestión Usuarios y sesiones -
print(session_name());
y las instrucciones
session_name("Mi_sesión");
print(session_name());
devuelve Mi_sesión.
session_save_path("C:/XAMPP/htdocs/curso/tmp/");
print(session_save_path());
print(session_id());
- 261 -
Curso de Iniciación a PHP: Unidad 5
- Gestión Usuarios y sesiones -
y las instrucciones
print(session_id());
Todos los datos devueltos por las funciones anteriores sólo permiten crear
sesiones, destruirlas e identificarlas. Pero lo verdaderamente importante es
poder asociar información sobre las operaciones y desplazamientos de un
cliente por una aplicación web. En este apartado vamos a estudiar las
funciones que permiten guardar esta información y acceder a ella
posteriormente.
<?php
session_start();
$_SESSION["usuario"]="Ana";
$_SESSION["hora"]=time();
$_SESSION["pagina"]="$_SERVER["PHP_SELF"];
if (empty($_SESSION["contador"])) {$_SESSION["contador"]=0;}
$_SESSION["contador"]++;
?>
- 262 -
Curso de Iniciación a PHP: Unidad 5
- Gestión Usuarios y sesiones -
<?php
session_start();
$_SESSION["nombre"] = "Pedro Pablo";
if (isset($_SESSION["nombre"])) {
print "<p>Su nombre es $_SESSION[nombre].</p>\n";
} else {
print "<p>Nombre desconocido.</p>\n";
}
unset($_SESSION["nombre"]);
if (isset($_SESSION["nombre"])) {
print "<p>Su nombre es $_SESSION[nombre].</p>\n";
} else {
print "<p>Nombre desconocido.</p>\n";
}
?>
<p>Nombre desconocido.</p>
- 263 -
Curso de Iniciación a PHP: Unidad 5
- Gestión Usuarios y sesiones -
session_destroy();
También produce los mismos efectos la sintaxis que incluye como argumento el
identificador de la sesión session_destroy($session_id); e incluso
session_destroy("La sesión del curso");
En este programa se incluyen los ejemplos cuyo código hemos ido escribiendo
junto a las funciones explicadas. Es muy importante que lo estudies en
detenimiento para completar el aprendizaje de este apartado.
- 264 -
Curso de Iniciación a PHP: Unidad 5
- Gestión Usuarios y sesiones -
- 265 -
Curso de Iniciación a PHP: Unidad 5
- Gestión Usuarios y sesiones -
Control de conexiones
Mientras un usuario está conectado al servidor nos puede interesar conocer las
acciones que realiza e incluso manejar sus decisiones, como la orden de
cancelar la carga de la página. PHP dispone de funciones para conocer y
controlar, hasta cierto punto, las conexiones de los clientes al servidor. En este
apartado vamos a tratar brevemente de este asunto.
Puede ocurrir que sea necesario también hacer que termine la conexión de un
usuario, por ejemplo, cuando no se ha validado correctamente o su consulta
persistente no obtiene resultados.
connection_aborted();
- 266 -
Curso de Iniciación a PHP: Unidad 5
- Gestión Usuarios y sesiones -
La página solicitada se creó utilizando la información que envió en un formulario. Esta página
no está ya disponible. Como medida de precaución, Internet Explorer no volverá a enviarle la
información.
Para volver a enviar la información y ver esta página Web haga clic en el botón Actualizar.
- 267 -
Curso de Iniciación a PHP: Unidad 5
- Gestión Usuarios y sesiones -
La función die() hace lo mismo que exit(), pero permite mostrar un mensaje
de texto entre comillas dentro de los paréntesis. La interpretación del código
PHP se interrumpe cuando se encuentra esta orden y se muestra la cadena de
texto que se pone como argumento. Ya la hemos usado también en diferentes
script.
En este programa se incluyen los ejemplos cuyo código hemos ido escribiendo
junto a las funciones explicadas.
- 268 -
Curso de Iniciación a PHP: Unidad 5
- Gestión Usuarios y sesiones -
Sin embargo, si dejamos que se ejecute la página hasta que termine su carga
en el navegador veremos que aparece al final de esta página aparece la
palabra “FIN”:
- 269 -
Curso de Iniciación a PHP: Unidad 5
- Gestión Usuarios y sesiones -
- 270 -
Curso de Iniciación a PHP: Unidad 5
- Gestión Usuarios y sesiones -
- 271 -
Curso de Iniciación a PHP: Unidad 5
- Gestión Usuarios y sesiones -
Resumen
Revalidar usuarios.
- 272 -
Curso de Iniciación a PHP: Unidad 5
- Gestión Usuarios y sesiones -
- 273 -
Curso de Iniciación a PHP: Unidad 5
- Gestión Usuarios y sesiones -
- 274 -