Está en la página 1de 209

PHP NURIA

Antes de nada, vamos a ver qué ocurre cuando un usuario solicita una página PHP a un servidor.
El proceso se inicia cuando el usuario introduce la dirección (URL) de la página PHP.
Aunque estas páginas puedan tener varias extensiones la más frecuente es .php

Una vez que la página llega al servidor, este la estudia y ve que se trata de una página web dinámica (PHP) y no
estática (HTML), por tanto este servidor le pasará la página a un intérprete php el cual la tratará y se la
devolverá al servidor.
Por tanto quien ejecuta el código PHP es en realidad el intérprete instalado en el servidor web.
Cuando el servidor web dispone de la página, la envía al usuario, pero no en PHP sino como HTML (estática) sin
código php.
La ventaja de este concepto es que varios usuarios que piden la misma página pueden obtener un resultado
distinto, dependiendo de quien la haya solicitado.

Veamos un ejemplo. Observe el código correspondiente a la página obtenida en el navegador tras solicitar la
página http://servidorweb/saludo.php(donde servidorweb es el nombre de nuestro equipo, por lo que también
podríamos haber utilizado localhost).

Y este es el mismo código de saludo.php situado en el servidor Apache:


Como podemos ver, el código fuente de la página que recibimos no s el mismo que el que ejecuta el servidor
Apache.

¡Pruebe a ejecutar este código a otras horas! Y verá como la página que se le envía al usuario cada vez es
distinta.

Crear Un Alias En Apache

Cuando instalamos Apache, esté nos crea una carpeta donde podemos albergar nuestras páginas PHP.

Este sitio se conoce como la raíz de los documentos, y por defecto tiene el nombre de htdocs.
Solo tenemos que buscarla en la carpeta inmediatamente superior de donde hayamos instalado Apache. Por
defecto C:\apachefriends\xampp.

En cualquier caso si quisiéramos albergar estas páginas web en otra carpeta podríamos hacerlo mediante el
archivo de configuración del Apache httpd.conf.

Este archivo también se encuentra en la carpeta en la que instaló apache.

Dentro de este archivo, la ubicación de la raíz de documentos se indica en el parámetro DocumentRoot.

Como ve, está configurado por defecto a la carpeta apachefriends/xampp.

Esto quiere decir que cualquier página que pongamos en esta carpeta estará a disposición de los usuarios a
través de http://localhost o http://nombreservidor.
Por tanto si creáramos una carpeta llamada pruebas en Htdocs, podríamos acceder a ella mediante
http://localhost/pruebas.

Pero, ¿qué pasa si quisiéramos albergar nuestras páginas en otra carpeta? Pues solo tendríamos que crear un
alias dentro del archivo de configuración.

Observe esta imagen:

Solo habría que añadir esto al archivo de configuración y lo que hará Apache será lo siguiente:
Después de la palabra Alias ponemos el nombre que queramos para entrar a las páginas, y a continuación la ruta
donde están albergadas.

La demás información es necesaria, pero no la estudiaremos, solo cópiela como aparece en la foto.

Por tanto, cuando escribamos http://localhost/pruebasphp, buscará las páginas php de la carpeta c:/pruebas.

Una última cosa es que cada vez que se cambie algún dato del archivo de configuración es necesario reiniciar
Apache.

La Página Principal

En muchas ocasiones accedemos a sitios web sin indicar realmente el nombre de la página que queremos
obtener.
Esto es muy típico. Por ejemplo, cuando usted escribe la dirección www.google.es en su navegador y acepta,
accede a la página principal de ese sitio web, que seguramente tendrá un nombre como index.html, default.aspx,
index.php, etc.
Podemos configurar el servidor Apache para indicar qué documentos tiene que buscar cuando no se indica una
página sino sólo el directorio donde está. Para ello, volveremos a acceder al archivo de configuración httpd.conf.

La directiva o parámetro que establece la página principal de un directorio del servidor web es DirectoryIndex:
# DirectoryIndex: sets the file that Apache will serve
#if a directory is requested.
#
# The index.html.var file (a type-map) is used to
#deliver content-negotiated documents. The MultiViews
#Option can be used for the same purpose, but it is
#much slower.
#

DirectoryIndex index.html index.htm index.php index.php4 index.php3 index.cgi index.pl index.html.var


index.phtml

Aquí vemos que la configuración incluye distintos nombres para la página principal de un directorio: index.html,
index.htm, index.php, etc.
Esto quiere decir que cuando introduzcamos una dirección en el navegador sin incluir una página concreta,
Apache buscará uno de esos archivos y, si lo encuentra, nos lo proporcionará.
En el caso de que haya más de una página con un nombre acorde con la página principal, el orden en que aquí
aparece será el que decida cuál mostrar.
Es normal crear una página principal en cualquier sitio web ya que los usuarios no suelen escribirla.

En el caso de un sitio web creado con PHP es habitual que esa página sea index.php, pero también podría ser
una página estática y tener la extensión .htm o .html.

Práctica 10

En esta práctica crearemos un sitio web con el servidor Apache donde guardar las distintas páginas que vayamos
programando.
Lo primero es crear el directorio físico en el disco duro. Vamos a utilizar un subdirectorio del directorio principal
de documentos del Apache, que normalmente es htdocs.

Así pues, nos situaremos en el directorio c:\apachefriends\xampp\htdocs y crearemos un directorio aquí. El


nombre del directorio será php más su primer apellido y la primera inicial de su nombre, todo en minúsculas.

Por ejemplo, si usted se llama Miguel López, la ubicación de su sitio web sería c:\apachefriends\xampp\htdocs\
phplopezm.

Solución de la práctica 10

Veamos qué detalles deberíamos tener en cuenta para realizar esta práctica que, aunque sencilla, debe prestar la
mayor atención posible para no equivocarse en los pasos a seguir.

Lo primero es crear el directorio físico donde se guardarán las páginas, así que acceda al directorio c:\
apachefriends\xampp\htdocs y cree allí un directorio o carpeta con el nombre adecuado.
Con esto sería suficiente.

Recuerda

1. En este tema se ha visto qué ocurre cuando un usuario solicita una página PHP a un servidor.

2. El proceso se inicia cuando el usuario introduce la dirección (URL) de la página PHP.

3. Una vez que la página llega al servidor, este la estudia y ve que se trata de una página web dinámica
(PHP) y no estática (HTML), por tanto este servidor le pasará la página a un intérprete php el cual la
tratará y se la devolverá al servidor.

4. Cuando el servidor web dispone de la página, la envía al usuario, pero no en PHP sino como HTML
(estática) sin código php.

5. Cuando instalamos Apache, esté nos crea una carpeta donde podemos albergar nuestras páginas PHP.
Este sitio se conoce como la raíz de los documentos, y por defecto tiene el nombre de htdocs.

6. En muchas ocasiones accedemos a sitios web sin indicar realmente el nombre de la página que queremos
obtener. Esto es muy típico. Por ejemplo, cuando usted escribe la dirección www.google.es en su
navegador y acepta, accede a la página principal de ese sitio web, que seguramente tendrá un nombre
como index.html, default.aspx, index.php, etc.

7. Podemos configurar el servidor Apache para indicar qué documentos tiene que buscar cuando no se indica
una página sino sólo el directorio donde está.

Preguntas de Autoevaluación
1.
¿En qué carpeta vamos a albergar las páginas?:
Wwwroot.
Htdocs.
Httpdoc.
2.
Indica si la siguiente afirmación es verdadera o falsa: 
“El código PHP queda delimitado entre <?php y ¿>”.
Verdadero.
Falso.
3.
Si solicita una página a un servidor, ¿podrá ver su código php?:
Si.
No.
4.
¿Dos usuarios que solicitan la misma página php, será siempre la misma?
Si
No
5.
Si utilizamos el servidor Apache en Windows, ¿Qué línea es la correcta a la hora de indicar la ubicación de cierto
directorio del disco duro C:\?:
C:\apachefriends\xampp\htdocs.
C:/apachefriends/xampp/Htdocs.

Las Etiquetas PHP

Como ya hemos visto, para que el servidor reconozca una página en php, le hace falta un intérprete pero… como
sabe este interprete ¿qué parte del código es php y cual no?
Esto se consigue utilizando unas etiquetas especiales para delimitar el código PHP. Estas etiquetas son <?php al
inicio del código y ?> al final.
Podremos encontrar varios grupos de etiquetas de este tipo a lo largo de la página, delimitando siempre
fragmentos de código PHP.
PHP permite utilizar otros tipos de etiquetas para delimitar el código, pero éstas son las más utilizadas y las más
compatibles porque no se pueden desactivar en una instalación.
Variables

Lo primero es saber que al igual que JavaScript, en PHP las variables no se tienen que declarar.
Para crear una variable, no tenemos que hacer nada más que escribir su nombre, antecediéndole el signo $, y
asignarle un valor.
Tenemos que tener en cuenta que un nombre de variable valido tiene que empezar con una letra o una raya
(subrayado), seguido de cualquier número de letras, números y rayas.

Veamos un ejemplo:

En este ejemplo podemos destacar varias cosas:


La variable “variable” va precedido del $(dólar) indicando que es una variable.
Cada instrucción en PHP acaba en “ ; ”
La orden echo sirve para imprimir una cadena de texto
En la línea 10 hemos utilizado comilla dobles “, aunque también podríamos haber utilizado comillas simples ‘, la
única diferencia es que si utilizamos estas últimas, no podremos acceder al contenido de la variable $variable, y
por lo tanto en vez de aparecer un 5, aparecería como tal $variable.
Algo curioso a tener en cuenta es que como hemos dicho, no hace falta declarar la variable, pero si es así…
¿Cómo sabe el intérprete el tipo de dato al cual nos referimos?
Pues es el propio interprete quien decide a su juicio qué tipo de dato va a utilizar, por lo que lo transforma en
dicho tipo de dato. A esto se le conoce como Conversión Implícita y se aplica en cualquier situación, no solo
durante las asignaciones.
Cuando el tipo de datos de un valor (ya esté almacenado en una variable o al evaluar una expresión mayor) no
concuerde con el tipo de datos de la operación o expresión en que se encuentre, PHP convertirá el tipo de datos
de dicho valor para que así sea.
Esto proporciona mucha flexibilidad, pero también es una de las características que más errores lógicos pueden
introducir en nuestro código PHP.
Adicionalmente, podremos convertir una variable a un determinado tipo de forma explícita, aunque primero
tendremos que conocer qué tipos de datos disponemos en PHP.
$(número 4 teclado)

Tipos De Datos
El tipo de datos de una variable determina el conjunto de valores que puede tener en ese momento, así como las
operaciones en las que puede formar parte.
En PHP se dispone de los siguientes tipos de datos:

Además, posteriormente veremos que podemos crear matrices (tipo array) y objetos (tipo object).
Cuando se asigna un valor a una variable, ésta almacena ese valor según su tipo de datos. En ese momento es
cuando se establece ese tipo de datos. De ahí que en cada asignación, la variable puede cambiar de tipo de
datos (además, claro está, de su propio valor).
En ocasiones estas conversiones implícitas de tipo de datos no son suficientes y podemos hacerlas explícitas.

Veamos un ejemplo:

Y estudiemos el tipo de conversiones implícitas:


En la línea 9, al asignar el valor 5 a $variable, implícitamente le está asignando el tipo de dato Integer.
En la línea 10, al asignar el valor 2.5 a $variable2, implícitamente le está asignando el tipo de dato Float.
En la línea 12, para concatenar cadenas utiliza el operador “ . “ pero como podemos ver la orden echo queremos
imprimir texto . int + float . texto.

Pues bien, ahí hay dos conversiones implícitas:


Int + float = la cual toma a int como float y suma los 2 float, dando 7.5 de resultado.
Texto . float . texto = lo que se hace es hacer otra conversión implícita de float a texto, por lo que al final
concatenará 3 textos, mostrándolo en pantalla.
Hay que tener mucho cuidado en el tema de las conversiones implícitas, ya que puede dar lugar a grandes
quebraderos de cabeza.
Pero… ¿Qué sucede si usted no quiere que el intérprete decida el tipo de dato al cual convertir?
Por ejemplo, si queremos que el valor de $variable2 sea entero en la expresión de la suma...Pues para ello
utilizaremos el concepto de casting.
El casting es una manera de conversión explicita y para utilizarlo no hay más que poner el tipo de dato al que
queremos convertir delante del tipo de dato que queremos convertir.
Otras expresiones de casting:

 (boolean) o (bool) ö Para convertir a booleano.


 (integer) o (int) ö Para convertir a entero.
 (float) o (double) ö Para convertir a numérico con valor decimal.
 (string) ö Para convertir a cadena de texto.

Es muy importante que entienda que una variable sólo puede cambiar su tipo de datos cuando se le asigna un
valor. Sin embargo, si esa variable aparece en una expresión distinta a una asignación, su valor puede cambiar
de tipo de datos para concordar con el esperado en la expresión.

Estas conversiones implícitas o explícitas de tipo pueden producir que se pierda información, por lo que debemos
entender qué ocurre en cada caso:
¿Qué ocurre cuando se convierte a booleano?
Cuando se realiza una conversión a boolean, los siguientes valores se toman como FALSE:
 El valor boolean FALSE (no se tiene en cuenta la combinación de mayúsculas y minúsculas utilizada).
 El integer 0.
 El float 0.0.
 El valor string vacío y la cadena ''0''.
 Un array con cero elementos.
 Un objeto con cero variables miembro.
 El tipo especial NULL.
 Cualquier otro valor se considera como TRUE.
¿Qué ocurre cuando se convierte a entero?
Cuando se realiza una conversión a integer, debe saber que:
 El valor boolean FALSE se convierte en 0 y el valor TRUE a 1.
 Cuando se convierte un valor numérico con parte decimal, ese valor se redondea hacia cero.
 Cuando se convierte una cadena de texto, sólo tendrá valor numérico (entero) si el principio de la cadena
tiene una representación numérica válida. En otro caso, será 0.
Por ejemplo, ''25Hola'' se convertiría en el valor entero 25, pero ''Hola25'' tendría el valor numérico 0 porque el
principio de la cadena no tiene una representación numérica válida.
¿Qué ocurre cuando se convierte a float?
 Cuando se realiza una conversión a numérico con valor decimal, debe saber que:
 Si se trata de una cadena de texto, se aplica la misma regla que en el caso de conversión a entero. La
cadena será convertida implícitamente a float si contiene alguno de estos caracteres: . e E
 Para valores de otros tipos, la conversión es la misma que si el valor hubiese sido convertido a entero y
luego a float.
¿Qué ocurre cuando se convierte a cadena de texto?
 Un valor boolean TRUE es convertido a la cadena ''1''; el valor FALSE se representa como '''' (una cadena
vacía).
 Un número integer o float es convertido a una cadena que representa el número con sus dígitos
(incluyendo la parte del exponente para los números float).
 NULL se convierte siempre a una cadena vacía.
 Realmente, el hecho de que PHP realice conversiones de tipo implícitas reduce al mínimo la necesidad de
realizar conversiones explícitas o casting. Pero si lo necesita, ya sabe cómo hacerlo.

Constantes

Si en nuestra aplicación encontramos un valor que se repite frecuentemente, es posible que nos interese
guardarlo en una constante.
La diferencia fundamental entre una variable y una constante es que el valor de esta última no puede cambiar,
por lo que se establece únicamente al definir la constante en sí.
Además, el nombre de la constante no incluye el signo $ característico de las variables. Los nombres suelen
aparecer en mayúsculas, aunque esto no es obligatorio.
Un nombre de constante válido empieza con una letra o un carácter de subrayado, seguido por cualquier número
de letras, números o subrayados.
Para definir una constante se utiliza la función define, que necesita el nombre de la constante, el valor que
queremos establece y si se tendrá en cuenta la combinación de mayúsculas o no en el nombre de la constante.

Por defecto, sí que se tiene en cuenta dicha combinación.

Aquí definimos la constante LABORABLES_SEMANA con el valor 5. A partir de ahora, siempre que utilicemos el


nombre de esta constante, es como si estuviéramos escribiendo el valor numérico 5.
¿Qué ventaja tiene esto? Seguramente pensará que es mucho más fácil escribir un 5 que el identificador
LABORABLES_SEMANA.

Sin embargo, utilizando una constante, será mucho más cómodo poder cambiar este valor posteriormente sin
tener que modificar nada más que la línea donde la hemos definido. Además, es mucho más legible
LABORABLES_SEMANA que simplemente un 5 en un código de muchas líneas.

Podrá utilizar las constantes en cualquier expresión donde se necesite un valor de su tipo de datos, que viene
establecido según el valor que almacene, como ocurría con las variables. De la misma forma, ese valor puede
sufrir conversiones de tipo si es necesario en alguna expresión, pero no la constante en sí, que no podrá cambiar
ni de valor ni de tipo de datos.

PHP incorpora un gran número de constantes predefinidas que podemos utilizar libremente en nuestro código.
Iremos viéndolas a medida que las necesitemos.

Práctica 11

En esta práctica crearemos una sencilla página php para comprobar algunos de los aspectos básicos de
programación en este lenguaje.

Escriba el código php necesario en el interior del cuerpo de la página (entre las etiquetas <body> y </body>),
que realice las siguientes acciones:

Crear cinco variables, con los siguientes nombres y, entre paréntesis, valores: entero (0), decimal (0.5), cadena
(hola), cadena2 (0256) y nulo (NULL).

El nombre de las variables le sirve para conocer el tipo de datos que tendrán al recibir el valor indicado entre
paréntesis.

Escriba las correspondientes expresiones de asignación para que así sea.

Escribir cinco líneas donde imprimir la conversión de los valores de esas cinco variables al tipo de datos boolean.
Tras cada una de esas líneas, escriba una más para crear un salto de línea en el resultado de la página web con
la etiqueta HTML <br>.

Guarde la página como practica11.php y compruebe el resultado en su navegador.


Fíjese en la figura de la página siguiente, donde puede ver dicho resultado.

¿Por qué se imprime una cadena vacía o un 1 en lugar de los valores boolean FALSE y TRUE, respectivamente?

Solución de la práctica

Primero creamos las cinco variables estableciendo su valor inicial, momento en el que PHP decide qué tipo de
datos es adecuado.

Por ejemplo, para un valor con parte decimal, como es 0.5, establecerá el tipo de datos float; para un valor de
texto, como "cadena" o "0256", el tipo de datos string, etc.

Para realizar la conversión explícita al tipo de datos boolean, se utiliza la expresión de casting (boolean) + el
nombre de la variable. Por ejemplo, (boolean)$entero.

Es interesante ver que dicha expresión de casting proporcionará un valor boolean, es decir, FALSE o TRUE, pero
que después se imprimirá como 0 o 1, respectivamente.

¿Por qué? Porque al imprimir en la página web con esto, estaremos haciendo una conversión implícita del valor
boolean a string, ya que echo imprime siempre texto.

Para entender las conversiones realizadas, debe repasar la tabla de conversión entre los distintos tipos de datos
de PHP.
Otra cosa interesante es ver que necesitamos escribir una etiqueta <br> en el código HTML resultante para que
realmente se realice un salto de línea en la página web. No es suficiente con escribir las instrucciones del código
php en líneas distintas.

Finalmente, recuerde que puede utilizar tanto las comillas simples (') como dobles (") para representar cadenas
de texto.

La ventaja de utilizar las dobles es que si, en su interior, escribe el nombre de una variable, entonces realmente
la cadena contendrá el valor de dicha variable y no ese nombre. Si utiliza comillas simples, como en el caso de
las líneas echo de nuestro código, el nombre de la variable se toma como una cadena literal. En este último caso,
suele utilizarse el operador de concatenación representado por un punto (.).

Recuerda

Las etiquetas para que el servidor reconozca un código PHP son <?php y ?>


En PHP las variables no se tienen que declarar.
La conversión Implícita hace que el intérprete sea quien decide a su juicio qué tipo de dato va a utilizar, por lo
que lo transforma en dicho tipo de dato.
Adicionalmente, podremos convertir una variable a un determinado tipo de forma explícita, aunque primero
tendremos que conocer qué tipos de datos disponemos en PHP.
El tipo de datos de una variable determina el conjunto de valores que puede tener en ese momento, así como las
operaciones en las que puede formar parte.
El casting es una manera de conversión explicita y para utilizarlo no hay más que poner el tipo de dato al que
queremos convertir delante del tipo de dato que queremos convertir.
Si en nuestra aplicación encontramos un valor que se repite frecuentemente, es posible que nos interese
guardarlo en una constante.
Podrá utilizar las constantes en cualquier expresión donde se necesite un valor de su tipo de datos, que viene
establecido según el valor que almacene, como ocurría con las variables.
PHP incorpora un gran número de constantes predefinidas que podemos utilizar libremente en nuestro código.

Preguntas de Autoevaluación
1.
¿Cuál de estas variables es válida?:
Dia.
$2dia.
$_dia.
2.
Fíjese en la siguiente asignación de valor a una variable. Si antes de ella el tipo de datos de la variable era String
(cadena de texto), ¿Qué cree que ocurrirá?: 

Se producirá un error porque el valor numérico 5 no puede guardarse en un String.


Se almacenará la representación de cadena del valor numérico 5 en la variable.
Se almacenará el valor numérico 5 en la variable y cambiará el tipo de datos a entero
3.
Si $dia contiene “Martes”, ¿qué instrucción imprimirá Hoy es Martes?:
echo ‘Hoy es $dia’.
echo “Hoy es $dia”.
4.
Indica si la siguiente afirmación es verdadera o falsa: 
“Es el intérprete de PHP quien decide de qué tipo de dato es cada variable”.
Verdadero.
Falso.
5.
Indica si la siguiente afirmación es verdadera o falsa: 
“En PHP sólo hay un tipo de datos numérico”.
Verdadero.
Falso.

Arrays

Un array es una colección indexada de elementos.


La diferencia de PHP con otros lenguajes es que cada uno de estos elementos puede ser un tipo de dato distinto.
Por lo que no podemos declarar el tipo de dato “genérico” de un array.
Observe el siguiente código PHP:

Array ejemplo básico


Como puede comprobar, se utilizan 6 variables enteras, se indican sus valores y finalmente se escribe en la
página la suma de todas ellas.
Aunque el código es correcto, podría utilizar un array de 6 elementos en lugar de utilizar las 6 variables
independientes. Esto, además de reducir el código, es una forma de indicar que los elementos están
relacionados.
Hay distintas formas de crear un array. La forma más sencilla es hacerlo como si se tratara de una variable más
pero incluyendo corchetes tras el nombre.
Por ejemplo, con la línea $a[0] = 0; se creará un array con un único elemento, cuya posición es la 0 ya que los
elementos de los arrays empiezan por este índice.
La única diferencia que vemos es que tras el nombre de la variable, se indica, entre corchetes, el índice del
elemento del array.
$a[1] = 1;
$a[2] = 2;
….
A medida que vamos estableciendo el valor de otros índices del array, estamos creando elementos del mismo.
Hay una forma más cómoda de hacerlo:
$a = array(0, 1, 2, 3, 4, 5);
Con una única línea hemos creado un array de 6 elementos y hemos dado el valor de cada uno de ellos.
$suma2 = $a[0] + $a[1] + $a[2] + $a[3] + $a[4] + $a[5];
Ahora obtenemos en la variable $suma2 la suma de todos los elementos del array.
Para ello hemos accedido a cada uno de esos elementos indicando su índice entre los corchetes. Por lo tanto
$a[0] es el primer elemento del array, $a[1] es el segundo, etc.

Estructuras De Repetición

Imagine que quiere repetir un número determinado de veces un conjunto de instrucciones o hacerlo mientras o
hasta que se cumpla cierta condición.
En el primer caso podrá utilizar la estructura de repetición for, que presenta la siguiente sintaxis:

Donde expr1 se evalúa al principio del bucle. Normalmente es la asignación de valor inicial a una variable.

En cada iteración se evalúa expr2, que es la expresión que determina si se tiene que volver a entrar en el bucle o
no. Expr3 determina cómo se modifica la variable contador.

Además, en cada iteración se ejecuta el conjunto de instrucciones de su cuerpo.

Veamos un ejemplo:
Estudiemos el ejemplo:

En la línea 8, vemos la declaración del array $a

En la línea 12-14 vemos nuestra estructura de repetición que va desde $i=0, hasta que $i<=5; y tras cada
iteración $i se incrementará en 1.

Es decir, este bucle se ejecutará 5 veces (para $i= 0, 1, 2, 3, 4).

En la línea 13 observamos que tras cada iteración el valor de $a [$i] se va almacenando en nuestra variable
$suma2 (previamente inicializada a 0 en la línea 11), la cual mostramos luego en la línea 16.
¿Fácil verdad?

Aunque el bucle for está pensado para utilizarse cuando se conoce de antemano el número de veces que debe
repetirse, es posible utilizar la instrucción break para salir del bucle anticipadamente.

Por ejemplo, podríamos comprobar si se cumple cierta condición y decidir salir del bucle aunque el valor inicial no
haya llegado al valor final.

En otras ocasiones, sin embargo, deseará repetir un conjunto de instrucciones mientras se cumpla una
determinada condición o hasta que se cumpla otra.

La sintaxis del bucle while es la siguiente:


Y su significado es muy sencillo:

La línea instrucciones se ejecutará siempre que expr se evalúe a TRUE.


Observemos este ejemplo:

Cópielo en NotePad++ y ejecútelo…

¿Qué sucede?

Pues bien, observemos que cuando entra al while, $i tiene el valor 0, por lo que como es menor o igual que 5
entra, se ejecuta $suma += $a [$i], sale del bucle y vuelve a entrar.

Como $i, tiene todavía el valor 0, vuelve a entrar al while…etc. Es decir, se ejecuta un número infinito de veces
ya que la variable $i no cambia nunca de valor, por ello, debemos escribir como última línea la instrucción $i++.

Este ejemplo corregido sería así:

Alternativamente existe otra versión de estructura de decisión while, es la llamada Do… While, cuya estructura
es:

Y aunque es similar a while, la diferencia en que en la primera si la condición no se evaluaba a TRUE, no entraba,
sin embargo en do... While, la primera vez siempre se ejecuta, y es cuando llega al final cuando evalúa para ver
si sigue ejecutando la estructura de repetición.

Estructuras De Decisión
Otro tipo de estructuras de control que se utiliza frecuentemente son las estructuras de decisión.
En este caso, el propósito es ejecutar un conjunto de instrucciones u otro según una determinada condición.
Su estructura es:

Veamos el siguiente ejemplo:

En el código anterior damos un valor a una variable entera y después comprobamos dicho valor con varias
estructuras if.
Así, si el valor de $dia es 1, entonces se ejecuta la instrucción $resultado = ''lunes'' ; si es 2, se
ejecuta $resultado = ''martes'', etc.
Al final, se imprime en la página web la frase ''Hoy es....'', concatenando el día que hemos obtenido como
resultado tras las estructuras de decisión.
Tal como está escrito este código, se realizan 7 comprobaciones del valor de la variable $dia.
Para evitar esto, existe una versión alterativa a If-else, denominado if-elseif cuya estructura es:

Por lo que si al evaluar la condición1 es TRUE, dejará de comprobar y se irá al final, si no fuera así, comprobaría
con la de abajo, y así sucesivamente.
En el peor de los casos haría lo mismo que el ejemplo anterior con if-else donde se comprobarían todos los
casos…
Esto en programas simples puede parecer una tontería pero en programas complejos… no podemos permitirnos
que se comprueben todos los casos, por cuestión de eficiencia, tiempo, etc.
Aunque anidar varias cláusulas if-else permite reducir el número de comprobaciones que se deben realizar,
existe una estructura de decisión más apropiada para estos casos, sobre todo para añadir claridad a su código.

Esta estructura es:

Esta instrucción evalúa sólo una vez la expresión de comparación y ejecuta el bloque de instrucciones de la
primera cláusula case cuya listaExpresiones cumpla con ella.

Es importante no olvidar introducir la instrucción break al final del bloque de instrucciones de cada case. Esto es
así porque PHP ejecutará el grupo de instrucciones que aparece a partir de la primera cláusula case que se
cumpla hasta encontrar un break.

Veamos el mismo ejemplo que estábamos viendo pero ahora con esta nueva estructura:
Por lo tanto, si $dia vale 1 y no escribimos las instrucciones break, entonces se ejecutaría la asignación de la
cláusula case 1 pero también de las demás, asignando a la variable $resultado la cadena de texto “día
incorrecto”, que es la última.

Con la cláusula default indicamos qué debe ocurrir cuando ninguna de las condiciones anteriores se ha cumplido.
No es obligatorio hacerlo.

Además, esta estructura tiene como ventaja respecto a if que las condiciones que se evalúan no tienen por qué
ser únicamente TRUE o FALSE, sino que también podrían dar como resultado un valor entero, decimal o incluso
una cadena de texto.

Combinar Estructuras

Ahora veremos cómo es posible combinar todas estas estructuras:

El objetivo de nuestro código será la búsqueda de un determinado valor en un array de enteros. Si el valor a
buscar se encuentra en el array, entonces imprimiremos en pantalla un mensaje indicando esa circunstancia.
Y como observamos:
En la línea 9, tenemos una declaración de un array de enteros.
En la línea 12-17, tenemos un for, que se ejecutará 9+1= 10 veces buscando en el array el número, si lo
encuentra, pondrá la variable booleana $encontrado a VERDADERO, y saldrá del bucle.
Luego, en la línea 18, si $encontrado == TRUE, entrará a la línea 19, mostrando el mensaje “El valor X está en
la lista”, en otro caso, saltará a la línea 21 con el mensaje “El valor X no está en la lista”.

Arrays Asociativos

Como hemos visto en temas anteriores, la diferencia principal entre una variable y un array, es que esta última,
puede contener varias variables, que pueden ser de distinto tipo y además, se accede mediante un índice, que
aparte de empezar por 0, era numérico.
Bien pues ahora veremos, que también podremos acceder a través de cadenas de texto, que nos facilitará a la
hora de acceder a dichos arrays.
Se conocen como arrays asociativos y mediante un ejemplo, mostraremos su estructura.

Arrays asociativos
Como observamos, en el array $monedas añadimos 5 países y a cada uno de estos le “asociamos” un tipo de
moneda.
Así el primer elemento del array es $monedas [“España”] en lugar de $monedas [0].
Fíjese que utilizamos el operador => para “apuntar” al elemento almacenado.
Haremos un ejemplo en el que en una tabla en HTML almacenaremos los valores de las distintas monedas de los
distintos países.
Lo primero será crear una tabla en HTML con esta estructura:

Tabla sin resultados

Para ello, utilizaremos las etiquetas <TABLE> </TABLE> para crearla, <TH> </TH> para la cabecera (en
nuestro caso la primera fila), <TR> </TR> para las filas y <TD> </TD> para las columnas
Así de este modo para crear dicha tabla podemos utilizar lo siguiente:

Definición tabla html

El Bucle Foreach

Para acceder a los elementos de un array hemos utilizado siempre índices numéricos, pero ahora en este caso de
arrays asociativos no podemos, por lo que debemos utilizar un bucle de repetición especial para estos casos.

Se trata de foreach.

Veamos un ejemplo:
Bucle foreach y arrays

Y ahora observemos atentamente el código:


De la línea 1 a 7, tenemos el código en PHP donde almacenamos en el array asociativo $monedas, las monedas
correspondientes a los distintos países.
De la línea 13 a la 16, Introduciremos los títulos de la tabla (uno por columna) que son País y Moneda.
De la línea 18 a 25 tenemos el código en PHP para ir escribiendo en cada uno de estas filas de la tabla.
Como vemos utilizamos el bucle foreach para recorrer el array $monedas. Después de la palabra as tenemos un
variable $clave y otra $valor, dichas variables las creamos para poder en cada iteración ir guardando los
resultados. Por tanto, el índice se almacenará en $clave y el valor en $valor.
Luego simplemente vamos creando para cada iteración la estructura de filas/columnas e introduciendo el
contenido de $clave y $valor.
Obteniendo una tabla como esta:

Tabla datos html dos columnas


Lo bueno del bucle foreach es que se encarga de acceder a cada elemento del array, sin que nosotros tengamos
que preocuparnos de cómo indicar cada uno de sus índices.
Arrays Multidimensionales

Una característica muy potente en los arrays es que cada uno de sus elementos puede ser un array, y así
sucesivamente, por lo que podemos crear estructuras muy complejas (tanto como deseemos).
Para entenderlo vamos a ver un ejemplo, en la que mediante un array vamos a tener una lista de productos.
Arrays múltiples
En el que podemos observar que $productos es un array que contiene 3 elementos, que son arrays y cada uno
de esos arrays también tiene 3 elementos.
Y la manera de acceder a ellos es similar a como lo hacíamos con arrays unidimensiones.
Ej. Si queremos acceder al precio del despertador, lo haríamos de la siguiente manera:
$productos [1] [2]
Ó
Si quisiéramos acceder al nombre “Reloj de pared” lo haríamos como
$productos [2] [1]
Veamos un ejemplo en el que crearemos una tabla que contendrá todos los elementos del array $productos.

Array múltiple y tabla html


Que como observamos, contiene a todos los elementos de $productos
Tabla html datos
También podremos utilizar arrays asociativos incluso al crear un array de más de una dimensión. El
funcionamiento será exactamente el mismo que ya hemos visto.
Por ejemplo, tal como hemos escrito nuestro código, tenemos que saber que en la posición 0 de cada elemento
tenemos el identificador del producto, en la 1 su nombre y en la posición 2 su precio ¿No sería mejor expresarlo
justamente con esas palabras?

Arrays múltiples asociativos


Y ahora para acceder al tercer elemento de $productos, lo haríamos de la siguiente manera:
$productos [2][“Identificador”]
$productos [2][“Nombre”]
$productos [2][“Precio”]
Por lo tanto, ahora es mucho más fácil hacer referencia al identificador, nombre o precio del primer producto de
nuestra lista.
Los arrays son muy utilizados en las páginas php, por lo que el lenguaje proporciona mucha funcionalidad para
trabajar con estas estructuras de datos.

Práctica 12a

Esta práctica se divide en dos partes. En la primera trabajará con arrays y tendrá que demostrar que conoce la
sintaxis para acceder a sus elementos; en la segunda parte transformará una estructura de repetición dada en
otra equivalente.
Primera Parte:
Cree una nueva página php en el editor que esté utilizando.
Escriba el código necesario en el cuerpo de la página web para que se creen dos arrays:
En el primero se almacenan los 10 primeros números naturales (empezando por el 0).
En el segundo se almacena el valor del factorial del número incluido en la misma posición del primer array.
Por ejemplo, si tenemos que en la posición 3 del primer array se guarda el valor 3, entonces en la posición 3 del
segundo array estará el valor correspondiente al factorial de 3, que es 6.
A continuación se define el factorial de un número entero:
factorial(0) = 1
factorial(1) = 1
factorial(n) = 1 * 2 * 3 * … * (n-1) * n
Por ejemplo: factorial(5) = 1 * 2 * 3 * 4 * 5 = 120
factorial(18) = 6402373705728000
Deberá escribir el código necesario para realizar este cálculo y almacenarlo en el segundo array.
A continuación imprima el contenido del segundo array. Una línea en la página web por cada uno de los valores.
Guarde la página como practica12a.php y pruébela en su navegador web.
Segunda Parte:
Transforme la estructura de repetición del siguiente fragmento de código en una equivalente, pero utilizando la
condición de salida al final del bucle.
Es decir utilizando la estructura Do-While en vez de While.
En este código aparece el operador &&, que es el AND de PHP.
Es decir, que en la condición donde se utiliza, se tiene que cumplir ambos criterios para que la expresión se
evalúe a TRUE.
El operador OR equivalente es ||.
Guarde la página como practica12a2.php y pruébela en su navegador web.
Solución de la práctica 12a y Práctica 12a2
Esta puede ser una de las varias soluciones posibles que puede haber.
Práctica12a.php

Y el resultado al ejecutarlo en nuestro navegador, debe de tener este aspecto:


Práctica12a2.php

En el enunciado de la práctica, la condición de salida del bucle while se comprueba al principio, por lo que para
escribir un bucle equivalente en que se compruebe al final, tenemos que comprobar dicha condición para la
primera ocasión. Esto se consigue con una estructura if - else.

Práctica 12b

En esta práctica diseñará un ejemplo con un array multidimensional y asociativo.


Al principio de la página, y antes de cualquier otra etiqueta, escriba el código php necesario para representar
mediante un array lo que se conoce como el juego de “La Quiniela®”.
Se trata de una apuesta deportiva donde se tiene que elegir el resultado de 15 partidos de fútbol. Cada uno de
esos resultados puede tener tres posibles valores: 1, X, 2, donde:
1: si gana el equipo local,
X: si el partido finaliza con empate,
2: si gana el equipo visitante.
Cada elemento del array debe permitir guardar los tres posibles valores, ya que el usuario puede elegir un
resultado (apuesta sencilla), dos (apuesta doble) o los tres (apuesta triple).
Seguidamente, rellene el array con las siguientes apuestas:

Donde Partido1,… Pleno15 serán los índices del array.


Ahora escriba el código php necesario en el cuerpo de la página; esto es, entre las etiquetas <body> y </body>,
para obtener el siguiente aspecto.
Guarde la página con el nombre practica12b.php y compruebe el resultado en su navegador.
Solución de la Práctica 12b

Una posible solución puede ser:

La apuesta del participante queda aquí reflejada como un array asociativo de 15 elementos, los cuales, a su vez,
son arrays de tres elementos booleanos, representando los posibles resultados de cada uno de los partidos. Por
lo tanto, es un array multidimensional.
Así pues, si el primer partido es array (TRUE, TRUE, FALSE), tendremos que la apuesta es 1X, ya que tienen el
valor verdadero los dos primeros elementos.
Una vez elegida esta representación de la apuesta, podemos utilizar un bucle foreach para recorrer todo el array
asociativo y comprobar el resultado de cada uno de los partidos. Fíjese cómo se accede al valor de cada una de
las claves del array asociativo, que es otro array de elementos booleanos.

Recuerda

Un array es una colección indexada de elementos.


A medida que vamos estableciendo el valor de otros índices del array, estamos creando elementos del mismo.
Utilizaremos FOR para repetir un número determinado de veces un conjunto de instrucciones o hacerlo mientras
o hasta que se cumpla cierta condición.
Aunque el bucle for está pensado para utilizarse cuando se conoce de antemano el número de veces que debe
repetirse, es posible utilizar la instrucción break para salir del bucle anticipadamente.
Para repetir un conjunto de instrucciones mientras se cumpla una determinada condición o hasta que se cumpla
otra utilizaremos WHILE.
Otro tipo de estructuras de control que se utiliza frecuentemente son las estructuras de decisión.
Es importante no olvidar introducir la instrucción break al final del bloque de instrucciones de cada case.
Con la cláusula default indicamos qué debe ocurrir cuando ninguna de las condiciones anteriores se ha cumplido.
Con los arrays asociativos podremos referirnos a su contenido mediante cadenas de texto.
Para recorrer los arrays asociativos necesitaremos usar FOREACH.
Lo bueno del bucle foreach es que se encarga de acceder a cada elemento del array, sin que nosotros tengamos
que preocuparnos de cómo indicar cada uno de sus índices.

Preguntas de Autoevaluación
1.
¿Qué valores tomará $i al ejecutarse la siguiente instrucción?: 

10, 9, 8,7….
0,2,4,6,8,
10,8,6,4,2,
2.
Si no conoce el número de veces a iterar, ¿qué bucle utilizará?:
For.
While.
3.
¿Qué valor tendrá la variable $resultado tras el siguiente código?: 

“lunes”.
“martes”.
“miércoles”.
4.
¿Cuántas veces se evalúa la condición de una estructura switch?:
Tantas como cláusulas case.
Una.
5.
¿Cuál de los siguientes arrays es asociativo?:
$temperaturas = array(12,14,18);
$temperaturas= array(“Salamanca” => 12, “Madrid” => 14, “ Valencia” => 18);

Introducción

Cuando un proyecto tiene cierta magnitud, se hace muy difícil poder desarrollarlo sin dividirlo en trozos más
pequeños. Las funciones (junto a las clases, que más tarde estudiaremos) son la herramienta que proporciona
PHP para dividir la aplicación en unidades más pequeñas y fáciles de manejar.
Desde el punto de vista de la programación, una función no es más que un bloque de código bien delimitado al
que le damos un nombre y que realiza alguna tarea bien definida. Cuando en nuestro programa necesitamos
llevar a cabo esa tarea, llamamos a la función.
Veamos un ejemplo:

Se trata de un típico formulario que permite calcular los gastos de envío de los productos que elije el usuario. El
nombre de la página es funciones.php
Así, indica a qué categoría pertenece el producto comprado y cuántas unidades serán enviadas. A partir de estos
datos, se calcula el importe total en cuanto a gastos de envío.
Lo único que debe de saber ahora mismo sobre los formularios es que en action indicamos que página o archivo
es el encargado de procesar esa información
En este caso la información suministrada será procesada por otra página llamada calculargastos.php
Por tanto: Necesitamos “recoger la información” del usuario y más tarde “Procesarla”.

Crear Funciones

Como vimos en el tema de JavaScript, tras la palabra function escribiremos el nombre de la función y unos
paréntesis. En el interior de esos paréntesis podemos escribir parámetros.
Los parámetros sirven para comunicar la función y el código que la utiliza. Por ejemplo, en nuestro caso, la
función debe saber a qué categoría pertenece el producto comprado y cuántas unidades se tienen que enviar.
Pues bien, eso se lo comunicaremos mediante parámetros.
Observemos este ejemplo:

Donde podemos ver como el nombre de la función no lleva el símbolo del dólar, pero en cambio el de los
argumentos sí, porque dentro de la función actuarán como variables.
Además, la función debe devolver el cálculo efectuado. Esto se consigue con la palabra clave return.
Return ($recargo + ($unidades * 2.25));
Con la palabra return, la función devolverá la suma del recargo aplicado más 2.25 unidades monetarias por cada
unidad comprada del producto.
La palabra return hace que la función finalice inmediatamente, devolviendo el control a la siguiente línea del
código donde se ha utilizado. En este caso es la última línea de la función, pero si no fuese así, el resto no
llegaría a ejecutarse.
Vemos, por lo tanto, que la función gastos realiza una tarea bien definida, devolviendo el valor buscado y nada
más.
Sin embargo, definir una función no hace que su código se ejecute. Para eso, es necesario llamarla.

Llamar A Una Función

Como ya dijimos también en su momento, para utilizar una función no basta solo con crearla sino que en algún
momento del código deberemos llamarla. Esto se conoce como “llamar a una función”.
Para ello tendremos que escribir su nombre y entre paréntesis escribir la lista de parámetros que le hacen falta a
la función.
También en el caso en el que la función devolvería algún valor (mediante return) necesitaremos guardar ese
valor.
Por tanto, si en este ejemplo solo quisiéramos imprimir el valor que devuelve la función podríamos hacerlo como
sigue:

Por ejemplo, necesitamos pasar la categoría y el número de unidades compradas. Pues utilizaremos dos
variables como argumentos y después veremos de dónde sacamos sus valores:
$arg_categoria y $arg_unidades.
Es importante el orden en que se escriben los argumentos, ya que serán emparejados según ese orden con sus
correspondientes parámetros en la función.
Es decir, que el valor de la variable $arg_categoria será el que recoja el parámetro $categoria de la función
y $arg_unidades dará valor al parámetro $unidades.
Con esto estaremos llamando a nuestra función para calcular e Imprimir el importe de los gastos de envío.
Sólo nos falta saber qué valor tendrán estos argumentos. Como se ha indicado, vendrán dados por lo que
introduzca el usuario en el formulario que vimos al principio de la lección.

Las ventajas de utilizar funciones son muchas. Imagínese que necesita calcular los gastos de envío en otro lugar
de su sitio web.
Será muy fácil hacerlo simplemente llamando a la función. Si después decide cambiar el recargo por modalidad o
por las unidades enviadas, sólo tendrá que hacerlo en la definición de la función y todos los cálculos se
actualizarán automáticamente.
Paso De Parámetros

Sabemos que los parámetros permiten comunicar el código que llama a la función con la propia función, pero,
¿Qué pasa si no nos es suficiente con que esa función nos devuelva un único valor mediante la palabra return?
Los parámetros pueden servir para ello y al terminar la función almacenar valores que deseemos.
Veamos el mismo ejemplo de antes, pero con un parámetro adicional (que guardará el valor del return).

Función con parámetros


Estas funciones en el mundo de la programación se llaman Funciones void y son las únicas funciones que no
devuelven ningún valor.
Por tanto, habrá que llamarla y almacenar el valor que deseemos en alguna variable (en nuestro caso
en $importe.
Ahora tendremos también que modificar la llamada a la función, incluyendo el nuevo argumento.

Llamada a función con parámetros


Con todo esto que sabemos, podemos ejecutar el ejemplo de este modo y ver el resultado:

Código llamada a función

Y el resultado es:
Pantalla de resultados vacía
¿Qué ha pasado?
Pues bien, este es un error muy común que pasaremos a explicar.
El problema es antes de terminar la función, el resultado se “mete” dentro de la variable $importe, pero cuando
la función termina, al ser la variable local, esta pierde su valor, por lo que luego al imprimirla no tendrá nada.
¿Por qué pasa esto?
Cuando llamamos a una función, la lista de parámetros a introducir se “pasan” por valor es decir, se hace una
copia de lo que le pasas, internamente la función hace sus cálculos y al finalizar destruye el contenido de esas
“copias”, es decir, solo las necesita para hacer cálculos.
Por tanto, si lo que queremos es que aparte de hacer cálculos, guarde información y luego podamos acceder a
ella, hay que “pasar los parámetros por referencia”.
De este modo, todo parámetro pasado por referencia, podrá ser modificado por la función ya que no lo destruirá,
y más tarde podremos acceder a él.
Para pasar un parámetro por referencia hay que anteponerle “&” al argumento de este modo:

Función parámetros por referencia


Ahora que sabemos esto, probemos a ejecutar en el navegador el código y veamos que ocurre:

Pantalla con resultados


Que como era de esperar, obtenemos el resultado esperado.
Es verdad que en esta ocasión era más apropiado utilizar la palabra return para que el cálculo lo devolviera la
función y no utilizar un parámetro más, pero ahora ya sabe que puede utilizar parámetros que se puedan
modificar pasándolos por referencia.
Finalmente, si necesita devolver más de un valor tras ejecutar la función, puede hacerlo devolviendo un array, ya
sea mediante la palabra return o con un parámetro más de la función.
Parámetros Por Defecto

Cuando usted realiza una llamada a una función, tiene que proporcionar el mismo número de argumentos y en el
mismo orden en que aparecen en su definición.
Sin embargo, PHP permite crear parámetros opcionales o para los que se indica un valor por defecto.
La idea es que si nosotros no especificamos el valor de dicho parámetro en la llamada a la función, entonces
tomará el valor que tenga por defecto, por lo que la llamada seguirá siendo válida.
Para crear un parámetro opcional debemos escribir su nombre y seguidamente un igual más el valor que tomará
por defecto. Además, los parámetros de este tipo tienen que aparecer después de todos los parámetros de la
función que no sean opcionales:

Función parámetros por defecto


El valor por defecto tiene que ser una expresión constante y no una variable o llamada a una función.
¿Qué estamos indicando con este parámetro? Muy sencillo, hemos añadido un servicio urgente o rápido de envío
de los productos y queremos que se tenga en cuenta a la hora de calcular el importe total.
Por defecto, asignamos el valor FALSE a dicho parámetro, por lo que si no se indica en la llamada, se utilizará
ese valor.
Código función parámetros por defecto

Con el nuevo parámetro representamos que se añadirán 50 unidades monetarias al total de los gastos de envío
si el usuario ha elegido el envío urgente.
Tal como tenemos la llamada a la función gastos, el código seguiría funcionando perfectamente, ya que no
utilizamos ningún argumento para este último parámetro, pero como es opcional, no pasa nada.

Fíjese que esto tiene muchas utilidades, ya que no necesitaríamos modificar el código donde ya ha sido utilizada
la función gastos si no queremos representar este último detalle del envío.
Sin embargo, si queremos hacerlo...

Llamada función múltiples parámetros

Con esto indicamos que sí que se tiene que aplicar el recargo por envío urgente. Lógicamente esto debería venir
establecido de alguna forma por el usuario en el formulario inicial.
Establecer un valor por defecto para un parámetro evita la obligación de tener que proporcionarlo en la llamada a
la función, pero nada más. Usted podrá dar el valor adecuado (incluso coincidiendo con el establecido por
defecto) siempre que quiera y ése será el valor que realmente se utilice en el interior de la función.

Práctica 13

En esta práctica tendrá que crear y utilizar una función para ordenar un array de números enteros.
Antes de cualquier otra cosa, escriba el código php necesario para crear una función que ordene un array dado
mediante el “método de la burbuja”.

El método de la burbuja consiste en recorrer el array y, en cada pasada, comparar e intercambiar (si procede)
elementos del array.

De esta forma, si consideramos los elementos del array como burbujas con pesos acordes a su valor y si
imaginamos el array en posición vertical y lo recorremos de abajo arriba, conseguiremos que en cada pasada
ascienda uno de los elementos o burbujas a la posición que le corresponde en el array ordenado. Esto lo
podemos ver mejor en la figura siguiente, donde aparece resaltado en cada pasada qué pares de elementos se
están comparando.
Una ayuda: puede conocer el número de elementos que tiene un array usando la función count.
Por ejemplo, si tenemos el array $a, la expresión count($a) nos devolvería el número de elementos de dicho
array.
Guarde la página como practica13.php y compruebe el resultado en su navegador.
Solución de la práctica 13
Una posible solución…
La función Burbuja recibe como parámetro el array a ordenar. Fíjese que el paso de ese parámetro es por
referencia (como se indica al anteceder el símbolo &) porque tiene que poder modificarse ordenándolo.
El bucle interior de la función Burbuja recorre los elementos del array, situando cada vez un elemento o burbuja
en la posición adecuada del array ordenado. Para ello, realiza el intercambio entre la posición actual y la anterior
si es adecuado.
El bucle exterior hace que esto se repita las veces necesarias.
Fíjese cómo se crea el argumento que necesita la función, cómo se realiza su llamada y, cómo no hace falta
guardar el resultado de dicha llamada, ya que el resultado deseado lo encontraremos en el mismo array que ha
servido de argumento.
Se utiliza la función count para obtener el tamaño o elementos del array. Fíjese en que el número de elementos
sería 5 en nuestro ejemplo, aunque fueran desde el índice 0 al 4.
Indicarle también que PHP proporciona funciones incorporadas en el lenguaje para ordenar arrays. Busque
información sobre las funciones asort, arsort, ksort, rsort, sort, uasort, usort y uksort en el manual de PHP.
Recuerda

Una función no es más que un bloque de código bien delimitado al que le damos un nombre y que realiza alguna
tarea bien definida. Cuando en nuestro programa necesitamos llevar a cabo esa tarea, llamamos a la función.
Tras la palabra function escribiremos el nombre de la función y unos paréntesis. En el interior de esos paréntesis
podemos escribir parámetros.
La palabra return hace que la función finalice inmediatamente, devolviendo el control a la siguiente línea del
código donde se ha utilizado.
Es importante el orden en que se escriben los argumentos, ya que serán emparejados según ese orden con sus
correspondientes parámetros en la función.
Las funciones void son las únicas funciones que no devuelven ningún valor.
PHP permite crear parámetros opcionales o para los que se indica un valor por defecto.

Preguntas de Autoevaluación
1.
Indica si la siguiente afirmación es verdadera o falsa: 

“Para pasar una variable por referencia usaremos el carácter “$”.”


Verdadero.
Falso.
2.
¿Cuál será el resultado impreso en pantalla después de ejecutar estas instrucciones?: 

0.
3.

3.
¿Es necesario incluir paréntesis en la llamada a una función si no tiene parámetros?:

Si.
No.

4.
¿Cuál es el paso de parámetros predeterminado en PHP?:

Por valor.
Por referencia.

5.
¿Qué parámetros estamos pasando por referencia en la función? 

$x.
$y.
$x e $y.
$resultado.

Ámbito De Las Variables

El concepto de ámbito de variables hace referencia a dónde se puede utilizar o es conocida una variable.
Principalmente se pueden encontrar dos tipos de variables en función de su ámbito:
Variables globales: son todas aquellas que se definen fuera de las funciones, por lo que están accesibles en
cualquier lugar del código php.
Variables locales: son aquellas que se definen en el interior de una función. Sólo están disponibles en esa función
y desaparecen al finalizar la ejecución de la función.
Fíjese en este formulario:

Donde queremos escribir un nombre, un correo (que tenga una @) y una contraseña (con más de 6 caracteres).
Pues bien, ya hemos visto en el tema de JavaScript como crear este tipo de formulario y además como validarlo
en la parte del cliente, ahora, lo haremos, desde el lado del servidor.
El formulario ha sido creado de esta forma:

Que como puede ver, al pulsar el botón “enviar”, al ser un tipo “submit”, se ejecutará el método “POST” del
formulario y se redirigirá a “procesar.php”.
Ahora veremos el contenido de “procesar.php”.
Donde hemos creado 3 variables, $usuario, $password y $email, donde recogeremos la información que haya en
los distintos campos del formulario a la hora de pulsar el botón de enviar. Observe la sintaxis:
Variable = $_post [“nombre de input”];
A continuación tenemos dos funciones, ValidarEmail y ValidarPassword.
En la línea 8 vemos como se comprueba si en la cadena está el carácter “@”, esto se hace mediante la función
strpos, que te devuelve la posición de un carácter.

En la línea 15 vemos como la función ValidarPassword utiliza también una función llamada strlen, la cual
devuelve la longitud de una cadena,
Con todo esto explicado, pruebe a escribir estos dos fragmentos de código en distintos páginas.
Y ejecútelo para ver que funciona.
¿Qué está pasando?
¿Por qué si escribimos nuestro nombre, una dirección con una arroba y una password de más de 6 caracteres,
nos muestra el mensaje de incorrecto?
Sin embargo, si comprueba el resultado verá que siempre se indica que el formato de los datos introducidos no
es correcto.
El problema está en que las funciones utilizan las variables $email y $password en su interior, por lo que las
toman como locales y no recogen el valor de las variables globales definidas fuera de las funciones.
Vemos, por lo tanto, que las variables globales no se pueden utilizar directamente en el interior de las funciones,
ya que, al utilizar el mismo nombre, PHP entiende que está definiendo una variable local a la función.
Esto puede solucionarse con la palabra global antes de la variable. Por ejemplo, en la función ValidarEmail:

Finalmente, indicarle que si quiere eliminar manualmente una variable, puede hacerlo utilizando la función unset(
) y pasando como parámetro el nombre de la variable.

Variables Estáticas

Sabemos que las variables locales, que se definen en el interior de una función, sólo pueden utilizarse en dicha
función y, además, desaparecen al finalizar ésta.
Esto es muy fácil de comprobar. Fíjese en la función contar siguiente.
Se utiliza una variable llamada $cuenta a la que se le da el valor inicial 1, seguidamente se imprime uno u otro
mensaje en función de su valor y se incrementa en una unidad.
La página simplemente llama 5 veces a la función anteriormente mencionada, para lo que se utiliza un bucle for.
Si accede a esta página con su navegador, recibirá el primer mensaje 5 veces porque la variable recibe el valor 1
cada vez que se ejecuta la función, por lo que no guarda el valor incrementado al final de la misma.

Por lo tanto, la línea en la que se incrementa el valor de la variable ($cuenta++) no sirve para nada porque
siempre tomará el valor 1 al imprimir el mensaje en la página web.
Podemos hacer, sin embargo, que la variable local guarde su valor entre las distintas llamadas a la función. Para
ello, se utiliza la palabra static.

Como ahora sí que se guarda el valor que va teniendo la variable entre cada llamada a la función, se imprimen
los distintos mensajes.
Recuerde que esto no es el funcionamiento normal de las variables locales, ya que desaparecen al finalizar la
ejecución de la función.
Uso De Include Y Require

Cuando empiece a crear sus propias, funciones comprobará que le interesa utilizarlas en varias de las páginas de
su aplicación.
En lugar de escribir el mismo código en una y otra página, es mejor escribir este código “reutilizable” en un
archivo independiente e incluirlo en las páginas donde se necesite.
Para ello, se utilizan las instrucciones include o require. Ambas funcionan prácticamente igual, pero mientras que
la primera puede provocar una advertencia si no se encuentra el archivo incluido, require provoca un error fatal,
finalizando la ejecución de la página.
Vamos a poner el código de las funciones ValidarEmail y ValidarPassword en un archivo independiente y después
lo utilizaremos aquí. Es lógico pensar que estas funciones las podamos utilizar en más de una página de nuestra
aplicación.
Un aspecto importante es que el código php que escribamos en archivos independientes tiene que estar incluido
entre las etiquetas de inicio y cierre de php: <?php y <?
Archivo validator.inc.php:

Otro aspecto a tener en cuenta es qué nombre asignar a los archivos que posteriormente serán incluidos.
Podemos utilizar cualquier extensión para este tipo de archivos, ya que, en teoría, sólo deberán ser utilizados
cuando se incluyan en otras páginas php.
Por ello, es una costumbre utilizar la extensión .inc (de incluido), aunque es mejor, como después
demostraremos, utilizar la misma extensión .php que para el resto de páginas dinámicas.
Nosotros utilizaremos una combinación de ambas para diferenciar estos archivos respecto de las páginas
ejecutables. Vamos a asignar la extensión .inc.php.
Ahora incluiremos este archivo para poder utilizar las funciones que validan los datos introducidos por el usuario.
Al utilizar la instrucción include o require, el intérprete PHP incluirá el código que se encuentra en el archivo
indicado, exactamente igual que si hubiese escrito este código en la posición de la línea include, pero ahora
tenemos la ventaja de incluir las funciones allá donde las necesitemos sin necesidad de volver a escribir todo su
código, sino simplemente con una línea.
Debe entender que al incluir (include) o requerir (require) el código de uno o más archivos, está haciendo que
ese código se incruste en la posición donde aparecen estas líneas.
Esto quiere decir que incluso en dicho código se podría utilizar cualquier variable, constante o función que
apareciese en el código de la página que los utiliza.
También quiere decir que en esos archivos podríamos escribir otro tipo de código, como el mismo código HTML
que queremos incluir en más de una ocasión. Por ejemplo, esto serviría para reproducir el mismo aspecto en las
páginas de la aplicación.

Incluir Solo Una Vez

Una versión un poco diferente de la instrucción include (o require) es include_once (o require_once).


Se utiliza para no incluir en más de una ocasión el mismo archivo independiente, ya que esto no sería correcto
porque el código aparecería repetido, dando errores de duplicación de identificadores de función.
Veámoslo con un ejemplo para entenderlo mejor:
Archivo svalidator.inc.php:

En este archivo aparece una única función llamada SecurePassword, que es una versión un poco más “exigente”
en cuanto a las características que tiene que cumplir la contraseña del usuario.
Como se utiliza la función ValidarPassword, hemos incluido también el archivo validator.inc.php.
Vemos, por lo tanto, que si incluimos el archivo svalidator.inc.php estaremos, de forma indirecta, incluyendo
también el archivo validator.inc.php.
¿Qué ocurre entonces si incluimos ambos archivos en una página web?
Include(“svalidator.inc.php”);
include(“validator.inc.php”);
Muy fácil: que realmente el archivo validator.inc.php se incluirá dos veces.
Vemos que se ha producido el error que estábamos esperando. Se nos indica que no podemos volver a definir la
función validaremail porque ya está definida con anterioridad. Esto se debe a que hemos incluido dos veces el
mismo archivo validator.inc.php.
Utilizando include_once en lugar de include, el archivo especificado sólo se incluirá si no se ha hecho con
anterioridad. De la misma forma funciona la versión require_once.
Include(“svalidator.inc.php”);
include_once(“validator.inc.php”);
Tenga en cuenta que utilizando include_once o require_once, sólo se insertará el código del archivo una vez,
aunque aparezcan varias líneas indicándolo.
De ahí que es necesario disponer también de la instrucción include o require para poder incluir en más de una
ocasión el mismo archivo.
Piense por ejemplo, si quiere incluir en varios lugares de la página web el mismo fragmento de código para
incorporar el mismo texto o imágenes.
Seguridad De Los Archivos Incluidos

Dónde guardar los archivos independientes con código que después se incluirán es un asunto a estudiar
detenidamente.
En esos archivos podemos encontrar código realmente importante que el usuario no debería ver de ninguna
forma, como contraseñas, funciones internas, etc.
De ahí que sea importante la extensión que les asignemos. Como se ha indicado, es mejor utilizar la
extensión .php ¿Por qué? Ahora lo verá.
Imagínese que incluyó el código de las dos funciones anteriores en un archivo de nombre validator.inc. Si el
usuario supiera que existe dicho archivo en el directorio donde se almacenan las páginas a las que tiene acceso,
no tendría más que escribir ese nombre de archivo en el campo Dirección de su navegador.
Como la extensión del archivo no coincide con ninguna de las que tiene que interpretar el servidor web,
simplemente devuelve el contenido textual del archivo.
Esto permite al usuario ver este código, que no debería ver en ningún caso. De ahí que sea importante utilizar la
extensión .php, ya que en lugar de mostrar el código, simplemente se ejecutaría.
En este caso, el resultado de la página enviada al navegador sería totalmente en blanco, ya que es el resultado
de procesar ese código php.
Aunque ésta es una buena medida, no es suficiente. Debe asegurarse de que el usuario no pueda acceder a los
archivos independientes.
Para ello, lo mejor es guardarlos en una carpeta o directorio fuera del espacio web al que tiene acceso el usuario,
es decir, fuera de la jerarquía de documentos, alias, etc. del servidor web Apache.
Por ejemplo, podríamos crear un directorio en nuestro disco duro llamado funciones y guardar estos archivos allí.
En este caso, deberíamos indicar la ubicación completa de los archivos en las líneas include, pero, a cambio,
nadie podría acceder a dicho código utilizando su navegador, ya que estaría fuera del espacio web al que tiene
acceso a través del servidor web Apache.
Otra posibilidad que existe en cuanto a asegurar los archivos incluidos es utilizar una extensión específica,
como .inc, e impedir que se pueda acceder a este tipo de archivo.
Esto último lo indicaríamos en el archivo de configuración de Apache httpd.conf. En el ejemplo planteado
podríamos incluir el siguiente fragmento de código para proteger los archivos .inc:

No incluya ningún espacio entre la coma y allow en la segunda línea.


El problema que tiene esto es que tenemos que acceder al archivo de configuración de Apache, lo que no
siempre es posible (piense, por ejemplo, si su aplicación está siendo hospedada por una empresa de servicios de
Internet o ISP).
En este último caso, todavía podríamos aplicar esta regla creando un archivo llamado .htaccess en el directorio
de nuestra aplicación e incluyéndola.
En resumen: tenemos que proteger los archivos incluidos para que nadie pueda acceder a su contenido. La forma
más fácil de hacerlo es guardándolos fuera de la jerarquía de documentos del sitio web y con la extensión .php

Práctica 14

En esta práctica veremos la forma de incluir archivos.


Abra el archivo practica13.php adjunto al curso.
Guarde el archivo abierto como practica14.php para no modificar el archivo original.
Seleccione el código de la función Burbuja y cópielo.
Cree una nueva página en blanco e incluya el código previamente copiado. Guarde el nuevo archivo como
burbuja.inc.
Elimine el código de la función Burbuja en el archivo original (practica14.php) y sustitúyalo por el necesario para
incluir el archivo burbuja.inc.
Guarde los cambios efectuados y compruebe que la página sigue funcionando bien en su navegador.
Sin cerrar su navegador, acceda a la página burbuja.inc.
Compruebe que puede obtener el contenido de este archivo, lo que representa un serio riesgo en cuanto a la
seguridad.
Cierre el navegador y cree ahora un nuevo archivo de texto, dándole el nombre .htaccess (incluyendo el punto
inicial). Guarde este archivo en el directorio de su sitio web.
Incluya en este nuevo archivo las líneas necesarias para proteger los archivos con extensión .inc, de forma que
nadie pueda acceder a ellos con su navegador.
Ejecute su navegador y acceda a practica14.php. Compruebe que todo sigue funcionando perfectamente.
Sin cerrar el navegador, intente ahora acceder a la página burbuja.inc. Compruebe que no puede hacerlo.
NOTA: Aunque aquí hemos visto otra forma de proteger los archivos incluidos, creando un archivo .htaccess con
una directiva para evitar que se pueda acceder a ellos desde un navegador, recuerde que es conveniente
nombrar estos archivos con la extensión .php. En nuestro ejemplo, podría ser burbuja.inc.php.
Solución de la práctica
A tener en cuenta:
Una vez copiado el código de la función Burbuja, crearemos un nuevo archivo y lo pegaremos en él. Debe incluir
en este nuevo archivo (burbuja.inc) las etiquetas de código php, es decir, <?php y ?>. Después tendrá que
introducir una línea include (o require) en sustitución del código de la función en el primer archivo. El resultado
sería como sigue Archivo burbuja.inc:

Práctica 7.php

Si accede con su navegador a la página burbuja.inc, podrá obtener tranquilamente su contenido, ya que, al no
ser una extensión de archivo que maneje el servidor web, simplemente devuelve la página tal cual.
Para solucionar esto, tenemos varias opciones: utilizar la extensión .php en lugar de .inc y guardar los archivos
incluidos fuera del espacio web del sitio; modificar la configuración del servidor web para impedir el acceso a los
archivos .inc, para lo que tendremos que indicarlo en el archivo httpd.conf; o, lo que vamos a hacer, que es lo
mismo que la segunda opción, pero particularmente para el directorio en cuestión: crear un archivo .htaccess.
Tenga en cuenta que, en muchos casos, no podrá acceder al archivo general de configuración del servidor
Apache, por lo que es importante saber utilizar los archivos .htaccess.
Archivo .htaccess:

En cualquier caso, es una buena política utilizar la extensión .php o, por ejemplo, .inc.php, para los archivos
incluidos. Además, es mejor guardarlos fuera del espacio web del servidor.
Recuerda

El concepto de ámbito de variables hace referencia a dónde se puede utilizar o es conocida una variable.
Principalmente se pueden encontrar dos tipos de variables en función de su ámbito:
Variables globales: son todas aquellas que se definen fuera de las funciones, por lo que están accesibles en
cualquier lugar del código php.
Variables locales: son aquellas que se definen en el interior de una función. Sólo están disponibles en esa función
y desaparecen al finalizar la ejecución de la función.
include o require funcionan prácticamente igual, pero mientras que la primera puede provocar una advertencia si
no se encuentra el archivo incluido, require provoca un error fatal, finalizando la ejecución de la página.
Debe entender que al incluir (include) o requerir (require) el código de uno o más archivos, está haciendo que
ese código se incruste en la posición donde aparecen estas líneas.
Una versión un poco diferente de la instrucción include (o require) es include_once (o require_once) que se
insertará el código del archivo una vez, aunque aparezcan varias líneas indicándolo.
Tenemos que proteger los archivos incluidos para que nadie pueda acceder a su contenido. La forma más fácil de
hacerlo es guardándolos fuera de la jerarquía de documentos del sitio web y con la extensión .php

Preguntas de Autoevaluación

1.
¿Qué operador utilizaría para conocer si dos variables tienen el mismo contenido y aparte son del mismo tipo de
dato?:
==
===
2.
¿Es necesario eliminar las variables locales de una función al finalizar su ejecución?:
Si.
No.
3.
¿Qué instrucción provoca un error fatal, que finaliza la ejecución de la página, si no encuentra el archivo a
incluir?:
Include.
Require.
4.
¿Podemos utilizar más de una vez la instrucción include o require?:
Si.
No.
5.
¿Es correcto el siguiente código si en el archivo funciones.inc.php aparece más de una línea ejecutable?: 

Si.
No.

Introducción

La característica estrella o que más ha mejorado en la versión 5 de PHP es su orientación a objetos.


Hoy en día este paradigma de programación es el más utilizado y prácticamente lo podemos encontrar en
cualquier lenguaje de programación que se precie.
Pero, ¿qué es realmente la orientación a objetos? La orientación a objetos es una forma de programar que rompe
con la forma de programar clásica.
En un entorno clásico de programación el problema o sistema que se está analizando se divide en funciones: este
sistema hace esto, esto y esto.
Sin embargo, en una programación orientada a objetos, el sistema se divide en objetos o entidades que
podemos encontrar en la realidad.
Veamos un ejemplo. Imagine que está realizando la simulación de un coche.
Realizando una descomposición funcional del coche, podría hablar de:
Arrancar y apagar.
Girar a la izquierda y a la derecha.
Cambiar de marcha.
Moverse hacia delante.
Moverse hacia atrás.
Aumentar la velocidad.
Disminuir la velocidad.
...
Si pensara en objetos, hablaría de: El coche dispone de un motor que se puede arrancar y apagar utilizando para
ello el contacto.
Además, el coche dispone de un volante que permite que nos desplacemos en una determinada dirección:
derecha o izquierda. Al aumentar la velocidad utilizando el acelerador, debemos cambiar a una marcha más alta.
Si reducimos la velocidad con el freno, puede que sea conveniente cambiar a una marcha inferior...
Observe cómo en la descomposición funcional nos hemos fijado en lo que debería hacer el coche, mientras que
en la descomposición en objetos nos hemos centrado en qué elementos podemos encontrar: motor, volante,
acelerador, freno, caja de cambios, etc.
Al pensar en objetos en lugar de en funciones, usted se acerca más a la realidad, ya que es la forma en que lo
haría en cualquier otra situación cotidiana.
De esta forma, una vez encontrados los objetos que intervienen, podremos asignarles las tareas que tienen que
realizar.
Se puede estar preguntando para qué nos va a servir conocer los conceptos de orientación a objetos a la hora de
desarrollar una aplicación web con PHP.
Bien, aunque no es necesario utilizar un enfoque orientado a objetos en PHP, cada vez es más frecuente
encontrarnos con paquetes o librerías creadas por terceros que añaden funcionalidad específica al lenguaje.
La mayoría de estas librerías están desarrolladas con un enfoque orientado a objetos, por lo que si las queremos
utilizar, es necesario saber cómo. Incluso nosotros mismos podemos aplicar este enfoque a la hora de desarrollar
nuestras aplicaciones.
Clases

El elemento clave en todo lenguaje orientado a objetos es la clase. Una clase es como una plantilla o modelo que
define a los objetos.
Por ejemplo, en el caso del coche, piense en la clase como en la idea genérica que tiene usted de un coche. Sin
embargo, un objeto sería un coche en particular que está viendo en la calle.
Está claro que usted utilizará un coche determinado (un objeto) y que no puede hacer nada con la idea de coche
que pueda tener (la clase).
Ésta es la realidad. Traslademos ahora la idea al ambiente de programación. Normalmente las clases se escriben
en archivos independientes para más tarde incluirlos allá donde necesitemos la funcionalidad que nos ofrecen.

PHP proporciona la palabra clave class para definir una clase:

Dentro de las llaves incorporaremos el código que representa las características de la clase Coche. Para ello,
debemos saber qué puede contener una clase.

Volvamos al ejemplo del coche. Estoy seguro de que si le piden que describa un coche, empezaría a indicar sus
características físicas: tiene cuatro ruedas, puede ser de distintos colores, etc.

Estas características que definen el aspecto del coche son propiedades cuando se trasladan al ambiente de
programación.

Con las propiedades posx y posy indicaremos la posición del coche.


Siguiendo con la descripción de lo que es un coche, también indicaría que puede moverse en una determinada
dirección, que puede tomar velocidad: aumentándola y reduciéndola, etc.
Las características que definen lo que puede hacer el coche o, en definitiva, su comportamiento, son
llamadas métodos en el ambiente de la programación.
Éste es el aspecto que tiene un método. Recuerde que, gracias a los métodos, podemos indicar el
comportamiento que pueden tener los objetos de la clase.
El método mover sirve para cambiar la posición del coche.
También podríamos tener otros métodos, como acelerar o frenar, para variar su velocidad.

Observe lo directo que puede ser trasladar una idea que maneja en la realidad a un programa orientado a
objetos.
Propiedades

La parte de los objetos que permite describirlos detalladamente son las propiedades.
Las propiedades no siempre serán características físicas. Por ejemplo, podría tener una propiedad que indicara la
máxima velocidad que puede alcanzar un objeto coche.
Lógicamente, no todos los objetos coche van a tener la misma máxima velocidad.
Las propiedades se corresponden con variables en el interior de las clases. Así, en nuestra clase Coche hemos
definido varias propiedades: $numruedas, $color, $posx, $posy, $velocidad...
Cada objeto se caracterizará por tener un determinado valor en
Dichas propiedades. Además, este valor podrá cambiar a lo largo de la “vida” del objeto.
Por ejemplo, un coche de color rojo y que está aparcado tendrá el valor rojo en la propiedad color y 0 en la de
velocidad.
Sin embargo, un coche azul metalizado que va por la autopista podrá tener el valor azul metalizado en su
propiedad color y 110 en su propiedad velocidad.
Observe cómo, en cualquier caso, ambos coches dispondrán del mismo número de ruedas: 4.
Esto nos hace ver que existen dos tipos de propiedades: aquellas que pueden tomar valores distintos en cada
objeto y aquellas que son iguales para todos o que las comparten todos los objetos.
En este último caso se dice que son propiedades compartidas o estáticas. En PHP podrá indicar esta circunstancia
antecediendo a su declaración la palabra static.

De esta forma indicamos que el valor de la propiedad numruedas es compartido por todos los objetos que se
creen de la clase Coche.
Esto quiere decir que si modifica esta propiedad, la estará modificando para todos los objetos de esa clase.
En la mayoría de los casos tendrá sentido indicar el valor que van a tomar las propiedades compartidas en la
propia declaración, como puede ver en la línea de código anterior.
De esta forma, los objetos de esta clase se crearán con el valor 4 como el número de ruedas.
Lo importante es entender que definimos las propiedades en la clase, pero que éstas sólo tendrán sentido cuando
creemos objetos.

Métodos

Si las propiedades describen estructuralmente los objetos, los métodos hacen lo propio con su comportamiento.
Los métodos se implementan en PHP a través de funciones.
Veamos como ejemplo el método mover. Tras el nombre de la función, aparece, entre paréntesis, una lista de
parámetros.
Un parámetro sirve para comunicar el método con el resto del código que lo utiliza. En este caso, el método
mover permite desplazar el coche de una posición a otra. Lógicamente, necesita conocer la posición final, que se
le indica a través de los parámetros x e y. function mover($x, $y).

Método o función con parámetros


También puede darse el caso de que el método no utilice parámetros, con lo que la lista aparecerá vacía (como
el método acelerar).
En el caso de que el método tenga que devolver un valor, utilizaremos la palabra clave return y lo indicaremos.

Método o función sin parámetros


Por ejemplo, vemos que el método acelerar devuelve la velocidad final del coche, es decir, tras acelerar.
Existe un método especial, que permite crear objetos de la clase.
Este método se llama constructor. function __construct($color, $posx, $posy)

Función constructor clase


Fíjese en el nombre especial de este método. Se utilizan dos subrayados delante de la palabra construct para
indicar que es el constructor de la clase.
Sólo puede haber un constructor por clase y no es obligatorio escribirlo. Lo hará cuando quiera inicializar las
propiedades al crear el objeto o por cualquier otro proceso que tenga que ejecutarse en ese momento.
En el método constructor es donde podemos establecer el valor que tienen las propiedades al crear el objeto.
Por ejemplo, en este caso vamos a crear un objeto con un determinado color y posición inicial.
La velocidad inicial será siempre de 0 kilómetros por hora.
La forma de acceder a una determinada propiedad del objeto es a través de la sintaxis nombre_objeto-
>nombre_propiedad.
En el constructor se utiliza $this. La palabra clave this indica que estamos haciendo referencia al propio objeto
que se está creando. Así, damos el valor del parámetro $color a la propiedad color del objeto.
Siempre que quiera acceder a alguna propiedad o método de un objeto debe indicar el nombre del objeto o, al
menos, $this si es en la propia definición de la clase.
Por lo tanto, el código que habíamos escrito para los métodos no es correcto porque no se accede de forma
adecuada a las propiedades del objeto.
Por ejemplo, en el método mover vemos que la intención es modificar el valor de las propiedades posx y posy del
objeto sobre el que se llama el método. El código correcto sería:
Método con referencia a this
Por lo tanto, para acceder a la propiedad posx, utilizamos la expresión $this->posx. Lo mismo ocurriría en el
resto del código:
Archivo coche.inc.php:

Clase con métodos y constructor


Volviendo al método constructor, la idea es que cuando usted cree objetos en el código que utiliza la clase,
indique el valor de las propiedades.
Observe que no es necesario indicar el valor de la propiedad numruedas ya que este valor se indica en la propia
declaración de la propiedad al ser una propiedad compartida.
Por lo tanto, ya sabemos que podremos utilizar el método constructor para crear objetos y, además, hemos visto
cómo podemos acceder a las propiedades de los objetos.
En la lección siguiente aprenderemos a crear objetos y a utilizar sus métodos.
En las versiones anteriores de PHP 5, los métodos constructores no se llamaban __construct, sino que tenían el
mismo nombre que la clase.
Para mantener la compatibilidad con el código escrito antes de PHP 5, cuando se crea un objeto, el intérprete
buscará primero un método __construct y, si no lo encuentra, un método con el mismo nombre de la clase.

Visibilidad

Uno de los principios de la programación orientada a objetos es que la clase sólo debe exponer los servicios que
proporciona, no así su implementación.
Esto, que suena muy formal, se entiende mejor con la analogía del coche que estamos utilizando.
Cuando usted conduce un coche, lo único que necesita es saber cómo frenar, acelerar, cambiar de marcha, etc.
Usted no necesita conocer cuál es el proceso que se sigue cuando pulsa el pedal del freno o del acelerador.

De hecho, si más tarde decide poner un sistema antibloqueo de frenos, seguro que no le gustaría que le
cambiaran su forma de frenar.
Lo que quiere es seguir presionando el freno como siempre, independientemente de que se utilice un mecanismo
diferente.

Este mismo enfoque es el que se sigue en la programación orientada a objetos.


En nuestra clase nosotros debemos mostrar al exterior que el coche puede acelerar, frenar o moverse, sin
necesidad de conocer que cuando lo hace, lo que realmente ocurre es que cambia el valor de una o más
propiedades.

PHP permite “ocultar” aquellas características de las clases que no queremos mostrar fuera de ella. Para ello, se
utiliza la palabra private.

Normalmente, las propiedades deben ser privadas.

La propiedad numruedas no será privada porque queremos poder utilizarla sin necesidad de crear un objeto para
ello. Por lo tanto, debe ser pública o accesible desde fuera de la clase.

Por otra parte, los métodos deberían ser públicos, ya que representan los servicios que la clase ofrece al exterior.
Esto se consigue mediante la palabra public o simplemente no indicando nada, ya que el acceso predeterminado
es público.

Sin embargo, en muchas ocasiones desearemos poder acceder a algunas propiedades, tanto para conocer su
valor como para poder modificarlo.
Si las definimos como privadas, esto no será posible. Por ello, para estas propiedades, deberá incluir un método
específico para ello.
Estos métodos se conocen como métodos get y set, ya que obtienen y modifican las propiedades,
respectivamente. Puede utilizar cualquier nombre, pero es una buena costumbre incluir estas palabras inglesas.

Veámoslo para la propiedad color,posy y posx.


Vemos que en el caso del método get, lo único que hacemos es devolver el valor de la propiedad mediante la
instrucción return.

En el método set incluimos el código necesario para establecer el valor de la propiedad. Dicho valor viene dado a
través del parámetro valor.

En el ejemplo hacemos algo más, ya que validamos el color y, si no es uno de los permitidos (rojo, verde o azul),
lo establecemos a “ninguno”.
Ésta es una de las principales ventajas de utilizar métodos para el acceso a las propiedades.
Si permitiéramos el acceso directo a la propiedad color, entonces se podría establecer a cualquier valor, incluso
alguno que no fuera correcto.
Fíjese que el acceso a estos procedimientos tiene que ser public para poder utilizarlo desde fuera de la clase
donde está definida la propiedad.
Utilizando los métodos get y set en lugar de las propiedades fuera de la clase, será muy sencilla cualquier
modificación posterior, ya que sólo la tendremos que hacer en estos métodos.
Crear Objetos

Una vez hemos completado el código de nuestra sencilla clase Coche, vamos a utilizarla para poder crear y
“conducir” coches.
Lo normal a la hora de crear las clases es hacerlo en un archivo independiente, por lo que será necesario incluir
dicho archivo en las páginas donde vayamos a utilizar la clase.
Archivo coches.php (la página a la que accederá el usuario con su navegador):

Al incluir el archivo de la clase, podremos utilizarla perfectamente. Lo primero será crear algún objeto Coche:

Con esta línea creamos nuestro primer objeto Coche. Es decir, estaremos utilizando su constructor para ello. Se
utiliza una variable para guardar el nuevo objeto, la palabra clave new, el nombre de la clase y, entre paréntesis,
los parámetros que necesite el constructor.
Si el constructor de la clase no necesita parámetros, sería suficiente con incluir un par de paréntesis.
Una vez ya creado el objeto, podremos utilizar sus características (propiedades y métodos) públicos.
Por ejemplo, $c->mover (5, 78) es correcto porque estamos utilizando el método público mover del objeto; pero
$c->color no lo sería porque estaríamos accediendo a su propiedad privada color. En lugar de esto último,
deberíamos utilizar el correspondiente método get $c->getColor( ).
No siempre va a necesitar un método get y otro método set para todas las propiedades. Por ejemplo, podría
encontrarse con propiedades que no permitirá modificar (sólo lectura), por lo que sobraría su método set; o con
propiedades que no permitirá consultar (sólo escritura), por lo que no tendría sentido su método get.
Usted está diseñando la clase, así que usted decide lo que necesita.
Fíjese cómo se utiliza el objeto en el siguiente código:

Pruebe a ejecutarlo todo en su navegador y observe el resultado.


Destructores

Hemos podido comprobar que para trabajar con objetos en nuestro código, no necesitamos nada más que utilizar
el constructor de la clase para crearlos y, a partir de ese momento, acceder a sus características públicas.
El objeto creado de esta forma existirá mientras se ejecute el código php y desaparecerá al finalizar éste. Es
decir, que no necesitamos hacer nada para destruir el objeto, ya que esto ocurrirá cuando finalice el código en el
que se ha creado.
Sin embargo, en ocasiones esto no es suficiente y tenemos que asegurarnos de que, al desaparecer el objeto, se
cierren ciertos recursos, como archivos, conexiones con bases de datos, etc.
Podemos escribir un método especial llamado destructor para ello. Sin embargo, recuerde que sólo necesitará
hacerlo cuando realmente tenga que llevar a cabo algún proceso al destruir el objeto.

En este caso, el destructor simplemente imprimirá un texto en la página, pero nos servirá para comprobar que
realmente se está ejecutando el código del destructor que ha creado.
Fíjese que el nombre es muy parecido al caso del constructor.
Ahora se trata de dos subrayados y la palabra destruct.
Sin llamar al destructor, se ejecutará su código porque se destruye automáticamente el objeto al finalizar la
ejecución del código o al perder su ámbito.
Si necesita destruir el objeto en un momento dado sin esperar a esto, puede utilizar unset( ) y pasar el nombre
del objeto como parámetro.

Práctica 15a

Ésta es una de las prácticas más importantes del curso, ya que deberá empezar a “pensar en objetos”.
Se va a describir una situación real y usted tendrá que encontrar los objetos que intervienen, así como sus
características: propiedades y métodos.
Lea detenidamente la siguiente descripción de una cuenta bancaria. Después de una lectura completa, identifique
los objetos fundamentales que intervienen, así como sus propiedades y métodos. Apúntelos en un papel.
Una vez identificados los objetos, cree un nuevo archivo. Guárdelo como ccorriente.inc.php.
Escriba únicamente el código php siguiente en este archivo, donde se detalla una posible implementación de la
clase Ccorriente (cuenta corriente) anteriormente descrita:
Observe el aspecto de la clase: las propiedades, el constructor, los otros métodos, el uso del identificador $this,
etc.
No se preocupe si no entiende todo el código que ha escrito.
Por ahora lo que realmente interesa es que “piense en objetos”.
Solución de la Práctica 15a
La primera parte de la práctica tiene la intención de que empiece a acostumbrarse a pensar en objetos a la hora
de abarcar la realización de una aplicación informática.
Al utilizar un enfoque orientado a objetos, nos centramos en los objetos que intervienen y, una vez localizados,
les asignamos las tareas que deben realizar.
Así, en nuestro caso de estudio podremos encontrar dos objetos fundamentales: la cuenta corriente y el titular. A
continuación se describen:
Cuenta corriente:
Propiedades: número de la cuenta, nif del titular (ya que es la forma de identificarlo), fecha de creación de la
cuenta, saldo actual e interés que se aplica.
Métodos: además del constructor, necesitaremos un método para cargar y otro para abonar en cuenta.
Titular:
Propiedades: nif, nombre, domicilio, teléfono y profesión.
Ahora se pasa a detallar un poco más la implementación de la clase Ccorriente. Tenga en cuenta que sólo nos
interesan los conceptos de programación orientados a objetos.
Observe que el código de la clase se incluye entre la estructura:
class
{
…...
}
Las propiedades se corresponden con variables y los métodos con funciones.
Se utiliza el identificador $this para hacer referencia al propio objeto.
Se utiliza el operador -> (un signo menos y un signo mayor que) para acceder a las propiedades y métodos del
objeto en cuestión. Por ejemplo, para acceder a la propiedad saldo, utilizamos la expresión $this->saldo.
Fíjese en el aspecto del constructor, donde se inicializan las propiedades a un determinado valor, que se le pasa
como parámetro.
Observe el aspecto de los otros métodos. Fíjese en que son necesarios tres parámetros: cantidad, fecha y motivo
del movimiento (cargo o abono). Por ahora, lo único que hacemos es actualizar el saldo de la cuenta y
devolverlo.
Práctica 15b

En esta práctica completaremos el código de la práctica anterior, donde representamos una cuenta corriente
bancaria mediante una clase.
Ejecute Notepad++ y abra el archivo ccorriente.inc.php. Si no dispone de él, puede encontrarlo entre los
trabajos del curso.
Modifique adecuadamente la especificación de visibilidad de las propiedades y métodos de la clase Ccorriente.
Cree los métodos get y set apropiados, de forma que se pueda obtener el valor de todas las propiedades, pero
sólo establecer el de las propiedades nifTitular, saldo e interés. El nombre de estos métodos será
get+NombrePropiedad y set+NombrePropiedad, con la primera letra del nombre de la propiedad en mayúscula.
Por ejemplo, getNumCuenta.
Cree una nueva página php en Notepad++ y escriba el código necesario en el cuerpo de la página para:
Crear un objeto de la clase Ccorriente de forma que el número de cuenta es “0000-0000-00-0000000001”, el Nif
del titular es “1111115858-J”, la fecha de alta es el 13 de agosto de 2005 y se le aplica un interés del 2,35%.
Represente, mediante código, que se ha producido un abono de 785.46 unidades monetarias en la cuenta, con la
fecha 1 de enero de 2006 y con el concepto “Abono en ventanilla”.
Represente, mediante código, que se ha producido un cargo de 59.05 unidades monetarias en la cuenta, con
fecha el 15 de febrero de 2006 y por el concepto de “Mensualidad canal de televisión”.
Escriba una línea de código en la que se imprima el saldo de la cuenta.
Guarde la nueva página como practica9.php y pruébela en su navegador. El resultado debe ser la frase “El saldo
es de 726.41”.
NOTA: Especifique las fechas con el formato dd/mm/aaaa. Es decir, primero el día (2 dígitos), después el mes (2
dígitos) y finalmente el año (4 dígitos), utilizando la barra / de separador.
Solución de la Práctica 15b
Una posible solución puede ser:
Fíjese que las propiedades se han establecido como privadas (private) y los métodos, incluyendo el constructor,
como públicos (public).
Por otra parte, se ha creado un par de métodos get y set para cada propiedad que puede consultarse (método
get) y establecerse (método set), mientras que no se ha escrito el método set en aquellas propiedades de sólo
lectura o que no pueden modificarse su valor.
Esto tiene sentido, ya que detalles como el número de cuenta o la fecha de alta sólo deben establecerse durante
la creación de la cuenta.
El método get de una propiedad simplemente devuelve el valor de dicha propiedad, mientras que el método set
lo establece a partir del valor que le pasamos como parámetro.
Éste sería el código para la página practica15.php:

Observe que hemos incluido el archivo donde se ha escrito la clase.


Fíjese cómo se crea el objeto utilizando la palabra clave new y el nombre de la clase. En ese momento es cuando
se utiliza el correspondiente constructor, por lo que le pasamos los parámetros que éste necesite:
$c = new Ccorriente("0000-0000-00-0000000001", "1111115858-J", "2005/08/13", 0.0235);
De esta forma, podemos utilizar la variable $c como manejador del objeto, es decir, para poder hacer referencia
al nuevo objeto creado. Así pues, después utilizamos los métodos abonar, cargar y para obtener el saldo
(getSaldo) de dicho objeto.
Recuerda
La característica estrella o que más ha mejorado en la versión 5 de PHP es su orientación a objetos.
En una programación orientada a objetos, el sistema se divide en objetos o entidades que podemos encontrar en
la realidad.
El elemento clave en todo lenguaje orientado a objetos es la clase. Una clase es como una plantilla o modelo que
define a los objetos.
PHP proporciona la palabra clave class para definir una clase.
Gracias a los métodos, podemos indicar el comportamiento que pueden tener los objetos de la clase.
La parte de los objetos que permite describirlos detalladamente son las propiedades.
Si las propiedades describen estructuralmente los objetos, los métodos hacen lo propio con su comportamiento.
Los métodos se implementan en PHP a través de funciones.
Se utilizan dos subrayados delante de la palabra construct para indicar que es el constructor de la clase.
Para mantener la compatibilidad con el código escrito antes de PHP 5, cuando se crea un objeto, el intérprete
buscará primero un método __construct y, si no lo encuentra, un método con el mismo nombre de la clase.
Uno de los principios de la programación orientada a objetos es que la clase sólo debe exponer los servicios que
proporciona, no así su implementación.
Los métodos get y set obtienen y modifican las propiedades, respectivamente.
Se utiliza una variable para guardar el nuevo objeto, la palabra clave new, el nombre de la clase y, entre
paréntesis, los parámetros que necesite el constructor.
Si necesita destruir un objeto, puede utilizar unset( ) y pasar el nombre del objeto como parámetro.
Preguntas de Autoevaluación
Leyenda
Pregunta correcta
Pregunta errónea
Opción simple no seleccionada
Opción simple seleccionada
Opción simple correcta
Opción simple errónea
Opción múltiple no seleccionada
Opción múltiple seleccionada
Opción múltiple correcta
Opción múltiple errónea
Opción correcta no seleccionada

1.
¿Cómo se accede a la propiedad $color del objeto $micoche?:
$micoche($color).
$micoche->color.
Micoche->$color.
$micoche->$color.
2.
Indica si la siguiente afirmación es verdadera o falsa: 
“Las propiedades se corresponden con funciones y los métodos con variables”.
Verdadero.
Falso.
3.
¿Se puede establecer un valor inicial para las propiedades en la definición de una clase?:
Si.
No.
4.
¿Pueden crearse métodos compartidos o estáticos en una clase?
Si.
No.
5.
¿Cuántos constructores puede haber en una clase?
Uno.
Más de uno.

Evaluar Test

Presentación

En este tema vamos a hablar de un concepto muy importante en programación orientada a objetos, la herencia.
Veamos un ejemplo para entenderlo mejor:
Imagine que le han propuesto preparar una aplicación para controlar el pago de las nóminas de los empleados de
su empresa.
Para ello, usted ha creado la clase Empleado, tal y como esta:

Donde vemos que se usa un constructor, y dos métodos, baja y calcularsalario.


Pues bien, ahora llega el jefe de contabilidad y le indica que su aplicación no le sirve para los vendedores que
tiene la empresa.
¿Por qué? Porque no hay forma de reflejar las ventas que han realizado esos vendedores y se da la casualidad de
que su salario depende, en parte, de dichas ventas.
Su primera reacción es la de crear una nueva clase que represente la existencia de los vendedores en su
empresa.
Pues bien, usted se pone a pensar y observa que estos vendedores también tienen nombre, salario fijo, fecha de
alta, fecha de baja, y además, deberán calcular su salario, darse de baja… es decir, que aparte de las
características propias, también tienen las características de nuestra clase creada.
Pues bien, este es el tema del que trata la herencia.
Crear Subclases

Cuando usted encuentre una clase de la que parte de sus propiedades y sus métodos sean comunes a otra clase,
podrá crear una subclase a partir de ella.
En PHP para indicar que una clase es subclase de otra, utilizarla la palabra reservada extends.

Definición de subclase
Con ello estamos haciendo que la clase vendedor herede las propiedades y los métodos que tenga la clase
empleado.
Aparte, la clase vendedor podrá llevar sus operaciones/métodos propios.
Por ejemplo, en el caso del vendedor, será interesante conocer qué ventas ha realizado (propiedad), qué
comisión se lleva (propiedad) y representar que ha realizado una venta (método).
Fíjese cómo lo haríamos:

Subclase, propiedades y métodos


Como puede ver, el vendedor es un empleado especial que tiene características que otros no tienen.
En toda relación de herencia encontrará que puede utilizar la expresión “es un”. Esto ocurre en nuestro caso: un
vendedor es un empleado que tiene una parte variable de su sueldo en comisiones.
Sin embargo, al revés no es cierto: un empleado no es un vendedor... ya que no todos los empleados tienen por
qué ser vendedores.
A la clase más sencilla se la llama clase base o superclase, mientras que aquella clase que la especializa o que le
añade nuevas características se llama clase derivada o subclase.

Crear Objetos De Las Subclases

Seguro que se lo está preguntando pero… Si desea crear un objeto de una subclase, ¿Cómo lo haría? Es decir, ¿A
qué constructor llama? ¿Al de la subclase, o al de la superclase?
La respuesta es: al de los dos.
Deberemos llamar a los dos constructores, pero indirectamente, ya que lo que haremos será llamar únicamente
al constructor de la subclase, y ella se encargará de llamar al constructor de su superclase.
Para ello PHP introduce la expresión parent:: para poder acceder a las propiedades y métodos de la superclase.
De esta manera:

Sublcase constructor

Constructor subclase
Sin embargo, es fácil que en el constructor de la subclase tengamos que hacer algo más, como hemos visto en
nuestra clase Vendedor. Por lo tanto, escribiremos el nuevo constructor, llamando explícitamente al de la
superclase.

Sobrescribir Métodos

Otro tema importante a tratar es que ahora que tenemos nuestra clase vendedor con sus propiedades/métodos
heredados y propios, queramos darle nueva funcionalidad a métodos que ya tiene.
Como por ejemplo en el método calcularsalario de la clase empleado.
Como vemos, el vendedor calcula el salario de manera destina al empleado ya que toma en cuenta las
comisiones.
Pues bien, en PHP podremos sobrescribir métodos en las subclases sin más que volverá escribir la función con el
mismo nombre que la heredada.

Subclase métodos
Por tanto, si creamos un objeto de la clase vendedor y llamamos a calcularsalario, llamaremos al método
sobrescrito, mientras que si lo que creamos es un objeto de la clase empleado y volvemos a llamar a
calcularsalario, estaremos refiriéndonos al método heredado.
Veamos un ejemplo al completo, llamando a los dos calcularsalario:

Uso de clases y sublcases


Repasando este código vemos que:
Clases y subclases explicación
Éste es el resultado que obtendrá:

Navegador web
El resultado es un poco desconcertante porque el cálculo del salario funciona bien para el objeto de la clase
Empleado pero no para el de la clase Vendedor.
Ahora veremos por qué.
El Acceso Protected

Parece que el problema está en el método calcularsalario de la clase Vendedor, ya que no funciona demasiado
bien.

Clase y método
¿Qué sucede? Muy sencillo, fíjese que utiliza la expresión $this->salario para acceder al salario del vendedor.
Hay un problema en esto, ya que dicha propiedad viene heredada de la clase Empleado y allí se definió como
privada para la clase. Es decir, que se da la paradoja de que aunque el vendedor es un empleado, no puede
acceder a una de las propiedades privadas de la clase Empleado.
Existen dos formas de solucionar este problema:
Puede crear un método public o protected en la clase Empleado de forma que se acceda a la propiedad privada
(el típico procedimiento get) y utilizar este método en la clase Vendedor.
Puede declarar la propiedad como protected en lugar de private.
El modificador protected permite que la propiedad o método sea accesible tanto en la clase en la que se define
como en sus subclases.
Clase modificador protected
Ahora sí que funcionará bien el cálculo, ejecutándose la versión correcta del método calcularsalario en función de
si se trata de un objeto Empleado o un objeto Vendedor.
En este último caso, además de su salario, recibe el 15% de las ventas, que ascendían a 100 unidades en este
mes. Por lo tanto, su salario es de 18015 unidades monetarias.
De todas formas, es una buena costumbre ocultar las propiedades con el modificador prívate y escribir los
métodos get / set si necesitamos que se utilicen fuera de la clase.
Práctica 16

En esta práctica completará el código de un archivo con clases que se le proporciona como ejemplo para reforzar
el concepto de herencia.
Copie el archivo clases.inc.php en el directorio de su sitio web.
Podrá encontrarlo entre los trabajos del curso.
En este archivo encontrará el código correspondiente a tres clases: Recurso, Libro y Video.
La clase Recurso representa todos los recursos de una biblioteca, mientras que Libro y Video son recursos
especiales, ya que presentan ciertas características únicas.
Abra el archivo en Dreamweaver o en su editor preferido y estudie detenidamente el código existente.
Modifique el código de forma que:
Indique que las clases Libro y Video son subclases de la clase Recurso.
Añada la línea necesaria en el cuerpo del constructor de la clase Libro y de la clase Video para realizar la llamada
al constructor de la superclase, pasándole los parámetros oportunos.
Una vez realizadas estas dos modificaciones, responda a las siguientes preguntas:
¿Es posible reservar un objeto de la clase Recurso? ¿Y de la clase Video?
¿Qué clases del proyecto disponen de una propiedad llamada registro?
¿Es posible omitir la llamada al constructor de la clase Recurso en las clases Libro y Video?
Haga una definición de las clases Libro y Video, atendiendo a las características únicas que presentan.
Modifique el acceso a la propiedad prestado de la clase Recurso para que se pueda acceder a ella desde sus
subclases.
Guarde los cambios efectuados en el archivo.
A continuación se lista el código correspondiente al estado inicial del proyecto:
Solución de la práctica 16
Algunas consideraciones:
Para indicar que las clases Libro y Video son subclases de Recurso, se utiliza la palabra extends en la definición
de la clase, como puede ver a continuación:

Los constructores quedarían así:


Clase Libro

Clase Vídeo

Observe que lo primero que se hace es la llamada al constructor de la superclase, para lo que se utiliza parent::
y se le pasa los parámetros que necesita dicho constructor: registro, titulo, año e idioma.
La misma idea se sigue en los métodos sobrescritos prestar y devolver de la clase Libro.
Tras realizar alguna acción adicional, se llama al método correspondiente de la superclase
Recurso:
parent::prestar( ) y parent::devolver( ).
Esto es así porque al prestar o devolver un libro, debemos comprobar si está reservado y después hacer lo
mismo que con cualquier otro recurso.
Respuestas a las preguntas:
No, ya que el método reservar es una característica específica de la clase Libro.
Todas, ya que se define en la clase Recurso y se hereda en la clase Libro y Video.
No, ya que hemos escrito un constructor en la subclase. Por lo tanto, PHP no llamará automáticamente al de la
superclase si no lo hacemos nosotros en nuestro código.
"Un libro es un recurso que tiene un autor, una editorial y que puede ser reservado por lo que hay que tener
especial cuidado con ello a la hora de prestarlo y devolverlo".
"Un vídeo es un recurso que tiene un director, un productor y un sistema de vídeo".
Lo importante en las definiciones anteriores es la expresión "es un", indicando que son subclases de la clase
Recurso.
Para cambiar el acceso de la propiedad prestado, lo único que tiene que hacer es sustituir el modificador private
por protected:
protected $prestado.

A continuación se lista el código final:


Recuerda
Cuando usted encuentre una clase de la que parte de sus propiedades y sus métodos sean comunes a otra clase,
podrá crear una subclase a partir de ella.
En PHP para indicar que una clase es subclase de otra, utilizarla la palabra reservada extends.
En toda relación de herencia encontrará que puede utilizar la expresión “es un”. Esto ocurre en nuestro caso: un
vendedor es un empleado que tiene una parte variable de su sueldo en comisiones.
PHP introduce la expresión parent:: para poder acceder a las propiedades y métodos de la superclase.
En PHP podremos sobrescribir métodos en las subclases sin más que volverá escribir la función con el mismo
nombre que la heredada.
Preguntas de Autoevaluación
1.
Indica si la siguiente afirmación es verdadera o falsa: 
"En PHP para indicar que una clase es subclase de otra se utiliza la palabra reservada extends”.
Verdadero.
Falso.
2.
¿Se puede utilizar la expresión parent:: para acceder a métodos de la superclase que no son su constructor?:
Si.
No.
3.
¿Se imprimirá el mensaje “Se ha creado el objeto” al crear un objeto de la clase B? 

Si.
No.
4.
¿Qué acceso tiene que tener una propiedad o método para que sólo sea accesible desde la propia clase y en sus
subclases?:
Prívate.
Protected.
Public.
5.
Indica si la siguiente afirmación es verdadera o falsa: 
“El modificador protected permite que la propiedad o método sea accesible tanto en la clase en la que se define
como en sus subclases”.
Verdadero.
Falso.

Introducción

La ventaja fundamental de utilizar una tecnología de programación de páginas dinámicas, como PHP, es que el
resultado que recibe el usuario que solicita una página puede estar en función de los detalles que ha
proporcionado.
La página se construye en el momento de la solicitud con el contenido personalizado, lo que evita tener
almacenadas muchas páginas estáticas en su lugar.
Sin embargo, para todo ello tenemos que ver cómo recoger la información que nos facilita el usuario y que le
solicitamos para conocer lo que realmente desea recibir.
En estos casos se suelen aplicar dos enfoques:
Utilizar hipervínculos que apuntan a una única página pero proporcionando “información adicional” para que el
servidor pueda personalizarla.
Utilizar formularios HTML donde el usuario introducirá los datos necesarios y los enviará al servidor.
Independientemente de cómo se envíe la información al servidor, éste tiene que ser capaz de recogerla y
trabajar con ella. Para ello, PHP proporciona una serie de variables conocidas como superglobales.
El Array GET

Este método de envío de una página web tiene la característica fundamental de que la información necesaria
viene dada explícitamente en la URL o dirección de la propia página
Veamos un ejemplo:
Se trata de una página sencilla correspondiente a los productos “novedad” de una tienda virtual en Internet.
Hemos bautizado esta tienda con el nombre ficticio tiendaDETALLES.com.
Si le interesa conocer algún detalle adicional de estos productos, pulsará en el hipervínculo “Más
detalles” correspondiente.
Este texto no es más que un hipervínculo que apunta a una página donde encontrar los detalles adicionales del
producto en cuestión.
Podríamos crear una página html estática para cada uno de estos productos, pero sería muy tedioso y des-
organizado.
PHP, al ser dinámica, nos permite crear una sola página y construirla con el contenido adecuado.
Para hacer esto, lo único que hace falta es que al escribir el link a donde se te lleve la página, necesitamos
pasarle información. ¿Cómo?
Así,

Es decir, que queremos que nos lleve a la misma página pero con cierta información adicional, como es:
Familia= decorar y Producto=Cisne.
A estos detalles es a los que nos dará acceso después el array $_GET.
Tenemos que hacer esto con todos los hipervínculos de la página:

Ahora solo nos quedaría modificar el código de detalles.php para que supiera que hacer dependiendo de la
información que le pasemos:
Un ejemplo puede ser este:

En el que vemos que depende del valor familia y producto, las variables $imagen, $descripcion y $pvp cambiarán
su valor.
Por último en detalles.php vamos a escribir también el código html correspondiente para poder mostrar la
imagen, el precio y la descripción dependiendo de los parámetros introducidos.

Y en la barra de navegación de nuestro explorador, escribiremos por ejemplo:


http://localhost/PracticaPHP/detalles.php?Familia=Flores&Producto=Hucha
Y podremos ver que todo funciona correctamente:

El Array POST

El método Get sólo debe ser utilizado para transmitir poca información y que no tenga carácter privado, como
ocurre con el número de la tarjeta de crédito, los productos comprados, etc.
El método Post es el recomendable en prácticamente cualquier ocasión excepto en casos sencillos donde es
aceptable transmitir la información en la propia URL. Si utilizamos el método Post, accederemos al array
superglobal $_POST.
Veamos un ejemplo ilustrativo de lo que se conoce como un formulario HTML, donde el usuario introduce la
información solicitada en distintos controles, como cuadros de texto, casillas de verificación, listas desplegables,
etc.
Esa información es enviada al servidor web cuando pulsa en un botón del tipo Enviar. En este caso se trata del
formulario de registro en tiendaDETALLES.com. El usuario tiene que registrarse introduciendo los detalles
necesarios aquí para poder comprar en la tienda virtual.
Para conseguir la disposición que puede ver, se ha creado un formulario.
Dentro de este formulario la distribución de los controles y del resto del texto se consigue con una tabla.
Debemos indicar dos características del formulario HTML: qué método utilizará para enviar la información al
servidor web y en qué página se recogerá dicha información.
En la propiedad Method ya aparece que está seleccionado el envío mediante Post, aunque también podría utilizar
el método Get, para que la información se pasara en la propia URL de la página.
Por otra parte, en la propiedad Action indicaremos la página que recogerá esa información. Puede ser una página
distinta o la misma en la que está trabajando.
En este caso utilizaremos una página distinta para recoger y trabajar con la información enviada por el usuario.
Veamos cómo quedan representados estos dos detalles en el código de la página:
<form name="form1" method="post" action="finalregistro.php">
Fíjese que la etiqueta <form> tiene el atributo method establecido al valor post, indicando el método con el que
se envía el formulario; y el atributo action establecido a la página que recogerá dicha información.
Finalmente, otro detalle importante es establecer el nombre de los controles del formulario, ya que después los
utilizaremos para poder acceder a la información que allí haya introducido el usuario.
Fíjese que el nombre de este control es direccion (no utilice acentos para los nombres).
Lo importante es que sea un nombre lo suficientemente descriptivo para que después sea sencillo hacer
referencia al control en el código php.
Veremos que utilizando el array $_POST será muy sencillo hacerlo porque se trata de un array asociativo en el
que podremos utilizar el nombre de los controles que hemos establecido en el código HTML.
Recogerlos En Una Página Distinta

En esta sección veremos cómo recoger los datos del usuario mediante el array $_POST en una página distinta a
la que procesa los datos.
Veamos un ejemplo:
finalregistro.php

Imaginemos que tenemos este código que muestra los datos del usuario recogidos en otro sitio en una nueva
pestaña.
Pues bien, para llamarlo simplemente deberíamos escribir en el campo action del formulario que recoge esos
datos la dirección de este código, de esta manera:

Pruebe a crear un formulario, con los datos que aparecen en finalregistro.php y pruebe que efectivamente
funciona y los datos son mostrados en otra página diferente.
Sin embargo, hay que tomar precauciones cuando mostremos información suministrada por el usuario, ya que
podría introducir en ella código ejecutable (como código de la parte cliente escrito en JavaScript) para realizar
alguna acción no lícita.
Recogerlos En La Misma Página

Nuestra intención es hacer lo mismo que en el apartado anterior, pero con la diferencia de que los datos a
mostrar, lo hagan en la misma página.
Esto se realiza mediante otro array, $_SERVER y comprobando en la página si es la primera vez que se accede o
no.
Esto último lo podemos comprobar así:

Comprobamos si el array $_POST está definido. Si no lo está, quiere decir que es la primera vez que se accede a
la página y todavía no se ha enviado ninguna información mediante el método Post.
Y en este caso mostraremos el formulario.
También tenemos que cambiar la página que recogerá la información suministrada en el formulario, ya que ahora
queremos que sea la propia página.

Con esta expresión indicamos que la página que manejará la información es la misma página en la que estamos
escribiendo el código.
¿Y si $_POST tiene valor?
Entonces significará que el usuario ha introducido algún dato, por lo que debemos mostrar la página de
confirmación, escribiendo el mismo código que habíamos escrito en registrofinal.php pero ahora en esta página.
Por tanto en resumen sería así:
If ( !$_POST){
Muestro formulario y recojo datos.
}
else{
Muestro confirmación de los datos recogidos.
}
Entradas Requeridas

Ahora que sabemos cómo recuperar los datos que introduce el usuario en un formulario, es el momento de
indicar que siempre hay que desconfiar de dicha información y validarla adecuadamente.
Está claro que podremos validar dicha información utilizando programación del lado cliente, como en JavaScript,
para que no sea necesario enviar al servidor la información hasta que no se haya validado correctamente.
Sin embargo, la validación final siempre deberá realizarse en el servidor, utilizando la validación cliente sólo
como un primer filtro.
Así, en el servidor deberemos comprobar cosas como que:
Se han rellenado campos obligatorios del formulario.
El formato de la información introducida sea correcta. Por ejemplo, si se trata de una dirección de correo
electrónico, que cumpla con los requisitos que tiene este tipo de direcciones.
No se incluya texto que pueda representar secuencias ejecutables. Por ejemplo, un usuario “avispado” podría
escribir en lugar de su nombre, una secuencia <script> ejecutable por el navegador.
Una manera de conseguir que un campo obligatorio sea rellenado es mediante la función empty, y la podemos
utilizar de esta manera:

Pero… ¿qué pasa si es la primera vez que se entra en la página? Pues que el array $_POST es vacío y por
tanto $_POST[“email” ] también, y por tanto, se ejecutará el mensaje.
Pues para “arreglarlo” podemos poner una variable booleana para diferenciar si es la primera vez que entramos o
no.
Y para darle un valor a esta variable $primeravez hay un truco que consiste en comprobar si se ha pulsado el
botón de enviar o no, de esta manera:

Práctica 17a

En esta práctica trabajará con el array superglobal $_GET, que da acceso a información suministrada en la
misma URL de la página.
Abra la página practica17a.php en NotePad++ o en el editor que esté usando.
Puede encontrarla entre los trabajos de la lección.
En esta página encontrará una tabla HTML con el siguiente aspecto.

Copie la carpeta images, que también encontrará entre los trabajos, en el directorio de su sitio web. En esta
carpeta aparecen imágenes correspondientes a los productos de una tienda virtual.
Algunas de ellas las utilizaremos en esta práctica.
Tiene que modificar el código de la página de forma que:
El texto correspondiente a cada uno de los productos (Figurita cisne, Despertado, Ramo flores 1, etc.) pase a ser
un hipervínculo que apunta a la misma página, pero con información adicional en la URL que indique a qué
producto hace referencia el hipervínculo.
Comprobar si existe dicha información adicional y, en caso afirmativo, utilizarla para mostrar la imagen correcta
en la columna central de la tabla HTML. Si no aparece esa información adicional, se mostrará la imagen
nodisponible.gif.
Guarde los cambios efectuados y compruebe el resultado en su navegador web. En la página siguiente puede
verlo, eligiendo el primer producto de la izquierda.
Solución de la práctica 17a
La práctica es más sencilla de lo que puede parecer a primera vista.
La cuestión está en generar hipervínculos para cada uno de los nombres de los productos, que apunten a la
misma página web (practica17.php), pero con información adicional. Esta información se pasa añadiendo un
interrogante ? y lo que queramos, como pares (clave, valor).
Por ejemplo, en nuestro caso podremos pasar el producto en cuestión al que da acceso el hipervínculo: <a
href="practica17.php?producto=1">Figurita cisne</a> sería para el primer producto.
Después, nuestro código php tiene que comprobar si se proporciona dicha información en la URL, para lo que
utilizará el array superglobal $_GET, y obrar en consecuencia.
Aquí puede ver una posible solución:
Práctica 17b

En esta práctica utilizará el formulario de registro de la tienda ficticia de comercio electrónico


tiendaDETALLES.com.
Copie los archivos registro.php y estilo.css, que encontrará en los trabajos del curso.
Abra la página registro.php y añada el código php necesario en esta página para que:
La información suministrada por el usuario sea recogida en el mismo formulario de registro, utilizando el método
Post.
Sea obligatorio introducir, al menos, todos los campos que incluyen un asterisco (*) junto a su nombre: el
nombre, apellidos, email y contraseña.
En el caso de que no se haya introducido alguno de esos campos, el formulario debe aparecer tal cual, pero con
la información que sí que haya introducido el usuario (excepto los campos de contraseña).
Además, antes de dicho formulario aparecerá una indicación por cada uno de los datos obligatorios que falten.
Puede utilizar el estilo error de la hoja de estilos estilo.css.
En caso de haber introducido todos los detalles obligatorios, el resultado será simplemente dicho formulario con
todos los valores introducidos por el usuario excepto los de la contraseña.
Guarde los cambios efectuados y pruebe la página con su navegador web.
Solución de la práctica 17b
Algunas consideraciones:
Como vamos a utilizar la misma página para enviar y recoger los datos, es necesario diferenciar entre la primera
vez que aparece la página en el navegador y las restantes, una vez se ha pulsado el botón Enviar y ha vuelto del
servidor web. Para ello, utilizaremos la variable $primeravez.
El atributo action del formulario se establece a

para indicar que es la propia página.


La estrategia que se sigue para que los distintos campos mantengan la información introducida por el usuario
aunque el formulario no haya superado todas las validaciones es la de proporcionar el valor en cualquier caso:
Si es la primera vez, tendrán un valor vacío ("").
Si no es la primera vez, el valor almacenado en la correspondiente variable del array $_POST.
Para comprobar si un campo está vacío se utiliza la función empty.
Por ejemplo, en el caso de los campos obligatorios.
Para comprobar que se ha enviado el formulario, se utiliza el valor de $_POST["botEnviar"].
Finalmente, un detalle interesante es cómo mantener la selección de la provincia, que no es un cuadro de texto
sino una lista desplegable. En este caso, se tiene que indicar qué elemento de la lista está seleccionado con el
atributo selected.
Para saberlo, se comprueba el valor de $_POST["provincia"] y, si es el caso, se establece dicho atributo.
Obsérvelo con un ejemplo:

A continuación puede ver el código más interesante.


Como puede comprobar, el código se empieza a complicar y empieza a ser cada vez más grande, por lo que
podrá encontrar una copia de éste en la carpeta de recursos del curso.
Recuerda

En PHP la página se construye en el momento de la solicitud con el contenido personalizado, lo que evita tener
almacenadas muchas páginas estáticas en su lugar.
Independientemente de cómo se envíe la información al servidor, éste tiene que ser capaz de recogerla y
trabajar con ella. Para ello, PHP proporciona una serie de variables conocidas como superglobales.
El Método GET de envío de una página web tiene la característica fundamental de que la información necesaria
viene dada explícitamente en la URL o dirección de la propia página.
El método Post es el recomendable en prácticamente cualquier ocasión excepto en casos sencillos donde es
aceptable transmitir la información en la propia URL.
En la propiedad Method ya aparece que está seleccionado el envío mediante Post, aunque también podría utilizar
el método Get, para que la información se pasara en la propia URL de la página.
La validación final siempre deberá realizarse en el servidor, utilizando la validación cliente sólo como un primer
filtro.
Una manera de conseguir que un campo obligatorio sea rellenado es mediante la función empty.
Preguntas de Autoevaluación

1.
¿Cuántas claves distintas se pasan en la siguiente URL?: 

Solo uno: Familia=Hogar&Producto=


Dos: Familia y Producto.
Dos: Hogar y
2.
¿En qué método se envía la información a través de la propia URL de la página?:
GET.
POST.
3.
¿Dónde se recoge la información enviada con este formulario?: 

En la propia página donde está el formulario.


En la página indicada en el atributo action.
4.
¿Qué expresión debería utilizar para acceder a la información introducida en un cuadro de texto llamado
identidad de un formulario?
$_GET[“identidad”].
$_POST[“identidad”].
5.
Indica si la siguiente afirmación es verdadera o falsa: 
“Cuando validamos información mediante JavaScript, esta la hace antes de enviar la página al servidor”.
Verdadero.
Falso.

Expresiones Regulares

En el apartado anterior hemos visto como comprobar si se ha rellenado un campo obligatorio o no.
Pues bien, ahora comprobaremos que tenga un formato válido.
Un ejemplo típico es el campo email, donde sabemos que tiene una @, un punto, etc.
Sabiendo esto… ¿Por qué no construir un sentencia que permita comprobarlo?
Para hacer este tipo de comprobaciones se utilizan las llamadas expresiones regulares que no son más que una
forma de especificar, exactamente, el formato que debe cumplir una cadena de texto.
Veamos un ejemplo:

Aquí utilizamos la función eregi para comprobar si la cadena introducida por el usuario (que se almacena en el
elemento email de $_POST) concuerda con la expresión regular pasada como primer argumento de la función.
Es muy difícil conseguir una expresión regular que acepte todas las posibles direcciones válidas de correo
electrónico. Por eso, normalmente es mejor crear una expresión flexible abarcando posibles direcciones
incorrectas, que otra más concreta que pueda rechazar alguna válida:

Esto es un ejemplo de expresión regular, y aunque no es nuestro punto de estudio, veremos algunas “reglas”
para poder construir una expresión regular:
Y aquí una lista de expresiones regulares muy útiles y ya creadas:
Limpiando La Información

Imagínese un formulario login.php en el que pide el nombre y la contraseña para entrar.


Qué pasaría si en vez de escribir un nombre, escribiésemos una consulta en JavaScript como por ejemplo:

Y… ¿Si le diéramos a enviar?


Pues que el servidor ejecutará el código correspondiente a la página de confirmación y devolverá ese código
JavaScript.
Y… no podemos permitir que un usuario desde su ordenador modifique el contenido de nuestra página web, por
tanto, habrá que “bloquearlo” de alguna manera.
Para ello, PHP por defecto, no permite que se haga, ya que tiene establecido el parámetro magic_quotes_gpc a
on del archivo de configuración php.ini.
Básicamente lo que hará magic_quotes_gpc será omitir los ‘ y los “ que se encuentre, impidiendo así que se
ejecute cualquier sentencia JavaScript.
Pero…
En ocasiones será necesario que el usuario pueda introducir texto con caracteres como <, >, etc., que
representan un riesgo de seguridad.
Para estos casos, PHP proporciona dos funciones que nos pueden ser de utilidad. Lo que deberemos hacer es
utilizarlas contra la información suministrada por el usuario para “limpiarla”.
Estas dos funciones son: strip_tags y htmlspecialchars.
Otra función útil para el propósito que estamos viendo es trim, que elimina los espacios en blanco al principio y
al final de las cadenas de texto.
En resumen, vemos que es necesario validar la información suministrada por el usuario. Esto será incluso más
importante cuando se guarde en un archivo o en una base de datos.
Utilizar sin ninguna prudencia dicha información nos puede llevar a resultados inesperados y, lo que es peor,
incluso dañino para nuestro sitio web.
Comprobando El Formulario De Origen

Imaginemos ahora la situación en la que un formulario login.php nos redirigiera una vez identificados a una
página con datos confidenciales llamada confidencial.php y que nosotros conociéramos el nombre de esa última
página y accediéramos directamente.
Estaríamos entrando en una página confidencial sin pasar primero por login.php y sin identificarnos.
No podemos permitir esto.
Una primera aproximación será comprobar desde dónde se viene.
Este detalle viene dado a través de la variable HTTP_REFERER del array superglobal $_SERVER.
Sin embargo, no podemos confiar en ese valor porque puede ser fácilmente modificable y aparentar el valor que
nosotros esperamos aunque realmente no se provenga de la página correcta.
Veremos que es necesario identificar claramente al usuario una vez haya pasado por login.php. Y esa forma será
a través de cookies o variables de sesión.
Práctica 18

En esta práctica completaremos el formulario de registro de la práctica anterior proporcionando una mayor
validación de la información introducida por el usuario.
Abra la página registro.php de la práctica anterior en su editor preferido.
Si no dispone de ella, la podrá encontrar entre los trabajos del curso.
Complete el código php de esta página utilizando una expresión regular para validar la dirección de correo
electrónico que introduzca el usuario en el formulario de registro. En caso de que no se supere esta validación,
indíquelo con un mensaje descriptivo al principio de la página, junto al resto de los mensajes de este tipo.
Utilice la función htmlspecialchars para “limpiar” toda esa información.
Guarde los cambios efectuados y pruebe la página en su navegador.
Solución de la práctica 18
Añadiríamos una línea más a la comprobación del principio de la página para la dirección de correo electrónico
que ha introducido el usuario. Fíjese que se utiliza una expresión regular y la función eregi:

Además, incluiríamos la función htmlspecialchars siempre que accedamos a algún elemento del array $_POST.
Por ejemplo:
También puede encontrar la solución de la práctica entre los trabajos de la lección.
Recuerda

Las llamadas expresiones regulares que no son más que una forma de especificar, exactamente, el formato que
debe cumplir una cadena de texto.
La función eregi sirve si para comprobar si la cadena introducida por el usuario concuerda con la expresión
regular pasada como primer argumento de la función.
La función magic_quotes_gpc omitirá los ‘ y los “ que se encuentre, impidiendo así que se ejecute cualquier
sentencia JavaScript.
Preguntas de Autoevaluación

1.
Indica si la siguiente afirmación es verdadera o falsa: 
“Es mejor utilizar una expresión regular que pueda abarcar direcciones de correo electrónico incorrecto que otra
más rígida que pueda rechazar alguna correcta”.
Verdadero.
Falso.
2.
¿Qué devolverá eregi cuando el patrón no concuerde con la cadena a analizar?:
True.
False.
3.
¿Cuál es el valor predeterminado del parámetro de configuración magic_quotes_gpc en php 5?:
On.
Off.
4.
Indica si la siguiente afirmación es verdadera o falsa: 
“magic_quotes_gpc sirve para evitar ataques JavaScript en los formularios”.
Verdadero.
Falso.
5.
¿Cuál es la función que elimina las etiquetas HTML de una cadena de texto?:
Strip_tags.
Htmlspecialchars.

Introducción

Una forma sencilla de mantener información de la visita que está realizando el usuario a nuestro sitio web es a
través de lo que se conoce como “cookies”.
Seguramente, más de una vez haya hecho una compra por internet, donde usted iba seleccionando artículos de
la página web y los iba añadiendo a un carrito o cesta de la compra.
La forma más sencilla de mantener este carrito virtual es a través de cookies.
Una cookie es información que mantenemos durante toda la visita del usuario a un sitio web, y que puede
referirse a elecciones, preferencias, etc. que ha ido efectuando, liberando al servidor de mantener estos datos.
Una característica propia de las cookies es que esta información se almacena en el ordenador cliente, es decir, es
responsabilidad del navegador.
Sin embargo, aunque esto es una ventaja, también se corre el riesgo de que el usuario modifique dicha
información o incluso que la elimine. Por ello, un sitio dirigido al comercio electrónico tiene que estar preparado
para esta circunstancia.
Crear Cookies

Aunque como hemos dicho es responsabilidad del navegador mantener la información de una cookie, es el
servidor quien debe de crearla para cada petición de página web que use cookies.
Cuando se inicia por primera vez una sesión, el servidor envía una cookie al navegador del usuario y cada vez
que el navegador del usuario solicite una página de ese servidor, se volverá a enviar la cookie al servidor, el cual
puede leer la cookie e identificar el navegador del usuario.
En realidad, una cookie no está relacionada con una página web en concreto sino con un determinado dominio,
de esta manera, si usted entra en www.unapaginaweb.com seguramente en su equipo tendrá una cookie
relacionada con elcorteingles.es
Y ahora vamos a lo más importante, ¿Cómo creamos y accedemos a una cookie?
Pues para acceder usaremos el array superglobal $_COOKIE y para modificarlo o crearlo usaremos la función
setcookie (“un nombre”, “un valor “).
Algo importante y que suele dar problemas, es que una cookie debe de crearse siempre antes de cualquier
código HTML, es decir, al principio de nuestra página, de esta manera:

Vamos a ver que hace esta función:


Lo primero es comprobar si la cookie de nombre “veces” tiene algún valor, es decir, si es la primera vez que
entramos a la página web. En dicho caso, usaremos setcookie para crearla, especificándole un nombre (“veces”)
y un valor (1).
Si no es así lo que hacemos es acceder al cookie $_COOKIE “veces” y añadirle 1 a su valor (sumándole 1)
también mediante la función setcookie.
Fíjese que para acceder usamos $_COOKIE y para modificarlo (aunque tengamos que acceder a él) utilizamos
setcookie.
Es un error común hacer $_COOKIE +1.
En ocasiones es interesante crear cookies con subvalores. Esto es así porque sólo disponemos de 4 KB para el
total de la información almacenada mediante cookies, ya que éste es el tamaño que permite la mayoría de
navegadores.
Por ello, podemos reducir la información enviada al servidor creando cookies como arrays:

La cookie Momento tiene dos subvalores: el valor Fecha y el valor Hora.


La misma sintaxis se utiliza para crear la cookie con subvalores.

Así, hemos modificado (o creado, si es la primera vez) la cookie Momento, estableciendo sus subvalores Fecha y
Hora a la fecha y hora del servidor.
Para ello, se han utilizado las funciones getdate y time.
Caducidad De La Cookies

La característica más importante de una cookie es su caducidad. Al crearla podemos establecer un valor entero
que indique cuánto durará.
Si no se indica ese valor en la función setcookie, la cookie se mantiene “viva” sólo en la memoria del navegador
por lo que desaparece al cerrarlo.
Veamos cómo hacerlo:

Aquí utilizamos la función isset para saber si la variable $Fecha_anterior tiene valor (es lo contrario que la
función empty), y, en ese caso, se imprime en pantalla la fecha y hora de la última visita del usuario, además del
número de veces que la ha visitado.
Tal y como pone en el ejemplo, cuando entremos por primera vez en la página web, obtendremos el mensaje de
bienvenida, la segunda vez, la fecha y hora del último acceso, la tercera, etc.
Hagamos una prueba, copie este código en un editor y pruebe a ejecutarlo.
Cuando entre verá que le muestra un mensaje de bienvenida. Ahora si actualizamos la página (botón actualizar
de nuestro navegador), vemos como cada vez que actualicemos nos muestra correctamente la información de la
fecha y el número de veces que hemos accedido.
Pero… Intenta cerrar el navegador y volverá a ejecutarlo.
¿Por qué me muestra otra vez el mensaje de bienvenida cuando no es la primera vez que he accedido?
En cuanto cerramos la sesión (cerramos el navegador), las cookies sin caducidad pierden su valor y se vuelven a
iniciar/inicializar de nuevo.
Pues para esto hace falta la caducidad.
Para establecer la caducidad de una cookie, debemos indicar la marca de tiempo correspondiente a esa fecha.
Esto lo haremos como un parámetro más de la función setcookie. setcookie(“Veces”, 1, time() + (3600 * 24 *
7));
Con esta expresión indicamos que la cookie tiene un período de vigencia de 7 días, ya que:
time( ) devuelve el momento o marca horaria actual,
(3600 * 24 * 7) representa los segundos que hay en 7 días.
Al establecer la caducidad de las cookies, éstas se almacenarán como un archivo de texto en el ordenador del
usuario y de allí se obtendrán mientras no hayan caducado.

A continuación se proporciona el código completo del archivo


cookies.php:
Dependencia Del Navegador

Un problema importante de los cookies es la dependencia del navegador.


Así, las cookies que se almacenan en memoria sólo están disponibles para la instancia del navegador en la que
se han creado. En el caso de las cookies guardadas en disco duro, todas las instancias del navegador pueden
acceder a ellas.
Como existe la posibilidad de que las cookies se almacenen en el disco duro del usuario, el navegador permite
que sea el usuario quien decida si esto es posible o no.
Por tanto, entre en su navegador e investigue en la sección de cookies para ver la política de privacidad. Cada
navegador asigna una por defecto.
Características De Los Cookies

Las cookies incrementan el tráfico en la red, ya que en cada petición HTTP que realiza el navegador, se incluyen
las cookies que coinciden con el dominio al que se accede.
Las cookies incrementan el tiempo de respuesta del servidor, ya que el servidor tiene que recoger la información
de cookies y rellenar el array $_COOKIE.
Las cookies son dependientes del equipo en el que se crean: tenga en cuenta que un usuario podría utilizar
distintos ordenadores, mientras que las cookies almacenadas en disco duro estarían siempre en el equipo donde
se han creado. En definitiva, las cookies permiten que el servidor identifique un navegador, pero no directamente
a un determinado usuario.
Las cookies pueden sufrir alteraciones: al estar almacenadas en el equipo del usuario, éste es libre de
modificarlas.
Las cookies son seguras, ya que el navegador sólo las envía al servidor del sitio web que las ha creado, por lo
que no pueden ser recibidas en ningún otro sitio.
Podemos aplicar características de seguridad al enviar y recibir cookies. Para ello, se utiliza el protocolo SSL, que
encripta el contenido de las cookies al enviarlas, consiguiendo que no sea fácil obtenerlas por terceros.
¿Qué Es Una Sesión?

¿Qué pasa si en vez de querer almacenar la información en la memoria del navegador, quisiéramos almacenarlo
en la del servidor para que sea él quien pueda diferenciar entre las distintas peticiones que realizamos los
usuarios?
Para ello, habría que identificar al navegador cada vez que solicitara una página al servidor.
Para conseguirlo, el servidor trabaja con el concepto de sesión, facilitando al programador un recipiente o lugar
donde almacenar información que esté disponible en toda la visita del usuario al sitio web.
Esta información de sesión será almacenada en el array superglobal $_SESSION.
Cada sesión establecida dará lugar a un nuevo array $_SESSION.
Es un poco complicado de entender, así que vayamos poco a poco.
Una sesión se inicia cuando un cliente, solicita una página .php albergada en un servidor y finaliza solamente por
dos motivos,
El cliente lo solicita explícitamente
Se acaba el tiempo establecido para su sesión.
Por tanto, el hecho de cerrar el navegador no significa, que cerremos la sesión, ya que el servidor no tiene
manera de comprobar este hecho.
Y aquí está la clave del asunto: el servidor, al entregar la página (recuerde, ya en HTML) al cliente, le asigna una
cookie de identificación con la cual podrá identificar a la sesión.
Por tanto, el servidor hará dos cosas al recibir una petición del cliente:
Creará el correspondiente array $_SESSION.
Asignará una cookie “especial” de identificación al cliente.
¿Y porque esta cookie es “especial”?, Pues porque no hará falta crearla con setcookie, sino que se creará
automáticamente y además, se almacenará siempre en la memoria del navegador.
Por tanto, si salimos del navegador, esta cookie desaparecerá pero… la sesión en el servidor quedará abierta y
no podremos recuperarla ya que la cookie que la identificaba ha desaparecido.
¿Qué ocurre en este caso con la sesión que tenía abierta?
Pues que transcurrido un tiempo, el servidor la cancelará, por lo que es recomendable establecer siempre que
usemos sesiones un botón de “desconexión” que nos permita aparte de eliminar la cookie de identificación,
cerrar la sesión actual.
Veremos cómo.
El Array SESSION

Las sesiones son, por lo tanto, otra forma de almacenar información de un determinado usuario, pero, a
diferencia de las cookies, esa información se almacena en el servidor, por lo que se tiene control total sobre
dicha información.

Fíjese en la figura anterior en la que tenemos una página web donde aparece una lista desplegable con una serie
de productos y un botón que permite enviar al servidor cuál es el producto elegido.
Veamos cómo manejar las sesiones con este ejemplo.
Comentemos un poco este código:
En la línea 9, tenemos una comprobación de si es la primera vez que accedemos o no a la página comprobando
si el array $_POST está vacío (tal y como llevábamos haciendo hasta ahora).
De la línea 13 a la 21 tenemos un formulario fácil con method=post y action= $_SERVER[‘PHP_SELF’] es decir,
que mediante el método post enviaremos la información recogida a la misma página.
En la línea 25 tenemos el else que indica que no es la primera vez que accedemos a la página.
De la línea 27 a 40 tenemos un switch que comprueba que hemos seleccionado del formulario en el apartado
“Productos” y por cada caso, añadimos al array $_SESSION un valor determinado.
Y además en la línea 43 hemos añadido un hipervínculo “volver” que nos devuelve a $_SERVER[‘PHP_SELF’] es
decir “atrás”.
Seguro que le ha llamado la atención que la línea 8 está comentada. Pues bien, pruebe a copiar este código en
su editor y ejecútelo.
Elija un producto, déle a enviar y vea su cantidad.
Vuelva atrás elija otro producto a ver qué pasa con esa cantidad.
Pues como puede ver, si la línea está comentada, no se crea ninguna sesión por lo que el contenido en
$_SESSION no se almacena ni acumula.
Sin embargo podemos crear una sesión con session_start () y ver qué pasa.
Efectivamente, ahora aunque volvamos atrás podemos ir acumulando precios, ya que la variable $_SESSION
estará activada y no se desactivará hasta como hemos dicho, lo indiquemos explícitamente o expire su tiempo de
vida.
Fíjese que deberemos activar la sesión explícitamente porque, por defecto, la configuración de PHP no da soporte
a las sesiones.
La Función Ob_start() Y Ob_clean()

Algo muy importante a tener en cuenta a la hora de usar sesiones, es que PHP 5 ya no permite iniciar sesión
( session_start() ) en cualquier sitio de la página web sino que debe ser iniciada antes de ejecutar cualquier
etiqueta html.
Por ejemplo, veamos un ejemplo de lo más sencillo.

Código de programación
Donde no haremos nada, solo crear la estructura de una página en html.
Pues bien, si intentamos ejecutarla en nuestro compilador, veremos un error como este:

Tablas con varias columnas


Y esto ocurre, exactamente por lo que hemos dicho antes.
No podremos iniciar una sesión a mitad de un código html, sino al principio de todo, como en este ejemplo:

Código de programación
Pero claro, no siempre querremos iniciar sesión al principio del código.
Para ello necesitamos la función ob_start() y ob_clean().
Si queremos por tanto, iniciar sesión después de haber escrito código html deberemos encerrar todo lo que haya
inmediantamente antes de session_start() entre estas dos funciones.
Será como si encerraramos todo el contenido html en un buffer, para hacer creer a la página que no ha sido
escrito y así poder ejectuar session_start() como si estuviese al principio, y luego con ob_clean(), sacarlo del
buffer para imprimirlo.
De este modo:
Código de programación
Finalizar La Sesión

Como ya hemos dicho, son 2 las maneras de finalizar con una sesión:
Esperando a que expire el contador de tiempo asociado a la sesión
Indicando explícitamente que queremos cerrar la sesión.
Pues bien, esto último podremos hacerlo mediante la función session_destroy().
La mejor manera entonces de cerrar entonces una sesión será la de crear un botón o un hipervínculo que se
llame desconexión y que llame a esta función.
Como el de la siguiente imagen:

Formulario lista desplegable


En este caso hemos usado un hipervínculo, en el que mediante el array $_GET recogeremos el valor de una
variable que nos indicará la desconexión.

Código html
Y luego en el código habrá que modificarlo de esta manera:

Código de programación
Después veremos que la información de sesión se puede almacenar de distintas formas, pero, por defecto, se
hace como archivos en un lugar del servidor.
Esto hace que esa información no se pierde aunque reiniciemos el servidor web, lo que es una gran ventaja.

El Identificador De La Sesiones

Repasando lo que hemos visto hasta ahora referente a las sesiones vemos que:
Las sesiones tienen un identificador que se guarda, por defecto, en una cookie que recibe el navegador la
primera vez que se crea la sesión y que viaja con cada página a partir de ese momento para identificar esa
sesión.
Para acceder a la información almacenada en la sesión se utiliza el array superglobal $_SESSION.
Vamos a ver más detalles referentes a la forma de identificar las sesiones.
Por ejemplo, veamos el significado de las distintas directivas de configuración que aparecen en el archivo php.ini
respecto a la cookie de sesión:
session.save_path: aquí se especifica la ubicación donde se almacenará la información de sesión. Después
veremos que, inicialmente, esa información se almacena como un archivo de texto por sesión, pues aquí se
indicaría dónde se guardan esos archivos.
Es importante que la ubicación indicada en esta directiva esté fuera del espacio de documentos web del sitio, de
forma que ningún usuario pueda acceder a él a través de su navegador.
session.use_cookies: aquí se indica si se podrán utilizar cookies para identificar la sesión. El valor 1 indica que sí,
mientras que el valor 0 impediría que se utilizaran cookies para este propósito.
session.name: aquí indicaremos el nombre de la cookie que se utiliza para identificar las sesiones. Por defecto, el
nombre es PHPSESSID y la verdad es que no tiene sentido cambiarlo excepto en el caso de que tengamos más
de un sitio web en el mismo servidor y necesitemos diferenciar las sesiones de cada uno de ellos.
session.autostart: ¿RECUERDA que tuvimos que iniciar explícitamente la sesión con la función session_start en el
código de la página? Bien, si establecemos la directiva session.autostart al valor 1, entonces esto no será
necesario ya que se iniciará una sesión automáticamente al solicitar cualquier página php del sitio web. Es como
si incluyéramos una llamada a la función session_start al principio de cada página.
session.cookie_lifetime: aquí indicamos el período de vigencia de la cookie que identifica la sesión. Si se
establece al valor 0, entonces se tratará de una cookie que sólo se almacena en la memoria del navegador;
mientras que un valor distinto haría que se almacenara en el disco duro del usuario durante su vigencia.
Recuerde que si la cookie se almacena en la memoria del navegador, se eliminará al cerrarlo.
session.cookie_path: aquí indicamos para qué directorios será válida la cookie que identifica la sesión.
Por ejemplo, podríamos desear utilizar la información de sesión sólo en un subdirectorio y no en todas las
páginas del sitio web, como es el valor predeterminado (/).
Pero, ¿qué ocurre si el usuario ha configurado su navegador para no permitir las cookies?
Esto depende de la configuración de la directiva session.use_trans_sid. Si se establece a 1, entonces PHP busca
otra forma de identificar la sesión, que es pasándola a través de la URL de la página o como un campo oculto de
un formulario.
Por defecto la configuración de esta directiva es que está desactivada, pero si la activamos, PHP pasará mediante
Get o Post el identificador de la sesión:
En los hipervínculos añade el identificador de la sesión, de forma que éste se envía junto a la URL de la página
de destino, como puede ver en la figura de la página siguiente.
Si lo que hacemos es enviar la información mediante un formulario utilizando el método Post, utilizará un campo
oculto para pasar el identificador de sesión.
Recuerde que PHP utilizará estos métodos alternativos para identificar la sesión sólo cuando no se permitan las
cookies y si hemos habilitado la directiva session.use_trans_sid.

El Identificador De La Sesiones

Primero siempre intenta utilizar cookies, ya que es un método mucho más seguro que pasar el identificador de la
sesión bien mediante la URL de la página (GET) o mediante un campo oculto en un formulario (POST).
11. ¿Dónde se almacena la información?
Ahora veremos dónde se almacena físicamente la información de las distintas sesiones que se establecen.
La forma en que el servidor web guarda la información de sesión viene dada por el valor de la directiva
session.save_handler del archivo php.ini. Esta directiva puede tomar tres valores:
files: es el valor predeterminado e indica que la información de sesión se almacenará en forma de archivos.
mm: indica que se guardará en la memoria RAM del servidor.
user: permite establecer una forma de almacenar la información “personalizada” como por ejemplo en una base
de datos.
Adicionalmente, la directiva session.save_path indica la ubicación donde se almacenarán los archivos si
utilizamos el método predeterminado. El paquete XAMPP configura la ubicación c:\apachefriends\xampp\tmp (o
en la ruta donde haya instalado apache)
En esta carpeta podrá ver estos archivos de sesión que se irán eliminando de forma más o menos rápida,
dependiendo de si el usuario utiliza session_destroy() o deja que expire su tiempo.
Por tanto es necesario que el servidor proteja bien estos archivos ya que es donde se almacena la información de
los usuarios que visitan nuestra web.
12. Práctica 19a
En esta práctica creará cookies en el equipo del usuario para recordar su nombre y el color del texto que más le
gusta.
Copie el archivo practica19a.php , que podrá encontrar en entre los trabajos del curso.
Abra este archivo en el editor que esté utilizando y observe su aspecto. La idea de la página es guardar las
preferencias del usuario, esto es, su nombre y color elegido, en cookies, de forma que no tenga que volver a
indicarlo durante un determinado tiempo.
Así, el usuario introducirá su nombre y elegirá uno de los colores que aparecen en la lista desplegable (Gris,
Amarillo o Verde), aceptando a continuación.
En ese momento, deberá crear una cookie con el mensaje de bienvenida, que será del estilo de "Hola...", donde
en los puntos suspensivos aparecerá el nombre que haya introducido, y otra cookie para el color del texto
elegido.
Establezca un período de vigencia de un mes para las cookies.
La primera vez que acceda el usuario a la página verá este formulario, pero una vez establecidas las cookies,
deberá obtener únicamente el mensaje de bienvenida.
Pruebe la página introduciendo un nombre, eligiendo un color y pulsando en el botón Aceptar. Fíjese que tiene
que recargar la página para poder utilizar el valor de las cookies, ya que no se podrá acceder a él a la vez que se
establece.
Puede cambiar el color del texto utilizando una etiqueta HTML
<FONT color=...>Mensaje</FONT>,
Donde pondrá el valor de la cookie que guarda la elección efectuada por el usuario en el formulario.
Cierre el navegador y vuelva a abrirlo con la misma página.
Observe que el mensaje de bienvenida sigue apareciendo porque las cookies son persistentes.
El Identificador De La Sesiones

Elimine las cookies a través del comando adecuado de su navegador y vuelva a solicitar la página. Compruebe
que aparece como estaba inicialmente, en la situación en que se solicita un nombre y un color. Introduzca y
acepte los nuevos detalles.
Solución de la práctica 19a

Algunas consideraciones:
Para crear cookies se utiliza la función setcookie, estableciendo el nombre de la misma, su valor y la fecha de
caducidad, si no queremos que sólo exista en la memoria del navegador. Para acceder a ellas, utilizamos el array
$_COOKIE.
Por ejemplo, setcookie("Color", $_POST["color"], time() + (3600 * 24 * 30));
Con la expresión time( ) + (3600 * 24 * 30) especificamos el número de segundos que hay en un mes.
13. Práctica 19b
En esta práctica trabajará con sesiones para obtener el mismo resultado que conseguimos en la práctica anterior,
pero guardando los detalles particulares del usuario en el servidor web en lugar de hacerlo en el equipo del
usuario.
Abra el archivo practica19a.php de su sitio web en Dreamweaver o en el editor que esté utilizado. Si no dispone
de este archivo, puede encontrarlo entre los trabajos de la lección.
Modifique el código php de esta página de forma que ahora no se utilicen cookies sino sesiones en el servidor
web. Guarde la página modificada como practica19b.php.
Compruebe el resultado. Para ello, muestre la página en el navegador, introduzca los datos solicitados y pulse en
el botón Aceptar.
Después, sin cerrar el navegador, acceda a otra página web escribiendo su dirección en el campo Dirección del
navegador.
Sin cerrar el navegador, vuelva a solicitar la página practica19b.php escribiéndola en el campo Dirección. El
resultado que debe obtener es directamente el mensaje de bienvenida, ya que la información está disponible a
través del array $_SESSION de la sesión actual. Si no es así, seguramente es porque el navegador mantiene la
página en su caché (pulse en el botón Actualizar y verá cómo sí que aparece el mensaje de bienvenida, ya que
se vuelve a solicitar la página al servidor web).
Cierre el navegador y vuelva a abrirlo. Solicite de nuevo la página practica19b.php y verá que vuelve a aparecer
el formulario para introducir el nombre y color deseados, ya que el servidor no puede identificar la sesión porque
se ha eliminado la cookie que la identificaba al cerrar el navegador, aunque la información de la sesión anterior
sigue estando almacenada en el servidor web hasta que sea eliminada al caducar.
NOTA: Hay formas de obligar a que el navegador siempre busque la página más actual en el servidor web. Puede
configurar su navegador para que así sea.
Busque en internet como hacerlo.
Solución de la práctica 19b
En la práctica anterior usábamos setcookie para modificar y crear el cookie y $_COOKIE para acceder a él.
En esta práctica, lo que haremos será modificar esta parte, utilizando únicamente el array $_SESSION, y creando
la sesión con session_start().

Recordamos que el servidor nos creará un cookie para identificar la sesión y que al cerrar el navegador este
cookie se perderá por lo que la sesión se “cerrará” (aunque en realidad la sesión sigue abierta, pero no hay
manera de volver a identificarla en el servidor, hasta que pase su tiempo de expiración y el servidor termine
cerrándola).

Una forma sencilla de mantener información de la visita que está realizando el usuario a nuestro sitio web es a
través de lo que se conoce como “cookies” .
Una cookie es información que mantenemos durante toda la visita del usuario a un sitio web, y que puede
referirse a elecciones, preferencias, etc. que ha ido efectuando, liberando al servidor de mantener estos datos.
La característica más importante de una cookie es su caducidad. Al crearla podemos establecer un valor entero
que indique cuánto durará.
Al establecer la caducidad de las cookies, éstas se almacenarán como un archivo de texto en el ordenador del
usuario y de allí se obtendrán mientras no hayan caducado.
Un problema importante de los cookies es la dependencia del navegador.
El concepto de sesión facilita al programador un recipiente o lugar donde almacenar información que esté
disponible en toda la visita del usuario al sitio web.
La mejor manera entonces de cerrar entonces una sesión será la de crear un botón o un hipervínculo que se
llame desconexión y que llame a la funcion session_destroy().
Por defecto la configuración de la directiva session.use_trans_sid es que está desactivada, pero si la activamos,
PHP pasará mediante Get o Post el identificador de la sesión.
Preguntas de Autoevaluación

1.
¿Dónde se almacenan las cookies?:
En el equipo cliente.
En el servidor.
2.
¿Qué tiene que utilizar para crear y modificar cookies?:
La función setcookie.
El array $_COOKIE.
3.
¿Dos navegadores distintos comparten las cookies que han recibido?:
Si.
No.
4.
¿Con qué están relacionadas las cookies?:
Con las páginas web.
Con los servidores web.
Con los dominios.
5.
¿Cuál es la ubicación por defecto de la cookie identificadora de una sesión?:
En la memoria del navegador.
En el disco duro del usuario.

Introducción

Ahora que hemos visto como recoger información del usuario a través de formularios, y de procesarlos, ¿no sería
una buena idea guardarlos de manera permanente en nuestro equipo por si nos hicieran falta para algo?
Pues esta es la idea de los accesos a archivos. También podemos hacerlo mediante bases de datos, pero esto lo
estudiaremos en el tema siguiente.
Veamos un ejemplo:

Lo que estamos viendo es un simple formulario en el que introducimos nuestro nombre, una contraseña y
repetimos la contraseña, si los dos últimos campos son iguales, entrará.
Por tanto, una vez bien introducidos los datos, nos hará falta un sitio donde almacenar estos datos, pues bien,
esto será lo primero que haremos.
Debemos ir a la carpeta Htdocs donde la tengamos instalada y dentro de la carpeta del proyecto que estemos
trabajando y crear una carpeta, llamada por ejemplo “usuarios”.
Allí es donde almacenaremos estos datos.
Pero hay un problema, prueba a crearla y a acceder a ella mediante la barra de dirección del navegador de esta
manera:

Como vemos, hemos entrado en la carpeta y podremos ver todos los datos de los usuarios registrados.
Esto debemos evitarlo, ¿Cómo?, pues la clave está en el archivo httpd.conf que lo podrá encontrar en
C:\apachefriends\xampp\apache\conf\httpd.conf (o donde haya instalado apache).
Y crear una nueva directiva de este modo:

De esta manera (y recuerde, después de haber reiniciado apache), al acceder otra vez a la misma dirección, nos
aparecerá un mensaje como este:
Con lo que ya tendremos protegido nuestra carpeta con los datos que no queramos que sean accesibles para
otros usuarios.
Esta forma de proteger un directorio tiene también algún inconveniente, ya que es necesario tener acceso al
archivo de configuración del servidor Apache.
Si nuestro sitio web está alojado en un servido externo, esto seguramente no podrá ser. Para estos casos,
podremos crear archivos con el nombre .htaccess(se incluye un punto al principio) en el propio directorio de
nuestro sitio web.
En este archivo incluiríamos la configuración particular que queremos aplicar y que complementa a la del archivo
general de configuración httpd.conf, siempre que en este último no se impida con la opción AllowOverride None.
Crear El Archivo

PHP nos proporciona una serie de funciones para trabajar con archivos que iremos viendo gradualmente.
La primera y siempre debe ser la primera es que debemos abrir el fichero.
Para ellos utilizaremos la función fopen de esta manera:

La cual recibe dos parámetros, el primero es el nombre del archivo que queramos abrir (si no existiese lo crea) y
el segundo es el modo de apertura:
Observa que fopen devuelve siempre un descriptor de archivo, con el cual podremos referirnos a él en un futuro.
Si no fuera así, no tendríamos medios para identificar a ese archivo recién abierto.
Escribir En El Archivo

Para escribir en un archivo abierto, utilizaremos la función fwrite. Esta función necesita el descriptor del archivo y
el contenido a escribir.

Donde recorremos mediante foreach todos los valores que tenga el array $_POST, asignando cada elemento a la
variable $valor.
Después a cada elemento le concatenamos dos puntos y coma (;;) para separarlo y luego poder diferenciarlos, y
por ultimo le introducimos un salto de línea (\n)para que cada usuario esté en una línea de nuestro fichero.
Una vez hemos utilizado el archivo y no lo vayamos a utilizar más, podremos y deberemos cerrarlo mediante la
función fclose (“descriptor del fichero”), pasando por argumento el descriptor que nos devolvió la función fopen.
Leer De Un Archivo

Ahora que ya sabemos abrir, cerrar y escribir en un fichero, solo nos faltaría leer sobre el.
En este caso, hay varias maneras (funciones) que nos permitirán leer de un archivo de distintas maneras:
fgets(fd, [n]): lee una línea o un determinado número de caracteres (n) de un archivo.
Si el resultado de esta función se asigna a un array, entonces se lee todo el contenido del archivo de una vez y
se almacena en dicho array, donde cada una de las líneas del archivo es un elemento del array y las claves son
numéricas.
Por ejemplo,
$contenido[] = fgets(fd);
$contenido = file(nombre_archivo): abre el archivo indicado por su nombre y pone cada una de sus líneas en el
array contenido.
Por ejemplo,
$contenido = file(“c:/pruebas/usuarios/results.txt”);
$contenido = file_get_contents(nombre_archivo): funciona igual que la función file, pero en lugar de almacenar
el contenido del archivo en un array lo hace en una única cadena de texto.
Por ejemplo,
$contenido = file_get_contents(“c:/pruebas/usuarios/results.txt”);
Antes de cerrar el archivo, leeremos su contenido línea a línea y lo imprimiremos en la página. Para ello,
utilizamos la función rewind, que pone el marcador de posición del archivo al principio del mismo.

Recorremos el archivo (mientras no se llegue al final, para lo que se utiliza la función feof ), obtenemos línea a
línea su contenido (con la función fgets ), la codificamos con htmlspecialchars para que no contenga código
ejecutable y finalmente la imprimimos en la página.
En la figura anterior vemos que se crea un párrafo HTML por cada una de las líneas que contiene el
archivo results.txt.
Otra posibilidad podría haber sido crear un archivo de texto para cada usuario que se registre.
En este caso, deberíamos establecer el nombre de cada uno de esos archivos utilizando algún método para su
identificación, como un número secuencial que almacenáramos y modificáramos en otro archivo de texto.

Práctica 20
En esta práctica guardará la información de registro de los usuarios en un archivo de texto.
Abra el archivo registro.php en el editor que esté utilizando. Si no dispone de este archivo, podrá encontrarlo
entre los trabajos del curso.

Cree una nueva carpeta llamada usuarios dentro del directorio de su sitio web.


Escriba y modifique el código php necesario para almacenar la información enviada por el usuario en un archivo
de texto que tendrá el nombre UsuarioX.txt, donde X representa el identificador de la sesión del usuario. Puede
obtener este valor con la función session_id( ).

Por lo tanto, se creará un archivo por cada usuario registrado.


Cada campo se guardará en el orden en que aparece en el formulario (de arriba abajo y de izquierda a derecha).
Debe haber una línea en el archivo de texto por cada uno de los campos.

Después debe redirigir al usuario a una página de confirmación como la de la figura de la página siguiente, a la
que llamaremos confirmar.php y que recibirá el archivo donde se almacena la información que ha introducido el
usuario como un parámetro de su URL (sólo el nombre del archivo, sin incluir el directorio usuarios).

Fíjese como puede hacerlo:

Deberá crear esta nueva página y tomar todas las precauciones necesarias a la hora de leer el contenido del
archivo de texto en ella.
Pruebe el resultado y compruebe que se ha guardado correctamente la información en los archivos de texto.

Solución de la práctica 20
Registro.php
Este trozo de código sirve (como ya hemos visto) para validar el formulario antes de enviarlo.

Lo más interesante aquí es ver cómo construimos el nombre del archivo donde se guardará la información por
cada usuario que se registra. Fíjese que ese nombre viene dado por el identificador de la sesión, que lo
obtenemos a partir de la función session_id y con extensión .txt.

Concatenando ese nombre con el correspondiente directorio /usuarios, ya podemos crearlo con la función fopen,
escribir en él con la función fwrite y cerrarlo con fclose. Fíjese en la necesidad de incluir un salto de línea con la
expresión "\n".
Confirmar.php

En la página recogemos el archivo a leer a través del parámetro archivo de la URL, para lo que utilizamos el
array $_GET.
Después utilizamos fopen para abrirlo en modo de sólo lectura, feof para recorrerlo hasta llegar al
final, fgets para leer línea a línea y htmlspecialcharspara codificarlo adecuadamente.
Finalmente lo cerramos con fclose.
Si accede al directorio usuarios, donde se guardan estos archivos, verá cómo se construye el nombre de cada
uno de ellos a partir de un identificador de sesión creado por PHP.
Hemos utilizado una tabla HTML para mostrar los detalles, pero podríamos haber utilizado perfectamente
cualquier otra disposición, incluso simples párrafos de texto (<p>).
Entre los trabajos de la lección puede encontrar la solución completa de la práctica
Recuerda

En la carpeta Htdocs es donde albergaremos los datos de nuestra aplicación.


Siempre que se pueda es mejor guardar la información confidencial fuera del espacio web de nuestro sitio.
Los archivos .htaccess se crean en los directorios donde queremos aplicar una configuración especial.
La función fopen recibe dos parámetros, el primero es el nombre del archivo que queramos abrir (si no existiese
lo crea) y el segundo es el modo de apertura.
Observa que fopen devuelve siempre un descriptor de archivo, con el cual podremos referirnos a él en un futuro.
Para escribir en un archivo abierto, utilizaremos la función fwrite.

Preguntas de Autoevaluación

1.
Viendo este fragmento, ¿podremos modificar la configuración del directorio c:/pruebas/usuarios con un
archivo .htaccess? 

Si.
No.
2.
¿Cuál es la instrucción correcta si el servidor web está en Windows?:
$fd = fopen(“c:\pruebas\usuarios/results.txt”,”a+”);.
$fd = fopen(“c:/pruebas/usuarios/results.txt”,”a+”);.
3.
¿Qué línea es la correcta?:
Fwrite(“c:/pruebas/usuarios/results.txt”,$contenido);
Fwrite($fd,$contenido);
4.
¿Podemos leer el contenido completo de un archivo en una única acción?:
Si.
No.
5.
Si cerramos un archivo con el método close, ¿qué podremos hacer después con el archivo?:
Solo leer.
Solo escribir.
Ni leer ni escribir.

Errores

Introducción
Es normal que cuando estemos programando en PHP salten errores y mensajes para informarnos de que
estamos haciendo mal.

Estos mensajes, normalmente suelen aparecer en la página web, por lo que si somos los desarrolladores de la
página, no deberíamos de permitir que un usuario viera código y en el caso de que tuviéramos que mostrar un
error, lo haríamos con una interfaz “amigable” de vista al usuario.

Antes de la versión 5 de PHP, esto se solucionaba mediante funciones manejadoras de errores, sin embargo a
partir de esta versión, ha aparecido un método más potente, las excepciones.

Tipos de errores en PHP


Nivel de registro de errores
Observe como PHP nos muestra los errores cometidos.
Errores en pantalla
Nos indica el tipo de error producido (warning en este caso) e incluso la línea y archivo donde se produce.
Esto representa un serio resquicio de seguridad, ya que el usuario puede ver algunos aspectos del código PHP.
En PHP podemos configurar el nivel de advertencias y errores mostrados mediante el archivo de configuración
php.ini, y en especial en el parámetro error_reporting que es donde se establece de que tipos de errores se debe
informar.
Éstos son los operadores que podemos utilizar para crear la expresión que se establece como el valor de
error_reporting:

Operadores y constantes para gestión errores


Además, si establecemos una configuración y más tarde queremos que en una página en concreto establezca
otros tipos de errores, podremos hacerlo mediante la función error_reporting(), pasándole por argumento la
expresión que refleja los errores a informar en PHP.
Otro parámetro importante en php.ini es display_errors, donde establecemos si queremos que los errores se
muestren en pantalla junto a nuestra web o no, porque más tarde veremos que es posible guardar estos errores
en un archivo aparte y así, asegurarnos de que estos errores no se muestren en pantalla y el usuario pueda
acceder a ellos.
Mensajes de error personalizados
Como hemos dicho antes, si en algún momento tuviéramos mostrar un error al usuario, no deberíamos dejar que
vea los mensajes de error de este tipo:

Mensaje de error aplicación web


Si no, que deberíamos de pensar en esto y mostrar un mensaje más “amigable” y personalizado como el de la
siguiente imagen:

Pantalla mensaje de error


Para crear un mensaje personalizado de error, tenemos que hacer dos cosas:
Crear una función que maneje los errores y que muestre el mensaje deseado.
Utilizar la función de PHP set_error_handler para indicar que, cuando ocurra un error, se utilice la función que
hemos escrito para ello en el primer paso.

Función con parámetros

Donde los parámetros de la función mensaje_error deben ser estos y en este orden:
En primera posición, el tipo o número de error.
En el segundo parámetro, el mensaje del error.
Después, el archivo y la línea donde ha ocurrido.
Una buena idea es crear un archivo librería llamado include(“errorhandler.inc.php”) e incluirlo en todas nuestras
páginas web, de esa manera no tendríamos que preocuparnos más.
Guardar los errores en un registro
Como hemos dicho en los capítulos anteriores, aparte de mostrar los mensajes en la pantalla, podremos
ocultarlos al usuario y registrarlos en un archivo o registro.
Para ello, veamos como configurar el archivo php.ini:
Lo primero es establecer el parámetro log_errors del archivo php.ini al valor On.
De esta forma, se permitirá el registro de los errores en un archivo.
Una vez activado el registro de los errores, deberemos indicar en error_log dónde guardarlos.
El paquete XAMPP configura este directorio:
error_log = c:\apachefriends\xampp\apache\logs\phperror.log
Deberá quitar el punto y coma al principio de la línea error_log, ya que, inicialmente está comentada, por lo que
no se aplica.
Una cosa importante es que si estamos utilizando la función set_error_handler, no podremos a la vez, registrar
los errores en phperror.log y a la vez tratar los errores con funciones.
Para ello, deberá utilizar la función error_log( mensaje, tipo, localización):
El parámetro mensaje será el texto que se guardará en el registro.
El parámetro tipo indica qué se utilizará como registro. Éstos son los posibles valores:
0: utilizar los registros del sistema operativo.
1: enviar el error a una dirección de correo electrónico.
2: utilizar la depuración de PHP.
3: utilizar un archivo específico. Éste es el valor que normalmente utilizará.
El parámetro localización indicaría el archivo de registro en sí.
Observe cómo podría quedar nuestro manejador de errores:

Función con parámetros


Como hemos visto en esta lección, el manejo de errores clásico de PHP es bastante engorroso ya que intervienen
muchos parámetros y funciones.
En PHP 5 ha aparecido la posibilidad de manejar errores a través de excepciones.
Utilizando excepciones, el tratamiento de errores es mucho más limpio y potente. Sin embargo, todavía está en
su nivel inicial de desarrollo por lo que no es todo lo funcional que podremos encontrar en otros lenguajes de
programación.
Anterior

Excepciones

Introducción
A partir de PHP 5, se introducen las excepciones, que es un concepto muy utilizado en otros lenguajes de
programación.
Sus ventajas:
No es necesario estar comprobando constantemente la existencia de un error.
Seremos capaz de propagar el error hasta el código que exactamente está dándolo.
Clasifican los errores de una manera muy cómoda.
Se tratan los errores desde un punto de vista orientado a objetos.
Sus desventajas:
Solo pueden utilizarse para manejar errores propios y no los que genera automáticamente el intérprete PHP
Por lo tanto, tenemos que decir que aunque sea una buena y potente herramienta, todavía está en fase de
desarrollo por lo que está muy verde.
Manejar excepciones
Debemos entender el tema de manejar las excepciones como la manera de detectar y responder antes errores.
Para ellos utilizaremos la estructura try – catch.
Veámoslo con el ejemplo anterior asegurándonos que podamos abrir el archivo results.txt del directorio usuarios,
pero esta vez con excepciones.
La idea es meter el código que queramos probar dentro de try y si se diera un error, como responderíamos ante
él dentro de la estructura catch.
Explicaré el siguiente código:
Encerrado en try tenemos lo que “sospechamos” que pueda dar error” y en catch lo que deberíamos de hacer si
fuera así.
Con la función is_dir comprobamos si es un directorio por lo que si no lo es, entraremos dentro del if y
con throw lanzaremos una excepción (fíjese lo verde que está PHP que somos nosotros quien debe lanzar la
excepción…)
Lo mismo ocurre con file_exists que comprueba si lo que le pasamos por parámetro es un archivo.
En cuanto entre en algún if, este lanzara su excepción y automáticamente php buscará la parte de catch es decir,
que no se ejecutará el código inmediatamente inferior.
Por tanto, solo abriremos el archivo con fopen si y solo si no ocurre antes ninguna excepción.
En caso de que si la hubiese, dentro de catch vemos que le pasamos como parámetro el $e, que es objeto de la
clase Exception y lo que hacemos es llamar al método getMessaje() de la clase Exception.
Aunque ahora lo vea más complicado de entender, con el tiempo se dará cuenta de su potencialidad y facilidad.
Lo único que tiene que hacer es pensar que los errores se representan ahora como objetos de una determinada
clase de excepción.
Jerarquía de excepciones
Php proporciona la clase base Exception como hemos visto pero nosotros podríamos crear nuestras propias
clases de excepciones.
Observe por dentro la clase definida Exception:

Cabe destacar que la única función que es sobre escribible es _toString() ya que todas las demás, son finales
(observe la palabra reservada final).
Ahora utilizaremos dos clases distintas para nuestro ejemplo:
Se trata de la clase DirectoryException y FileException.
Y para tratarlos podremos referimos a ellos de manera separada.

Además, esto nos permite también crear una última cláusula catch manejando el resto de excepciones que no
hayamos controlado con las anteriores. Para ello, utilizaremos la clase base Exception.

La última cláusula “recoge” el resto de excepciones no manejadas al utilizar la clase base Exception.


Bien, pues ahora solo falta un detalle para que todo esto funcione y es hacer que las
clases DirectoryException y FileException sean subclases de la clase Exception, de esta manera:

Con esto es suficiente si no queremos añadir más funcionalidad a las subclases sino que sólo nos interesa
utilizarlas para diferenciar entre tipos de errores.
Sin embargo, podríamos ampliar las subclases para reflejar lo que tienen esas excepciones y no tiene la clase
base Exception.

Como DirectoryException y FileException son subclases de Exception, es muy importante el orden de las


cláusulas catch.
Debe escribir primero las cláusulas catch correspondientes a las clases más concretas (subclases) y, por último,
las clases más generales (superclases).

¿Dónde manejar las excepciones?


Ya estamos viendo que es mucho mejor utilizar un tipo de excepción que un código de error, ya que esto facilita
la forma de responder ante distintas excepciones.

Pero lo más importante de ellas, quizás sea cuando comprendamos que la respuesta ante una excepción no tiene
que darse en el código donde se produzca sino donde realmente se está preparado para ello.

Vayamos por pasos, ¿Qué pasa cuando se genera una excepción?


PHP empezará a buscar una clausula catch asociada al try en el que esté encerrado, sino la encuentra seguirá
subiendo en el código hasta que la encuentre.

En el caso de que la excepción estuviera dentro de una función y no haya ninguna clausula catch, buscaría en el
código que ha llamado a esa función y así sucesivamente.

Para comprobar todo esto, vamos a utilizar dos funciones para validar la corrección del directorio y el archivo que
queremos abrir:
Como puede ver, podemos lanzar excepciones con throw sin necesidad de manejarlas ya que aquí no tenemos
ningún bloque try – catch.
La idea es que las maneje el código que utiliza estas funciones:

Poder decidir dónde manejar el error o excepción es muy importante, ya que no siempre es lo mejor hacerlo en
el código donde se ha generado porque no se tiene la información necesaria para ello.

Esto es mucho más difícil de conseguir si utilizamos el tratamiento de errores clásico de PHP.

Manejador por defecto


¿Qué pasaría si nosotros no escribiéramos ninguna clausula catch en nuestro código?
Pues que PHP finalizaría con un error al no encontrarlo.

Pues para ello podremos definir un manejador por defecto, es decir, el que se utilizará en el caso en el que PHP
no encuentre ninguno establecido por nosotros.

El uso más habitual es el de redirigir al usuario a una página de error ya preparada en la que se muestre una
respuesta “amable” de lo que pasa.

Para ello deberemos de crear un código parecido a este:

En la que vemos que primero creamos una función que lo que hará será únicamente redirigirnos a
“nuestra_pag_error.php” y fuera de la función llamaremos a la función set_exception_handler, pasando por
parámetro la función que acabamos de crear.
Un ejemplo puede ser este:
Como conclusión, debe entender que las excepciones van a ser la forma en que en un futuro se manejen todos
los errores de PHP.
Si se trata de un desarrollo nuevo, no dude en decantarse por las excepciones.

Práctica 21a

En esta práctica creará un manejador personalizado para los errores que puedan suceder durante la ejecución de
sus páginas web.
Cree un nuevo archivo su editor preferido con el nombre error.inc.php.
En este archivo escriba una función llamada error_personalizado que maneje los errores mostrando un mensaje
como el que puede ver a continuación.

Deberá establecer esta función como manejador predeterminado de todos los errores.
Incluya el nuevo archivo en la página registro.php que utilizó en la práctica anterior. Si no dispone de ella, la
puede encontrar entre los trabajos de la lección.
Ahora pruebe el manejador de errores de dos formas:
Generando un error de tipo E_USER_WARNING cuando no coincida el contenido de los
campos password y repetirpassword del formulario de registro.
Modificando el código de registro.php de forma que se intente guardar la información en un directorio que no
existe (por ejemplo, elimine la “s” del directorio usuarios en el código donde se indica la ubicación de los archivos
de texto que se crean para guardar la información del registro).
Solución de la práctica 21a
error.inc.php
Lo importante es ver que la función recibirá todos los detalles del error que ha sucedido a través de parámetros.
Esta información se la pasará el entorno de ejecución de PHP, sin que nosotros tengamos que hacer nada. Se ha
utilizado el estilo error para los mensajes.
Pero para ello, es necesario indicar que la función error_personalizado es el manejador de error predeterminado.
Esto se consigue en la última línea, utilizando la función set_error_handler.
Seguidamente, veamos cómo modificaríamos el código de la página registro.php. Lo primero será incluir el
archivo anterior: include("error.inc.php").
Después, escribiremos código para comprobar que lo que se ha introducido en el campo de la contraseña y
repetir contraseña es lo mismo:

Práctica 21b

En esta práctica deberá manejar un determinado tipo de excepción.


Abra en su editor preferido el archivo practica21b.php , que podrá encontrar entre los trabajos del curso.
El objetivo de esta página es que el usuario indique su fecha de nacimiento y nuestro código calculará el día de la
semana correspondiente a esa fecha.

Por ejemplo, si introduce la fecha 21 de octubre de 2005, entonces obtendrá un mensaje como "Usted nació un
viernes.".
En el caso de que la fecha introducida no sea correcta (por ejemplo, el día 31 de febrero de cualquier año),
mostrará el mensaje "La fecha no es válida.". Para ello, deberá manejar esta situación mediante una excepción.
PHP dispone de tres funciones que le pueden ser de utilidad en esta práctica:
Checkdate (mes, día, año): comprueba si la fecha dada es válida (devuelve TRUE) o no (devuelve FALSE). Para
ello, se le pasa como parámetros el número de mes, día y año.

Mktime (hora, minutos, segundos, mes, día, año): dados los valores pasados como parámetros, devuelve un
valor numérico (timestamp) correspondiente a dicho momento. La fecha tiene que ser posterior a 1 de enero de
1970.

Getdate (timestamp): dado un valor numérico que representa un momento dado (timestamp), devuelve un array
asociativo con información referente a dicha fecha y hora. El valor de este array que nos interesa es "weekday",
que proporciona el día de la semana en texto completo (pero en inglés).

Deberá proporcionar el día de la semana en castellano:


Monday -> lunes
Tuesday -> martes
Wednesday -> miércoles
Thursday -> jueves
Friday -> viernes
Saturday -> sábado
Sunday -> domingo
Escriba el código necesario para todo ello y pruebe la página en su navegador, tanto con una fecha correcta
como con una incorrecta.

Solución de la práctica 21b


Hay varias cosas interesantes en este código:

Como deseamos controlar la posibilidad de que el usuario elija una fecha incorrecta mediante excepciones,
rodeamos el código con una estructura try - catch.
Utilizamos la función checkdate para comprobar si la fecha es correcta. Si no lo es (devuelve FALSE), entonces
creamos la excepción con throw. Fíjese que tenemos que hacerlo explícitamente porque PHP no la generará por
nosotros.
Con la función mktime creamos el valor timestamp que necesita la función getdate. Este valor viene dado por
todos los datos de la hora y fecha deseadas. Fíjese que hemos introducido el valor 0 para la hora, minutos y
segundos.
Después pasamos este valor timestamp a la función getdate para que nos proporcione el nombre del día de la
semana correspondiente a dicho valor. Esta función devuelve un array asociativo, del cual sólo nos interesa su
elemento "weekday". Estudie la forma de acceder a dicho elemento: $nacimiento["weekday"].
Como nos lo devuelve en inglés, utilizamos una estructura switch - case para conseguirlo en castellano.
En la cláusula catch tratamos apropiadamente la excepción. En este caso, simplemente mostramos un mensaje
advirtiendo al usuario de que ha introducido una fecha incorrecta, para lo que se utiliza el método getMessage
del objeto que representa dicha excepción. Fíjese que ese mensaje es justamente el que utilizamos al crear la
excepción con throw.
La ventaja de este modelo es que cuando se genera la excepción con throw, porque así lo requiere la fecha
introducida por el usuario, el código salta las líneas siguientes y la ejecución pasa directamente a la cláusula
catch, que es la que dispone del código apropiado para esa situación.
Puede obtener más información acerca de las funciones de fecha en el manual de PHP, disponible en el sitio
web www.php.net.
Puede obtener la solución de la práctica en su carpeta de soluciones.
Recuerda

En PHP podemos configurar el nivel de advertencias y errores mostrados mediante el archivo de configuración
php.ini, y en especial en el parámetro error_reporting que es donde se establece de que tipos de errores se debe
informar.
Otro parámetro importante en php.ini es display_errors, donde establecemos si queremos que los errores se
muestren en pantalla junto a nuestra web o no.
Una buena idea es crear un archivo librería llamado include(“errorhandler.inc.php”) e incluirlo en todas nuestras
páginas web, de esa manera no tendríamos que preocuparnos más.
Si estamos utilizando la función set_error_handler, no podremos a la vez, registrar los errores en phperror.log y
a la vez tratar los errores con funciones.
En PHP 5 ha aparecido la posibilidad de manejar errores a través de excepciones.
La idea es meter el código que queramos probar dentro de try y si se diera un error, como responderíamos ante
él dentro de la estructura catch.
Php proporciona la clase base Exception como hemos visto pero nosotros podríamos crear nuestras propias
clases de excepciones.
Debe entender que las excepciones van a ser la forma en que en un futuro se manejen todos los errores de PHP.
Preguntas de Autoevaluación

1.
¿De qué tipo es el error al imprimir el contenido de una variable no creada?:
Notice.
Warning.
Error.
2.
¿Cuál es la función encargada para establecer una función escrita por nosotros como manejador de errores?:
Display_errors.
Set_error_handler..
3.
Indica si la siguiente afirmación es verdadera o falsa: 
“Cada vez que ocurre un error del tipo E_ERROR, PHP lanza una excepción”.
Verdadero.
Falso.
4.
¿Es recomendable tener siempre un bloque catch para manejar las excepciones de tipo Exception?:
Si.
No.
5.
¿Qué ocurre cuando PHP es incapaz de encontrar un bloque catch para una excepción y no se ha definido un
manejador por defecto?:
Nada.
Un error fatal de PHP.
 
MySql

A partir de ahora vamos a hablar sobre las bases de datos en las páginas web.
La mayoría de las aplicaciones web y sobre todo en las de comercio electrónico como la que estamos creando
nos hará falta trabajar con ciertos datos, por lo que nos encontraremos con una base de datos.
Nosotros nos vamos a decantar por MySQL, que ya viene instalado en el paquete XAMPP que instalamos al
principio del curso.
Actualmente MySQL se proporciona bajo dos tipos de licencias: una libre o GPL (General Public License) y otra
comercial o de pago.
Dependiendo de su uso, podemos acogernos a uno u otro tipo de licencia.
Contraseña Para El Root

Cuando instalamos en el paquete XAMPP, MySQL, se creó un usuario por defecto llamado root para administrar la
base de datos, el problema es que este usuario viene por defecto sin contraseña, por lo que cualquiera podría
conectarse.
Por tanto, lo primero que haremos será establecerle una contraseña.
Para ello hay muchas maneras pero explicaremos la más fácil.
Accede a phpmyadmin (http://localhost/phpmyadmin) y pinche en la pestaña privilegios y veremos que abajo
aparece root,

Pues haz clic en editar (muñeco con el lápiz) y busque contraseña, como verá por defecto esta desactivada, pues
lo que deberá hacer es escribirla (y reescribirla) y hacer clic en continuar.

Extensión Mysqli

Cuando trabajemos con MySQL en base de datos veremos que utilizaremos funciones específicas.
Estas funciones no son de PHP sino que se obtienen a partir de una extensión (librería) creada para ello.
La extensión mysql proporciona funciones para acceder a bases de datos MySQL anteriores a la versión 4.1.0.
La extensión mysqli proporciona funciones y objetos para acceder a bases de datos MySQL 4.1.0 y posteriores.
Ambas son parecidas aunque mysqli es más moderna y potente.
Nosotros trabajaremos lógicamente con mysqli.
Por lo que tendremos que configurarlo en el archivo php.ini.
Y en especial en la directiva extensión_dir:

El valor de esta directiva indica dónde buscará PHP las extensiones que le hagan falta. Aquí debería estar la
extensión mysqli que vamos a utilizar para acceder a bases de datos MySQL.
Después, deberá comprobar en la lista de extensiones, que esté mysqli. El paquete XAMPP habilita la extensión
mysql y no mysqli, que es la que vamos a utilizar. Por lo tanto, asegúrese de que está como puede ver a
continuación:

Donde lo que nos importa es la segunda línea. Por lo que si no la tiene tendrá que agregarla y si la tiene, quitarle
el punto y coma del principio.
Como ya sabe, después de tocar los archivos de configuración, deberá reiniciar Apache.
PHPMyAdmin

Debe saber que la configuración inicial de PHPMyAdmin utiliza la extensión mysql para acceder al servidor de
base de datos.
Como nosotros vamos a utilizar la extensión nueva mysqli, deberemos cambiar su configuración. Esto se hace en
el archivo config.inc.php, dentro del directorio de PHPMyAdmin.
En la que vemos que la línea resaltada indica esta circunstancia.
Adicionalmente, es conveniente establecer un método de autenticación distinto al inicial. Esto se indica en las
líneas siguientes:

Inicialmente, el valor que se utiliza en auth_type es config, lo que quiere decir que se utiliza el usuario y
password que aquí se establecen (en las dos líneas más abajo).
Sin embargo, no es una buena idea guardar estos detalles aquí porque podrían ser fácilmente descubiertos al
estar en una página dentro del espacio web del servidor.
Por lo tanto, lo cambiaremos a http o a cookie. Si lo hacemos a http, será necesario identificarnos con nuestro
navegador cuando queramos acceder a phpMyAdmin, como puede ver en la figura siguiente.

Por lo tanto, no tiene sentido que indiquemos el usuario y contraseña, ya que deseamos que se pidan esas
credenciales cada vez que se intente acceder a PHPMyAdmin, así que dejaremos estos detalles en blanco en el
archivo de configuración config.inc.php.
Ahora puede ver el aspecto de esta aplicación. En ella trabajaremos a la hora de crear las bases de datos, de
crear los usuarios, etc. Como se puede imaginar, será mucho más cómodo hacerlo así que a través de la línea de
comandos.
Administración De Usuarios

No debemos utilizar el usuario root de MySQL para realizar las conexiones con la base de datos desde nuestra
aplicación PHP, ya que este usuario tiene todos los privilegios sobre el servidor.
Lo correcto será utilizar un usuario que tenga los permisos necesarios únicamente en la base de datos que utilice
nuestra aplicación web. Con PHPMyAdmin podemos crear tanto la base de datos como dicho usuario.
Para crear la base de datos, escriba su nombre en el campo que aparece en la página inicial de PHPMyAdmin y
pulse en el botón Crear. Después ya tendrá que completarla creando las tablas y campos de cada una de ellas.
Nosotros crearemos una base de datos con el nombre tiendabd.
Y para crear el usuario, pulse en el hipervínculo Privilegios de la página principal de PHPMyAdmin. Accederá otra
página con la configuración de usuarios actuales. Pulse en Agregar nuevo usuario e introduzca su nombre y los
privilegios que tendrá.
Nosotros crearemos un usuario llamado tienda, con contraseña password y con privilegios para acceder a la base
de datos tiendabd y a ninguna otra.
Los permisos otorgados para esta base de datos serán: SELECT, INSERT, UPDATE y DELETE ; es decir, para
poder acceder a los datos, insertar nuevos, actualizarlos o eliminarlos, respectivamente.
Con esto será suficiente, aunque también es posible aplicar privilegios a tablas particulares.
Esto último representa mayor seguridad, ya que el usuario que utilizaremos para establecer la conexión con la
base de datos tiendabd tendría los permisos más limitados. Todo depende de lo que usted necesite.
Si instala PHPMyAdmin desde el paquete XAMPP, como hemos hecho en este curso, se creará un usuario de
nombre pma, sin contraseña y con todos los privilegios sobre el servidor.
Este usuario es necesario para el funcionamiento de PHPMyAdmin. Sin embargo, la instalación de XAMPP lo crea
con todos los privilegios y no como recomienda la documentación de PHPMyAdmin.
En realidad esto puede representar un serio agujero de seguridad, ya que cualquiera podría acceder como el
usuario pma y tomar el control del servidor MySQL utilizando su navegador.
La documentación de PHPMyAdmin indica que este usuario debe tener algunos permisos específicos, por lo que
nos ofrece una consulta para crearlo:

Puede ejecutar esta consulta desde PHPMyAdmin indicando el password de este usuario en lugar de pmapass.
Tenga en cuenta que deberá actualizar el archivo config.inc.php para que se indique esta circunstancia:
$cfg[ ‘ Servers ’ ][$i][ ‘ controluser ’ ] = ‘ pma ’ ;
$cfg[ ‘ Servers ’ ][$i][ ‘ controlpass ’ ] = ‘ pmapass ’ ;
Aunque, de esta forma, aparece el password del usuario que necesita PHPMyAdmin en este archivo de
configuración, no es un riesgo muy grande, ya que sus privilegios están limitados.

Práctica 22

En esta práctica comprobaremos la configuración de MySQL y crearemos el usuario que utilizará para acceder a
la base de datos con la que trabajará a partir de ahora.
Antes de empezar la práctica es importante que se asegure de que el servidor de base de datos MySQL está
funcionando como un servicio de Windows y que está iniciado.
Lo primero que deberíamos hacer a la hora de configurar el servidor MySQL es establecer la contraseña para el
usuario root o administrador.
Seguidamente, debe modificar, si es necesario, el archivo php.ini, de forma que se utilice la extensión mysqli en
lugar de la más antigua mysql.
Después compruebe la configuración de la aplicación PHPMyAdmin y, si es necesario, establezca el método http
para la autenticación de los usuarios. De esta forma, será necesario autenticarse al entrar en la aplicación.
Para ello, utilizaremos el usuario root sin contraseña.
Una vez comprobada la configuración del entorno de trabajo, arranque su navegador y acceda a la página de
inicio de PHPMyAdmin, es decir, http://localhost/phpmyadmin.
Introduzca root como usuario y deje en blanco el campo de contraseña, como en la figura de la página siguiente.
Con estas credenciales debería tener acceso sin ningún problema si se han seguido las indicaciones anteriores.
Trabaje en PHPMyAdmin para crear una nueva base de datos con el nombre xbd, donde x representa su primer
apellido más la inicial de su nombre (todo en minúsculas). Por ejemplo, lopezbd.
Finalmente, cree un nuevo usuario para que pueda acceder únicamente a su base de datos a través del código
de las próximas prácticas.
Este usuario tendrá el nombre x, donde x hace referencia a su primer apellido y la inicial de su nombre en
minúsculas (por ejemplo, lopez) y como contraseña la palabra password.
Solución de la práctica 22
Debe realizar la práctica con mucho cuidado y modificando lo que necesite siempre que sepa lo que está
haciendo porque la configuración de un servidor de bases de datos es una tarea realmente delicada, como ha
podido ver en la lección.
En una práctica anterior se instaló el paquete XAMPP, que incluía el servidor de bases de datos MySQL y se
configuró de forma que se ejecutara como un servicio más de Windows (lo mismo se hizo para el servidor web
Apache).
La forma más rápida de comprobar esta situación es accediendo a las Herramientas administrativas del Panel de
control de Windows, hacer doble clic sobre la herramienta
Servicios y buscar en la lista el servicio mysql. Si no aparece, es que no está instalado como un servicio de
Windows, por lo que tendrá que hacerlo e iniciarlo, como ya se explicó.
En cuanto a la forma de modificar el archivo php.ini, de forma que se utilice la extensión mysqli a la hora de
acceder a MySQL desde el código, debe buscar las líneas correspondientes a las extensiones activadas en este
archivo. Recuerde que XAMPP guarda este archivo en la ubicación C:\apachefriends\xampp\apache\bin\php.ini.
Práctica 22

En el apartado Dynamic extensions aparece una línea por cada extensión disponible. Las líneas que empiezan por
un punto y coma no están activadas en ese momento, por lo que están comentadas de esta forma.
Pues bien, debe asegurarse de que hay una línea como
extension=php_mysqli.dll
sin comentar, es decir, sin el punto y coma al principio de la misma. También deberá asegurarse de que no se
utiliza la extensión mysql. En resumen, debería tener:
;extension=php_mysql.dll
extension=php_mysqli.dll
Tenga en cuenta que una vez modificado el archivo php.ini (si ha hecho falta), deberá reiniciar el servidor
Apache para que los cambios surtan efecto.
En cuanto a la configuración de la aplicación PHPMyAdmin, tiene que editar el archivo config.inc.php del
directorio donde se instaló.
El paquete XAMPP lo instala en la ubicación
C:\apachefriends\xampp\phpMyAdmin\config.inc.php.
En este archivo deberá configurar los siguientes parámetros como aquí se indica:
$cfg['Servers'][$i]['extension'] = 'mysqli';
$cfg['Servers'][$i]['auth_type'] = 'http';
Con estos dos detalles indicamos que se utilice la extensión mysqli para acceder a MySQL y el método de
autenticación http cuando ejecutemos PHPMyAdmin.
Seguidamente debe trabajar en PHPMyAdmin, habiéndose identificado como root (sin contraseña). Lo primero es
crear la base de datos y el usuario que utilizaremos:
Escriba el nombre en el campo Crear nueva base de datos de la página principal y pulse en el botón Crear.
Vuelva a la página principal con el icono y después pulse en el hipervínculo Privilegios, con lo que accederá a otra
página web donde pulsará en el hipervínculo Agregar nuevo usuario. Con ello, accederá a otra página donde
tiene que introducir el nombre del usuario que quiere crear y su contraseña.

Pulse en el botón Continúe de esta última página sin activar ninguno de los permisos que en ella aparecen, ya
que son permisos de carácter general y nosotros sólo queremos darle privilegios para la base de datos que
hemos creado con anterioridad.
En la página resultante, sitúese en el apartado Privilegios específicos para la base de datos y seleccione su base
de datos (por ejemplo, lopezbd), después active las casillas SELECT, INSERT, UPDATE y DELETE, aceptando
finalmente con el botón Continúe. Cierre el navegador.
Con estos pasos hemos creado el usuario que utilizaremos en nuestro código php siempre que tengamos que
acceder a la base de datos. Es muy importante no utilizar el usuario root, ya que tiene demasiados privilegios.

Recuerda

Actualmente MySQL se proporciona bajo dos tipos de licencias: una libre o GPL (General Public License) y otra
comercial o de pago.
Es importante la combinación de las mayúsculas y minúsculas en las contraseñas de MySql
El usuario root se crea automáticamente al instalar esta base de datos
Debe saber que la configuración inicial de PHPMyAdmin utiliza la extensión mysql para acceder al servidor de
base de datos.
Inicialmente, el valor que se utiliza en auth_type es config, lo que quiere decir que se utiliza el usuario y
password que aquí se establecen.
Para crear la base de datos, escriba su nombre en el campo que aparece en la página inicial de PHPMyAdmin y
pulse en el botón Crear

Preguntas de Autoevaluación

1.
Indica si la siguiente afirmación es verdadera o falsa: 
“Al instalar MySQL, al usuario root no le asigna contraseña”.
Verdadero.
Falso.
2.
¿Cuál es la extensión que utilizaremos en este curso?:
Mysql.
Mysqli.
3.
¿Dónde se indican las extensiones de PHP?:
En el de PHP (php.ini).
En el de Apache (httpd.conf).
4.
Según esta configuración del archivo config.inc.php de PHPMyAdmin: ¿falta escribir el nombre de usuario y contraseña con el que
queremos acceder a PHPMyAdmin? 

Si.
No.
5.
Indica si la siguiente afirmación es verdadera o falsa: 
“No es recomendable el usuario root de MySQL a la hora de establecer una conexión con la base de datos desde una aplicación PHP”.
Verdadero.
Falso.

Evaluar Test

Tipos De Tablas En MySQL

Toda base de datos relacional se basa en dos objetos fundamentales:


Tablas, donde se almacena la información.
Relaciones, que permiten extraer resultados a partir de la información almacenada en las tablas, así como
mantener la integridad de dicha información.
Una tabla está compuesta de:
Los campos o columnas representan las distintas categorías de información que almacena la tabla, como puede
ser el nombre, los apellidos, la dirección, el teléfono, etc., en el caso de una tabla donde se guardan los detalles
de los clientes de la empresa.
Los registros o filas de la tabla representan los valores individuales o concretos de dichos campos. Por ejemplo,
podremos tener un registro que represente al cliente Antonio Fernández Blas, cuya dirección sea C/ Hermano
Rojo, 16. 28080 - Madrid...
PHP tiene una característica respecto a las tablas y es que usted podrá crear dos tipos,
Que permitan transacciones. Ej. tabla InnoBD
Que no permitan transacciones. Ej. tabla MyISAM (por defecto en MySQL, MEMORY, MERGE, ISAM….
Y se preguntará, ¿Pero que es una transacción?
Pues una transacción es una operaciones sobre la base de datos que sólo tiene sentido si todas las demás
ocurren con éxito.
Las tablas que permiten transacciones necesitan más espacio en disco y utilizan más memoria que las que no lo
permiten. En nuestro caso, necesitamos tablas que permitan transacciones, y por tal, utilizaremos el tipo de
tablas InnoBD.
2. Crear tablas
Bien, a partir de ahora vamos a crear las tablas necesarias para crear nuestra aplicación tiendaDETALLES.
Para ello, accederemos a PHPMyAdmin y crearemos una tabla para la base de datos creada en la unidad anterior.
Esta tabla se llamará clientes y deberá especificar el número de campos (que en nuestro caso serán 12).

Formulario crear tabla


Pulse continúe para rellenar cada uno de los campos de la manera que indica la siguiente imagen:

Formulario crear tabla columnas


Además, como la clave primaria de la tabla clientes es IdCliente, deberá indicarlo marcando en la pestaña índice
como primario, y además, haciendo clic sobre A I (autoincrement) para que MySQL se encargue de asignarle en
cada inserción un identificador único.
Por último, deberemos decirle a MySQL que queremos una tabla InnoBD seleccionando esta opción en tipo de
tabla (abajo).
Tipo de tablas base de datos
Hecho esto y después de darle a grabar, deberíamos de ver una pantalla como esta:

Vista estructura tabla base de datos


Para continuar con la lección, he añadido varias tablas a nuestra base de datos. Es aconsejable no utilizar
acentos en los nombres de las tablas:
Tabla carritocompra: en esta tabla almacenaremos los detalles de los productos que el cliente ha decidido añadir
a su compra (junto a las cantidades para cada uno de ellos).
Representa el conjunto de productos que ha elegido comprar el usuario. Se identifica por un número de registro
único IdRegistro, pero realmente se utilizará el campo IdCarrito, que coincidirá con el identificador del cliente si
es un usuario registrado o con un identificador aleatorio si el usuario todavía no se ha registrado. De esta forma,
se identifica el carrito con el usuario en cuestión.
Cree en PHPMyAdmin la tabla con estos datos:

Definición tabla base de datos


Tabla 410ategorías: incluye la descripción de cada categoría de productos que tenemos en nuestra tienda virtual.
Por ejemplo, artículos de decoración, utensilios de cocina, etc. Esta tabla podría incluir detalles únicos para cada
categoría si fuera necesario, de forma que todos los productos de la misma “heredarían” dichas características.
Cree en PHPMyAdmin la tabla con estos datos:
Definición tabla y tipos base de datos
Tabla ordenes: para ello habrá tenido que identificarse para entrar en la tienda como un usuario registrado. Se
guarda el total del pedido para no tener que calcularlo cada vez.
Cree en PHPMyAdmin la tabla con estos datos:

Definición tabla y tipos base de datos


Tabla productos: Almacena toda la información de los productos disponibles en la tienda, incluyendo un campo
donde se indica la ubicación de una imagen digital del producto.
Cree en PHPMyAdmi n la tabla con estos datos:

Definición tabla y tipos base de datos


MySQL proporciona distintos tipos de datos para los campos de las tablas en función de la naturaleza de los
valores que se van a almacenar: valores numéricos, de texto, fechas, etc.
Aquí presentamos los más relevantes:
Tipos variables mysql
Relaciones Uno A Muchos

1
Siguiente
1/2
Además de las tablas, las relaciones son otro tipo de objeto que se almacena en una base de datos. Sin
embargo, es un concepto más difícil de entender.
Usted ha entendido enseguida que necesitaba una tabla donde guardar la información sobre los clientes de la
tienda, otra tabla para los productos, etc.
Sin embargo, el objetivo de una base de datos relacional también es el poder extraer información útil a partir de
los datos guardados.
Para facilitar esta tarea, es conveniente enlazar las tablas con relaciones.
En el diagrama siguiente puede ver gráficamente las relaciones existentes en la base de datos. Las relaciones se
representan mediante enlaces que unen las tablas. Como límites de estos enlaces tenemos un icono de llave, que
representa la parte 1, y un icono del símbolo del valor infinito, que representa la parte muchos. En todas ellas se
exigen las restricciones de integridad referencial y están activadas las modificaciones y eliminaciones en cascada.

Esquema entidad relación de base de datos


Para establecer las relaciones, pulse en el botón Estructura de la tabla y acceda a la Vista de relaciones. Aquí
puede verlo para la tabla Productos.

Formulario web varios campos


Fíjese que aparece un campo llamado IdCategoria. Este campo representa la categoría a la que pertenece el
producto en cuestión y es fruto de la relación existente entre las tablas productos y ategorías.
En MySQL, es posible representar una relación de este tipo si hemos utilizado tablas InnoDB. Ésta es otra de las
ventajas de este tipo de tablas.
Esto no quiere decir que no podrá hacerlo si utiliza otro tipo de tablas, pero MySQL no las controlará por sí
mismo. Además, hay que crear un índice en las columnas que formarán la relación.
Si estudia la figura anterior, verá que en la columna FOREIGN KEY – InnoDB tenemos que la columna
IdCategoria de la tabla productos se enlaza con la columna IdCategoria de la tabla ategorías.
¿Para qué sirve esto? Pues para que:
Cuando se inserte un producto y se indique su categoría, que esa categoría exista en la tablas ategorías.
Cuando se elimine una categoría en la tabla ategorías, ¿qué pasa con los productos que pertenecen a dicha
categoría?
Lo mismo cuando lo que ocurre es que se modifica la clave principal de una categoría, ¿qué ocurre con los
productos relacionados?
Esto se indica en el apartado ON DELETE (al eliminar) y ON UPDATE (al actualizar).
Podemos indicar hasta cuatro posibilidades a aplicar cuando se elimine la categoría a la que pertenecen los
productos.
CASCADE: que también se eliminen los productos de esa categoría.
SET NULL: que se ponga el campo IdCategoria de dichos productos al valor NULL.
NO ACTION: no permitir eliminar la categoría si existen productos asociados.
RESTRICT: lo mismo que NO ACTION.
Eligiendo CASCADE, si se elimina/actualiza una categoría que tiene productos relacionados, MySQL también
eliminará/actualizará estos últimos.
Al crear las relaciones, estamos facilitando que la base de datos se mantenga en un estado coherente.
Por ejemplo, en este caso no podremos crear productos que pertenecen a categorías inexistentes o nos
aseguraremos de eliminar los productos que pertenecen a una categoría que ha desaparecido.
Tenga en cuenta que los campos que establecen la relación deben ser del mismo tipo o al menos de tipos
compatibles. Esto es lógico, ya que, al fin y al cabo, almacenarán el mismo tipo de información.
Sin embargo, no es necesario que tengan el mismo nombre, aunque esto ayudará a la hora de crear las
relaciones.
Es importante darse cuenta de que el campo IdCategoria de la tabla productos ha aparecido justamente porque
hemos identificado esta relación al diseñar la base de datos.
En este caso se trata de una relación 1 a muchos, es decir, tendremos que una categoría puede tener muchos
productos (o ninguno), pero que un determinado producto sólo puede pertenecer a una categoría determinada.
Si no tiene mucha experiencia en bases de datos, seguramente el concepto más complicado con el que se va a
encontrar es el de relación.
Debe pensar en las relaciones como en algo que puede encontrar en la realidad. Así, podemos encontrar
relaciones en nuestra base de datos como:
Los productos pertenecen a una categoría.
Un carrito de la compra contiene productos.
Los productos aparecen en las órdenes de compra.
Los clientes realizan órdenes de compra.
Etc.
Recuerde que: Las relaciones entre tablas se representan como claves ajenas en MySQL.
Para poder crear claves ajenas son necesarios tres requisitos:
Que las dos tablas implicadas sean del tipo InnoDB.
Que el campo que actuará como clave ajena, referenciando a otra tabla, tenga un índice.
Que se cree la relación entre ambas tablas, lo que queda representado como una CONSTRAINT FOREING KEY en
el código SQL.
Si no utiliza tablas InnoDB, podrá simular las relaciones mediante los campos que aparecen para ello, pero no
podrá hacer que MySQL asegure las restricciones de integridad referencial que implica toda relación.
Anterior
1
2
2/2
Tipos De Tablas En MySQL

Toda base de datos relacional se basa en dos objetos fundamentales:


Tablas, donde se almacena la información.
Relaciones, que permiten extraer resultados a partir de la información almacenada en las tablas, así como
mantener la integridad de dicha información.
Una tabla está compuesta de:
Los campos o columnas representan las distintas categorías de información que almacena la tabla, como puede
ser el nombre, los apellidos, la dirección, el teléfono, etc., en el caso de una tabla donde se guardan los detalles
de los clientes de la empresa.
Los registros o filas de la tabla representan los valores individuales o concretos de dichos campos. Por ejemplo,
podremos tener un registro que represente al cliente Antonio Fernández Blas, cuya dirección sea C/ Hermano
Rojo, 16. 28080 - Madrid...
PHP tiene una característica respecto a las tablas y es que usted podrá crear dos tipos,
Que permitan transacciones. Ej. tabla InnoBD
Que no permitan transacciones. Ej. tabla MyISAM (por defecto en MySQL, MEMORY, MERGE, ISAM….
Y se preguntará, ¿Pero que es una transacción?
Pues una transacción es una operaciones sobre la base de datos que sólo tiene sentido si todas las demás
ocurren con éxito.
Las tablas que permiten transacciones necesitan más espacio en disco y utilizan más memoria que las que no lo
permiten. En nuestro caso, necesitamos tablas que permitan transacciones, y por tal, utilizaremos el tipo de
tablas InnoBD.
2. Crear tablas
Bien, a partir de ahora vamos a crear las tablas necesarias para crear nuestra aplicación tiendaDETALLES.
Para ello, accederemos a PHPMyAdmin y crearemos una tabla para la base de datos creada en la unidad anterior.
Esta tabla se llamará clientes y deberá especificar el número de campos (que en nuestro caso serán 12).

Formulario crear tabla


Pulse continúe para rellenar cada uno de los campos de la manera que indica la siguiente imagen:

Formulario crear tabla columnas


Además, como la clave primaria de la tabla clientes es IdCliente, deberá indicarlo marcando en la pestaña índice
como primario, y además, haciendo clic sobre A I (autoincrement) para que MySQL se encargue de asignarle en
cada inserción un identificador único.
Por último, deberemos decirle a MySQL que queremos una tabla InnoBD seleccionando esta opción en tipo de
tabla (abajo).

Tipo de tablas base de datos


Hecho esto y después de darle a grabar, deberíamos de ver una pantalla como esta:
Vista estructura tabla base de datos
Para continuar con la lección, he añadido varias tablas a nuestra base de datos. Es aconsejable no utilizar
acentos en los nombres de las tablas:
Tabla carritocompra: en esta tabla almacenaremos los detalles de los productos que el cliente ha decidido añadir
a su compra (junto a las cantidades para cada uno de ellos).
Representa el conjunto de productos que ha elegido comprar el usuario. Se identifica por un número de registro
único IdRegistro, pero realmente se utilizará el campo IdCarrito, que coincidirá con el identificador del cliente si
es un usuario registrado o con un identificador aleatorio si el usuario todavía no se ha registrado. De esta forma,
se identifica el carrito con el usuario en cuestión.
Cree en PHPMyAdmin la tabla con estos datos:

Definición tabla base de datos


Tabla 410ategorías: incluye la descripción de cada categoría de productos que tenemos en nuestra tienda virtual.
Por ejemplo, artículos de decoración, utensilios de cocina, etc. Esta tabla podría incluir detalles únicos para cada
categoría si fuera necesario, de forma que todos los productos de la misma “heredarían” dichas características.
Cree en PHPMyAdmin la tabla con estos datos:

Definición tabla y tipos base de datos


Tabla ordenes: para ello habrá tenido que identificarse para entrar en la tienda como un usuario registrado. Se
guarda el total del pedido para no tener que calcularlo cada vez.
Cree en PHPMyAdmin la tabla con estos datos:
Definición tabla y tipos base de datos
Tabla productos: Almacena toda la información de los productos disponibles en la tienda, incluyendo un campo
donde se indica la ubicación de una imagen digital del producto.
Cree en PHPMyAdmi n la tabla con estos datos:

Definición tabla y tipos base de datos


MySQL proporciona distintos tipos de datos para los campos de las tablas en función de la naturaleza de los
valores que se van a almacenar: valores numéricos, de texto, fechas, etc.
Aquí presentamos los más relevantes:
Tipos variables mysql
Relaciones Uno A Muchos

1
Siguiente
1/2
Además de las tablas, las relaciones son otro tipo de objeto que se almacena en una base de datos. Sin
embargo, es un concepto más difícil de entender.
Usted ha entendido enseguida que necesitaba una tabla donde guardar la información sobre los clientes de la
tienda, otra tabla para los productos, etc.
Sin embargo, el objetivo de una base de datos relacional también es el poder extraer información útil a partir de
los datos guardados.
Para facilitar esta tarea, es conveniente enlazar las tablas con relaciones.
En el diagrama siguiente puede ver gráficamente las relaciones existentes en la base de datos. Las relaciones se
representan mediante enlaces que unen las tablas. Como límites de estos enlaces tenemos un icono de llave, que
representa la parte 1, y un icono del símbolo del valor infinito, que representa la parte muchos. En todas ellas se
exigen las restricciones de integridad referencial y están activadas las modificaciones y eliminaciones en cascada.

Esquema entidad relación de base de datos


Para establecer las relaciones, pulse en el botón Estructura de la tabla y acceda a la Vista de relaciones. Aquí
puede verlo para la tabla Productos.

Formulario web varios campos


Fíjese que aparece un campo llamado IdCategoria. Este campo representa la categoría a la que pertenece el
producto en cuestión y es fruto de la relación existente entre las tablas productos y ategorías.
En MySQL, es posible representar una relación de este tipo si hemos utilizado tablas InnoDB. Ésta es otra de las
ventajas de este tipo de tablas.
Esto no quiere decir que no podrá hacerlo si utiliza otro tipo de tablas, pero MySQL no las controlará por sí
mismo. Además, hay que crear un índice en las columnas que formarán la relación.
Si estudia la figura anterior, verá que en la columna FOREIGN KEY – InnoDB tenemos que la columna
IdCategoria de la tabla productos se enlaza con la columna IdCategoria de la tabla ategorías.
¿Para qué sirve esto? Pues para que:
Cuando se inserte un producto y se indique su categoría, que esa categoría exista en la tablas ategorías.
Cuando se elimine una categoría en la tabla ategorías, ¿qué pasa con los productos que pertenecen a dicha
categoría?
Lo mismo cuando lo que ocurre es que se modifica la clave principal de una categoría, ¿qué ocurre con los
productos relacionados?
Esto se indica en el apartado ON DELETE (al eliminar) y ON UPDATE (al actualizar).
Podemos indicar hasta cuatro posibilidades a aplicar cuando se elimine la categoría a la que pertenecen los
productos.
CASCADE: que también se eliminen los productos de esa categoría.
1
Siguiente
1/2
Relaciones Uno A Muchos

Anterior
1
2
2/2
SET NULL: que se ponga el campo IdCategoria de dichos productos al valor NULL.
NO ACTION: no permitir eliminar la categoría si existen productos asociados.
RESTRICT: lo mismo que NO ACTION.
Eligiendo CASCADE, si se elimina/actualiza una categoría que tiene productos relacionados, MySQL también
eliminará/actualizará estos últimos.
Al crear las relaciones, estamos facilitando que la base de datos se mantenga en un estado coherente.
Por ejemplo, en este caso no podremos crear productos que pertenecen a categorías inexistentes o nos
aseguraremos de eliminar los productos que pertenecen a una categoría que ha desaparecido.
Tenga en cuenta que los campos que establecen la relación deben ser del mismo tipo o al menos de tipos
compatibles. Esto es lógico, ya que, al fin y al cabo, almacenarán el mismo tipo de información.
Sin embargo, no es necesario que tengan el mismo nombre, aunque esto ayudará a la hora de crear las
relaciones.
Es importante darse cuenta de que el campo IdCategoria de la tabla productos ha aparecido justamente porque
hemos identificado esta relación al diseñar la base de datos.
En este caso se trata de una relación 1 a muchos, es decir, tendremos que una categoría puede tener muchos
productos (o ninguno), pero que un determinado producto sólo puede pertenecer a una categoría determinada.
Si no tiene mucha experiencia en bases de datos, seguramente el concepto más complicado con el que se va a
encontrar es el de relación.
Debe pensar en las relaciones como en algo que puede encontrar en la realidad. Así, podemos encontrar
relaciones en nuestra base de datos como:
Los productos pertenecen a una categoría.
Un carrito de la compra contiene productos.
Los productos aparecen en las órdenes de compra.
Los clientes realizan órdenes de compra.
Etc.
Recuerde que: Las relaciones entre tablas se representan como claves ajenas en MySQL.
Para poder crear claves ajenas son necesarios tres requisitos:
Que las dos tablas implicadas sean del tipo InnoDB.
Que el campo que actuará como clave ajena, referenciando a otra tabla, tenga un índice.
Que se cree la relación entre ambas tablas, lo que queda representado como una CONSTRAINT FOREING KEY en
el código SQL.
Si no utiliza tablas InnoDB, podrá simular las relaciones mediante los campos que aparecen para ello, pero no
podrá hacer que MySQL asegure las restricciones de integridad referencial que implica toda relación.
Anterior
1
2
Relaciones Muchos A Muchos

Continuamos la lección estudiando otro tipo de relación menos frecuente pero que también puede aparecer en
una base de datos: las relaciones muchos a muchos.
Por ejemplo, podemos ver que en una orden de compra pueden aparecer varios productos (junto a la cantidad
que se compra) y, además, un producto puede aparecer en varias órdenes de compra.
Por lo tanto, estamos identificando una relación muchos a muchos entre las tablas productos y ordenes.
Las relaciones muchos a muchos no se pueden representar directamente en una base de datos relacional, sino
que se tienen que seguir estos pasos:
Cree una nueva tabla en la que aparecerán dos campos representando las claves principales de las tablas
relacionadas.
Estos dos campos constituirán la clave principal de esta nueva tabla.
Adicionalmente pueden aparecer más campos en esta tabla, propios de la relación.
Establezca una relación 1 a muchos entre la nueva tabla y cada una de las tablas implicadas.
En nuestra base de datos creamos la tabla lineasorden para representar esta relación muchos a muchos. Observe
la estructura de la nueva tabla:

Estructura tabla base de datos


La clave principal de esta tabla es el par (IdOrden, IdProducto) y ambos campos participan en la relación con las
tablas ordenes y productos, respectivamente.

Formulario web múltiples campos


En algunos casos nos encontraremos con lo que se conoce como “campos calculados”. Por ejemplo, si abre la
estructura de la tabla ordenes, verá que allí hay un campo para el total a facturar de la orden.
Bien, realmente este campo no haría falta porque podemos obtener ese total a partir de la suma de los
subtotales de cada línea correspondiente a la orden.
El hecho de que aparezca el campo total en la orden es más un aspecto de eficiencia que de diseño, ya que será
más fácil guardar el total en ese campo una sola vez que tener que calcularlo siempre que lo necesitemos.
SQL

1
Siguiente
1/4
Introducción
SQL es un lenguaje estándar que permite manipular bases de datos relacionales. Esto quiere decir que podemos
utilizar SQL para realizar consultas de selección y modificación de una base de datos sin importarnos de qué tipo
son: MySQL, SQL Server, Oracle, Access, etc.
Conocer el lenguaje SQL es un requisito indispensable para crear aplicaciones profesionales de bases de datos,
ya que en muchos casos no hay otra forma de conseguir nuestro objetivo que escribir una consulta en este
lenguaje.
Por ello, esta lección introducirá el lenguaje SQL utilizándolo para acceder a la base de datos tiendabd, que
estamos utilizando en esta parte del curso.
Lo normal será escribir las consultas SQL en el interior del código PHP de nuestra aplicación, como veremos más
tarde. Sin embargo, ahora vamos a trabajar directamente en la base de datos, escribiendo el código SQL
necesario utilizando PHPMyAdmin.
Formulario web generar consulta
La sentencia SELECT
La sentencia SELECT es la más importante del lenguaje SQL.
Sirve para crear consultas de selección, es decir, consultas en las que extraemos resultados de la base de datos
sin que se vea modificada.
La sentencia SELECT puede ser muy sencilla o llegar a ser realmente complicada. Su objetivo es seleccionar
registros de la base de datos que cumplan ciertos criterios.
La consulta más sencilla que podemos hacer es: SELECT * FROM Nombre_Tabla
Utilizando el asterisco (*), estamos indicando que queremos recuperar todos los campos de la tabla o tablas que
se indiquen en la cláusula FROM.
Por ejemplo, SELECT * FROM clientes devuelve todos los registros (con todos sus campos) de la tabla clientes.

Registros de tabla de base de datos


Normalmente no se desea extraer toda la información de la base de datos, sino sólo algunos campos. Para ello,
lo que tiene que hacer es indicar la lista de campos tras la palabra SELECT:
SELECT IdCliente, Nombre, Apellidos, Edad FROM clientes
Además, podemos utilizar la cláusula WHERE para establecer los criterios de selección. Por ejemplo, nos gustaría
obtener sólo “los clientes menores de 35 años”.
SELECT IdCliente, Nombre, Apellidos, Edad
FROM clientes
WHERE Edad < 35
Resultados registros tabla
En esta consulta vemos las tres cláusulas fundamentales:
En la cláusula SELECT se indica el conjunto de campos que queremos extraer.
En la cláusula FROM se indica sobre qué tablas actuará la consulta.
En la cláusula WHERE establecemos los criterios de selección.
En ocasiones, la información que deseamos obtener proviene de más de una tabla. Por ejemplo, ahora deseamos
obtener aquellos “clientes que han realizado algún pedido”.
Así, podría haber clientes cuyos datos han sido recogidos de promociones o sorteos y que todavía no han
efectuado ninguna compra.
SELECT clientes.IdCliente, clientes.Nombre,
clientes.Apellidos
FROM clientes, ordenes
WHERE clientes.IdCliente = ordenes.IdCliente

Resultados registros tabla


Esta consulta es muy interesante, por varios detalles:
Primero: si utiliza más de una tabla en la consulta, es conveniente indicar el nombre de la tabla en la cláusula
SELECT, sobre todo si existen campos que se llaman igual en más de una tabla implicada.
Por ello hemos escrito clientes.IdCliente para especificar que queremos la información desde la tabla clientes y
no desde la tabla ordenes, donde también hay un campo que se llama igual.
Segundo: todas las tablas implicadas en la consulta aparecen en la cláusula FROM separadas por comas.
Es importante el orden en que se especifican las tablas en la cláusula FROM para optimizar la consulta. Así, debe
incluir primero la tabla que corresponda a la parte 1 de una relación 1 a muchos. En el ejemplo anterior, el orden
es correcto: clientes, órdenes. De esta forma, se recorre toda la tabla clientes y, para cada cliente, se recorre la
tabla órdenes.
Sin embargo, también es cierto que los gestores de bases de datos actuales ya se encargan de optimizar las
consultas internamente.
Tercero: en la cláusula WHERE se construye el criterio de selección. En este caso, elegimos aquellos registros de
clientes cuyo IdCliente está presente en la tabla ordenes.
Fíjese cómo las tablas clientes y ordenes poseen un campo llamado IdCliente en el que se estableció una relación
uno a muchos.
1
Siguiente
1/4
SQL

Anterior
1
2
Siguiente
2/4
Ahora puede ver el resultado de ejecutar la nueva consulta:
En el resultado aparecen aquellos clientes que han comprado alguna vez en nuestra tienda virtual de Internet. El
“problema” es que algunos de ellos lo han hecho en más de una ocasión, por lo que aparecen repetidos.
Podemos solucionar este detalle utilizando la palabra DISTINCT en la cláusula SELECT.
SELECT DISTINCT clientes.IdCliente, clientes.Nombre, clientes.Apellidos
FROM clientes, ordenes
WHERE clientes.IdCliente = ordenes.IdCliente
Ahora sólo aparecen una vez, por lo que la consulta es mucho más útil.

Resultados registros tabla 3 columnas


Vamos a complicar un poco la consulta, construyendo un criterio de selección más completo.
Ahora queremos obtener aquellos clientes que han comprado algún artículo a partir de una determinada fecha.
SELECT clientes.Nombre, clientes.Apellidos,
ordenes.FechaOrden
FROM clientes, ordenes
WHERE ((clientes.IdCliente = ordenes.IdCliente)
AND (ordenes.FechaOrden > '2004-12-20'))
Fíjese en la fecha de la orden que realizaron los clientes aquí listados. Siempre debe coincidir que lo hicieron en
una fecha posterior a 20 de diciembre de 2004.
Resultados registros tabla 3 columnas sin opciones
Utilizando los operadores AND, OR, NOT y otros menos conocidos, podremos crear criterios complejos de
selección que nos permitan obtener resultados interesantes para la toma de decisiones de la empresa. Por
ejemplo, podríamos enviar una carta de atención a nuestros mejores clientes,
Selecciones complejas
En este capítulo continuaremos construyendo consultas de selección conociendo otros operadores que podemos
utilizar con la sentencia SELECT.
Por ejemplo, vamos a solicitar aquellos artículos comprados por algún cliente cuyo precio oscile entre 70 y 200
unidades monetarias.
La información del precio se almacena en la tabla productos, mientras que los artículos comprados están en la
tabla lineasorden.
SELECT DISTINCT productos.Nombre, productos.Precio
FROM productos, lineasorden
WHERE (productos.IdProducto = lineasorden.IdProducto)
AND (productos.Precio BETWEEN 70 AND 200)
ORDER BY productos.Precio

Resultados tabla orden por columna


Es interesante que se dé cuenta de que estamos limitándonos a los artículos comprados, ya que seguramente
habrá más artículos cuyo precio esté entre 70 y 200 unidades monetarias.
En esta consulta utilizamos un operador nuevo: BETWEEN...AND. Con este operador podemos seleccionar
registros que cumplan que el valor de uno de sus campos se encuentra entre un valor y otro.
Adicionalmente, vemos la cláusula ORDER BY, que permite indicar cómo se ordenará el resultado. En este caso,
indicamos que se ordene según el campo Precio, que tiene que ser uno de los que aparecen en el resultado de la
consulta. Este orden puede ser ascendente (por defecto) o descendente si indicamos la palabra DESC.
Otro operador interesante es LIKE. Con este operador podemos buscar subcadenas de texto. Por ejemplo, nos
interesan los clientes cuyo nombre empieza por E.
SELECT Nombre
FROM clientes
WHERE Nombre LIKE 'E%'
Resultados tabla orden columna texto
Utilizamos el símbolo % para indicar que después de la E puede aparecer cualquier conjunto de caracteres
(incluso ninguno).
Como resultado hemos obtenido los clientes Eusebio y Elena.
Observe que ambos empiezan por la letra E.
También puede utilizar el carácter _ (subrayado) para especificar un único carácter en cierta posición. Por
ejemplo, un criterio como LIKE 'o_a' devolvería valores como ola, osa, etc.
El operador IS NULL permite seleccionar registros que tengan campos con valores nulos.
SELECT Nombre, Apellidos, FechaNacimiento
FROM clientes
WHERE FechaNacimiento IS NULL

Tabla mysql
Fíjese que ahora buscamos los clientes para los que no tenemos su fecha de nacimiento. Si lo que quisiéramos es
justamente lo contrario, podríamos utilizar IS NOT NU LL.
Anterior
1
2
Siguiente
2/4
SQL

Anterior
1
2
3
Siguiente
3/4
Otro aspecto interesante de las consultas de selección es cuando utilizamos una subconsulta como criterio de
otra consulta.
Por ejemplo, anteriormente vimos que podíamos seleccionar aquellos clientes que habían comprado algún
artículo ¿Cómo podría seleccionar los que todavía no lo han hecho? Lo mejor es seleccionar aquellos que sí que lo
han hecho y devolver los que no están incluidos.
SELECT IdCliente, Nombre, Apellidos, Telefono
FROM clientes
WHERE IdCliente NOT IN (SELECT Idcliente FROM ordenes)

Tabla mysql
Vemos que el criterio de búsqueda que aparece en la cláusula WHERE es, a su vez, una consulta de selección.
Utilizando el operador IN indicamos que queremos buscar aquellos registros cuyo IdCliente está en el resultado
de la subconsulta. Si antecedemos el operador NOT, obtenemos los que no están, que es lo que estamos
buscando.
Si compara el resultado anterior con el que obtuvimos cuando buscamos los clientes que habían comprado, verá
que es correcto.
Existen otros operadores, pero hemos visto los principales que necesitará al escribir consultas de selección.
Funciones agregadas
SQL proporciona una serie de funciones que podemos utilizar para realizar cálculos sobre la base de datos.
Estas funciones se conocen como funciones agregadas, ya que lo que hacen es realizar alguna operación en una
o más columnas sobre un conjunto de filas.
Por ejemplo, usted podrá calcular el número de filas que devuelve una consulta, el máximo valor en una
columna, la suma de determinadas filas, etc.
Las funciones que tenemos disponibles son:
COUNT: calcula el número de registros o filas que devuelve una consulta.
AVG: obtiene el valor medio de un conjunto de valores.
MAX: obtiene el valor máximo de un conjunto de valores.
MIN: obtiene el valor mínimo de un conjunto de valores.
SUM: obtiene la suma de un conjunto de valores.
Por ejemplo:
SELECT COUNT(*) AS NumeroClientes
FROM clientes

Resultados tabla un resultado


Con esta sencilla consulta calculamos el número de registros de la tabla clientes. Cuando se utiliza una función
agregada, es conveniente asociar un alias o nombre para el resultado de dicha función. Esto se consigue con la
palabra AS seguida de dicho nombre.
De esta forma, el nombre NumeroClientes actúa como una columna más del resultado de la consulta, por lo que
podremos acceder a ella más fácilmente en el código que escribamos en la aplicación.
Las funciones agregadas son mucho más útiles cuando se puede agrupar el resultado obtenido.
Por ejemplo, podríamos desear conocer el número de pedidos que ha realizado cada cliente.
En este caso, el resultado debe ser un valor calculado a partir de una función agregada, pero agrupándolo por los
distintos clientes.
Para agrupar resultados se utiliza la cláusula GROUP BY:
SELECT clientes.Nombre, clientes.Apellidos,
COUNT (ordenes.IdOrden) AS PedidosRealizados
FROM clientes, ordenes
WHERE (clientes.IdCliente = ordenes.IdCliente)
GROUP BY clientes.Nombre, clientes.Apellidos

Resultados tabla tres columnas sin opciones


Debe agrupar los resultados por cada uno de los campos indicados en la cláusula SELECT, excepto por los
correspondientes al uso de las funciones agregadas.
En el resultado vemos cómo sólo aparecen los socios que han realizado algún pedido, ya que la cláusula WHERE
determina este criterio de selección.
También podemos aplicar criterios de selección a los grupos. Por ejemplo, si usted quiere conocer sólo los
clientes que han realizado más de tres pedidos, ¿dónde indica este criterio de selección?
No puede hacerlo en la cláusula WHERE, ya que esta cláusula sólo afecta a los registros sin agrupar. En lugar de
ello, se utiliza la cláusula HAVING.
HAVING actúa de la misma forma que WHERE, pero afectando a los valores ya agrupados:
SELECT clientes.Nombre, clientes.Apellidos,
COUNT (ordenes.IdOrden) AS PedidosRealizados
FROM clientes, ordenes
WHERE (clientes.IdCliente = ordenes.IdCliente)
GROUP BY clientes.Nombre, clientes.Apellidos
Anterior
1
2
3
Siguiente
SQL

Anterior
1
2
3
4
4/4
HAVING PedidosRealizados > 3

Resultados tabla tres columnas sin opciones


Conociendo la existencia de las funciones agregadas, damos por finalizado el estudio de las consultas de
selección. Recuerde que en este tipo de consultas, la base de datos no sufre ninguna alteración, ya que sólo nos
sirven para extraer resultados de ella.
La sintaxis completa de la sentencia SELECT quedaría:
SELECT Conjunto de campos
FROM Conjunto de tablas
WHERE Criterios de selección
GROUP BY Conjunto de campos
HAVING Criterios de selección
ORDER BY Conjunto de campos
La sentencia INSERT
A diferencia de las consultas de selección, las sentencias SQL que permiten modificar la base de datos son mucho
más sencillas. La primera que vamos a estudiar es INSERT, que permite insertar registros en una tabla.
INSERT INTO Nombre_Tabla (Lista_Campos)
VALUES (Lista_Valores)
Para ello, debemos indicar la tabla que se verá afectada, el conjunto de campos y sus correspondientes valores.
Deberá incluir todos los campos en los que no pueda haber un valor nulo.
Por otra parte, si hay algún campo auto_increment, no debe incluirlo en la lista, ya que el valor adecuado se
genera automáticamente.
Vamos a escribir una consulta de modificación para insertar un nuevo producto:
INSERT INTO productos (Nombre, Precio, Descripcion,
ImageURL, IdCategoria)
VALUES (‘Vela redonda’, 2.5, ‘Consigue un ambiente acogedor con esta vela redonda.’,‘images/Nodisponible.gif’,
1)
En la primera línea incluimos entre paréntesis el conjunto de campos para los que proporcionaremos un valor,
mientras que abajo se indican dichos valores.
Es importante que se dé cuenta de que, aunque no hemos indicado su identificador (IdProducto), MySQL lo
creará por nosotros porque es un campo auto_increment.
La sentencia UPDATE
Podemos cambiar la información almacenada en la base de datos a través de la sentencia UPDATE.
UPDATE actualiza el contenido de uno o más campos y en uno o más registros.
Debe tener mucho cuidado con esta sentencia, ya que si no limita el conjunto de registros que se verá afectado,
puede cambiar el contenido de toda la tabla.
UPDATE Nombre_Tabla
SET Campo1=Valor/Expresión, SET Campo2=Valor/Expresión...
WHERE Condición
Por ejemplo, hemos asignado la categoría 1 (que se refiere a artículos de decoración) al producto que acabamos
de insertar. Sin embargo, ahora preferimos que se encuentre entre los artículos del hogar, que queda
representado por la categoría número 3...
UPDATE productos
SET IdCategoria = 3
WHERE (IdProducto = 31)
Indicamos la tabla sobre la que actuamos, el conjunto de campos que se verá afectado y el criterio de selección.

Recuerde incluir siempre el criterio de selección en la cláusula WHERE: si no lo hace, modificará toda la tabla.
La sentencia DELETE
Finalmente, podemos utilizar la sentencia DELETE para eliminar registros de una o más tablas.
DELETE es una sentencia muy sencilla, pero también muy peligrosa porque conlleva eliminar información de la
base de datos. Por ello, es conveniente utilizar siempre algún criterio de selección, de la misma forma que hemos
visto con la sentencia UPDATE.
DELETE FROM Nombre_Tabla
WHERE Criterio_Selección
Vamos a eliminar los clientes que no han realizado ningún pedido:
DELETE FROM clientes
WHERE IdCliente NOT IN (SELECT IdCliente FROM ordenes)
Se indica la tabla o conjunto de tablas a eliminar y el criterio de selección que se aplica para conocer cuáles son
los registros que se verán afectados.
Tenga en cuenta que se puede haber definido restricciones de integridad referencial en la tabla clientes.
Esto es importante al actualizar y al eliminar registros. Por ejemplo, si hubiésemos eliminado clientes que sí que
habían realizado algún pedido, se hubiesen aplicado estas restricciones.
Tal como creamos la base de datos, se aplica la regla CASCADE para la eliminación y actualización, por lo que
también se hubiesen eliminado los registros relacionados de la tabla ordenes y, a su vez, de lineasorden.

Acceder A La Base De Datos

Ahora que hemos creado nuestra base de datos ya solo falta conocer como a través del lenguaje PHP podemos
acceder a ella como si en PHPMyAdmin estuviéramos trabajando.
El esquema a seguir, siempre es el mismo:
Establecer la conexión con la base de datos
Elegir la base de datos
Realizar la sentencia SQL deseada
Opcionalmente, cerrar la conexión.
También dijimos en el tema anterior que trabajaríamos con la extensión mysqli utilizando su funcionalidad para
acceder a nuestra base de datos.
Además, debemos recordar que accederemos a la base de datos desde nuestro código PHP como un determinado
usuario (usuario que creamos en el tema anterior).
Establecer La Conexión

La extensión mysqli proporciona fundamentalmente dos clases muy importantes.


Mysqli, que permite establecer la conexión con la base de datos.
Mysqli_result, que proporciona propiedades y métodos para trabajar con dicha información.
Por lo tanto, lo primero será crear un objeto mysqli para establecer la conexión:

Como ve, lo que hemos hecho ha sido llamar al constructor de la clase mysqli, pasándole por parámetro, el
nombre del servidor que contiene la base de datos, nuestro nombre de usuario, la contraseña de ese usuario, y
la base de datos con la que queramos trabajar.
Sin embargo, no es una buena opción escribir contraseñas y datos importantes en el código de una página web,
sino que lo ideal sería guardar estos datos en un archivo y que el código “cogiera” los datos de ahí, por tanto lo
que vamos a hacer es crear un archivo conexión.inc.php que contendrá la parte confidencial.

Y luego como ya sabe, incluirlo en el código php de la página que vaya usarlo, de esta manera:
De esta manera “escondemos” los datos confidenciales, tras el archivo conexión.inc.php y evitamos que un
usuario pueda leer el código de nuestra página y descubrir estos datos.
También, debería ser bueno comprobar que se ha establecido la conexión con éxito, y si no fuera así, avisar al
usuario y terminar con la ejecución de la página.
Esto lo haríamos con un código parecido a este:

Mostrar Los Datos En Una Tabla

Bien, pues el siguiente paso es realizar la consulta que necesitemos.


Para ello utilizaremos el método query de esta manera.

Cuyo resultado lo almacenaremos en una variable, por ejemplo $resultado.


Y ahora podremos utilizar ese resultado para mostrar la información en la página web. Para ello, lo mejor es
hacerlo en una tabla HTML.

Se utiliza al final de cada línea la expresión \n, para que en el código HTML se incluya un retorno de carro,
creando una nueva línea.
Pero esto sólo es para el código HTML, no para el resultado de la página web.
Hay varios detalles a comentar:
Se utiliza un bucle while para recorrer el conjunto resultado de la consulta. Además, utilizamos el método
fetch_array para obtener dicho resultado como un array y poder recorrerlo con el bucle while.
Este bucle devolverá false cuando no haya más elementos del array.
Es muy importante que vea la diferencia entre disponer del conjunto resultado de la consulta y la forma de
acceder a esa información. Para obtenerlo, hemos utilizado el método query de la conexión; mientras que para
acceder a él, hemos utilizado el método fetch_array de dicho resultado.
El método fetch_array devuelve un array en el que cada fila es un registro del resultado. Este array puede
utilizarse con índices numéricos empezando desde el 0 y como array asociativo, en el que cada índice es el
nombre de un campo.
En nuestro ejemplo, utilizamos los índices numéricos, pero también podríamos haber escrito el código como:
$fila["IdProducto"], $fila["Nombre"], etc.
El método fetch_array es un método de la clase mysqli_result.
Recuerde: la clase mysqli sirve para crear la conexión y mysqli_result para trabajar con el conjunto resultante
tras realizar una consulta a la base de datos.
En el interior del bucle que recorre el conjunto resultado utilizamos un bucle for para crear una celda de datos
por cada uno de los valores correspondientes a los seis campos del mismo; esto es, el identificador del producto,
su nombre, precio, descripción, categoría e imagen.
Finalmente, completamos el código HTML de la tabla con la etiqueta de cierre </TABLE>.
Cerrar La Conexión

Aunque no es obligatorio porque tarde o temprano la recolección de basura de PHP liberará la memoria y los
recursos ocupados por una conexión, es conveniente cerrar tanto la conexión como el objeto resultado de la
consulta.
Para ello, se utiliza el método close de ambos objetos.
$resultado->close();
$conexion->close();
En la primera línea cerramos el resultado correspondiente a la consulta realizada, por lo que se libera la memoria
ocupada en el servidor. Es importante hacerlo una vez ya no vamos a utilizar dicho resultado, sobre todo si el
conjunto que hemos obtenido tras ejecutar la consulta es grande.
En la segunda línea se cierra la propia conexión con la base de datos.
Aunque ambos procesos se efectuarán automáticamente si no escribimos este código, es una buena idea hacerlo
para liberar los recursos en el momento en que lo indicamos y no esperar a que lo haga PHP por su cuenta.

Práctica 23a

En esta práctica creará el conjunto de tablas en la base de datos MySQL para la aplicación de la tienda de
Internet que estamos desarrollando.
Utilice su navegador para acceder a la base de datos que creó en la práctica anterior a través de PHPMyAdmin.
Recuerde que tiene que hacerlo identificándose como root (sin contraseña).
Ahora le toca crear las seis tablas de la base de datos. Tenga en cuenta que tienen que ser del tipo InnoDB:
carritocompra: Representa el conjunto de productos que ha elegido comprar el usuario. Se identifica por un
número de registro único (campo IdRegistro), pero realmente se utilizará el campo IdCarrito, que coincidirá con
el identificador del cliente si es un usuario registrado o con un identificador aleatorio si el usuario todavía no se
ha registrado. De esta forma, se relaciona el carrito con el usuario en cuestión. Esta tabla sólo tendrá registros
cuando exista un carrito de la compra actual, en el que todavía no haya sido confirmada la orden
correspondiente.

categorías: Incluye la descripción de cada categoría de productos que tenemos en la tienda. Por ejemplo,
artículos de decoración, utensilios de cocina, etc. Se identifica con el campo IdCategoria.

clientes: Almacena toda la información necesaria sobre los clientes, incluyendo su dirección de correo electrónico
y contraseña, datos necesarios para entrar como usuario registrado en la tienda. Se identifican con el campo
IdCliente.
lineasorden: Tabla resultante de la relación muchos a muchos entre las tablas productos y ordenes. Se almacena
el detalle de cada producto incluido en una orden en firme de compra. La clave de esta tabla es el par (IdOrden,
IdProducto).

ordenes: Representa los pedidos en firme efectuados por el usuario. Para ello habrá tenido que identificarse para
entrar en la tienda como un usuario autenticado. Se guarda el total del pedido. Se identifica con el campo
IdOrden.

productos: Almacena toda la información de los productos disponibles en la tienda, incluyendo un campo donde
se indica la ubicación de una imagen digital del producto. Se identifica con el campo IdProducto.

No vamos a establecer las relaciones entre las tablas ni a exigir las restricciones de integridad referencial,
aunque lo podríamos hacer al haber elegido el tipo de tabla InnoDB.
Una vez creadas las seis tablas, debemos rellenarlas con algunos registros. Esto normalmente se realizará a
través de la aplicación PHP, pero para poder realizar alguna de las prácticas siguientes, necesitamos que ya
tengan contenido.
Así pues, acceda a la ficha SQL en la parte superior del panel de la derecha de PHPMyAdmin y escriba las
consultas oportunas.
Para ello, encontrará entre los trabajos de la lección una serie de archivos de texto. Siga cuidadosamente estos
pasos:

Práctica 23a

Abra el archivo de texto InicializarClientes.txt, seleccione todo su contenido (Edición – Seleccionar todo en el
menú Edición del Bloc de notas) y cópielo en el portapapeles (Edición - Copiar).
Vuelva a PHPMyAdmin y pegue dicho contenido en el cuadro de texto correspondiente a la consulta SQL a
ejecutar, reemplazando el contenido inicial de dicho cuadro de texto. Obsérvelo en la figura de la página
siguiente
Pulse en el botón Continúe para ejecutar la consulta SQL.
Repita los pasos anteriores para los archivos Inicializar- Categorias.txt, InicialilzarProductos.txt,
InicializarOrdenes.txt e InicializarLineasOrden.txt, en este mismo orden.
Con estos pasos conseguimos disponer de la base de datos completa respecto a su estructura y con cierto
contenido:
11 clientes (tabla clientes),
3 categorías de productos (tabla categorías),
30 productos (tabla productos),
34 pedidos efectuados por los clientes (tabla órdenes) y sus correspondientes líneas de detalle (tabla
lineasorden).
Realizar esta práctica correctamente es fundamental para que el resto de prácticas se desarrollen normalmente.
Por lo tanto, tenga mucho cuidado en todos los pasos indicados.
Solución de la práctica 23a
El enunciado de esta práctica le indica los pasos a seguir, por lo que a continuación sólo se comentarán algunos
detalles importantes.
Para acceder a PHPMyAdmin, escriba la dirección http://localhost/phpmyadmin en su navegador web. Deberá
identificarse como root y sin contraseña. Después seleccione la correspondiente base de datos en el panel de la
izquierda (por ejemplo, lopezbd) y escriba el nombre de la tabla y su número de campos en el apartado Crear
nueva tabla en la base de datos.
Al crear las tablas, asegúrese de escribir correctamente todos los campos (sin acentos), así como su tipo de
datos, longitud y si se permiten valores nulos. Recuerde activar autoincremento (AI) y la opción de clave
primaria en aquel o aquellos campos que la compongan.
Es muy importante elegir el tipo de tabla InnoDB. Esto aparece como una lista desplegable debajo de los
campos.
Una vez creadas las tablas, es importante el orden en que se ejecutan las consultas SQL para incorporar datos.
Bueno, realmente es importante si se establecen las relaciones y las correspondientes restricciones de integridad
referencial; si no es así, puede hacerlo en cualquier orden.
Por ejemplo, si ejecuta antes la consulta InicializarLineasOrden que la de
InicializarProductos o que la de InicializarOrdenes, entonces ocurriría un error ya que estará intentando añadir
líneas referentes a una orden o a un producto que todavía no existe.
No pase a la siguiente lección hasta que tenga la base de datos en un estado estable, ya que es muy
recomendable este tema para seguir el curso con naturalidad.
Si durante el proceso obtiene algún tipo de error, parece a pensar que puede estar pasando y arréglelo.

Práctica 23b

En esta práctica deberá escribir algunas consultas en el lenguaje SQL y ejecutarlas contra la base de datos que
creó en la práctica anterior.
Acceda con su navegador web a la aplicación PHPMyAdmin y seleccione su base de datos (por ejemplo, lopezbd).
Sitúese en la ficha SQL de la parte superior del panel de la derecha de PHPMyAdmin.
En el cuadro de texto Ejecute la/s consulta/s SQL en la base de datos... escriba el código SQL necesario (y
ejecútelo pulsando en el botón Continúe):
Listar los campos IdCliente, Nombre, Apellidos y Email de aquellos clientes que han realizado algún pedido.
Fíjese que podríamos disponer de datos sobre clientes potenciales, que todavía no han comprado ningún artículo.
Estos últimos clientes no nos interesan en el resultado de la consulta.
Listar los campos IdOrden, IdCliente, FechaOrden y Total de aquellas órdenes o pedidos cuyo importe total esté
entre las 400 y 1000 unidades monetarias. El resultado debe aparecer ordenado ascendentemente según dicho
importe.
Listar todos los detalles de las líneas de una orden cuyo importe total ascienda a más de 1000 unidades
monetarias.
Mostrar el nombre, apellidos y email de aquellos clientes en cuyas órdenes de compra hay más de un artículo.
Ordenar el resultado descendentemente según el número de productos comprados en la orden.
Reflejar en la base de datos el hecho de que se acaba de confirmar una nueva orden con estos detalles:
"El cliente número 7 ha comprado una unidad del producto 4 y dos unidades del producto 22. La fecha de la
compra coincide con el día de hoy, mientras que serán enviados los productos tres días después".
Solución de la práctica 23b
Acontinuación se comentan las distintas consultas SQL. Una vez escritas en la ficha SQL de PHPMyAdmin, pulse
en el botón Continúe para obtener el correspondiente resultado.
1.- Listar los campos IdCliente, Nombre, Apellidos y Email de aquellos clientes que han realizado algún pedido.
SELECT DISTINCT clientes.IdCliente, clientes.Nombre, clientes.Apellidos,
clientes.Email
FROM clientes, ordenes
WHERE (clientes.IdCliente = ordenes.IdCliente)
Obtenemos los detalles indicados en el enunciado, pero sólo de aquellos clientes cuyo IdCliente aparece en la
tabla órdenes. Se utiliza la palabra clave DISTINCT para que no aparezcan clientes repetidos si se da el caso de
que han comprado en más de una ocasión. Éste es el resultado obtenido:

2.- Listar los campos IdOrden, IdCliente, FechaOrden y Total de aquellas órdenes o pedidos cuyo importe total
esté entre las 400 y 1000 unidades monetarias. El resultado debe aparecer ordenado ascendentemente según
dicho importe.
SELECT IdOrden, IdCliente, FechaOrden, Total
FROM ordenes
WHERE Total BETWEEN 200 AND 1000
ORDER BY Total

3.- Listar todos los detalles de las líneas de una orden cuyo importe total ascienda a más de 1000 unidades
monetarias.

Práctica 23b

SELECT lineasorden.IdOrden, lineasorden.IdProducto, lineasorden.Cantidad,


lineasorden.Subtotal
FROM ordenes, lineasorden
WHERE (ordenes.IdOrden = lineasorden.IdOrden) AND (ordenes.total > 1000)
4.- Mostrar el identificador, nombre, apellidos y email de los clientes que han comprado en la tienda virtual junto
al número de veces que han realizado un pedido. Ordenar el resultado descendentemente según este último
dato."
SELECT clientes.IdCliente, clientes.Nombre, clientes.Apellidos,
clientes.Email, COUNT(ordenes.IdOrden) AS NumeroOrdenes
FROM clientes, ordenes
WHERE (clientes.IdCliente = ordenes.IdCliente)
GROUP BY clientes.IdCliente, clientes.Nombre, clientes.Apellidos,
clientes.Email
ORDER BY NumeroOrdenes DESC

Fíjese que tenemos que agrupar el resultado por cada uno de los campos solicitados, excepto IdOrden, ya que
forma parte de una función agregada. También es interesante ver que si queremos ordenar el resultado
descendentemente, es necesario indicarlo expresamente en la cláusula ORDER BY con la palabra clave DESC.
5.- Reflejar en la base de datos el hecho de que se acaba de confirmar una nueva orden.
En este caso, se necesita primero crear la orden, después las líneas de detalle de dicha orden y, finalmente,
actualizar la orden con su total. En realidad son varias consultas:
INSERT INTO ordenes (IdCliente, FechaOrden, FechaEnvio) VALUES (7, '2005-10-24', '2005-10-27')
Con esto creamos la orden pero no establecemos su total, ya que todavía no lo conocemos.
Ahora necesitamos saber cuál es el identificador de la orden que se acaba de crear para indicarlo en las líneas de
detalle (aquí lo indicamos para las fechas indicadas en el ejemplo anterior):
SELECT IdOrden
FROM ordenes
WHERE (IdCliente = 7 AND FechaOrden = '2005-10-24' AND FechaEnvio = '2005-10-27')
Conociendo dicho valor (por ejemplo, el 35), ya podemos crear las líneas de detalle, pero también necesitamos
conocer el precio de los productos comprados:
SELECT IdProducto, Precio
FROM productos
WHERE (IdProducto = 4) OR (IdProducto = 22)
El precio del producto 4 es 235 y del producto 22 es 32 unidades monetarias. Creemos pues, las líneas del
detalle de la orden.
Producto 4:
INSERT INTO lineasorden (IdOrden, IdProducto, Cantidad, Subtotal)
VALUES (35, 4, 1, 235)
Producto 22:
INSERT INTO lineasorden(IdOrden, IdProducto, Cantidad, Subtotal)
VALUES (35, 22, 2, 64)
Finalmente, ya podemos actualizar el campo Total de la orden:
UPDATE ordenes
SET Total = 299
WHERE (IdOrden = 35)

Práctica 23c

En esta práctica tendrá que escribir las consultas SQL necesarias y establecer la conexión con la base de datos
para extraer los detalles de la orden que creó en la práctica anterior.
Cree una nueva página llamada practica22.php en la que debe conseguir el resultado que puede ver a
continuación.
Una de las consultas que ejecutó en la práctica anterior creaba una nueva orden (la número 35). Pues en esta
página se muestran los detalles de dicha orden.
Deberá establecer la conexión utilizando para ello el nombre de usuario y contraseña que creó en una práctica
anterior. En ningún caso debe hacerlo como root. Si siguió las indicaciones dadas, el nombre de usuario será su
primer apellido más la inicial de su nombre mientras que la contraseña será la palabra password.

Fíjese que en la página se muestran detalles que aparecen en distintas tablas. Por ejemplo, el nombre del
producto aparece en la tabla productos, mientras que los otros datos de detalle aparecen en la tabla lineasorden.

Además, el total de la orden aparece en la tabla ordenes. Por lo tanto, tendrá que ejecutar, al menos, dos
consultas contra la base de datos MySQL.
Solución de la práctica 23c
Lo primero será crear conexión.inc.php

Y a partir de ahí ya podremos realizar practica22.php


Vista la solución, comentemos los pasos que hemos seguido:
Incluir el archivo donde se guardan las credenciales con las que se accede a la base de datos.
Establecer la conexión creando un objeto mysqli. Para ello, se utiliza su constructor:
$conexion = new mysqli($servidor, $usuario, $passwd, $basedatos);
Preparar la consulta y ejecutarla con el método query de dicho objeto conexión:
$resultado = $conexion->query($sql);
Acceder a la información utilizando el método fetch_array del resultado de la consulta anterior.
Como este método devuelve un array al que se puede acceder mediante índices numéricos o mediante el nombre
de los elementos, podemos utilizar la nomenclatura que queramos:
$fila = $resultado->fetch_array()
$fila[$columna] o $fila["Total"]
Imprimir estos datos en una tabla HTML. Para ello, se recorre todo el array y se crea el código HTML necesario.
Cerrar el resultado y la conexión con sus métodos close.
Fíjese que estamos utilizando dos consultas: en la primera obtenemos los datos necesarios para el detalle de la
orden y en la segunda el total de la misma. Utilizamos los mismos objetos en las dos consultas.

Recuerda

Toda base de datos relacional se basa en dos objetos fundamentales:


Tablas, donde se almacena la información.
Relaciones, que permiten extraer resultados a partir de la información almacenada en las tablas, así como
mantener la integridad de dicha información.
Los campos o columnas representan las distintas categorías de información que almacena la tabla, como puede
ser el nombre, los apellidos, la dirección, el teléfono, etc., en el caso de una tabla donde se guardan los detalles
de los clientes de la empresa.
Los registros o filas de la tabla representan los valores individuales o concretos de dichos campos.
Las tablas que permiten transacciones necesitan más espacio en disco y utilizan más memoria que las que no lo
permiten.
Las relaciones se representan mediante enlaces que unen las tablas.
Al crear las relaciones, estamos facilitando que la base de datos se mantenga en un estado coherente.
Para poder crear claves ajenas son necesarios tres requisitos:
Que las dos tablas implicadas sean del tipo InnoDB.
Que el campo que actuará como clave ajena, referenciando a otra tabla, tenga un índice.
Que se cree la relación entre ambas tablas, lo que queda representado como una CONSTRAINT FOREING KEY en
el código SQL.
La sentencia SELECT puede ser muy sencilla o llegar a ser realmente complicada. Su objetivo es seleccionar
registros de la base de datos que cumplan ciertos criterios.
El operador IS NULL permite seleccionar registros que tengan campos con valores nulos.
SQL proporciona una serie de funciones que podemos utilizar para realizar cálculos sobre la base de datos y
realizar alguna operación en una o más columnas sobre un conjunto de filas.
La sentencia INSERT permite insertar registros en una tabla.
Podemos cambiar la información almacenada en la base de datos a través de la sentencia UPDATE.
Utilizaremos la sentencia DELETE para eliminar registros de una o más tablas.

Preguntas de Autoevaluación
1.
En la relación entre las tablas productos y categorías de la base de datos tiendabd: ¿Cuál es la tabla principal?:
Productos.
Categorías.
2.
¿Qué tipo de tabla debe utilizar si necesita transacciones y, además, quiere establecer claves ajenas en las
tablas?:
MyISAM.
InnoDB
3.
¿En qué clausula de una sentencia SELECT debe escribir las tablas a las que se hace referencia?:
SELECT.
FROM.
WHERE.
4.
¿En qué cláusula escribiría criterios de selección que se apliquen a los resultados agrupados mediante GROUP
BY?:
Where.
Having.
5.
¿Qué sentencia SQL utilizaría para eliminar registros de una tabla?:
INSERT.
UPDATE.
DELETE.

Ordenar El Resultado

Una funcionalidad que debemos procurar al usuario cuando mostremos resultados de nuestra base de datos debe
de ser la posibilidad de ordenar el resultado.
Observe esta imagen:
Como puede ver, los productos están ordenados tal y como aparecen en la base de datos, por su identificador.
Pero, ¿Qué pasa si el usuario quisiera cambiar ese orden para por ejemplo ordenarlo por precio?
Pues bien, tendremos que proporcionar como mínimo esa funcionalidad, y para ello, lo primero será modificar el
código HTML de las cabeceras de las columnas.
Ahora no serán elementos de texto, sino hipervínculos, en los que mediante el array $_GET le pasaremos a la
misma página la información de ordenación seleccionada.
Como puede ver, lo que hacemos es redirigirnos mediante $_SERVER[‘PHP_SELF’] a la página en la que estamos
pero pasando mediante el método GET, la variable orden=IdProducto que será el método de ordenación.
Una vez hemos preparado las cabeceras de cada columna para que nos informen de cómo debe ordenarse la lista
de productos, vamos a utilizar dicha información en la consulta SQL.

Con esta condición comprobamos si se ha pulsado en alguna columna, si es así el orden será el seleccionado y si
no se ha pulsado porque acabamos de entrar en la página, el orden lo dará IdProducto.
Finalmente, utilizamos el orden adecuado en cada caso simplemente indicándolo en la cláusula ORDER BY de la
consulta que obtiene el listado de productos.

Dividir El Resultado En Páginas

Otra funcionalidad que podremos observar en otras páginas y que conviene proporcionar al usuario es dividir la
información en distintas páginas, porque por ejemplo en nuestro caso, no tenemos mucha información y
contemplar en una página 31 registros no es nada, pero es posible que en nuestra base de datos tengamos miles
de registros por lo que necesitaremos “paginarlos” y darle la opción al usuario de que elija, cuantos registros
quiere ver y moverse por ellos.
Podemos proporcionar paginación fácilmente utilizando el modificador LIMIT de una
consulta SELECT. LIMIT establece un límite en cuanto al número de registros que devolverá SELECT.
Su sintaxis es LIMIT [desplazamiento,] numerodefilas. En desplazamiento podemos indicar desde qué registro
queremos obtener los resultados y en numerodefilas, el número de filas que devolverá la consulta.
Por ejemplo, LIMIT 0, 5 devolverá las 5 primeras filas del SELECT, mientras que LIMIT 10, 5 devolverá 5 filas a
partir de la número 10 del resultado.
Por lo tanto, para hacer paginación debemos conocer:
El número de filas por página.
El desplazamiento.
El número total de filas para saber si es necesaria la paginación.
También, es necesario conocer con anterioridad el número de filas que contiene nuestra base de datos, es decir,
el número de registros.
Esto podemos calcularlo de esta manera:

Ahora nos falta el número de filas que se mostrará en cada página y el desplazamiento: $num_filas = 5.
Tendremos 5 productos por página:
Con esto estamos diciendo que el desplazamiento en la base de datos a mostrar será 0 o el indicado mediante el
método GET.
Ahora solo falta, proporcionar al usuario alguna “manera” de que pueda pasar de una página a otra.
Esto lo haremos con un par de hipervínculos, uno hacia la página próxima y otra hacia la anterior (hay que tener
en cuenta que si estamos en la primera página no habrá anterior y si estamos en la última no habrá próxima).

Si ha estado guardando todos los códigos descritos en su editor (sino, puede encontrarlo en la carpeta de la
lección) y ha ejecutado el código final, se dará cuenta de que ya tiene la funcionalidad descrita, pero si observa
con cuidado podrá observar que al cambiar de página (dándole a siguiente por ejemplo) el orden se pierde, por
lo que no podemos permitirlo.
Para ello, lo único que hay que hacer es pasar mediante GET el orden y el desplazamiento:

Consultas Preparadas

Finalizamos esta lección con un concepto nuevo introducido en la extensión mysqli. Se trata de la posibilidad de
utilizar consultas preparadas.
La idea que está detrás de este concepto es la de conseguir un mayor rendimiento en la comunicación entre el
servidor de base de datos y nuestra aplicación PHP. Con un ejemplo entenderá a qué nos estamos refiriendo.
Imagínese que, mensualmente, usted recibe un archivo de texto con los nuevos productos que se tienen que
incorporar al catálogo de su tienda virtual.
En este archivo de texto tenemos una línea por cada nuevo producto, indicando todos sus detalles, como pude
ver a continuación:
Nuevo1;;0;;Descripción1;;images/Nodisponible.gif;;1
Nuevo2;;0;;Descripción2;;images/Nodisponible.gif;;1
Nuevo3;;0;;Descripción3;;images/Nodisponible.gif;;1
Nuevo4;;0;;Descripción4;;images/Nodisponible.gif;;1
Nuevo5;;0;;Descripción5;;images/Nodisponible.gif;;1
Nuevo6;;0;;Descripción6;;images/Nodisponible.gif;;1
Nuevo7;;0;;Descripción7;;images/Nodisponible.gif;;1
Nuevo8;;0;;Descripción8;;images/Nodisponible.gif;;1
Nuevo9;;0;;Descripción9;;images/Nodisponible.gif;;1

Vemos que cada detalle del producto viene separado por dos puntos y coma (;;). Así tenemos el nombre (que
por claridad establecemos a Nuevo1, Nuevo2, etc.), el precio, la descripción, la URL de la imagen y la categoría,
respectivamente.
Fíjese que lo que tiene que hacerse es insertar los nueve registros en la tabla productos. Es decir, que
deberemos ejecutar nueve veces una consulta del tipo INSERT INTO.

Aquí vemos dicha consulta pero con una particularidad, que es que los valores que se insertan
(cláusula VALUES ) no se especifican directamente, sino que se utiliza en su lugar un signo de interrogación.
1) Esto quiere decir que posteriormente tendrán que tomar los valores correctos para ejecutar la inserción.
2) En la línea siguiente es donde se indica esto. Con el método prepare del objeto conexión, “preparamos” la
consulta.
3) Es decir, la dejamos lista para ejecutarla posteriormente, cuando ya tengamos los valores del nuevo
producto.

Pues bien, ésta es la ventaja de utilizar las consultas preparadas, ya que se guardan en el servidor de base de
datos y están a disposición de nuestro código para ejecutarlas las veces que necesitemos.
Es decir, que en lugar de enviar la consulta nueve veces para insertar los nueve productos, lo hacemos una única
vez y después sólo se enviarán los valores concretos de cada producto.
Esto mejora significativamente el rendimiento de la aplicación si se realiza varias veces la misma consulta.
Una vez preparada la consulta, ya podemos dar los valores adecuados y ejecutarla. Fíjese cómo lo hacemos aquí:

Debe utilizar el método bind_param de la consulta preparada para enlazar los parámetros que ésta necesita.
El método bind_param necesita primero una cadena donde se indica la naturaleza de los parámetros y después
cada uno de esos parámetros.
Así pues, con la cadena “sdssi” indicamos que el primer parámetro es una cadena de texto, el segundo es un
valor decimal, el tercero y cuarto vuelven a ser texto y, finalmente, el quinto es un valor entero.
Éste es el significado de los caracteres que se utilizan para indica el tipo de los parámetros:
i: variables de tipo entero.
D: variables de tipo doublé.
S: variables de tipo String.

Consultas Preparadas

B: variables de tipo blob (de gran tamaño).


Después aparecen las variables que se utilizarán para enviar los valores concretos a la hora de insertar un
producto.
Así pues, el servidor recibirá el valor del nombre del producto en la variable $nombre; el precio en la variable
$precio, etc.
En la siguiente línea es donde se consigue el valor para cada una de estas variables. Para ello se han utilizado
dos funciones muy útiles: list y plit:

1) La idea es ir leyendo el archivo de texto nuevosproductos.txt línea a línea (para lo que se utiliza fgets) e ir
extrayendo el nombre, precio, etc. de cada producto.
2) Esto último lo hace la función plit, a la que le indicamos el separador que estamos utilizando, que en
nuestro caso es ;;, y la cadena a dividir.
3) Es decir, que plit(‘’;;’’, $fline) cogerá una línea del archivo de texto y creará cinco subcadenas.
4) Esta función busca el separador indicado (;;) para dividir la línea de texto en esas cinco subcadenas.
5) Este resultado de plit es el que recoge la función list, que lo único que hace es asignar cómodamente las
subcadenas a cada una de las variables $nombre, $precio, $descripcion, $imageurl e $idcategoria.
6) Es importante el orden en que aparecen estas variables en la función list, ya que es el orden en que se
asignarán las subcadenas que conseguimos con la función plit.

Finalmente, se ejecuta la consulta con su método execute. Esta línea es la que hará que los valores concretos
sean enviados al servidor de base de datos y se efectúe la inserción.

Fíjese que esto se repetirá mientras haya alguna línea en el archivo de texto, por lo que puede ocurrir muchas
veces.
En nuestro caso sólo tenemos nueve líneas, por lo que se repetiría la ejecución de la consulta nueve veces. Pero
piense que podríamos tener decenas de nuevos productos.
La ventaja de las consultas preparadas se comprueba mejor cuando tenemos que efectuar la misma consulta
muchas veces: en lugar de enviarla al servidor cada vez, lo hacemos una sola vez (cuando la preparamos) y
después sólo enviamos los valores concretos que se necesitan.
Tiene que entender que no hemos hecho nada que no pudiéramos haber hecho con lo que ya conocíamos, es
decir, enviando la consulta al servidor las veces necesarias para insertar esos nueve productos.

Sin embargo, el rendimiento ha sido mucho mejor porque la consulta sólo se ha enviado una vez y el resto de
veces sólo se incluían los valores concretos que ésta necesitaba.

Utilice este tipo de consultas sólo cuando realmente puedan ser útiles, ya que si la consulta no se tiene que
repetir en la misma página web, no tiene sentido hacerlo porque el proceso será más lento, ya que primero tiene
que prepararse y almacenarse (temporalmente) en el servidor de base de datos.
Otra de las ventajas de las consultas preparadas es que el servidor MySQL se puede preocupar por nosotros de
comprobar que los valores que se envían para ejecutar cada vez la consulta son valores correctos, en los que no
se ha introducido código “malicioso”.

Como recordará, es conveniente comprobar todo lo que viene del usuario ya que puede incluir código ejecutable.
Esto no es necesario con las consultas preparadas porque MySQL puede diferenciar entre lo que es la definición
de la consulta y lo que son los valores concretos.

Recuerde los pasos para utilizar consultas preparadas:


Práctica 24

En esta práctica modificará la página listaproductos.php, donde se muestra el listado de los productos de nuestra
tienda virtual, para proporcionar la posibilidad de ordenar y dividir el resultado en distintas páginas.
Copie el archivo listaproductos.php en el directorio de su sitio web. Encontrará este archivo entre los trabajos del
curso.

Estudie el código de esta página, que es exactamente igual que el que ha visto en la lección.
Compruebe la forma de establecer la conexión, de efectuar una consulta contra la base de datos y de acceder a
ese resultado mostrándolo en una tabla HTML.

Compruebe la página en el navegador y podrá acceder a los productos de la tienda virtual.


Siguiendo la explicación de esta lección, añada las funcionalidades de ordenación y paginación en la lista de
productos. Debe permitir ambas características simultáneamente.

Solución de la práctica 24
Algunos detalles a tener en cuenta:

Para ordenar el resultado, debemos cambiar el código HTML de las cabeceras de columna de forma que sean
ahora hipervínculos que apunten a la misma página pero con la ordenación deseada. Por lo tanto, la ordenación
vendrá dada a través del array $_GET. Por ejemplo,

Después incluimos el código necesario para comprobar la existencia del parámetro orden y actuar en
consecuencia:

Para aplicar paginación, haremos algo parecido pasando un parámetro en la URL de la página, que nos indique
dónde empezar. Este parámetro se pasará cuando el usuario pulse en uno de los dos hipervínculos inferiores:
Próxima página o Página anterior:
Fíjese que aquí incluimos esos hipervínculos cuando realmente tienen sentido.
Para ello, es necesario conocer el número de filas totales y el número de filas por página:

Con esto, ya podemos completar la consulta que genera correctamente el resultado a mostrar en la tabla HTML:

Si en el caso del orden se utiliza la cláusula ORDER BY, para la paginación se utiliza LIMIT e indicamos a partir de
qué registro mostrar ($desplazamiento) y cuántas filas por página ($num_filas).
Puede encontrar la práctica resuelta entre los trabajos de la lección.
Recuerda

Una funcionalidad que debemos procurar al usuario cuando mostremos resultados de nuestra base de datos debe
de ser la posibilidad de ordenar el resultado.
Otra funcionalidad que podremos observar en otras páginas y que conviene proporcionar al usuario es dividir la
información en distintas páginas
Podemos proporcionar paginación fácilmente utilizando el modificador LIMIT de una consulta SELECT
Debe utilizar el método bind_param de la consulta preparada para enlazar los parámetros que ésta necesita.
La ventaja de las consultas preparadas se comprueba mejor cuando tenemos que efectuar la misma consulta
muchas veces: en lugar de enviarla al servidor cada vez, lo hacemos una sola vez (cuando la preparamos) y
después sólo enviamos los valores concretos que se necesitan.
Preguntas de Autoevaluación

1.
Cuándo pasamos el ratón por encima de un hipervínculo, ¿cuál es el estado afectado?:
a:link.
a:hover.
a:visited.
2.
¿Qué estamos extrayendo cuando hacemos paginación?:
Todas las filas.
Solo las filas correspondientes.
3.
¿Es conveniente utilizar consultas preparadas para ejecutar la consulta una única vez?:
Si.
No.
4.
¿Qué parte de una consulta preparada se guarda en el servidor de la base de datos?:
Su definición.
Los valores de los parámetros
5.
¿Qué tipo de consultas son más seguras?:
Las preparadas.
Las no preparadas.
La Página De Login

Una de las tareas al crear cualquier aplicación como por ejemplo la que nosotros queremos crear consistirá en
comprobar las credenciales del usuario.

Para ello, nosotros utilizaremos nuestra página login.php.

En las prácticas anteriores nuestro login.php se encargaba básicamente en validar que el email y contraseña
fueran validos.

Ahora, debemos recogerlos y comprobar que de verdad existe ese cliente en nuestra base de datos.
Para recoger el email y el password utilizaremos el método POST de esta manera:

En la que como vemos, si supera la prueba de que no es la primera vez, no está vacío y aparte con eregi, tiene
“pinta” de email, guardaremos el email (“limpiado” con htmlspecialchars) en la variable $email, y lo mismo pero
en $password para la contraseña.
Y así podremos comprobar si existe en la base de datos:
En la que podemos observar que todo el código se ejecutará si no es la primera vez, está definido $email y
$password también.

Una vez dentro, haremos la consulta utilizando el email y el password y con el método num_rows,
comprobaremos si existe.

Num_rows, devuelve el número de filas para las que la sentencia sql es cierta.
En este caso, si es mayor que 0, es porque el cliente existe, y por tanto, podremos iniciar una sesión (línea 16) y
guardar en la variable $_SESSION, el usuario y si está logeado (esto nos será de utilidad más tarde).

También podríamos haber utilizado cookies para guardar esta información. El funcionamiento sería muy parecido,
pero en lugar de utilizar el array $_SESSION, trabajaríamos con la función setcookie y el array $_COOKIE.

Usted ya conoce las ventajas y desventajas de ambos métodos, por lo que debe ser usted el que decida cómo
hacerlo. Normalmente, si prima la seguridad, se utilizarán variables de sesión.
La Página De Registro

Lo normal es que en las páginas de login siempre haya un enlace a una página de registro (por si el usuario
quiere registrarse), por lo tanto, dotaremos nuestra web para esa funcionalidad.

La solución es bien sencilla, basta con poner un hipervínculo a registro.php (que ya habíamos hecho) pero con la
única diferencia que, en la práctica anterior guardábamos los datos en un fichero, y ahora lo que queremos es
almacenarlo en la base de datos.

Como se podrá imaginar, necesitaremos una instrucción INSERT INTO del lenguaje SQL. El código podría tener
un aspecto parecido a este:

Hay que notar la línea:


Con la que queremos transformar la fecha que el usuario escribe (formato español, DD/MM/AAAAA) al formato
de MySQL AAAA/MM/DD).
Es interesante fijarse también que no damos valor para el campo IdCliente en la instrucción INSERT INTO porque
se trata de un valor que crea automáticamente la base de datos por nosotros.
Finalmente ejecutamos la consulta en el interior de un bloque try- catch para controlar los errores que puedan
ocurrir mediante excepciones.
Asegurar La Confidencialidad

Cuando usted exige que el usuario se haya identificado para poder realizar algún proceso, como confirmar su
pedido de compra, está asegurando que el usuario está registrado en su base de datos y, por lo tanto, tiene una
cuenta activa y correcta.
Otro aspecto distinto es la seguridad con la que podrá realizar es autenticación. Es decir, nosotros tenemos que
preparar la infraestructura necesaria en nuestro sitio web para que la información que intercambia el usuario con
el servidor se realice en un entorno seguro, al menos, cuando esa información sea confidencial.
Por ejemplo, cuando el usuario introduce su email y contraseña para autenticarse, tiene que hacerlo en un
entorno seguro, de forma que nadie pueda conseguir esa información.
Lo mismo ocurre cuando realiza su registro o cuando tiene que introducir detalles de la forma de pago del
pedido. La solución pasa aquí por utilizar el protocolo Secure Sockets Layer (SSL).
SSL permite intercambiar la información cifrada mediante HTTPS (seguro). SSL ofrece seguridad en ambas
direcciones: la información se transmite al usuario mediante cifrado y la información enviada por el usuario está
asimismo cifrada.
La idea que hay detrás del protocolo SSL es asegurar la identidad del servidor web mediante un certificado digital
de servidor que es emitido por una entidad certificadora.
Esto nos obliga a disponer de dicho certificado y a instalarlo en Apache. Una vez hecho esto, el usuario accederá
a la página segura y, si confía en el certificado, podrá intercambiar la información confidencial con total
seguridad.
El que el usuario confíe o no en el certificado normalmente viene dado por quién lo ha emitido, es decir, por qué
entidad certificadora.
Normalmente solicitaremos un certificado a una entidad de reconocido prestigio internacional, como Verisign. La
misión de esta entidad es comprobar la identidad de la empresa o particular que solicita el certificado de forma
que el usuario pueda confiar en él.
Por lo tanto, vemos que la entidad certificadora actúa como intermediario entre nuestro sitio web y los usuarios
que acceden a él.
Si el usuario confía en la entidad que ha emitido el certificado, ésta le está asegurando que está accediendo al
sitio web de la empresa o particular que lo había solicitado.
Práctica 25

En esta práctica completará el código de la página donde los usuarios introducen sus credenciales para
identificarse.
Copie el archivo login.php en el directorio de su sitio web.
Podrá encontrar este archivo entre los trabajos del curso.
Se trata de la página donde el usuario introduce su email y su contraseña. Si esas credenciales coinciden con
alguno de los clientes almacenados en la base de datos, el usuario queda autenticado y puede acceder a páginas
protegidas.
Su labor en esta práctica es completar el código necesario para comprobar las credenciales introducidas por el
usuario. Es decir, deberá comprobar que existen en la tabla clientes de la base de datos de la aplicación.
En caso afirmativo, deberá crear dos variables de sesión: usuario y logged. Además, indicará el mensaje “Login
correcto”.
En la variable usuario guardará el identificador del cliente, mientras que logged tendrá el valor TRUE cuando se
trate de un usuario autenticado positivamente.
En caso de que las credenciales no existan en la base de datos, se indicará un mensaje pero no se crearán las
variables de sesión. El mensaje puede ser “Usuario o contraseña incorrectos”.
El código que tiene que completar empieza en la línea 65, una vez se ha validado el formato del email y
contraseña introducidos por el usuario.
Compruebe el funcionamiento de la página. Para ello, primero introduzca unas credenciales incorrectas:
Email: a@a.com
Contraseña: hola
Y después unas correctas (existentes en la base de datos):
Email: alopez@vmail.com
Contraseña: password
Solución de la práctica 25
Pasos a seguir:
Establecer la conexión.
Efectuar la consulta.
Comprobar si se ha obtenido algún cliente que coincida con las credenciales introducidas.
Crear las variables de sesión y el mensaje afirmativo o el mensaje indicando que no son credenciales correctas.
Cerrar el conjunto resultado y la conexión.

Lo más interesante aquí es ver cómo podemos comprobar que una consulta ha devuelto alguna fila en su
resultado. Para ello, se utiliza la propiedad num_rows de dicho resultado.
En caso de que las credenciales sean correctas, creamos las variables de sesión usuario y logged.

Estas variables serán las que posteriormente se comprueben en aquellas páginas privadas, es decir, a las que no
se puede acceder si el usuario no se ha autenticado positivamente.
Recuerda

Una de las tareas al crear cualquier aplicación como por ejemplo la que nosotros queremos crear consistirá en
comprobar las credenciales del usuario.

Deberemos recoger los datos y comprobar que de verdad existe ese cliente en nuestra base de datos.
Num_rows, devuelve el numero de filas para las que la sentencia sql es cierta.
También podríamos haber utilizado cookies para guardar esta información.

Lo normal es que en las páginas de login siempre haya un enlace a una página de registro.
La idea que hay detrás del protocolo SSL es asegurar la identidad del servidor web mediante un certificado digital
de servidor que es emitido por una entidad certificadora.
Normalmente solicitaremos un certificado a una entidad de reconocido prestigio internacional, como Verisign.

Preguntas de Autoevaluación
1.
Indica si la siguiente afirmación es verdadera o falsa: 
“Tras ejecutar una consulta con el método query de la clase mysqli, podemos conocer el número de filas que se
han visto afectadas con la propiedad num_rows del resultado”.
Verdadero.
Falso.
2.
¿Debemos introducir el valor de un campo auto_increment de una tabla al crear un nuevo registro con una instrucción INSERT
INTO?:
Si.
No.
3.
Indica si la siguiente afirmación es verdadera o falsa: 
“El protocolo https asegura la información enviada por el usuario al servidor web, pero no al revés”.
Verdadero.
Falso.
4.¿Qué protocolo debe utilizarse siempre que la información que se transmite es confidencial?:
http.
https.
5.
¿Podemos utilizar cookies para guardar el detalle de que el usuario se ha identificado correctamente en nuestra página de login?:
Si.
No.

Introducción

En este apartado veremos cómo implementar lo que nos queda, el proceso de compra que llevará a cabo el
cliente.

La estrategia que se suele encontrar en internet, es que el usuario accede a una página web principal (ej.,
default.php) y desde allí, puede ver los productos suministrados por la empresa, eligiendo los que quiera, y
añadiéndolos al carrito.

Una vez finalizada la compra, realizará el pedido, debiendo autentificarse.

La política que seguiremos es que el cliente no se tenga que autenticar al principio y así poder visitar y “comprar”
con total libertad los productos deseados.
Si no lo hiciésemos así el cliente podría no sentirse cómodo y evitar la compra.

Lo malo de esta estrategia es como identificar al carrito de la compra de los clientes ya que habrá carritos para
clientes no autentificados y carritos para clientes autentificados.
Modificar Listaproductos.Php

Lo primero que haremos será añadir funcionalidad a la página para que el cliente pueda comprar.
Esto lo haremos, añadiendo una última columna con un hipervínculo al lado del producto a comprar.

Y este podría ser su código:


Lo más interesante de este nuevo código es la línea donde vemos qué ocurrirá cuando el usuario quiera añadir
un producto a su carrito de la compra. Ese proceso se ha representado aquí como un hipervínculo a la página
comprar.php que incluye información adicional en forma de un parámetro GET.
Esa información adicional es precisamente el código del producto que ha seleccionado el cliente, que vendrá dado
en la primera columna de la correspondiente fila del resultado de la consulta de los productos disponibles
($fila[0]).
La Página Comprar.Php

Ahora necesitaremos una nueva página llamada comprar.php la cual agregará un producto al carrito de la
compra del usuario que está visitando nuestra web.
Si se fija en la estructura de la tabla carritocompra, que es donde se almacenará la información de los productos
que va comprando el usuario, tenemos un campo llamado IdCarrito.
¿Qué significado tiene este campo? Bien, es el detalle que nos permitirá asociar el carrito con un determinado
cliente.
Pero… ¿Qué pasa si el cliente no se ha autentificado? ¿Que IdCarrito tendrá? Pues bien, la forma de solucionar
este problema es creando una función que genere un IdCarrito aleatorio, trabajar con él y si luego más tarde el
usuario decide autentificarse, cambiarlo por el Id del cliente.
Aquí puede ver el código de la página comprar.php:

Y ahora expliquemos detalladamente el código:

Todo el proceso de comprar un producto se realizará únicamente cuando el array $_GET disponga de un
elemento llamado producto, es decir, que se pase esa información a través de la URL de la página.

Recuerde que la idea es que accedamos a esta página (comprar.php) desde la página listaproductos.php?
producto=…, donde se le pasará el código del producto que el cliente desea comprar.

Después tenemos que obtener el identificador del carrito de la compra del cliente. Como no tenemos muy claro
cómo identificar ese carrito, lo hacemos a través de una función que después estudiaremos: GetIdCarrito.

Teniendo en cuenta todos los detalles necesarios para añadir un registro en la tabla carritocompra, llamamos a la
función AgregarACarrito para que lo haga.

Fíjese que esta función necesita el carrito, el producto, la cantidad comprada y la fecha en que se hace. Por
sencillez, sólo aceptamos comprar una única unidad cada vez.
Como al agregar un producto al carrito del cliente puede ocurrir algún error, rodeamos la llamada a la función en
una estructura try – catch.

Fíjese que si ocurre alguna excepción, es porque se generará en el interior de esta función y, sin embargo, se
manejará aquí.

Ahora veamos la función AgregarACarrito, que está incluida en el archivo carrito.inc.php.


La función AgregarACarrito es la responsable de establecer la conexión con la base de datos y actualizar la tabla
carritocompra, reflejando que el cliente ha añadido un nuevo producto a su carrito de la compra.
Por tanto, con los parámetros que necesita (el carrito, el producto, la cantidad comprada y la fecha) crearemos
mediante INSERT un registro nuevo.
Esto funcionaria bien, pero ¿Qué pasa si el cliente elige un producto que ya ha elegido? Pues que no se debería
de crear un registro sino de aumentar en 1, la cantidad comprada de ese producto.
Para ello, hay que comprobar que ese producto ya estaba en el carrito de compra del cliente, y esto solo se
puede hacer consultando a la base de datos de esta manera:

También podemos observar la función ExisteProducto con la que comprobamos si el producto que se tiene que
agregar ya existe en el carrito.

Y si existe lo que haremos será actualizar la cantidad:


Si por el contrario, es un producto que no está en el carrito, lo que haremos será:

Con lo que la añadiremos al carrito.


En cualquier caso, fíjese que para utilizar esta función ya tenemos que conocer el identificador del carrito de la
compra que estamos modificando.
Identificar Al Cliente

Si obligáramos al cliente a identificarse antes de comprar, todo sería mucho más sencillo ya que el identificador
del carrito sería el identificador del carrito.
Pero, no podemos, ya que a todo cliente le gusta, investigar, que podría comprar, cuanto le costaría, etc. sin
tener que estar obligado a comprar.
Para esta situación, como hemos dicho, lo que haremos será crearle un identificador “temporal” único.
Esto lo haremos mediante la función GetIdCarrito:

La cual, lo que hace es ver si el usuario ha sido logeado, si es así devolverá al usuario.
En el caso de que el usuario no se haya autenticado, identificaremos su carrito de la compra con una cookie
llamada TiendaDetallesCarrito.
Se comprueba si existe dicha cookie y, en caso afirmativo, su valor será el identificador del carrito.
Por último, sino ocurre nada de esto, es porque es la primera vez que el usuario le ha dado a comprar y no hay
productos en el carrito, por lo que se llamará a la función uniqid(rand() , 1), que proporcionará un identificador
aleatorio único, creará la cookie TiendaDetallesCarrito y devolverá el identificador aleatorio único.
En cualquier caso, la función GetIdCarrito devuelve el identificador del carrito de la compra del usuario. Puede
que ese identificador coincida con su identificador de cliente o que sea un identificador temporal creado por la
aplicación y que almacenamos en una cookie que permanece en la memoria del navegador.
Si todo ha ido bien, es decir, que se ha añadido el producto al carrito de la compra, redirigimos al usuario a la
página carritocompra.php indicando el identificador de su carrito de la compra.

Fíjese que se le pasa el valor carrito a través de la URL, de forma que podamos conocer qué carrito de la compra
tenemos que mostrar en la página siguiente.
La Página Carritocompra.Php

Ya estamos al final del curso y nos queda poco.


Recordemos que nos habíamos quedado en que el usuario añadía un producto a su carrito, y que para ello, podía
o no estar autentificado.
Así cuando un usuario pulsaba el hipervínculo comprar de la última columna, nos redirigía a la página
comprar.php con la particularidad de que pasábamos el producto elegido mediante GET:
Por ejemplo:

Comprar.php añadía el producto al carrito (con id temporal o id del cliente) y una vez añadido el cliente era
redirigido a la página carritocompra.php donde podía ver los productos comprados:
Veamos esa página:

Donde establecemos la conexión y ejecutamos una simple consulta para listar los detalles correspondientes a los
registros almacenados en la tabla carritocompra.
Pero como además queremos mostrar el subtotal de cada producto en su carrito de la compra, se realiza otro
cálculo, multiplicando el precio del producto por la cantidad comprada del mismo.
Este valor se guarda con el nombre Subtotal.
Toda esta información (identificador del producto, su nombre, la cantidad comprada, el precio y el subtotal) es la
que mostraremos en la tabla HTML que vamos a construir en la página.
En el caso de que el array $_GET no tenga el elemento carrito, es decir, que no sepamos a qué carrito nos
estamos refiriendo en la página, entonces enviamos al usuario a la página listaproductos.php.

Con este código creamos una tabla en la que mostraremos todos los productos que hay en el carrito del cliente.
Además hemos añadido 2 hipervínculos adicionales, con los que el cliente podrá “seguir comprando” o “confirmar
el pedido”.
Si el cliente hace clic en seguir comprando, se le redirigirá a la página listaproductos.php y podrá volver a elegir
un producto.
Sin embargo, el cliente puede decidir comprar y confirmar el pedido.
Confirmar El Pedido

Como ya sabe, en este caso es obligatorio que se ha identificado como un usuario registrado en nuestra base de
datos.
Por lo tanto, debemos comprobar que lo haya hecho, y si no fuera así redirigirlo a la página de login para que lo
haga.

En la que comprobamos si el usuario ha sido autentificado y si ha sido así conectamos con al base de datos, y en
$cliente metemos el Id del usuario.
Pero ahora vayamos a lo más complicado.
Cuando un cliente decide comprar, tendremos que crear una orden en la base de datos.
Esa orden además tendrá ligada 1 o más líneas de orden.
Por lo que habrá que hacer inserciones en nuestra base de datos, (tabla ordenes, lineasorden, y carritocompra).
Observe este código:

Aquí vemos cómo se crea el nuevo registro en la tabla órdenes.


Para ello, se necesita el identificador del cliente (que acabamos de recoger de la variable de sesión usuario), la
fecha de la orden y la fecha de envío.
Para estas dos fechas se ha utilizado la fecha actual y dos días después, respectivamente.
Finalmente, en la última línea del código anterior obtenemos el identificador de la nueva orden que se acaba de
crear. Para ello, se ha utilizado la propiedad insert_id de la conexión.
Esta propiedad devuelve el valor de un campo auto_increment que se ha utilizado en la última consulta.
En nuestro caso, ese valor se corresponde con el identificador de la orden que ha creado MySQL por sí mismo al
ser un campo auto_increment.
Fíjese que es importante conocer el identificador de la nueva orden porque ahora tenemos que crear las
correspondientes líneas de la orden, donde se detallan los productos comprados.
A partir del carrito de la compra y la orden que acabamos de crear, se crean los registros correspondientes a
cada una de las líneas de la orden:

En este caso, no se utiliza la cláusula VALUES para indicar los valores del nuevo registro porque realmente se
pueden añadir más de un registro a la vez: exactamente los que devuelva la consulta SELECT que aparece justo
a continuación.
En la tabla lineasorden necesitamos el identificador de la orden, del producto, la cantidad comprada del mismo y
el subtotal. Estos detalles son los que se obtienen de la consulta SELECT. Este resultado es el que se crea los
registros nuevos a través de la instrucción INSERT INTO.
No estamos utilizando ningún bucle de repetición para insertar las distintas líneas de la orden. En lugar de ello,
obtenemos ese conjunto de líneas a través de una consulta SELECT y la utilizamos en la instrucción INSERT
INTO.
Una vez añadidas las líneas de la orden, podemos actualizar el total de la misma, que es un campo almacenado
en la tabla ordenes.

Para ello se utiliza la siguiente sentencia UPDATE:


Confirmar El Pedido

Recuerde que el campo Total es lo que se conoce como un campo “calculado”, ya que realmente no sería
necesario almacenarlo en la base de datos porque puede obtenerse a partir de otros valores.
El haber decidido hacerlo así es más una cuestión de eficiencia que otra cosa, ya que sólo lo calculamos una vez
y lo podemos utilizar las veces que queramos porque nos lo estamos guardando.
Finalmente, se eliminan los registros relacionados en la tabla carritocompra.

De esta forma, una vez el carrito de la compra ha generado el correspondiente pedido u orden, ya no es
necesario almacenar más esa información.
Esto es necesario, ya que si no lo elimináramos, entonces los mismos productos aparecerían en otra ocasión
cuando el mismo cliente volviera a comprar en nuestra tienda virtual.
Vemos, por lo tanto, que el proceso de confirmar un pedido es realmente complejo porque en él intervienen
varias tablas y procedimientos.
Primero crear la orden, después las líneas de dicha orden; más tarde actualizar el total de la orden porque ya lo
conocemos a partir de sus líneas y, finalmente, eliminar los registros relacionados de la tabla carritocompra.
¿Qué ocurriría si alguno de estos procesos no se pudiera efectuar?
Por ejemplo, imagínese que puede crear la nueva orden y, sin embargo, no puede crear las correspondientes
líneas de detalle.
Está claro que el procedimiento que estamos describiendo debe enmarcarse en el entorno de una transacción
porque sólo tiene sentido realizarlo cuando todos los procesos relacionados se realizan correctamente.
MySQL permite utilizar transacciones si utilizamos tablas InnoDB, por lo que vamos a aprovecharnos de ello.
Por defecto, MySQL actualiza inmediatamente las tablas de la base de datos tras efectuar una consulta. Sin
embargo, podemos cambiar este comportamiento si empezamos una transacción con la instrucción Sql START
TRANSACTION.

Ésta es una de las formas de hacerlo. Al iniciar una transacción, los resultados de las consultas que sigan a
continuación no se aplicarán directamente en la base de datos, sino que se esperará a que se confirmen o
finalmente se rechacen.
Para rechazar los cambios, utilizará la instrucción Sql ROLLBACK y para aceptarlos y finalizar la transacción, la
instrucción Sql COMMIT.
Hasta que no confirme la transacción con COMMIT, no se guardarán los datos en la base de datos.

En el código anterior vemos que, si ha ocurrido alguna excepción durante el proceso descrito, entonces
rechazamos los cambios con ROLLBACK. Sin embargo, si todo ha ido bien, los aceptamos con COMMIT.
La Página De Desconexión

Como es habitual, siempre en todas las páginas hay un enlace que nos permitirá cerrar la sesión.
Pues bien, nosotros no seremos menos.
Para ellos, crearemos un hipervínculo de texto Salir en la página confirmarpedido.php que apuntará a la página
logout.php.
Veamos el contenido de esta página:

Recuerde que la clave de la autenticación del usuario es que existe un par de variables de sesión que indican que
se ha identificado correctamente y cuál es su identificador.
Pues bien, no tenemos más que eliminar esas variables de sesión, para lo que utilizamos la línea $_SESSION =
array(), y después destruimos la propia sesión con session_destroy().
Es conveniente recordar que, previamente, ha sido necesario utilizar la función session_start porque, al fin y al
cabo, estamos accediendo a las variables de la sesión actual aunque sea sólo para destruirlas.
Migrar El Carrito De La Compra

Debemos volver a la página login.php porque hemos olvidado algo importante, y por eso lo hemos dejado para el
final.
Se trata de cómo pasar de un carrito temporal (usuario no autentificado) a un carrito perteneciente a un usuario
autenticado.
Vimos en login.php que pasaba cuando el usuario pulsaba en Enviar.
Mediante una consulta SQL comprobábamos si las credenciales eran correctas, y en ese caso, usábamos las
variables de sesión logged y usuario para identificar al usuario.
La parte que nos interesa es la que se ejecuta cuando el usuario ha introducido las credenciales correctas.
En este caso, debemos comprobar si existe un carrito “temporal” para este cliente y en este caso convertirlo en
un carrito identificado con el identificador del cliente.
De esta manera:
Donde como vimos, la función GetIdCarrito devolvía la cookie TiendaDetallesCarrito si ya existía, por lo que
podemos más tarde comprobar si existe la variable $existecarrito.
Si es que sí, es porque ya había una cookie asociada al carrito, y procederemos a migrar el carrito.
Observe la función MigrarCarrito:

El código asociado con esta función ejecuta una consulta SQL con dos instrucciones:
Primero elimina los registros que pudieran aparecer en la tabla carritocompra perteneciente al usuario
autenticado y ...
... después actualiza los correspondientes a su carrito temporal para que se identifiquen correctamente con el
identificador de ese cliente.
El cliente podría haberse autenticado antes de agregar productos a su carrito de la compra y finalmente no haber
confirmado el pedido, por lo que es necesario eliminar esos registros de la tabla carritocompra.
Después vemos que actualizar el carrito temporal no es más que actualizar el campo IdCarrito.
De esta forma, seguimos con la política de que una vez se cierre el navegador, cualquier carrito de la compra
que no se haya confirmado es eliminado.
Finalmente, en la última línea se establece la fecha de caducidad de la cookie TiendaDetallesCarrrito a una fecha
pasada. Ésta es la forma de eliminar esta cookie una vez migrado el carrito de la compra.
Como ha podido ver, el hecho de permitir que un usuario agregue productos a su carrito de la compra sin
haberse autenticado previamente complica significativamente todo el proceso pero da una flexibilidad que
demanda el propio cliente.
Finalizamos nuestro código con un detalle adicional. Como se ha indicado, cuando un usuario accede a una
página en la que es necesario que se haya autenticado previamente, se le envía automáticamente a la de login
para que lo haga.
Sin embargo, una vez se ha autenticado, ¿qué debemos hacer? Lo más lógico es volver a la página inicialmente
solicitada.
Esto lo estamos consiguiendo aquí con un parámetro más de la URL de la página login.php.
La idea es que con el parámetro URL obtengamos la página a la que debe volver el usuario una vez se ha
autenticado.
Por ejemplo, si nos ponemos en el caso de la página confirmarpedido.php, se comprueba si está autenticado y, si
no, se envía a login.php.
Una vez se ha autenticado, login.php devuelve al usuario a la página confirmarpedido.php porque existe el
parámetro URL en el array $_GET que así lo indica.
Se utiliza la función urldecode porque el parámetro URL vendrá codificado como una dirección URL, habiendo
utilizado la función contraria: urlencode.
Esto es necesario cuando necesitamos introducir direcciones URL en la propia dirección de la página.
Finalmente, si no existe el parámetro URL, quiere decir que se ha accedido directamente a la página login.php,
por lo que se envía al usuario a la página principal, que aquí es listaproductos.php, pero que podría ser cualquier
otra.
Teniendo en cuenta haber dado valor al parámetro URL en la página confirmarpedido.php cuando redirigimos al
usuario a ogin.php para que se autentique, todo el código se ha completado.

Práctica 26a

En esta práctica completará su aplicación de la tienda virtual para implementar el proceso de compra, como ha
podido ver en la lección.
Abra el editor que esté utilizando y añada la funcionalidad que ha visto en esta lección:
En la página listaproductos.php (si no dispone de ella, la puede encontrar entre los trabajos del curso), añada
una columna más en la tabla HTML con un hipervínculo que permita comprar el producto en cuestión.
Esto último se hará en una nueva página llamada comprar.php, donde se crearán los registros necesarios de la
tabla carritocompra.
Debe tener en cuenta que si el usuario compra en más de una ocasión el mismo producto, sólo se creará un
registro en la tabla carritocompra, aunque actualizando la cantidad comprada.
El carrito queda identificado de dos formas posibles: si el usuario se ha autenticado, entonces es su identificador
de cliente; si está comprando anónimamente, entonces es un identificador aleatorio que se guarda en una cookie
llamada TiendaDetallesCarrito.
Una vez añadido el producto comprado al carrito de la compra del cliente, debe redirigirlo a la página
carritocompra.php, pasando el identificador de dicho carrito en la misma URL.
Solución de la práctica 26a
A tener en cuenta:
Página listaproductos.php:
Debe completar el código de la tabla HTML, incluyendo una columna más con los hipervínculos para que el
usuario pueda comprar los productos:

Fíjese que cuando pulsa en uno de los hipervínculos con el texto Comprar, estará accediendo a la página
comprar.php pero pasando en el parámetro producto de la URL el producto a comprar.
Página comprar.php:
Aquí se utilizan las funciones GetIdCarrito y AgregarACarrito, que aparecen en el archivo incluido carrito.inc.php:
Con GetIdCarrito obtenemos el identificador del carrito, ya sea el propio del cliente o uno temporal creado por
nosotros y que almacenamos en una cookie. Este identificador del carrito es lo que se le pasa a la página
carritocompra.php.

Con AgregarACarrito creamos o actualizamos los registros de la tabla carritocompra:


Práctica 26b

En esta práctica estudiará el código que falta para completar el proceso de compra en la tienda virtual.
Copie los archivos logout.php, login.php, confirmarpedido.php y carritocompra.php en el directorio de su sitio
web. Podrá encontrar todos estos archivos entre los trabajos del curso.
En el archivo logout.php puede encontrar el código necesario para eliminar las variables de sesión y la propia
sesión.
En el archivo login.php encontrará el código donde se "migra" un carrito temporal a un carrito identificado con el
identificador del cliente.
En el archivo confirmarpedido.php puede encontrar el código en el que se comprueba si el usuario se ha
autenticado y se crea la orden correspondiente a su carrito de compra. Se realizan varias acciones: crear la
orden, crear las líneas de esa orden, actualizar el total de la orden y eliminar los registros de la tabla
carritocompra.
Todos estos procesos se crean en el entorno de una transacción, gracias a que utilizamos tablas InnoDB.
En el archivo carritocompra.php se listan los productos comprados por el usuario actual.
Compruebe que el proceso de compra funciona perfectamente:
Acceda a la página listaproductos.php y pulse en algún hipervínculo para comprar productos.
Siga comprando o confirme la orden en la página carritocompra.php.
Identifíquese con credenciales correctas (por ejemplo, el email alopez@vmail.com y la contraseña password) en
la página de login y accederá a la confirmación de la nueva orden.
Puede comprobar que el proceso también funciona si lo primero que hace es identificarse en la página login.php
(antes de comprar cualquier producto).
Si tiene cualquier duda, acuda a la lección, donde todo el proceso está completamente explicado.
Solución de la práctica 26b
El objetivo de la práctica es que pueda estudiar detenidamente todo el código necesario para implementar el
proceso de compra.
Abra las distintas páginas que conforman el proceso de compra y estudie detenidamente todo lo que ha visto en
la lección:
Estudie el código de la función MigrarCarrito insertada en la página login.php, donde se migra un carrito temporal
a uno definitivo, en el que el identificador coincide con el del cliente.
Compruebe cómo se accede a los registros del carrito de la compra del usuario en la página carritocompra.php,
sin importar si se trata de un usuario autenticado o no, ya que su identificador viene dado por la URL de la
página.
Compruebe que el proceso de crear una orden y todo lo que esto implica se realiza en el marco de una
transacción. De esta forma, si ocurre algún problema, no se modificará la base de datos.
Si tiene cualquier duda o necesita más información, acuda a la propia lección.
Entre los trabajos de la lección encontrará todos los archivos php que necesita para implementar el proceso de
compra que se ha descrito.
Recuerda

En este apartado se ha visto cómo implementar lo que nos queda, el proceso de compra que llevará a cabo el
cliente.
La estrategia que se suele encontrar en internet, es que el usuario accede a una página web principal (ej.,
default.php) y desde allí, puede ver los productos suministrados por la empresa, eligiendo los que quiera, y
añadiéndolos al carrito.
Lo primero que haremos será añadir funcionalidad a la página para que el cliente pueda comprar.
Esto lo haremos, añadiendo una última columna con un hipervínculo al lado del producto a comprar.
Necesitaremos una nueva página llamada comprar.php la cual agregará un producto al carrito de la compra del
usuario que está visitando nuestra web.
La función AgregarACarrito es la responsable de establecer la conexión con la base de datos y actualizar la tabla
carritocompra, reflejando que el cliente ha añadido un nuevo producto a su carrito de la compra.
Si obligáramos al cliente a identificarse antes de comprar, todo sería mucho más sencillo ya que el identificador
del carrito sería el identificador del carrito
Como es habitual, siempre en todas las páginas hay un enlace que nos permitirá cerrar la sesión.

Preguntas de Autoevaluación
1.
Cuando el usuario se ha autenticado, ¿qué valor tendrá el identificador de su carrito de la compra?:
El identificador de ese cliente.
Un identificador temporal.
2.
Si el usuario se ha autenticado, ¿cómo se identifica su carrito?: 

Con el valor de la cookie TiendaDetallesCarrito.


Con el valor de la variable de sesión usuario.
3.
¿Habría algún problema si el usuario se identificara antes de comprar cualquier producto (según lo estamos haciendo en el curso)?:
Sí, porque primero debe crearse un carrito temporal.
No, el identificador de su carrito sería siempre el identificador de ese cliente.
4.
¿Cuándo se crean las variables de sesión logged y usuario?:
Una vez se ha identificado correctamente (página login.php).
Al comprar un determinado producto (página comprar.php).
5.
¿Es necesario utilizar la función session_start para poder acceder a la información almacenada en le array $_SESSION?:
Si.
No.

Introducción
Ya hemos llegado al fin del curso y aunque hayamos visto y construido un carrito online con toda su
funcionalidad, se habrá dado cuenta de que el resultado visual es un poco “pobre” y que en la mayoría de las
páginas web no accedemos directamente a listarproductos.php para seleccionar los productos, elegirlos o
comprarlo, sino que tienen una estructura un poco más compleja, donde podemos navegar entre varias páginas,
para obtener nuestro cometido.
Normalmente cuando accedemos a una página web en la que existe un carrito no accedemos directamente a él,
sino que solemos entrar a la página principal, denominada comúnmente index.php, donde allí podemos ir a la
sección de productos, de contacto, de login y de carrito (entre otras).
Pues bien, en este último tema del curso (aunque no tenga mucha relación con JavaScript y Php) veremos cómo
integrar nuestro carrito a una página web como las que se ven hoy en día, repasando de este modo algunos
conceptos importantes sobre html y hojas de estilos y como no, JavaScript y PHP.
Por tanto, dividiremos esta lección en 3 partes:
Visión global de la página que vamos a construir, explicando los conceptos más importantes y las tendencias
actuales a la hora de construirla.
Montar la estructura web de la página con HTML y darle forma con estilos CSS.
Integrar la funcionalidad de nuestro carrito a la página.
¿Qué Vamos A Hacer?

Como hemos dicho anteriormente, al acceder a una página de compras online, lo normal será acceder a una
dirección web, en la que se nos mostrará la información de la empresa, explicando a que se dedica, como es,
etc.

Esta página normalmente viene estructurada de una manera especial y casi todas las páginas web comparten la
misma estructura.
En la parte superior nos encontramos con la cabecera (header) en la que se nos muestra un logo de la empresa
al igual que la funcionalidad para registrarnos, ver nuestra cuenta, nuestro nombre, etc.
En la parte inferior, un pie (footer) en la que se muestran datos de la empresa, como avisos legales, copyright y
fecha de creación de la página.

En el margen izquierdo, tendremos el menú, en el que aparecerán todos los distintos apartados a los que
podemos acceder de la página, como Inicio, contacto, productos, o Mi carrito.

Y en el centro, tendremos el contenido, que será donde visualizaremos el contenido de las distintas páginas.
Construir La Estructura HTML

Como ya hemos dicho, lo primero que haremos será montar la “estructura” de nuestra página web.
Para ello, abriremos nuestro editor preferido, escribiremos la estructura básica de una página web en HTML y la
nombraremos como index.php.

Nota: Si empezamos un proyecto nuevo en algún entorno de desarrollo como NetBeans, esto, se creará por
defecto al crear un nuevo proyecto php.
A partir de ahora index.php será la página a la que accederemos siempre y no como en la práctica anterior
donde podíamos acceder independientemente a cada una de ellas.
Lo siguiente será construir la estructura de la página por lo que utilizaremos la etiqueta
<div> </div> que hará que lo que haya dentro se “encapsule” y tenga unas propiedades y características
propias.
Nota: Si no conoces las etiquetas <div></div>, échale un vistazo a:
http://www.estrellateyarde.org/discover/manual-html-cajas-div
Sabiendo esto, y siguiendo con las 4 cajas (div) que queremos construir, podemos escribir un código como este:
En el que podemos observar varios detalles.
El div contenedor, es una caja que contiene a cabecera, cuerpo y pie.
El div cuerpo a su vez contiene a lateral-izquierdo y a contenido.
Ahora vemos que dentro de cada caja tenemos código php y concretamente una llamada a include “ “que lo que
hace, es copiar exactamente el código que contenga su parámetro.
Por tanto, el siguiente paso será crear en el mismo directorio donde estemos creando esta práctica, varias
páginas php.
En concreto: cabecera.inc.php, lat_izq.inc.php, bienvenida.inc.php y pie.inc.php.
Más tarde nos encargaremos de ellas.
También observamos que en el div contenido (que será donde vaya el contenido) tenemos un include a la página
web que tenga la variable $seccion.
Esto es así porque será el único div que cambie de contenido dependiendo de lo que queramos ver, dejando fijas
todos los demás div y consiguiendo con esto, que la cabecera, menú y pie, no cambien al cambiar de página.
Para ello, en cada uno de los elementos del menú, insertaremos un hipervínculo <a href…> que mediante el
método get, nos diga que página será la que queramos cargar en el div contenido.
Y por ello, index.php deberá de estar preparada. De ahí estas líneas.

Vemos efectivamente, que en $sección lo primero que haremos será cargar lo que tenga el ArrayGlobal
$_GET[‘sec’] y que en definitiva contendrá la página a cargar en el div contenido.
También hay una condición en la que si la variable $seccion no está definida, le asignaremos por defecto
“bienvenida.inc.php”, que será la página de bienvenida de nuestro sitio.
Por tanto, construyamos index.php y creemos cada uno de los archivos .inc.php nombrados anteriormente (por
ahora los crearemos vacíos) y probemos a ejecutarlo todo para ver que no nos da problemas.
Nota: Al no haber escrito código todavía, el resultado será index.php con la cabecera en blanco, el lat_izq en
blanco, el pie en blanco y en el div contenido, la bienvenida, también en blanco.
Recuerda: Al utilizar sesiones en php, necesitaremos escribir en algún momento session_start(), y como ya
sabemos, suele haber varios problemas para lograr que funcione con naturalidad, por lo que debemos arreglarlo,
anteponiendo ob_start() a cualquier código HTML y escribiendo ob_clean() exactamente antes de la llamada a
session_start().
Así que para ello vamos a escribir antes de nada en index.php la llamada a ob_start() y luego, cuando nos
vayamos encontrando session_start() le antepondremos ob_clean().

La página de bienvenida

La página de bienvenida de nuestro sitio, será algo muy simple en la que daremos la bienvenida a la página,
explicando que se puede encontrar y a que nos dedicamos.

Opcionalmente como vemos en la línea 7 y 10, podemos crear un hipervínculo que nos lleve directamente (y sin
pasar por el menú) a la sección de catálogo y contacto.

Construir La Estructura HTML

Para lograr esto, hay que añadir un hipervínculo de esta manera:

En la que vemos que al pulsar el hipervínculo nos llevará a index.php?sec=listaproductos.php


Que en realidad es como ir a index.php, pero pasándole por parámetro get sec=listaproductos.php para que más
tarde index.php, la procese y la cargue en el contenido.
Nota: Es importante que sepa porque estamos haciendo esto, ya que a partir de ahora todas nuestras páginas
irán a index.php, pero pasándole como argumento sec, la página que queremos cargar, y por tanto, habrá que
modificar nuestra práctica anterior para conseguir el resultado.
Así que, lo que haremos será copiar este código en nuestra página bienvenida.inc.php y al ejecutar ahora
index.php, vemos algo parecido a esto:
El pie de página
El pie de página es un elemento opcional, que suele contener información muy concreta. Si la página demasiado
grande en contenido, de tal forma que es necesario utilizar la barra de desplazamiento vertical, el pie de página
suele contener un menú auxiliar que permita al usuario continuar navegando por el sitio web sin tener que volver
a buscar el menú principal.

También puede contener un menú específico, en el que sueles mostrar enlaces a servicios muy particulares del
sitio web, como contratación de publicidad, formulario de contacto, ofertas de empleo, condiciones de uso,
políticas de seguridad, etc.

Uno de los usos más comunes del pie de página en la actualidad es mostrar información sobre la empresa
propietaria del sitio web o de su responsable directo ya que se debe cumplir la nueva Ley de Servicios de la
Sociedad de la Información (LSSI) y del comercio electrónico, que obliga a todos los sitios web que generen
beneficios directos (ventas) o indirectos (publicidad) a mostrar en cada página el nombre de la empresa o
responsable y una dirección física o de correo electrónico válidas. Esta información se suele complementar con el
número de teléfono y fax e información sobre copyright de los contenidos de la web.

No es obligatorio que la web tenga pie de página aunque sí que es aconsejable, ya que aparte de mostrar
información concreta, a la que muchos usuarios están ya acostumbrados, establece una delimitación del final del
documento, que ayuda al espectador a definir visualmente las diferentes zonas de la página y evita el mostrar
contenidos "pegados" a la parte inferior de la ventana del navegador web.
En nuestro caso, el pie de página será también muy simple ya que solamente añadiremos el nombre de nuestra
empresa y el copyright.
Para ello no tiene más que escribir este código en la página pie.inc.php.

Y al ejecutar de nuevo index.php un resultado como este:

La cabecera
La cabecera de nuestro sitio será aquella página situada siempre en la parte superior, en la que veremos
además, del nombre de nuestro sitio web, una imagen o logotipo.
Opcionalmente y si nuestra página se dedica a la venta por internet (como es nuestro caso), podemos añadir una
opción para identificarse, registrarse, o desconectarse, como ahora veremos.
Para ello lo primero será escribir en cabecera.inc.php el código necesario para insertar una imagen (nota: en
internet hay miles de sitios gratis donde bajarse imágenes para cabeceras).

Vemos que dentro de esta cabecera.inc.php y ya que vamos a añadir la funcionalidad de identificarse, registrarse
o desconectarse desde la cabecera, nos es necesario una nueva caja <div> llamada cuadro_login para tratarlo
como una entidad aparte con sus propiedades y caracterisitcas.
Dentro de este div y ya bien conocido, iniciaremos una sesión, para poder asi acceder al ArrayGlobal $_SESSION
para ver si el usuario está logeado o no, (recuerde, que esto ya lo habíamos hecho anteriormente).
Construir La Estructura HTML
En el caso de que estuviese logeado, lo que haremos será almacenar el nombre en la variable $nombre y
escribirla en pantalla, junto con el saludo “Hola”

Al igual que un enlace a index.php?sec=logout.php para que el usuario pueda cerrar su sesión.
En caso contrario, es decir que no estuviera logeado, añadiremos un hipervínculo a index.php?sec=login.php,
para que el usuario se identifique.
Observe también que al llamar en la línea 4 a session_start() nos vemos obligados a anteponer ob_clean() para
evitar que nos dé un fallo.
Además, hemos añadido:
Para que se vea el nombre de nuestra página en la cabecera.
Pruebe a escribir este código en cabecera.inc.php y ejecute ahora index.php.

El lateral Izquierdo (Menú)


Ya queda menos para terminar con la estructura general de la página.
Una de las partes más importantes a la hora de crear una página web es añadir un menú donde el usuario podrá
navegar por las distintas secciones de la web, y así elegir donde quiere ir.
Este menú suele ir a la izquierda y debe ser fácil de acceder (ya que el ojo humano siempre lee de izquierda a
derecha).
En este menú lo único que haremos será crear una lista de hipervínculos que nos lleven a la sección elegida.
Para simplificar, vamos a suponer que tendremos 3 opciones de menú, que serán, inicio, catalogo y contactar.

Vemos que lo que hacemos es nuevamente, ir a index.php pero añadiendo por parámetro get a sec la página a la
que queremos ir.
Escriba este código y ejecute index.php nuevamente:

La página de contacto
En toda página encontraremos siempre un apartado en el que podamos contactar con la empresa de la web.
Nosotros no seremos menos.
Para ello, crearemos un archivo llamado contactar.inc.php en la que insertaremos este código:

En el que simplemente hemos añadido un titulo de nivel h2 y un hipervínculo mailto: que permite mandar un
correo a la dirección especificada.
Pruebe a ejecutar index.php y acceda a contactar.

Dándole forma
Ahora lo único que haremos es encuadrar cada uno de esos div, añadiéndole una serie de propiedades CSS para
que tengan un aspecto “más bonito”.
Al no ser este un curso de CSS no explicaremos que hemos hecho en cada paso, sino que os adjuntamos en el
curso una hoja de estilos ya diseñada para poder utilizarla.
Para ello, lo primero será copiar la carpeta images y la carpeta css de esta práctica, en la carpeta en la que
estemos trabajando y en index.php añadir la línea que en HTML incluye una hoja de estilos:

De esta manera y al recargar la página ya veremos la estructura de la página que queríamos crear.

Adaptando la funcionalidad
Ya hemos conseguir diseñar un aspecto bonito para nuestra página web, dejando todo el contenido en el div
contenido.
Para añadir la funcionalidad que habíamos conseguido a lo largo de este curso lo primero será incluir los archivos
necesarios a la carpeta en la que estemos trabajando.
Estos archivos son:
 carrito.inc.php
 carritocompra.php
 comprar.php
 conexión.inc.php
 confirmarpedido.php
 listaproductos.php
 login.php
 logout.php
 registro.php
Ahora lo único que deberemos hacer será modificar estos archivos para que en vez de ejecutarse ellos, se pasen
por parámetro get a index.php, que se encargará de mostrarlos en el div contenido.
Diremos, cuales son los puntos específicos en los que hay que cambiar esto, para que funcione y no tengas que
estar buscándolos.

Construir La Estructura HTML


carrito.inc.php: No hay que modificar nada ya que solo son accesos a la base de datos.
carritocompra.php:
En la línea 18, cambiaremos el contenido del else:

Por este otro, ya que ahora, nos redirigirmos a index.php?sec=login.php en vez de a listaproductos.php

Además, al final del código vemos como teníamos estos hipervínculos para seguir comprando o confirmar el
pedido:

Ahora esto, deberemos sustituirlo para que pase por index.php:

comprar.php:
Lo mismo, sustituiremos:

por,

conexión.inc.php: No hay que tocar nada, son solo ajustes de conexión.


confirmarpedido.php:
La línea 64 la cambiaremos por:
La línea 78 tendremos que volver a cambiarla,

Para que pase por index.php:

Y además, añadiremos funcionalidad nueva agregando un enlace a login.php en el caso de que no estuviésemos
identificados.
listaproductos.php:
Cambiamos:

por

Y…

por…

Y…
Por…

login.php:
En esta página vamos a eliminar el div con id=Layer1, ya que ya no nos hace falta.

También, eliminaremos:

Y lo sustituiremos por:

Para que funcione al aplicarle el estilo css.


Además, eliminaremos este echo y cambiaremos la dirección del header

Por:

Tambien, cambiaremos de lugar el botón enviar.

Poniéndolo aquí:

Modificaremos el hipervínculo de registro.php a index.php?sec=registro.php


Y por último, incluiremos estas líneas nuevas, para quedarnos con el nombre del usuario una vez identificado y
podamos mostrar su nombre en la cabecera de este modo:

Logout.php:
Aquí cambiaremos:

Por:

registro.php:
Eliminamos la línea:

añadimos el archivo error.inc.php, que encontraremos en la práctica anterior (necesario para que función
registro.php)
Cambiamos esta línea:

por esta:

Cambiamos:

por:

Y por último eliminamos de nuevo:

Con esto finaliza la explicación de la integración del proceso de compra a una página web actual que hemos
implementado en nuestra tienda de Internet y también el curso que ha estado siguiendo.

Recuerda
Normalmente cuando accedemos a una página web en la que existe un carrito no accedemos directamente a él,
sino que solemos entrar a la página principal, denominada comúnmente index.php, donde allí podemos ir a la
sección de productos, de contacto, de login y de carrito (entre otras).
En este último tema del curso (aunque no tenga mucha relación con JavaScript y Php) hemos visto cómo integrar
nuestro carrito a una página web como las que se ven hoy en día, repasando de este modo algunos conceptos
importantes sobre html y hojas de estilos y como no, JavaScript y PHP.
El tema está dividido en 3 partes:
Visión global de la página que vamos a construir, explicando los conceptos más importantes y las tendencias
actuales a la hora de construirla.
Montar la estructura web de la página con HTML y darle forma con estilos CSS.
Integrar la funcionalidad de nuestro carrito a la página.
La página de bienvenida de nuestro sitio, será algo muy simple en la que daremos la bienvenida a la página,
explicando que se puede encontrar y a que nos dedicamos.
El pie de página es un elemento opcional, que suele contener información muy concreta.
La cabecera de nuestro sitio será aquella página situada siempre en la parte superior, en la que veremos
además, del nombre de nuestro sitio web, una imagen o logotipo.
Una de las partes más importantes a la hora de crear una página web es añadir un menú donde el usuario podrá
navegar por las distintas secciones de la web, y así elegir donde quiere ir.
En toda página encontraremos siempre un apartado en el que podamos contactar con la empresa de la web.

Preguntas de Autoevaluación

1.
Indica si la siguiente afirmación es verdadera o falsa: 
“En la web que vamos a crear, nuestra página principal será listaproductos.php”.
Verdadero.
Falso.
2.
Indica si la siguiente afirmación es verdadera o falsa: 
“La cabecera suele ir debajo de la página web”.
Verdadero.
Falso.
3.
Indica si la siguiente afirmación es verdadera o falsa: 
“En el pie, añadiremos nuestro menú”.
Verdadero.
Falso.
4.
Indica si la siguiente afirmación es verdadera o falsa: 
“La función include copia el contenido de la página que estemos llamando en la página de donde la estemos
llamando”.
Verdadero.
Falso.
5.
Indica si la siguiente afirmación es verdadera o falsa: 
“Para pasarle a index.php la información que mostrará en el div contenido, lo haremos mediante el método GET”.
Verdadero.
Falso.

Introducción
Como resumen de los temas anteriores, vamos a comentar que es lo que tendríamos hasta ahora:
Tenemos una pagina principal “index.php” en la cual veremos todas las opciones, gracias a los incluyes dentro de
index.php.
A la izquierda tenemos un menú, donde podremos:
Volver al Inicio.
Consultar el Catálogo.
Ver la dirección de correo de nuestra empresa y poder mandar un correo a esta misma.
En la parte superior, vemos nuestra cabecera, con el nombre de nuestra tienda “TiendaDetalles”, y una opción
para identificarnos.
Si nos identificáramos, accederíamos a Login.php, la cual nos muestra un formulario, donde podremos bien,
identificarnos o incluso registrarnos.
Una vez identificados, podemos utilizar la opción para ver el “Catalogo”, en la cual se nos mostrarán todos los
productos ofrecidos por nuestra empresa y en la parte derecha de la misma, la opción de comprar.
Si quisiéramos comprar uno o varios productos, pincharíamos en comprar, y veríamos un resumen de lo que
llevaríamos en el carrito de la compra, dándonos la opción de seguir comprando o confirmar el pedido.
Si continuásemos comprando, volveríamos a ver los productos, y repetiríamos los pasos anteriores, pero… si
quisiéramos confirmar el pedido, hasta ahora lo único que hacíamos es añadir una orden y unas líneas de orden
en nuestra base de datos, haciéndonos creer que se ha comprado el producto.
Pues bien, en este tema, veremos como implementar unas formas de pago, para poder llevar a cabo el cobro de
productos en nuestra web.
Tipos De Formas De Pago
Las tiendas online ofrecen una variedad asombrosa de formas de pago, cómodas y a medida de la percepción del
riesgo que cada usuario tenga de ellos en su compra online según su experiencia previa.
Podemos agrupar los medios de pago en función a la comunicación de los datos con el banco, si los facilitamos
nosotros al banco o es recogido mediante una plataforma directamente por el banco.
Medios de pago directos a nuestro banco
Los medios de pago en los cuales el pago no se efectúa durante la realización del pedido online, sino a posteriori
son considerados más seguros ya que no son transmitidos por Internet:
Pago contra reembolso: es el método de pago menos arriesgado para el comprador, ya que el pago se realiza
cuando el producto adquirido están en sus manos.
Pago por  transferencia bancaria: el comercio notifica al usuario una cuenta bancaria donde el cliente debe
realizar una transferencia para que se gestione su pedido.
Es un medio más lento porque tienen que pasar varias horas para que la transferencia sea cursada y que
informemos a la tienda (y esta se entere) de que la misma ha sido hecha.
El banco nos puede cobrar una comisión por cada transferencia periódica.
Domiciliación bancaria: la domiciliación bancaria  es un método menos frecuente. El cliente facilita su número
de cuenta bancaria al comercio, y el comercio le gira un cobro con una periodicidad determinada.
El banco nos puede cobrar una comisión por cada transferencia periódica.
Medios de pago comunicados por internet
En este tipo de pagos, el pago se efectúa en el momento justo cuando se realiza el pedido online mediante
conexión directa a través de una pasarela de pagos o similar son:
Tarjeta de crédito  (TPV virtual):
La tarjeta de crédito es el sistema de pago electrónico más común y aceptado hoy en día. A los consumidores no
nos encarece la compra, pero el comercio debe abonar una comisión a la entidad que le ofrece el servicio de TPV
virtual de entre el 0,5% y 4,5% del importe de nuestro pedido según su poder de negociación.
Podemos distinguir dos tipos de sistemas de pago con tarjeta vía TPV virtual:
El tradicional: a través del cual se puede usar cualquier tarjeta de crédito.
Los TPVs 3D Secure: en los que el pago se realiza mediante conexión telemática directa con nuestra entidad
bancaria que nos pide una clave especial para compras online que previamente le habremos solicitado para
operar por Internet (o que se solicita sobre la marcha).
En ambos casos, bien el comercio o el banco solicitan los datos de la tarjeta de crédito para poder completar la
compra y nuestra clave para pagos seguros online.
PayPal:
 PayPal es uno de los sistemas de pago online relativamente más recientes, propiedad de la empresa
norteamericana Ebay.
 PayPal permite la recepción y envío de dinero en Internet de forma rápida y segura entre comprador y
vendedor. Para ello se tiene la posibilidad de registrarse gratis desde su web www.paypal.es y obtener
servicios como pagos periódicos, pagar desde una cuenta del banco, o incluso que el dinero se guarde en
tu propia cuenta de PayPal.
 Este tipo de pago tiene un pequeño coste también en forma de cobro de comisión al comercio pero no al
consumidor comprador online.
 Es rápido y seguro porque no se envía en ningún momento al comercio la información financiera o de la
tarjeta de crédito.
 Es global (aceptado en cualquier transacción nacional e internacional).
Contrareembolso
 El pago contra-reembolso es un medio de pago utilizado en las ventas a distancia (por Internet, teléfono o
catálogo) que consiste en abonar el coste del producto comprado, con sus recargos (por entrega y por
elegir este medio de pago) directamente a la persona que nos haga la entrega del mismo en nuestro
domicilio (el transportista), generalmente en efectivo (moneda y billetes).
 Para que se pueda hacer un pago contra-reembolso es necesario:
 Que haya algo físico que entregar en el domicilio del cliente. Si no lo hubiera, por ejemplo, un servicio, no
podría darse esta forma de pago.
 Que estén presentes en el momento de la entrega del producto el comprador y el representante del
vendedor (el transportista).
 Disponer de dinero en efectivo. Si en el momento de la entrega, el consumidor comprador online no
dispusiera de monedas o billetes, el transportista no podría entregarle al producto.
 Pagar el pedido online completo, que comprenderá el precio del pedido, el coste de envío y el coste del
pago contra-reembolso.
Ventajas:
La principal ventaja del pago contra-reembolso en las compras online es que no tiene ningún riesgo para el
comprador, ya que puede abrir la mercancía en su hogar, comprobar que corresponde con lo solicitado y, sólo en
ese caso, desembolsar su importe en efectivo.
Inconvenientes:
La principal desventaja del pago contra reembolso en las compras online para el comprador es que cuesta dinero
en forma de comisión por recurrir a esta forma de pago en vez de a otras (tarjeta bancaria o transferencia
bancaria, por ejemplo).
El comprador paga esta comisión cuando elige el pago contra-reembolso ya que se debe al coste extra que este
medio de pago supone para el vendedor:
Cuando hacemos un pedido contra-reembolso, el comercio online se obliga a entregárnoslo en nuestro
domicilio sin haberlo cobrado antes, por lo que existe un alto riesgo de que el comprador no se encuentre en su
domicilio en el momento de la entrega, o que simplemente sea un pedido fallido porque el comprador es un
graciosillo.
Para ello las empresas de comercio electrónico deben estar seguras de que el cliente existe y de que tiene la
intención de comprar online, por ejemplo, comprobando que el domicilio de entrega existe y corresponde a un
hogar cierto.
La empresa transportista tiene que confiar a sus transportistas, para mover dinero del domicilio del cliente a la
empresa, y le cobran a esta una comisión por ese servicio (seguridad de que el dinero llegue del comprador al
vendedor).
Transferencia Bancaria

En materia de medios de pago, una transferencia bancaria es una operación bancaria por la que una
persona (física o jurídica), ordena electrónicamente a su banco que tome parte de sus fondos en una cuenta
bancaria y los deposite en la cuenta bancaria de otra persona (física o jurídica).
Las transferencias bancarias son medios de pago muy prácticos, ya que permiten hacer pagos sin transportar
efectivo y a distancia, es decir, el vendedor y el comprador no tienen que verse físicamente, incluyendo en las
compras online y a distancia.
Domiciliación Bancaria

Una domiciliación bancaria es un medio de pago consistente en dar la orden a nuestro banco de que atienda
periódicamente, hasta nuevo aviso, todos los recibos que una empresa, administración o particular pase al cobro
contra nuestra cuenta bancaria con la citada periodicidad.
La domiciliación bancaria se asocia a la contratación de un servicio por suscripción a lo que sea (un curso de
idiomas en una academia, una suscripción a una revista, etc.), o al pago periódico de recibos (luz, agua,
teléfono, adsl, o del colegio de los niños).
Servicios de suscripción:
Los servicios de suscripción son “peligrosos” cuando no son ni esperados ni solicitados por los consumidores.
El ejemplo más palmario de esto son los SMS Premium. El incauto consumidor ve en la tele o en Internet un
concurso, un sorteo o realiza una pretendida prueba de destreza que excita su curiosidad (por ejemplo, el “test
de la muerte”), que le requieren su número de teléfono móvil o enviar un mensaje de alta a un número corto.
Inmediatamente recibe un mensaje trampa en el que se le invita a confirmar éste mensaje para conocer más
información sobre el mensaje trampa pero en realidad está dándose de alta a un servicio ed suscripción en que
se factura por mensaje recibido independientemente de la finalidad del mensaje, a razón de 50 o 55 céntimos de
euro y hasta 100 mensajes al mes.
Otra técnica usada es la prueba gratuita de un mes sin compromiso, durante un mes con regalo incluido.
El usuario inocente da sus datos del banco y si no dice lo contrario la empresa le carga su primer recibo porque
entiende que el usuario que ha hecho la prueba no ha manifestado su oposición ni en tiempo ni forma.
Tarjetas Bancarias
Una tarjeta bancaria es un medio de pago emitido al consumidor por una entidad bancaria, contra su saldo en
una cuenta bancaria asociada a la tarjeta titularidad de éste, que es aceptada en miles de comercios y
establecimientos.
En el mercado hay un numeroso abanico de tarjetas bancarias: de débito, de crédito, tarjetas monedero y
tarjetas emitidas por los comercios.
Tarjeta de débito
Una tarjeta de débito permite hacer uso de ella en los comercios y establecimientos que la acepten como medio
de pago, hacer extracciones en efectivo de su red cajeros automáticos sin cargo y otras operaciones (recargar un
móvil con tarjeta prepago, consultar el saldo de la cuenta bancaria asociada a la tarjeta, etc.).
Las tarjetas de débito son nominativas y permiten disponer de tanto efectivo en cajeros automáticos (o hacer
cargos en comercios) como saldo disponible haya en la cuenta asociada a la tarjeta. El cargo es inmediato en la
cuenta del usuario titular de la tarjeta.
Tarjeta de crédito
Una tarjeta de crédito permite hacer uso de ella en los comercios y establecimientos que la acepten como medio
de pago, hacer extracciones en efectivo de su red cajeros automáticos y otras muchas y diversas operaciones.
La principal diferencia de una tarjeta de crédito con una de débito es que la primera lleva asociada (en función de
la solvencia que la entidad emisora reconoce a su titular) una línea de crédito que permite al usuario:
 Hacer compras a crédito o sacar dinero de cajeros en diferido (modalidad “diferida”) sin coste para el
usuario titular de la tarjeta,
 Hacer compras a crédito mediante el pago de una cuantía fija mensual, hasta la amortización del importe
adeudado, con un máximo de saldo dispuesto (lo que se llama línea de crédito).
 Tarjeta monedero
 Una tarjeta monedero es una tarjeta bancaria que se sirve de la modalidad prepago, para limitar el riesgo
de fraude en su utilización. Las tarjetas monedero son ideales para pequeños pagos o pequeños usuarios
bancarios.
Características de las tarjetas monedero:
 Se pueden recargar con el saldo en euros que quiera su titular (o persona tercera), mediante un ingreso
en caja o mediante cargo en la cuenta
 Puede ser utilizada en comercios mientras haya saldo disponible,
 Se puede recargar una vez dispuesto su saldo.
Tarjetas De Comercio

Las tarjetas comerciales, son tarjetas de crédito emitidas por las empresas financieras de grandes cadenas
comerciales (El Corte Inglés, Carrefour, Alcampo, etc.).
Las principales características de las tarjetas de comercio son las siguientes:
Se utilizan generalmente como instrumento de financiación de las compras hechas en tiendas.
Dan la posibilidad, al igual que cualquier tarjeta de crédito, aplazar las compras a fin de mes sin costes extras
para el titular,
Permiten a su titular financiar compras a plazo del establecimiento (con o sin intereses),
Suelen servir exclusivamente para realizar compras en el establecimiento comercial que las emite, dentro del
límite de crédito pactado.
Paypal

PayPal ofrece en el ámbito del comercio electrónico y de pagos online, un sistema de pago seguro y rápido
asociado a un email y a una cuenta de usuario, a la cual hay asociado una tarjeta o una cuenta bancaria.
Ventajas:
Comodidad: te das de alta con tus medios de pago en un solo sitio y puedes hacer tu compra online en los miles
de sitio web de todo el mundo.
El pago es muy sencillo solamente con identificarte en PayPal ya podrás abonar la compra realizada.
Seguridad: cuando se realiza el pago se abandona la web del vendedor para irte a la web de PayPal, acceder
con nuestras claves secretas, pagar y volver a la tienda, de esta forma nuestros datos de pago nunca los
conocerá el vendedor.
Facilita la rapidez de un pedido online ya que comunica al instante al comercio online si se ha realizado el pago.
En caso positivo, el comercio ya dispone de ese dinero y puede tramitar nuestro pedido.
Tiene la misma rapidez que pagando con una tarjeta de crédito, mucho más rápido que el pago por transferencia
bancaria.
Gratuidad: para el usuario es gratuito ya que Paypal le cobra comisión al vendedor, el mismo sistema que las
tarjetas.
Inconvenientes:
PayPal tiene que acordar con cada comercio online, si tu tienda preferida no dispone de PayPal, no podrás utilizar
este medio de pago.
Cuenta de reserva y límites: Si están comprometidos fondos de nuestra cuenta PayPal, no podremos disponer de
ellos. El pago al comercio se hará en los siguientes tres días.
El máximo de pagos anuales se fija en 2.500 euros por lo que no se podrá pagar más de esa cantidad al año en
PayPal.
Protección de datos y litigios: PayPal tiene su sede en Luxemburgo, es decir, que si hay que reclamarle se
rigen los las leyes de Luxemburgo.
Seguridad: Nadie debe conocer nuestras contraseñas ya se podrían realizar pagos fraudulentos, hay que tener
cuidado en caso de suplantación de personalidad (phishing o spoofing).

¿Qué Formas De Pago Utilizaremos?


Vistas las ventajas y los inconvenientes que tiene cada una de las formas de pago, vamos a integrar a nuestro
“TiendaDetalles”, tres formas de pago distintas:
 A contra-reembolso.
 Transferencia-Bancaria.
 Paypal.
Modificando La Interfaz De Nuestra Tienda
Bien, una vez aquí, debemos de saber que para poder utilizar estas formas de pago, vamos a tener que modificar
nuestra interfaz, ya que ahora, cuando el usuario quiera confirmar el pedido, deberemos de mostrarle una
pantalla en la que decida como quiere pagar.
Para ello, vamos a modificar el código incluido en confirmarpedido.php, reemplazando:

Por:

Y si lo ejecutamos veremos lo siguiente:

Que será la interfaz que nos permita elegir la forma de pago.


Si nos fijamos en el código, vemos que cuando pulsamos el botón, lo que hace es mediante GET, mandarnos a
un archivo que vamos a pagar, que se llamará “elegir_pago.php” dándole el valor 1(contrareembolso), el valor
2(Transferencia) o el valor 3 (Paypal).
El siguiente paso será crear en la carpeta carrito, el siguiente archivo “elegir_pago.php”, que tendrá un aspecto
como este:
Si nos damos cuenta lo que hacemos es ver la opción que ha elegido el usuario en la variable $opción y
dependiendo de la opción elegida lo redirigiremos a index.php, pasándole por parámetros get, 2 parámetros:
Si se ha pulsado el botón aceptar o cancelar (para ello creamos un formulario) y la pagina
pantalla_pago_final.php, que es donde tendrá que ir luego.

Modificando Nuestra Base De Datos


Bien, una vez aquí, debemos de saber que para poder utilizar estas formas de pago, y hacer que la interfaz
funcione vamos a tener que modificar la base de datos, ya que ahora, además, de guardar, lo que el usuario ha
comprado, hay que darle a elegir la manera de pago, y asociar una serie de campos a la base de datos, que
antes no contemplábamos.

Para ello, crearemos una tabla en la base de datos con las distintas formas de pago:
Con los siguientes campos:

Y ejecutaremos en phpmyadmin, los siguientes insert:


Obteniendo las siguientes formas de pago:

 Ahora, en la tabla ordenes, vamos a añadir tres campos nuevos:


 Pagado, MetodoPago y referencia_transaccion.
 Para ello, dentro de la tabla ordenes, le damos a estructura y añadimos al final de la tabla, las tres
nuevas columnas:
Quedándonos así:
Con esto, ya podemos centrarnos en el código y ver que hacer para rellenar y llevar el control de esos campos.

Modificando El Código Anterior

Anteriormente, hacíamos una simulación y cuando confirmábamos el pago, poníamos FechaEnvio, a dos días del
día de hoy.

Ahora, solo tocaremos de manera manual esa fecha de envío cuando nosotros enviemos el pedido.

Al igual que el campo Enviado, que lo pondremos a 1 si se envía.

Para ello, nos vamos a confirmarpedido.php y cambiamos este código:

Por este otro:

Como vemos, lo único que hacemos es que cuando hacemos el insert, omitimos el campo FechaEnvio, por lo
que, cuando un cliente, confirme un pedido, nos aparecerá un registro de este tipo:
Donde como vemos, la FechaEnvio es 0000-00-00, Pagado es 0, MetodoPago es 0 y referencia_trasaccion esta
vacío.
En este momento es cuando el usuario debe de estar eligiendo la forma de pago.
Antes de seguir, vamos a proceder a explicar para que nos sirva la referencia de transacción.
Esta referencia será una serie de caracteres (en nuestro caso, 50 caracteres alfanuméricos) que mostraremos al
cliente una ver, acepte el pago, y con el cual, él se podrá referir a nosotros si tuviera algún problema con el
envío, el pago, etc.…
Para ello, vamos a crear una función para ello, que se llamará: _generar_string_aleatorio().

Y tendrá esta estructura:

Este código lo copiaremos en donde nos hace falta, que es en pantalla_pago_final.php.


Y por tanto, lo primero que haremos nada mas entrar a esta página será llamar a la función y guardar los
caracteres generados en $ref, así:

Ahora volvamos a los métodos de pago, descritos anteriormente.


Implementando El Contrareembolso

Si el usuario, elige esta opción (solamente dándole al Botón Aceptar ) lo único que tendremos que hacer es
rellenar de la tabla ordenes, el nuevo campo, llamado MetodoPago y el campo referencia_transacción, con el
valor que ya tenemos generado ( ya que pagado, no podemos saber nada hasta que nos avise la mensajera).
Antes de nada, debemos de saber en todo momento, cual es el idOrden del cual estamos tratando.
Para no perderlo de vista, vamos a introducirlo en el array $_SESSION, de esta manera en confirmarpedido.php:
Por tanto, y ya que tenemos en $cliente = $_SESSION["usuario"]; el id del cliente, y en $_SESSION[“Orden”] el
idOrden, podremos actualizar el campo MetodoPago por 1, y referencia_transaccion por los caracteres
generados, de esta manera:

Y por ultimo, mostrarle al usuario su referencia de transacción y la dirección de envió, donde recibirá su pedido.
Y recordarle que cuando reciba el pedido, deberá abonar la cantidad, junto con la cantidad a cobrar.

Con este código:

Vemos que si en vez de pulsar aceptar, pulsamos cancelar, nos redirigimos a index.php, cargando la pantalla de
bienvenida.
(Recordar: Una vez, enviemos el pedido, hay que actualizar manualmente el campo FechaEnvio y cuando el
cliente reciba el pedido y lo pague, la mensajera nos avisará de que le pago ha sido hecho y seremos nosotros
los encargados de poner el campo pagado a 1).
Implementando La Transferencia
El pago por transferencia es muy parecido al de contrareembolso, con la única diferencia, que de debemos de
recordarle al usuario, una vez le mostremos la referencia, el número de cuenta donde tiene que ingresar el
dinero, y poner le método de pago a 2 en vez de a 1, por lo que, el código sería:

Y el resultado:
Implementando El Paypal

Ya tenemos nuestro carro de compra casi al completo.


En esta parte del tutorial Carrito de compras en php veremos como finalizar una compra con el método de
pago PayPal  gracias a su API y la facilidad con la que podemos interactuar con ella.
Para hacer pruebas con API de Paypal antes de lanzar nuestra tienda virtual al público existe una plataforma
llamada Paypal Sandbox para desarrolladores con la que podremos hacer pruebas con cuentas ficticias.
Así que lo primero que haremos es registrarnos, donde nos pedirán algunos datos personales como Nombre,
Apellidos, email y password (recomiendo no usar vuestros propios nombres).

Una vez tenemos registrado nuestro usuario de pruebas de Paypal es hora de crear las 2 partes "humanas" que
interactúan en una tienda virtual, el comprador y el vendedor, para así tener constancia de que se efectúa la
compra y que el vendedor recibe el pago.
Crear una cuenta de Paypal para vender
Una vez hemos activado nuestro usuario de Paypal Sandbox a través del e-mail y nos hemos logueado
correctamente, entramos en el panel de administración.
Para crear una cuenta en Paypal SandBox para realizar pruebas con datos que ellos nos proporcionan, seguimos
los siguientes pasos:
Ir a Test Accounts
Clic en Preconfigured y rellenar los datos que nos piden tal y como veis en la siguiente imagen:
El mail que se va a utilizar aquí, tal y como indican en el formulario, es una dirección simulada, así que no hace
falta registraros en gmail
Crear una cuenta de Paypal para vender
El sistema es muy parecido, solo cambia en el tipo de cuenta (Account Type) que lo seleccionaremos
como Buyer  en lugar de Seller.
Ahora si que estamos preparados para hacer pruebas comprando en nuestra tienda virtual.
Lo siguiente que haremos es preparar la página "pantalla_pago_final.php".

El funcionamiento es bastante simple viendo el diagrama. Lo primero y es lo que trataremos en esta parte del
tutorial es preparar una página con un formulario que envíe los datos necesarios a https://www.paypal.com/cgi-
bin/webscr. En nuestro caso como estamos haciendo pruebas y Paypal nos proporciona un sitio especifico para
tal fin, en el action del formulario utilizaremos https://www.sandbox.paypal.com/cgi-bin/webscr.

Para que Paypal nos pueda efectuar los pagos hace falta proporcionarle una serie de datos como son:
cmd: Indica el tipo de fichero que va a recoger PayPal, que pueden ser: _cart (varios items), _donations
(donaciones), _xclick (botón de compra)
business:Indica el identificador del negocio registrado en paypal. Aquí vendrá la dirección e-mail de registro en
Paypal del vendedor.
shopping_url: La dirección de nuestra tienda online.
currency_code: El tipo de moneda (USD , EUR ...)
return: Será el enlace de vuelta a nuestro negocio que ofrece paypal
notify_url: En esta página es donde recogeremos el estado del pago y un gran números de variables con
información adicional en nuestro caso lo hemos llamado paypalipn.php
rm: Indica el método que se va a utilizar para enviar la información de vuelta a nuestro sitio. RM=1 (información
enviada por GET) , RM=2 (información enviada por POST)(En este caso usamos este método porque es un script
php el que recoge los datos).
item_number_X: Identificador del producto. Aquí tendremos que definir tantos productos como haya en el
carro de compra. Ejemplo item_number_1, item_number_2, etc.
item_name_X: Nombre del producto. Aquí tendremos que definir tantos nombres de productos como haya en el
carro de compra. Ejemplo item_name_1, item_name_2, etc.
amount_X: Precio del producto. Aquí tendremos que definir tantos precios de producto como haya en el carro
de compras. Ejemplo amount_1, amount_2, etc.
quantity_X: Cantidad del producto. Aquí tendremos que definir tantos cantidad de producto como haya en el
carro de compras. Ejemplo quantity_1, quantity_2, etc.
Estos datos ya son suficientes para que Paypal pueda efectuar la compra correctamente. Para ver todos los tipos
de variables que podemos enviar a Paypal podéis acceder a la siguiente dirección.
Implementando El Paypal
El formulario quedaría de la siguiente manera:

Como veis, nos faltan algunas variables en el formulario para enviar a Paypal con información sobre productos,
precios, cantidad del carro de compra.
Como este tipo de información lo tenemos almacenado en nuestra base de datos, vamos a recuperarlos de
manera dinámica haciendo una consulta, y componiendo dinámicamente la parte que falta del formulario, de
esta manera.
Además, nos hace falta, enviar el formulario para que llegue a paypal.
Como no queremos que aparezca ningún botón ni nada, sino el mensaje de “Contactando con Paypal…”
necesitaremos hacer que el formulario se ejecute automáticamente, y esto lo hacemos mediante javascript de
esta manera.

Con esta función ya tenemos todas las variables necesarias para realizar el pago del carrito de compra en Paypal,
pero como veis hemos definido tres variables que hacen referencia a 3 páginas de nuestra aplicación, y 2 de ellas
aun no la hemos creado (error_Paypal.php y éxito_Paypal.php que veremos a continuación).
Lo primero es decir, que paypal no acepta como dirección de envío de éxito o de error, un archivo .php alojado
en nuestro localhost, por lo que si queremos seguir con el curso, vamos a necesitar un servidor real, albergar allí
nuestro carrito y cambiar los parámetros:
Por las direcciones reales del servidor.
Seguiremos con el curso, imaginando que son direcciones reales (aunque no se pueda probar, como ya he
dicho).
errorPaypal.php

Empecemos por la página error_Paypal.php. Esta página será la que se ejecutará automáticamente cuando se
cancele el pago por parte de Paypal. Y haremos una simple página de aviso de que no ha ido bien la conexión
con Paypal. Podéis crearlo con un simple texto informando de que no se ha podido efectuar el pago con éxito.

De esta manera:

exito.php

La otra página que tenemos que crear es éxito_Paypal.php, que como el nombre indica, será la página que se
mostrará en el caso de que todo haya ido bien con Paypal.
Podéis crearlo con un simple texto informando de que se ha efectuado el pago con éxito.

Pero además, es esta pagina éxito_Paypal.php, la que se debe de conectar a la base de datos, y modificar la
columna “Pagado” a 1, “MetodoPago” a 3 y la referencia_transaccion.
Con la referencia_transaccion vamos a tener un problema ya que en el momento en que mandemos el
formulario, vamos a perder la información de la referencia.
Esto se soluciona, metiendo la referencia en el array_session y luego recuperarla en éxito_Paypal.php al igual
que hicimos con $_SESSION[“Orden”]; para poder ejecutar el Update.

Dejamos este ultimo archivo .php, para que lo hagan aquellos que puedan hacer pruebas reales en un servidor, y
ver que efectivamente todo funciona.
Un detalle a comentar es que si en vez de querer probar paypal en un servidor de pruebas, queremos ejecutarlo
de manera real, debemos de cambiar la dirección de llamada del formulario de pruebas
(https://www.sandbox.paypal.com/cgi-bin/webscr) por (https://www.paypal.com/cgi-bin/webscr).
Recuerda
Cuando usted encuentre una clase de la que parte de sus propiedades y sus métodos sean comunes a otra clase,
podrá crear una subclase a
Las tiendas online ofrecen una variedad asombrosa de formas de pago, cómodas y a medida de la percepción del
riesgo que cada usuario tenga de ellos en su compra online según su experiencia previa.
Medios de pago directos a nuestro banco:
Pago contra reembolso: es el método de pago menos arriesgado para el comprador, ya que el pago se realiza
cuando el producto adquirido están en sus manos.
Pago por transferencia bancaria: el comercio notifica al usuario una cuenta bancaria donde el cliente debe
realizar una transferencia para que se gestione su pedido.
Domiciliación bancaria: la domiciliación bancaria : El cliente facilita un número de cuenta bancaria para girar un
cobro con una periodicidad.
Medios de pago comunicados por Internet:
Tarjeta de crédito (TPV virtual): La tarjeta de crédito es el sistema de pago electrónico más común y aceptado
hoy en día. Podemos distinguir dos tipos de sistemas de pago con tarjeta vía TPV virtual:
PayPal: PayPal es uno de los sistemas de pago online relativamente más recientes, propiedad de la empresa
norteamericana Ebay. PayPal permite la recepción y envío de dinero en Internet de forma rápida y segura entre
comprador y vendedor.
El pago contra-reembolso es un medio de pago utilizado en las ventas a distancia (por Internet, teléfono o
catálogo) que consiste en abonar el coste del producto comprado, con sus recargos (por entrega y por elegir este
medio de pago) directamente a la persona que nos haga la entrega del mismo en nuestro domicilio (el
transportista), generalmente en efectivo (moneda y billetes).
En materia de medios de pago, una transferencia bancaria es una operación bancaria por la que una
persona (física o jurídica), ordena electrónicamente a su banco que tome parte de sus fondos en una cuenta
bancaria y los deposite en la cuenta bancaria de otra persona (física o jurídica).
Una domiciliación bancaria es un medio de pago consistente en dar la orden a nuestro banco de que atienda
periódicamente, hasta nuevo aviso, todos los recibos que una empresa, administración o particular pase al cobro
contra nuestra cuenta bancaria con la citada periodicidad.
Una tarjeta bancaria es un medio de pago emitido por una entidad financiera (generalmente un Banco o una Caja
de Ahorros) a favor de un consumidor, contra su saldo en una cuenta bancaria asociada a la tarjeta titularidad de
éste, que es aceptada en miles de comercios y establecimientos:

-Tarjeta de Crédito.
-Tarjetas de débito.
-Tarjetas monedero.

Preguntas de Autoevaluación
1.
Los medios de pago en los cuales el pago no se efectúa durante la realización del pedido online, sino a posteriori,
de forma diferida son: (Respuesta múltiple)
Pago contra reembolso.
Transferencia bancaria.
Tarjeta de crédito.
2.
Indica si la siguiente afirmación es verdadera o falsa: 
“Para realizar una venta contra reembolso es necesario que exista algún material físico a entregar al cliente”.
Verdadero.
Falso.
3.
¿Cómo se denomina a las tarjetas de crédito emitidas por las empresas financieras de grandes cadenas
comerciales?:
Tarjetas de débito.
Tarjetas de socio.
Tarjetas de comercio.
4.
Indica si la siguiente afirmación es verdadera o falsa: 
“Un inconveniente de Paypal es que se pueden realizar pagos fraudulentos si alguien accede a nuestra cuenta”.
Verdadero.
Falso.
5.
Indica si la siguiente afirmación es verdadera o falsa: 
“Cuando implementemos un método contra reembolso, seremos nosotros los encargados de marcar la
transferencia como pagada cuando esto se produzca, y no el sistema”.
Verdadero.
Falso.

Manual En PDF Aprende A Programar

Nos descargamos un manual para aprender a programar


Archivos Necesarios Para Las Prácticas PHP

Nos descargamos los archivos necesarios para realizar las prácticas aquí


Enlaces De Descarga De Las Aplicaciones Necesarias

Editra
Editra para Windows
Editra para Linux
Editra para Mac
Notepad
Notepad
Netbeans
Netbeans para Windows
Netbeans para Linux
Netbeans para Mac
Xampp
Xampp para Windows
Xampp para Linux
Xampp para Mac
Examen Final
1.
¿Se pueden guardar las páginas web en una carpeta que no esté por defecto por debajo de la carpeta Htdocs del servidor Apache?:
Si.
No.
2.
¿Se puede crear algún mecanismo para acceder a una página web sin tener que acceder exactamente a la dirección URL?
Si.
No.
3.
En el archivo de configuración del Apache, ¿Importa el orden?:
Si.
No.
4.
Indica si la siguiente afirmación es verdadera o falsa: 
“Deberemos reiniciar Apache si efectuamos el más mínimo cambio”.
Verdadero.
Falso.
5.
¿Qué instrucción cambiará el contenido de la variable $ratio?:
$ratio =
Echo “Este es el ratio actual “ . (float)$ratio.
6.
¿Se incluye el signo dólar ($) en el nombre de las constantes?:
Si.
No.
7.
¿Qué signo de puntuación separa instrucciones en PHP?:
Punto (.)
Punto y coma (;)
Dos puntos (:)
8.
¿Podrá aumentar el número de elementos, una vez creado un array?:
Si.
No.
9.
Indica si la siguiente afirmación es verdadera o falsa: 
“En el cuerpo de un bucle while debe haber alguna instrucción que permita que la condición de fin de bucle se llegue a cumplir”.
Verdadero.
Falso.
10.
¿Cuál es el operador de asignación en PHP?:
=
==
11.
Para que $a valiese 5, ¿qué instrucción debemos usar?: 

a[4].
a[6].
$a[4].
$a[5].
12.
¿Con foreach es necesario conocer los nombres de los índices?:
Si.
No.
13.
¿Se pueden crear arrays de más de dos dimensiones en PHP?:
Si.
No
14.
Dada la siguiente línea de código: 

¿Qué expresión se evaluará a “Horno”?


$productos[2].
$productos[“Nombre”].
$productos[“A1”][“Nombre”]
15.
¿Podemos crear arrays asociativos multidimensionales?:
Si.
No.
16.
¿Cuántas dimensiones tiene el array $productos si accedemos a uno de sus elementos con la expresión: 
$products[“Category”][“A01”][“Nombre”]?
17.
¿Cuántas veces podemos llamar a una misma función?:
Las que nos apetezca, sin límite.
Una.
18.
Indica si la siguiente afirmación es verdadera o falsa: 
“Puede pasar que después de la palabra return la función no finalice y podamos seguir ejecutando el código
inmediatamente inferior”.
Verdadero.
Falso.
19.
¿Se podrán ejecutar las líneas que van después de la línea 5, donde se utiliza por primera vez la palabra
return?: 

Si.
No.
20.
¿Es correcta esta definición?: 

Si.
No.
21.
¿El nombre de las funciones es sensible a mayúsculas?:
Si.
No.

22.
¿Es necesario escribir las etiquetas de inicio y cierre de código php en los archivos a incluir?:
Si.
No.
23.
¿Se puede escribir código html en los archivos independientes que después se incluirán?:
Si.
No.
24.
Para asegurarnos de no incluir más de una vez un archivo, ¿qué instrucción utilizaríamos?:
Include.
Include_once.
25.
¿Cuál es la extensión que utilizaremos en los archivos incluidos?:
.inc
.php
26.
¿Es necesario utilizar la palabra $this para referirnos a funciones o métodos propios?:
Si.
No.
27.
¿Puede utilizar $this fuera del código de una clase?:
Si.
No.
28.
¿Cuál es la visibilidad de una propiedad compartida o static de una clase?:
Prívate.
Public.
29.
Si se ha declarado la propiedad color con la palabra var, ¿qué visibilidad se le aplica?:
Prívate.
Public.
30.
¿Todas las propiedades deben tener definidas un método Set y un método Get?:
Si.
No.
31.
¿Es obligatorio llamar al destructor de una clase, cuando no se vaya a utilizar más?:
Si.
No.
32.
¿Cómo crearías un objeto de la clase Libro?:
$libro = new Libro();
$libro = __construct();
$libro = $libro__construct()
33.
¿Qué método debe crearse en cualquier caso?:
El constructor.
El destructor.
Ninguno de ellos.
34.
¿Cómo debería ser la visibilidad de un constructor de una clase?:
Prívate.
Public.

35.
¿Cuál es el método para modificar una propiedad privada?:
Get.
Set.
36.
¿Cuál de estas dos clases es más sencilla?:
La superclase.
La subclase.
37.
¿Se producirá un error al crear un objeto de la clase B porque no tiene constructor?: 

Si.
No.
38.
¿Qué mensaje se imprimirá al crear un objeto de la clase B?: 

Mensaje 1
Mensaje 2
Primero Mensaje 1 y luego Mensaje 2
39.
¿Se puede utilizar dentro de una función la información de las variables superglobales?:
Si.
No.
40.
¿Se puede enviar el contenido de un formulario HTML mediante el método GET?:
Si.
No
41.
Indica si la siguiente afirmación es verdadera o falsa: 
“Podemos comprobar que es la primera vez que se accede a una página comprobando si es la primera vez que se
ha pulsado el botón enviar del mimo”.
Verdadero.
Falso.
42.
¿Qué tipo de validación no podrá evitar el usuario al acceder a una página web?:
Validación en el cliente (por el navegador).
Validación en el servidor.
43.
Indica si la siguiente afirmación es verdadera o falsa: 
“La ventaja de la validación en el cliente es que se realiza sin necesidad de enviar la información al servidor”.
Verdadero.
Falso.
44.
Indica si la siguiente afirmación es verdadera o falsa: 
“Cuando se utilice una página distinta para recoger los datos de un formulario, será conveniente comprobar que
se envían desde la página donde está el formulario”.
Verdadero.
Falso.
45.
Indica si la siguiente afirmación es verdadera o falsa: 
“El carácter interrogante (?) sirve para indicar cero o una vez los caracteres anteriores”.
Verdadero.
Falso.
46.
¿Confiaría al 100% en el valor de la variable HTTP_REFERER de $_SERVER?:
Si.
No.
47.
Indica si la siguiente afirmación es verdadera o falsa: 
“Si no ha sido modificado, el valor de HTTP_REFERER indica la página desde la que se ha llegado a la actual”.
Verdadero.
Falso.
48.
En la página de confirmación de un formulario comprueba que aparece el siguiente texto: 

¿Qué función ha utilizado?:


Strip_tags.
Htmlspecialchars.
49.
¿Podemos utilizar un carácter especial en una expresión regular como un carácter más, que se tome
literalmente?:
Si.
No.
50.
¿Podemos eliminar una cookie?:
Si.
No.
51.
¿Qué cookies permite por defecto su navegador?:
De Terceros.
Otros.
52.
Indica si la siguiente afirmación es verdadera o falsa: 
“Las cookies se crean despues que cualquier otro contenido HTML que queramos mostrar en la página”.
Verdadero.
Falso.
53.
¿Podemos transmitir de una manera segura, una cookie?:
Si.
No.
54.
¿Está disponible la información de sesión en todas las páginas que visita un usuario?:
Si.
No.
55.
¿Puede darse el caso de que se utilice la misma cookie de identificación en dos sesiones distintas?:
Si.
No.
56.
Indica si la siguiente afirmación es verdadera o falsa: 
“Cada vez que un usuario solicita una página, se renueva el período de tiempo durante el cual la sesión es
válida”.
Verdadero.
Falso.
57.
¿Se puede modificar la información en $_SESSION?:
Si.
No.
58.
Indica si la siguiente afirmación es verdadera o falsa: 
“La configuración por defecto de PHP no da soporte a las sesiones”.
Falso.
Verdadero.
59.
¿Elimina la cookie de identificación la función session_destroy()?:
Si.
No
60.
Indica si la siguiente afirmación es verdadera o falsa: 
“La ubicación donde se guardan los archivos con información de sesión tiene que estar fuera del espacio de
documentos web del sitio”.
Verdadero.
Falso.
61.
Indica si la siguiente afirmación es verdadera o falsa: 
“La configuración establecida mediante un archivo .htaccess se aplica en el directorio actual y en sus
subdirectorio”.
Verdadero.
Falso.
62.
¿Es una buena opción utilizar el bucle foreach para escribir en un archivo?:
Si.
No.
63.
¿Si utilizamos la función rewind podremos irnos al final del archivo?:
Si.
No.
64.
Si tocamos algo en el archivo httpd.conf ¿hará falta reiniciar el servidor Apache?:
Si.

65.
Indica si la siguiente afirmación es verdadera o falsa: 
“Los mensajes de error predeterminados de PHP incluyen siempre el archivo y la línea donde han ocurrido”.
Verdadero.
Falso.
66.
¿Es posible establecer un nivel de informe de errores distinto para una página particular al resto de páginas del
sitio web?:
Si.
No.
67.
¿Podemos a la misma vez mostrar los errores en las páginas web y guardarlos en un archivo de registro?:
Si.
No
68.
Si utilizamos el registro de errores en un archivo, ¿es necesario desactivar su visualización en la página web?:
Si.
No.
69.
¿Puede haber más de un bloque catch para un único try?:
Si.
No.
70.
¿Se ejecutará la línea numero 4?: 

Si.
No.
71.
¿Es obligatorio escribir una estructura try – catch en el código que puede lanzar excepciones con throw?:
Si.
No.
72.
Indica si la siguiente afirmación es verdadera o falsa: 
“Siempre que ocurre una excepción finaliza la ejecución de la página”.
Verdadero.
Falso.
73.
Indica si la siguiente afirmación es verdadera o falsa: 
“La función que actuará como manejadora tiene que tener un parámetro donde se le pase la excepción”.
Verdadero.
Falso.

74.
¿Qué ocurriría cuando no exista el archivo?: 

Se imprimirá el mensaje “No se ha podido abrir el archivo.”


Se accederá a la página error.php.
75.
¿Se pueden establecer privilegios a nivel de las tablas de una base de datos de MySQL?:
Si.
No.
76.
¿Tienen algo que ver los usuarios de MySQL y los usuarios de Windows?:
Si.
No.
77.
Indica si la siguiente afirmación es verdadera o falsa: 
“Al establecer un campo como clave principal o primaria, también conseguimos que sus valores sean únicos y
que se cree un índice automáticamente”.
Verdadero.
Falso.
78.
¿En qué tipo de relación es necesario crear una nueva tabla en la base de datos para representarla?:
1 a muchos.
Muchos a muchos.
79.
¿Es importante la combinación de mayúsculas y minúsculas en el lenguaje SQL?:
No.
Si.
80.
¿Qué carácter utilizará con el operador LIKE para indicar que puede aparecer cualquier conjunto de caracteres en
un criterio de búsqueda?:
*
%
_
81.
¿Qué sentencia SQL utilizaría para añadir registros a una tabla?:
INSERT.
UPDATE.
DELETE.
82.
Indica si la siguiente afirmación es verdadera o falsa: 
“Todos los campos que aparecen en una sentencia SELECT junto a funciones agregadas deberán aparecer
también en la cláusula GROUP BY?”
Verdadero.
Falso.
83.
¿En qué formato debe especificar las fechas en MySQL?:
AAAA-MM-DD.
MM-DD-AAAA.
DD-MM-AAAA.
84.
¿Qué método utilizaría para trabajar con la información proveniente de una consulta?:
El método query de la clase mysqli.
El método fech_array de la clase mysqli_result.
85.
¿A qué clase pertenece el método query?:
Mysqli.
Mysqli_result.
86.
¿Es obligatorio cerrar la conexión con la base de datos y el conjunto resultado de una consulta?:
Si.
No.
87.
¿Podemos utilizar el método fetch_array si previamente no hemos utilizado el método query?:
Si.
No.
88.
Indica si la siguiente afirmación es verdadera o falsa: 
“LIMIT 10, 5 devuelve 5 filas a partir de la número 10 del resultado”.
Verdadero.
Falso.

89.
¿Cuál de las siguientes consultas es una consulta preparada?: 

La de arriba.
La de abajo.
90.
Indica si la siguiente afirmación es verdadera o falsa: 
“Es conveniente validar la información suministrada por el usuario en un formulario, así como “limpiarla”
mediante una función como htmlspecialchars”.
Verdadero.
Falso.
91.
¿Qué ocurre cuando el usuario cierra el navegador sin haber confirmado el pedido?:
Se pierde el contenido de su carrito de la compra.
Si se trata de un cliente autenticado, no se elimina el contenido de su carrito.
92.
¿Qué sucede si, al confirmar un pedido, se crear su correspondiente orden pero no se pueden crear las líneas de
detalle de esa orden?
Como son operaciones que se ejecutan en una transacción, no se crea la orden.
Se crea la orden vacía, pero no sus líneas de detalle.
93.
¿Qué debe crearse primero al confirmar un pedido?:
La orden correspondiente.
Las líneas de esa orden.
94.
¿Podemos insertar más de un registro en una tabla con una única instrucción Sql INSERT INTO?:
Si.
No.
95.
Indica si la siguiente afirmación es verdadera o falsa: 
“La página de bienvenida se mostrará nada más entrar al sitio web.”
Verdadero.
Falso.
96.
Indica si la siguiente afirmación es verdadera o falsa: 
“La página de contacto es obligatoria”.
Verdadero.
Falso.
97.
Indica si la siguiente afirmación es verdadera o falsa: 
“Tal y como dejamos los archivos en el tema anterior, nos servirán ahora en este tema”.
Verdadero.
Falso.
98.
¿Qué tipo de tarjetas utilizan la modalidad de prepago?:
Crédito.
Débito.
Monedero.
99.
Cuando implementemos una nueva forma de pago deberemos modificar nuestra página a nivel…: (Respuesta
múltiple)
De interfaz.
De lógica.
No es necesario cambiar nada
100.
Indica si la siguiente afirmación es verdadera o falsa: 
“Para hacer que las formas de pago funcionen es necesario modificar nuestra base de datos”.
Verdadero.
Falso.
Anterior
Glosario De Términos De Programación Y Desarrollo
Antivirus: Programa informático que sirve para detectar, prevenir y eliminar virus informáticos en los distintos
soportes de almacenamiento de datos, como el disco duro o un disquete.

ASCII: Código binario que permite la representación de caracteres alfanuméricos.

Apache: Es uno de los servidores Web mas populares y utilizados. Se da la circunstancia de que es de dominio
público. Está basado en el sistema operativo Linux

Avatar: Es una imagen que los usuarios de Internet se atribuyen a la hora de escribir en foros o chatear. Suele
identificar de alguna manera a dicho usuario.

Backup: Copia de seguridad.

Banner: Espacio publicitario insertado en una página de Internet.

Bit: Unidad de medida de la información. Un mensaje tiene la información de un bit cuando está formado por dos
símbolos con igual probabilidad de elección.

Bug: Se refiere a los fallos existentes en cualquier tipo de software o hardware.

Byte: Cantidad de información contenida en un carácter, entendiendo como tal una letra, número o signo.

Chat: Conjunto de servicios que permiten mantener charlas virtuales en tiempo real dentro de Internet. La
charla se desarrolla escribiendo a través de una interfaz donde aparecen los mensajes con el nombre en clave de
los usuarios que los han escrito.

Chip: Es un circuito integrado formado por transistores y otros elementos electrónicos.

Computadora: Máquina electrónica con memoria usada para realizar procesos lógicos.

Copyright: Derecho de los autores o editores de obras artísticas, literarias y musicales, a explotar en exclusiva
esas obras.

CPU: Conjunto de la memoria principal, la unidad aritmeticológica y los registros de control de una computadora.

Criptografía: Técnica para asegurar la transmisión de información privada que utiliza una escritura convencional
secreta, de manera que sea ilegible para cualquiera que no posea la clave de descifrado.

DOS: Fue el primer sistema operativo que se creo para los ordenadores y fue creado por Bill Gates.

Driver: Programa informático, controlador o rutina que enlaza un dispositivo periférico al sistema operativo

E-book: Libro electrónico.

Formatear: Proceso que prepara un soporte magnético para la grabación de datos.

Fragmentación: El sistema operativo almacena los datos de un fichero o archivo concreto en muchas partes del
disco, dejando grandes espacios entre los registros. Al fragmentar se “colocan” todos esos espacios al principio
del disco y de forma ordenada.

Gráficos: Representación de información a través de dibujos que apelan a las propiedades de la percepción


visual.

Hardware: Conjunto de unidades físicas, circuitos y dispositivos que componen un sistema informático.

HTML: Siglas de HiperText Markup Language. Lenguaje de programación destinado a crear páginas de Internet.
Microprocesador: Unidad constituida por uno o más chips (pastillas) de circuitos integrados LSI, que contiene
todos los elementos que constituyen la unidad central de proceso de un ordenador.

Modem : dispositivo que servirá para conectar con Internet. Lo que hace es modular los datos digitales para su
transmisión por lineas telefónicas convencionales para después remodular la señal a su llegada.

Pantalla: Superficie de vidrio u otro material sobre la que se forma la imagen de un televisor, ordenador o
aparato semejante

Píxel: Unidad gráfica más pequeña que se puede representar en la pantalla, gralte. un solo punto de color.

ROM: Es una memoria del ordenador que se encarga de ciertas funciones básicas del ordenador.

Software: Conjunto de programas que permiten el desarrollo de una actividad a una computadora un software
para diseño gráfico.

Tarjeta: Es una placa electrónica que va normalmente conectada a la placa base y sirve para realizar ciertas
funciones.

También podría gustarte