Desarrollo PHP Con MySQL
Desarrollo PHP Con MySQL
Desarrollo PHP Con MySQL
Aprender a desarrollar un
sitio Web con PHP y
MySQL
Ejercicios prácticos y corregidos
Este libro se dirige a un público de programadores principiantes que ya conocen HTML y CSS y que
quieren entender el funcionamiento de una aplicación Web para poder crear sus propios sitios Web
dinámicos con PHP y MySQL.
En la primera parte del libro, el lector va a instalar su entorno de desarrollo EasyPHP y va a descubrir
las bases del lenguaje PHP, (con la versión 5.5)sus principales funciones y estructuras de control, así
como una explicación sobre la transmisión de datos entre las páginas y la librería gráfica(efectos
especiales sobre una imagen). Estas partes teóricas se acompañan de numerosos ejemplos.
Lo mismo ocurre en la segunda parte del libro, dedicada al lenguaje SQL. El lector va a descubrir una base
de datos MySQL y los distintos métodos para acceder a ella con PHP (PDO, SQL Avanzado), así como la
manera deasegurar la seguridad de la base de datos. Un capítulo se dedica a los primeros pasos
con Programación Orientada a Objetos y otro a laadministración de la configuración y su rendimiento.
Para que el lector pueda poner en práctica los conocimientos aprendidos, el autor ha
preparado numerosos ejercicios al final de cada capítulo (ejemplos: cómo crear un blog, una newsletter,
un sitio de administración...) y expone los ejercicios corregidos.
www.FreeLibros.me
http://www.eni-training.com/client_net/mediabook.aspx?idR=87296 1/1
24/4/2014 ENI Training - Libro online
El objetivo de este libro es explicar cómo crear de manera dinámica e interactiva un sitio Web, con ayuda
de ejemplos. Tras la lectura de este libro, será capaz de instalar y crear un sitio Web con PHP (Hypertext
Processor)/MySQL.
Los requisitos previos son: conocimientos de HTML y algunas nociones de JavaScript, con algunos
ejercicios.
www.FreeLibros.me
http://www.eni-training.com/client_net/mediabook.aspx?idR=87298 1/1
24/4/2014 ENI Training - Libro online
La URL se envía a un servidor Web a través de la red. Este servidor procesa la solicitud y reenvía el flujo
HTML al navegador.
Existen dos tipos de sitios Web: los sitios Web estáticos y los dinámicos.
Los sitios Web estáticos solo contienen código clientes, es decir, un código que puede interpretar su
navegador. Por ejemplo: HTML y JavaScript.
En cambio, los sitios Web dinámicos contienen lenguaje servidor porque el servidor Web interpreta este
lenguaje y envía al navegador el flujo HTML. Por ejemplo, PHP, Java (no confundir con JavaScript) y Active
Server Pages.NET (ASP.NET) son lenguajes del lado servidor.
Cuando almacena información en su sitio Web, por ejemplo un inicio de sesión y una contraseña, un blog,
artículos, etc., está obligado a utilizar una base de datos para almacenar la información y utilizar un
lenguaje servidor que pueda leer o escribir la información en la base de datos.
www.FreeLibros.me
http://www.eni-training.com/client_net/mediabook.aspx?idR=87299 1/2
24/4/2014 ENI Training - Libro online
Cuando ejecuta una URL desde un sitio Web dinámico (por ejemplo: http://google.es), se ejecutan dos
procesos diferentes:
De este modo, cuando quiera probar en su equipo un sitio Web estático, simplemente haga doble clic en
la página HTML para abrirla en su navegador.
Pero si quiere probar un sitio Web dinámico con PHP, obligatoriamente debe instalar en su equipo un
servidor Web (por ejemplo, Apache) y ejecutar su página PHP con una URL de tipo:
http://127.0.0.1/test.php
www.FreeLibros.me
http://www.eni-training.com/client_net/mediabook.aspx?idR=87299 2/2
24/4/2014 ENI Training - Libro online
Introducción
Para crear un sitio Web estático, solo necesita un navegador (Internet Explorer, Firefox, Chrome...) y un
editor de texto, por ejemplo Notepad++ o Sublime Text.
Para crear un sitio Web dinámico, necesita un navegador, un servidor Web que ejecute las páginas PHP y
un servidor de base de datos.
En este soporte utilizaremos el servidor Web Apache y el servidor de base de datos MySQL, que son las
herramientas más utilizadas para crear sitios Web de poca envergadura. Son gratuitos y están
disponibles como un paquete. Se instalan fácilmente en UNIX, Windows y Mac.
Los paquetes más utilizados son WAMP (XAMP en Linux, MAMP en Mac) y EasyPHP. En este libro
utilizaremos EasyPHP 13.1 de Windows.
www.FreeLibros.me
http://www.eni-training.com/client_net/mediabook.aspx?idR=87301 1/1
24/4/2014 ENI Training - Libro online
Una vez instalado, haga clic en Mostrar los iconos ocultos y verá el icono en el área de notificación
de la barra de tareas:
www.FreeLibros.me
http://www.eni-training.com/client_net/mediabook.aspx?idR=87302 1/4
24/4/2014 ENI Training - Libro online
Apache le envía esta página Web y la URL es http://127.0.0.1/. Esta dirección, también llamada localhost,
corresponde a la dirección de su servidor Web en modo local. Solo quien utilice este equipo visualizará
esta página y las páginas PHP que va a crear.
Observe que hay tres carpetas por defecto, que están vacías y que se pueden eliminar si lo desea.
Ahora solo le queda elegir un editor de archivos para escribir sus páginas PHP.
Vamos a utilizar Notepad++. Es gratuito, se instala fácilmente y contiene una función muy práctica, que
consiste en asignar colores dependiendo de la sintaxis, para visualizar los errores de sintaxis HTML o
PHP.
www.FreeLibros.me
http://www.eni-training.com/client_net/mediabook.aspx?idR=87302 2/4
24/4/2014 ENI Training - Libro online
A continuación, escriba su código HTML y PHP y guarde la página en el archivo C:\Program Files\EasyPHP-
DevServer-13.1VC11\data\localweb. Su página siempre debe tener la extensión .php, salvo si se trata de
una configuración especial del servidor Web. En el siguiente ejemplo, la página se llama test.php y
contiene el código HTML y PHP entre las etiquetas <?php y ?>.
En el siguiente ejemplo, la función echo crea <p>Hola!</p> en HTML y el navegador recibe todo el flujo
HTML de la página:
www.FreeLibros.me
http://www.eni-training.com/client_net/mediabook.aspx?idR=87302 3/4
24/4/2014 ENI Training - Libro online
Haga clic con el botón derecho del ratón y elija en su navegador la opción Ver código fuente de la
página. Solo visualizará el código HTML, nunca el código servidor en PHP. No se preocupe si no lo ha
entendido todo, porque vamos a explicar más adelante cómo se escribe una página PHP.
www.FreeLibros.me
http://www.eni-training.com/client_net/mediabook.aspx?idR=87302 4/4
24/4/2014 ENI Training - Libro online
Las etiquetas
1. Sintaxis básica
XHTML (Extensible Hypertext Markup Language) es un lenguaje de etiquetas. Es el sucesor de HTML y se
basa en la sintaxis de XML. Asegura la compatibilidad tanto en equipos clásicos como en smartphones.
Si retomamos el ejemplo del capítulo Instalación, el código PHP se escribirá de la siguiente manera:
<?php
echo ’<p>Hello!</p>’;
?>
Existen otras formas de escribir estas etiquetas. En lugar de <?php y ?>, puede escribir:
O bien:
<% %>
Y también:
<? ?>
Atención: en el archivo de configuración php.ini, las dos últimas sintaxis requieren un parámetro
especial.
www.FreeLibros.me
http://www.eni-training.com/client_net/mediabook.aspx?idR=87304 1/5
24/4/2014 ENI Training - Libro online
Haga clic con el botón derecho del ratón y escoja Ver código fuente de la página; obtendrá el siguiente
código:
Este es el código HTML que el navegador ha recibido e interpretado. Observe que no se puede ver el
código servidor entre las etiquetas php.
También puede generar de forma dinámica el título de la página HTML, es decir, el contenido de la
etiqueta <title>.
www.FreeLibros.me
http://www.eni-training.com/client_net/mediabook.aspx?idR=87304 2/5
24/4/2014 ENI Training - Libro online
O bien:
Atención: si utiliza la primera sintaxis, no se interpretarán las variables (vea el siguiente ejemplo).
www.FreeLibros.me
http://www.eni-training.com/client_net/mediabook.aspx?idR=87304 3/5
24/4/2014 ENI Training - Libro online
También puede escribir varias instrucciones en la misma línea, siempre y cuando vayan separadas por
punto y coma.
<?php echo ’texto’; ?> equivale a <?php echo ’tex’; echo ’to’; ?> y a
<?php echo ’tex’;
echo ’to’;
?>
Por tanto, puede escribir una página Web completa con la instrucción echo.
<?php
?>
El uso de las variables permite convertir el sitio en dinámico, es decir, la información mostrada se
genera en una base de datos cuyo contenido cambia con regularidad. En este ejemplo la variable
es $nombre y la cadena de caracteres está entre comillas.
5. Comentarios
Los comentarios son muy útiles en PHP porque permiten ignorar el código que el servidor Web tiene
que ejecutar. Solamente el usuario puede ver el texto de los comentarios, que sirve para explicar las
líneas del código PHP.
Monolínea:
www.FreeLibros.me
http://www.eni-training.com/client_net/mediabook.aspx?idR=87304 4/5
24/4/2014 ENI Training - Libro online
<?php
// comentario monolínea
// echo ’no veremos nada’;
?>
Multilínea:
<?php
/* comentario multilínea
echo ’no veremos’;
echo ’nada’;
*/
?>
www.FreeLibros.me
http://www.eni-training.com/client_net/mediabook.aspx?idR=87304 5/5
24/4/2014 ENI Training - Libro online
Las variables
1. Asignación
Una variable es una información que se almacena temporalmente en la memoria, es decir, es una zona
de la memoria que almacena información en una página PHP y que se destruye automáticamente
cuando la página ya no se ejecuta.
Una variable PHP comienza siempre con $, seguida de una letra y de una secuencia de letras, cifras o
del signo _.
Por ejemplo, $edad = 25, el valor 25 se asigna a la variable $edad gracias al signo =.
<?php
?>
Esto no origina ningún error. El tipo de variable puede cambiar. En el ejemplo anterior cambia del tipo
integer al tipo string (ver el siguiente párrafo).
2. Tipos de variables
Hay dos categorías de variables:
Escalar:
Los números enteros llamados integer son 1, 2, 3... y los números negativos, -1, -2, -3...
Los números decimales llamados float son los números positivos o negativos con comas
(1.35665). Atención: el punto se utiliza como separador.
La cadena de caracteres string: cualquiera con dobles comillas ("hola") o comillas simples
(’hola’).
Los booleanos: solo tienen dos tipos de valores: verdadero o falso, clasificados
como true o false.
Compuesta:
Las tablas: permiten almacenar varias variables. Podrá consultarlo en el capítulo Funciones
y estructuras de control - Las tablas.
www.FreeLibros.me
http://www.eni-training.com/client_net/mediabook.aspx?idR=87305 1/5
24/4/2014 ENI Training - Libro online
Cuando se añade la barra invertida delante del apóstrofo, se va a evitar que este se interprete como el
final de la instrucción echo.
De esta manera, en el segundo caso la cadena "¿Qué pasa con un apóstrofo ’ como este?" estará en la
variable $variable1.
La barra invertida anula el comportamiento de cierre de instrucción del apóstrofo o de las comillas
dobles. También puede servir pra anular el comportamiento del $.
<?php
$variable1 = ’pepe’;
echo "\$variable1 = $variable1";
?>
Para terminar, puede acceder a un carácter de una cadena con la siguiente sintaxis:
$var[x] o $var es el nombre de la variable que contiene la cadena de caracteres y x es la posición del
carácter que debe recuperar. Tenga en cuenta que para PHP el primer carácter está en la posición 0.
www.FreeLibros.me
http://www.eni-training.com/client_net/mediabook.aspx?idR=87305 2/5
24/4/2014 ENI Training - Libro online
<?php
$variable1 = ’hola’;
echo $variable1[0];
echo $variable1[3];
?>
4. La concatenación
Es un conjunto de cadena de caracteres. PHP permite la concatenación usando la coma o el punto.
<?php
echo ’hola ’.’lee esta ayuda’;
?>
Equivale a:
<?php
echo ’hola ’,lee esta ayuda’;
?>
Da como resultado:
Si quiere concatenar la cadena "hola" y "aquí hay un apóstrofo ’", no podrá escribir:
<?php
echo ’hola ’.’aquí hay un apóstrofo ’’;
?>
El apóstrofo cierra la cadena de caracteres que ha empezado en "aquí", por lo que PHP genera un
error.
<?php
echo ’Hola ’.’aquí hay un apóstrofo \’ ’;
?>
<?php
echo "hola"."aquí hay un apóstrofo ’";
?>
<?php
$variable = "aquí hay un apóstrofo ’";
echo "hola".$variable;
www.FreeLibros.me
http://www.eni-training.com/client_net/mediabook.aspx?idR=87305 3/5
24/4/2014 ENI Training - Libro online
?>
Para mostrar una variable en una cadena de caracteres con ayuda de echo, escriba lo siguiente:
<?php
$variable = "aquí hay un apóstrofo ’";
echo "hola $variable";
?>
PHP interpreta la variable y muestra: "Hola aquí hay un apóstrofo ’", pero no "hola $variable".
<?php
$variable = "aquí hay un apóstrofo ’";
echo "hola \$variable";
?>
Para terminar, y para una mayor claridad del código, utilizaremos la sintaxis:
<?php
$variable = "aquí hay un apóstrofe ’";
echo "hola ".$variable;
?>
Esto permite mostrar en Notepad++ la $variable en color azul, y por tanto resaltar las variables del
texto.
5. Transtipado
Se utiliza para transformar un tipo de variable en otro.
Por ejemplo, si tiene un número decimal en una variable y desea transformarlo en un entero, solo debe
convertirlo en entero. Esta conversión se denomina cast.
<?php
$variable = 15.325;
echo "El valor entero es:".(int)$variable;
?>
Da como resultado:
En este ejemplo la variable $variable se transforma en tipo int y se concatena con la cadena de
caracteres "El valor entero es:".
(tipo)$variable
Y el tipo es igual a:
www.FreeLibros.me
http://www.eni-training.com/client_net/mediabook.aspx?idR=87305 4/5
24/4/2014 ENI Training - Libro online
Puede añadir espacios entre los paréntesis, antes y después del tipo.
<?php
$variable = 15.325;
echo "El valor entero es:".( integer )$variable;
?>
Da como resultado:
<?php
$variable = 15.325;
echo "El valor del tipo de cadena de caracteres es:
".(string)$variable;
?>
Da como resultado:
<?php
$variable = 15.35;
$varbool = (bool)$variable;
echo "El tipo de variable \$varbool es:".gettype($varbool);?>
Da como resultado:
www.FreeLibros.me
http://www.eni-training.com/client_net/mediabook.aspx?idR=87305 5/5
24/4/2014 ENI Training - Libro online
Las constantes
Una constante permite definir un dato, dándole un valor permanente válido para el resto del programa.
Esta constante es muy útil si quiere utilizar regularmente un valor sin tener que escribirlo cada vez. Por
ejemplo, si utiliza normalmente PI y no quiere escribir cada vez el mismo valor 3,1415926535 puede crear
una constante llamada PI por valor de 3,1415926535 y así podrá utilizar PI en el código del programa.
<?php
define(’NOMBRE_DE_LA_CONSTANTE’,’valor de la constante’);
?>
<?php
define(’PI’,3,1415926535);
echo PI
?>
Da como resultado:
3,1415926535
El nombre y la constante se escriben siempre en mayúsculas. El valor puede ser una cadena de
caracteres, un valor numérico o un booleano.
Para saber si una constante está definida, puede utilizar la función defined. Esta función
devuelve true si la constante está definida, y false si no lo está.
<?php
define(’PI’,3,1415926535);
$var_definie = defined(’PI’);
echo $var_definie;
?>
Da como resultado:
True
www.FreeLibros.me
http://www.eni-training.com/client_net/mediabook.aspx?idR=87306 1/1
24/4/2014 ENI Training - Libro online
Las condiciones
1. If
Las instrucciones del tipo condición permiten ejecutar el código si una condición es verdadera.
<?php
$nombre = ’Roberto’; //declaración de la variable $nombre
El valor Roberto se asigna a la variable $nombre y se comprueba con ayuda de la instrucción if.
if (condition) { instrucción }
Por ejemplo, si el nombre es igual a Roberto, se muestra «Bienvenido», o «Hasta pronto» en otro caso:
<?php
Da como resultado:
www.FreeLibros.me
http://www.eni-training.com/client_net/mediabook.aspx?idR=87308 1/6
24/4/2014 ENI Training - Libro online
Hasta pronto
El código comprueba si la variable $nombre es Roberto, pero como no es el caso, el código entra
en else (si no), y ejecuta echo "Hasta pronto";.
Esto permite probar otras condiciones que no han sido comprobadas por if.
Por ejemplo, si el nombre es Roberto, se muestra «Bienvenido» ; si no, si es Pepe se muestra «Hola» ;
si no, «Hasta pronto»:
<?php
Da como resultado:
Hola
<?php
www.FreeLibros.me
http://www.eni-training.com/client_net/mediabook.aspx?idR=87308 2/6
24/4/2014 ENI Training - Libro online
{
echo ’Hasta pronto’;
}
?>
También puede anidar los if unos dentro de otros tantas veces como quiera.
Por ejemplo:
<?php
Da como resultado:
Bienvenido
Para terminar, puede intercalar el código HTML entre las condiciones en PHP.
Por ejemplo:
<?php
Es igual a:
www.FreeLibros.me
http://www.eni-training.com/client_net/mediabook.aspx?idR=87308 3/6
24/4/2014 ENI Training - Libro online
<?php
2. Switch
La instrucción switch es igual a if, pero el programador la utiliza para comprender mejor el código. Si
se utiliza un break para salir del switch, entonces es igual a if. De lo contrario, se ejecutarán todas
las instrucciones del case en el que ha entrado.
La sintaxis es:
switch (condition) {
case expresión: instrucción
case expresión: instrucción
...
}
<?php
La instrucción break provoca la salida del switch y si $nombre es igual a "Roberto" el código
ejecutará echo "Hola" y break, y saldrá del switch sin comprobar "Juan".
Eso es igual a la instrucción else if en lugar de if:
<?php
www.FreeLibros.me
http://www.eni-training.com/client_net/mediabook.aspx?idR=87308 4/6
24/4/2014 ENI Training - Libro online
{
echo ’Hasta pronto’;
}
?>
<?php
El valor Roberto se asigna a la variable $nombre y esta variable se comprueba con ayuda de la
instrucción switch. El ejemplo anterior muestra lo siguiente:
Hola
Hasta pronto
La instrucción case permite comparar cada valor con la variable $nombre y ejecuta las instrucciones
después de los :.
Para terminar, puede añadir la instrucción default para ejecutar el código en caso de no haber
encontrado ninguna similitud con las instrucciones case.
Por ejemplo:
<?php
Da como resultado:
Como $nombre es igual a "Pepe", el código no entra en el "Roberto" ni en el case "Juan", pero sí
en default.
www.FreeLibros.me
http://www.eni-training.com/client_net/mediabook.aspx?idR=87308 5/6
24/4/2014 ENI Training - Libro online
<?php
Da como resultado:
Tiene 25 años.
www.FreeLibros.me
http://www.eni-training.com/client_net/mediabook.aspx?idR=87308 6/6
24/4/2014 ENI Training - Libro online
Los bucles
1. For
Un bucle permite repetir x veces la ejecución de un código.
Por ejemplo, si quiere mostrar diez veces «Hola», solo tiene que escribir el bucle for.
<?php
La variable $i representa el contador del bucle. No está obligado a recurrir a la variable $i, pero por
norma general es el nombre que se emplea.
$i++ es igual a $i=$i+1 y represtenta el aumento de $i. Puede escribir $i=$i+2 para aumentar
o$i=$i-1 para disminuir.
Por ejemplo, puede escribir los números de 100 a 150 con el siguiente código:
<?php
<br /> permite saltar una línea entre cada número para no tener que mostrarlos todos.
Por ejemplo, si quiere mostrar cinco veces «Hola», solo debe escribir un bucle for:
<?php
www.FreeLibros.me
http://www.eni-training.com/client_net/mediabook.aspx?idR=87309 1/3
24/4/2014 ENI Training - Libro online
}
}
?>
Da como resultado :
Hola
Hola
Hola
Hola
Hola
2. While
El bucle while significa «mientras que», es decir, el bucle se ejecutará siempre y cuando una condición
sea verdadera.
Por ejemplo, para mostrar diez veces «Hola», solo debe escribir un bucle while:
<?php
$i = 1;
while ($i <= 10)
{
$i=$i+1;
echo ’Hola <br />’;
}
?>
La variable $i represtenta el contador del bucle. Pero mientras $i sea inferior o igual a 10, se repetirá
el bucle.
$i=número inicial
while ($i <= número final)
{
aumento
instrucciones
}
Tenga en cuenta que el valor de salida de $i se pone antes del bucle y que este valor debe respetar la
condición del bucle ($i <= número final) para entrar en el bucle.
Si escribe:
<?php
www.FreeLibros.me
http://www.eni-training.com/client_net/mediabook.aspx?idR=87309 2/3
24/4/2014 ENI Training - Libro online
$i = 11;
while ($i <= 10)
{
$i=$i+1;
echo ’Hola <br />’;
}
?>
Nunca pasará en el bucle porque $i vale 11 en un principio, no se satisface la condición del bucle.
El bucle while es igual al bucle for; en algunas ocasiones le resultará muy útil si desconoce el
número de veces que va a ejecutar un bucle, sobre todo si va a leer el bucle while en la base de
datos y la condición de salida del bucle depende del valor leído en la base de datos.
3. Do while
El bucle Do while significa «hacer mientras», es decir, el bucle se ejecutará siempre y cuando una
condición sea verdadera. Se diferencia del bucle while en que la expresión se ejecuta al menos una
vez.
Por ejemplo, para mostrar diez veces ”Hola”, debe escribir el bucle Do while:
<?php
$i = 1;
do
{
$i=$i+1;
echo ’Hola <br />’;
} while ($i <= 10)
?>
La variable $i representa el contador del bucle. Pero esta vez debe leer: ejecutar el bucle si $i es
inferior o igual a 10.
$i=número inicial
do
{
aumento
instrucciones
} while ($i <= número final)
4. Foreach
Este bucle se describe en la sección siguiente, dedicada a las tablas.
www.FreeLibros.me
http://www.eni-training.com/client_net/mediabook.aspx?idR=87309 3/3
24/4/2014 ENI Training - Libro online
Las tablas
1. Tabla numérica
Una tabla es como una variable, pero puede almacenar varios valores.
<?php
$tabla = array(’Juan’,’Roberto’,’Pablo’,’Pedro’,’Alonso’);
?>
Aquí la tabla se denomina $tabla, pero la puede llamar de cualquier otra manera.
También puede acceder directamente al valor de una tabla a través de su índice, con la siguiente
sintaxis:
<?php
echo $tabla[0];
?>
Da como resultado:
Juan
En efecto, $tabla[x] es una variable que tiene como valor el segundo elemento de la tabla.
Para sustituir la cadena de caracteres ’Roberto’ por ’Nadia’ en el índice 1 de la tabla, escriba:
<?php
$tabla[1] = ’Nadia’;
?>
<?php
$tabla = array();
$tabla[0] = ’Juan’;
www.FreeLibros.me
http://www.eni-training.com/client_net/mediabook.aspx?idR=87310 1/16
24/4/2014 ENI Training - Libro online
$tabla[1] = ’Roberto’;
$tabla[2] = ’Pablo’;
$tabla[3] = ’Pedro’;
$tabla[4] = ’Alonso’;
?>
<?php
$tabla = array();
$tabla[] = ’Juan’;
$tabla[] = ’Roberto’;
$tabla[] = ’Pablo’;
$tabla[] = ’Pedro’;
$tabla[] = ’Alonso’;
?>
O incluso:
< ?php
$tabla = [’Juan’,’Roberto’, ’Pablo’,’Pedro’,’Alonso’] ;
?>
<?php
$tabla = array(’Juan’,’Roberto’,’Pablo’,’Pedro’,’Alonso’);
?>
2. Tabla asociativa
En un tabla asociativa puede decidir la clave que va a introducir.
Por ejemplo:
En este ejemplo la clave puede tomar cualquier valor; no tiene que ser necestariamente un número.
<?php
$tabla = array(’A1’=>’Juan’,’B4’=>’Roberto’,3=>’Pablo’,’PEPE’=>’Pedro’,
’H’=>’Alonso’);
?>
www.FreeLibros.me
http://www.eni-training.com/client_net/mediabook.aspx?idR=87310 2/16
24/4/2014 ENI Training - Libro online
La asociación se escribe con los símbolos =>. El primero es la clave y el segundo, el valor.
<?php
$tabla = array();
$tabla[’A1’] = ’Juan’;
$tabla[’B4’] = ’Roberto’;
$tabla[3] = ’Pablo’;
$tabla[’Pepe’] = ’Pedro’;
$tabla[’H’] = ’Alonso’;
?>
Puede utilizar esta tabla cuando la clave tiene una información importante.
Por ejemplo, si quiere almacenar las características de una persona en una tabla $persona, escriba:
<?php
$persona = array();
$persona[’Apellido’] = ’Martín’;
$persona[’Nombre’] = ’Mónica’;
$persona[’Edad’] = 50;
?>
<?php
echo $persona[’Edad’];
?>
a. El bucle for
<?php
//creación de la tabla
$tabla = array(’Juan’,’Roberto’,’Pablo’,’Pedro’,’Alonso’);
//bucle en la tabla
for ($i = 0; $i < 5; $i++) {
//mostrar los valores concatenados de la tabla
//con un salto de línea
echo $tabla[$i].’<br />’;
}
?>
Juan
Roberto
Pablo
Pedro
www.FreeLibros.me
http://www.eni-training.com/client_net/mediabook.aspx?idR=87310 3/16
24/4/2014 ENI Training - Libro online
Alonso
Por tanto, $i varía de 0 a 4, el bucle muestra $tabla[0], cuyo valor es ’Juan’, $tabla[1], cuyo
valor es ’Roberto’, etc.
Algunas veces los elementos de una base de datos se recuperan en una tabla y no se puede saber
con antelación el número de elementos que contiene esta tabla. Si desconoce el tamaño de la tabla,
puede usar las funciones count() o sizeof(), que se detallan más adelante.
Por ejemplo:
<?php
//creación de la tabla
$tabla = array(’Juan’,’Roberto’,’Pablo’,’Pedro’,’Alonso’);
//bucle en los registros de la tabla
for ($i = 0; $i < sizeof($tabla); $i++) {
//muestra los valores concatenados de la tabla
//con un salto de línea
echo $tabla[$i].’<br />’;
}
?>
Juan
Roberto
Pablo
Pedro
Alonso
b. El bucle foreach
Este bucle es muy práctico porque no tiene que estar pendiente del tamaño de la tabla.
El bucle foreach no usa un contador. Almacena de uno en uno los valores de la tabla en una
variable temporal, que en el siguiente ejemplo es $val. Puede dar a esta variable el nombre que
quiera y no necesita definirla.
<?php
//creación de la tabla
$tabla = array(’Juan’,’Roberto’,’Pablo’,’Pedro’,’Alonso’);
//bucle en la tabla
foreach ($tabla as $val) {
//muestra los valores concatenados de la tabla
//con un salto de línea
echo $val.’<br />’;
}
?>
Da como resultado:
Juan
Roberto
Pablo
www.FreeLibros.me
http://www.eni-training.com/client_net/mediabook.aspx?idR=87310 4/16
24/4/2014 ENI Training - Libro online
Pedro
Alonso
Este bucle tiene otra ventaja: también permite mostrar la clave de la tabla:
<?php
//creación de la tabla
$tabla = array(’A1’=>’Juan’,’B4’=>’Roberto’,3=>’Pablo’,’Pepe’=>’Pedro’,
’H’=>’Alonso’);
//bucle en la tabla
foreach ($tabla as $clave => $val) {
//muestra los valores concatenados de la tabla
//con un salto de línea
echo ’Clave:’.$clave.’, valor:’.$val.’<br />’;
}
?>
Da como resultado:
Clave:A1, valor:Juan
Clave:B4, valor:Roberto
Clave:3, valor:Pablo
Clave:Pepe, valor:Pedro
Clave:H, valor:Alonso
El bucle foreach se escribe con la variable $clave (aunque le puede dar cualquier otro nombre), y
contiene la clave de la tabla, así como el signo => y la variable $val, que contiene el valor
correspondiente a la clave.
También puede utilizar el bucle foreach sin la clave, como muestra el siguiente ejemplo:
<?php
//creación de la tabla
$tabla = array(’A1’=>’Juan’,’B4’=>’Roberto’,3=>’Pablo’,’Pepe’=>’Pedro’,
’H’=>’Alonso’);
//bucle en la tabla
foreach ($tabla as $val) {
//muestra los valores concatenados de la tabla
//con un salto de línea
Echo ’valor:’.$val.’<br />’;
}
?>
Da como resultado:
valor:Juan
valor:Roberto
valor:Pablo
valor:Pedro
valor:Alonso
c. print_r
www.FreeLibros.me
http://www.eni-training.com/client_net/mediabook.aspx?idR=87310 5/16
24/4/2014 ENI Training - Libro online
Los programadores utilizan esta función para mostrar el contenido de la tabla sin cambiar el formato.
Ejemplo:
<?php
//creación de la tabla
$tabla = array(’A1’=>’Juan’,’B4’=>’Roberto’,3=>’Pablo’,’Pepe’=>’Pedro’,
’H’=>’Alonso’);
print_r($tabla);
?>
Da como resultado:
Array ( [A1] => Juan [B4] => Roberto [3] => Pablo [Pepe] => Pedro [H] => Alonso)
La función count() o sizeof() permiten conocer el número de elementos de una tabla, por
ejemplo:
<?php
//creación de la tabla
$tabla = array(’A1’=>’Juan’,’B4’=>’Roberto’,3=>’Pablo’,’Pepe’=>’Pedro’,
’H’=>’Alonso’);
$thisSize = count($tabla);
echo ’El tamaño de la tabla es:’.$thisSize;
?>
Da como resultado:
La sintaxis es:
$numero_de_elementos = count($tabla);
Por ejemplo:
<?php
//creación de la tabla
$tabla = array(’A1’=>’Juan’,’B4’=>’Roberto’,3=>’Pablo’,’Pepe’=>’Pedro’,
’H’=>’Alonso’);
if (in_array(’Roberto’,$tabla)) {
echo ’Roberto está en la tabla’;
}
www.FreeLibros.me
http://www.eni-training.com/client_net/mediabook.aspx?idR=87310 6/16
24/4/2014 ENI Training - Libro online
?>
Da como resultado:
$presencia = in_array($valor_búsqueda,$tabla);
Esta función puede tomar un tercer argumento, que consiste en comprobar el tipo de valor que se
encuentra con respecto al valor deseado. Este argumento es una variable booleana que tiene un
valor falso por defecto, es decir, no tiene en cuenta el tipo.
Explicación: una tabla tiene el valor ’33’ pero se está buscando la cifra 33. No son del mismo tipo, ya
que ’33’ es del tipo string (cadena de caracteres) y 33 es de tipo numérico.
Ejemplo:
<?php
//creación de la tabla
$tabla = array(’10’,’33’,’33’,’78’);
if (in_array(33,$tabla, true)) { // añadir true para tener en cuenta
// el tipo
echo ’33 está en la tabla’;
} else {
echo "33 no está en la tabla";
}
?>
Da como resultado:
33 no está en la tabla
La función busca en la tabla el número 33, pero solamente existe la cadena de caracteres ’33’.
$presencia = in_array($valor_buscado,$tabla,$tipo_equivalente);
Por ejemplo:
<?php
//creación de la tabla
$tabla = array(’A1’=>’Juan’,’B4’=>’Roberto’,3=>’Pablo’,
’Pepe’=>’Pedro’,’H’=>’Alonso’);
if (array_key_exists(3,$tabla)) {
echo ’La clave 3 está en la tabla’;
}
www.FreeLibros.me
http://www.eni-training.com/client_net/mediabook.aspx?idR=87310 7/16
24/4/2014 ENI Training - Libro online
?>
Da como resultado:
La sintaxis es:
$presencia = array_key_exists($Clave_buscada,$tabla);
Otro ejemplo:
<?php
//creación de la tabla
$tabla = array(’Juan’,’Roberto’,’Pablo’,’Pedro’,’Alonso’);
if (array_key_exists(4,$tabla)) {
echo ’La Clave 4 está en la tabla, su valor es:’.$tabla[4];
}
?>
Da como resultado:
Existen varias funciones que permiten ordenar una tabla. Algunas ordenan en orden descendente,
otras siguiendo la clave y no el valor, etc.
Por ejemplo:
<?php
//creación de la tabla
$tabla =
array(’A1’=>’Juan’,’B4’=>’Roberto’,3=>’Pablo’,’Pepe’=>’Pedro’,
’H’=>’Alonso’);
sort($tabla); //ordena la tabla
foreach ($tabla as $clave=>$valor) {
echo ’Clave:’.$clave.’, valor:’.$valor.’<br />’;
}
?>
Da como resultado:
Clave:0, valor:Alonso
Clave:1, valor:Juan
Clave:2, valor:Pedro
Clave:3, valor:Pablo
Clave:4, valor:Roberto
La función sort() pierde la clave de origen. Ya no tiene la clave ’H’ para ’Alonso’, sino 0. Las
www.FreeLibros.me
http://www.eni-training.com/client_net/mediabook.aspx?idR=87310 8/16
24/4/2014 ENI Training - Libro online
Por ejemplo:
<?php
//creación de la tabla
$tabla =
array(’A1’=>’Juan’,’B4’=>’Roberto’,3=>’Pablo’,’Pepe’=>’Pedro’,
’H’=>’Alonso’);
asort($tabla); //ordena la tabla conservando la clave
foreach ($tabla as $clave=>$valor) {
echo ’Clave:’.$clave.’, valor:’.$valor.’<br />’;
}
?>
Da como resultado:
Clave:H, valor:Alonso
Clave:A1, valor:Juan
Clave:Pepe, valor:Pedro
Clave:3, valor:Pablo
Clave:B4, valor:Roberto
Por ejemplo:
<?php
//creación de la tabla
$tabla =
array(’A1’=>’Juan’,’B4’=>’Roberto’,3=>’Pablo’,’Pepe’=>’Pedro’,
’H’=>’Alonso’);
rsort($tabla); //ordena la tabla del valor más grande al más pequeño
foreach ($tabla as $clave=>$valor) {
echo ’Clave:’.$clave.’, valor:’.$valor.’<br />’;
}
?>
Da como resultado:
Clave:0, valor:Roberto
Clave:1, valor:Pablo
Clave:2, valor:Pedro
Clave:3, valor:Juan
Clave:4, valor:Alonso
www.FreeLibros.me
http://www.eni-training.com/client_net/mediabook.aspx?idR=87310 9/16
24/4/2014 ENI Training - Libro online
Por ejemplo:
<?php
//creación de la tabla
$tabla =
array(’A1’=>’Juan’,’B4’=>’Roberto’,3=>’Pablo’,’Pepe’=>’Pedro’,
’H’=>’Alonso’);
arsort($tabla); //ordena la tabla conservando la clave
foreach ($tabla as $clave=>$valor) {
echo ’Clave:’.$clave.’, valor:’.$valor.’<br />’;
}
?>
Da como resultado:
Clave:B4, valor:Roberto
Clave:3, valor:Pablo
Clave:Pepe, valor:Pedro
Clave:A1, valor:Juan
Clave:H, valor:Alonso
ksort(): ordena las claves de la tabla de la más pequeña a la más grande, conservando
la pareja clave/valor.
Por ejemplo:
<?php
//creación de la tabla
$tabla =
array(’A1’=>’Juan’,’B4’=>’Roberto’,3=>’Pablo’,’Pepe’=>’Pedro’,
’H’=>’Alonso’);
ksort($tabla); //ordenar la tabla siguiendo la clave
foreach ($tabla as $clave=>$valor) {
echo ’Clave:’.$clave.’, valor:’.$valor.’<br />’;
}
?>
Da como resultado:
Clave:A1, valor:Juan
Clave:B4, valor:Roberto
Clave:H, valor:Alonso
Clave:Pepe, valor:Pedro
Clave:3, valor:Pablo
Por ejemplo:
<?php
//creación de la tabla
www.FreeLibros.me
http://www.eni-training.com/client_net/mediabook.aspx?idR=87310 10/16
24/4/2014 ENI Training - Libro online
$tabla =
array(’A1’=>’Juan’,’B4’=>’Roberto’,3=>’Pablo’,’Pepe’=>’Pedro’,
’H’=>’Alonso’);
krsort($tabla); //ordenar la tabla de manera descendente siguiendo
la clave
foreach ($tabla as $clave=>$valor) {
echo ’Clave:’.$clave.’, valor:’.$valor.’<br />’;
}
?>
Da como resultado:
Clave:3, valor:Pablo
Clave:Pepe, valor:Pedro
Clave:H, valor:Alonso
Clave:B4, valor:Roberto
Clave:A1, valor:Juan
Por ejemplo:
<?php
//creación de la tabla
$tabla = array(’A1’=>’Juan’,’B4’=>’Roberto’,3=>’Pablo’,’Pepe’=>’Pedro’,
’H’=>’Alonso’);
$clave_elemento = array_search(’Roberto’,$tabla);
echo "La clave del elemento buscado es:".$clave_elemento;
?>
Da como resultado:
La sintaxis es:
$clave = array_search($valor_buscado,$tabla);
Otro ejemplo:
<?php
//creación de la tabla
$tabla = array(’Juan’,’Roberto’,’Pablo’,’Pedro’,’Alonso’);
$clave_elemento = array_search(’Roberto’,$tabla);
echo "La clave del elemento buscado es:".$clave_elemento;
?>
Da como resultado:
www.FreeLibros.me
http://www.eni-training.com/client_net/mediabook.aspx?idR=87310 11/16
24/4/2014 ENI Training - Libro online
Por ejemplo:
<?php
$conjunto = "1;2;3;4;5";
$tabla = explode(";",$conjunto);
echo "El primer valor de la tabla es:".$tabla[0]."<br />";
echo "El segundo valor de la tabla es:".$tabla[1];
?>
Da como resultado:
La sintaxis es:
$tabla_recortada = explode($separador,$cadena_a_recortar);
Otro ejemplo:
<?php
$conjunto = "1-2-3-4-5";
$tabla = explode("-",$conjunto);
echo "Los valores de la tabla son:";
foreach ($tabla as $valor) {
echo $valor.";";
}
?>
Da como resultado:
La función implode()permite reagrupar los valores de una tabla en una cadena, utilizando un
separador.
Por ejemplo:
<?php
$tabla = array("Juan","Roberto","Pablo");
$nombres = implode(";",$tabla);
echo "Los nombres son:".$nombres;
?>
Da como resultado:
www.FreeLibros.me
http://www.eni-training.com/client_net/mediabook.aspx?idR=87310 12/16
24/4/2014 ENI Training - Libro online
La sintaxis es:
$cadena = implode($separador,$tabla);
Otro ejemplo:
<?php
$tabla = array(5=>"Juan",3=>"Roberto",2=>"Pablo");
$nombres = implode("-",$tabla);
echo "Los nombres son:".$nombres;
?>
Da como resultado:
Como puede observar, las claves de una tabla no tienen ningún efecto en la función implode().
Por ejemplo:
<?php
$conjunto="1;2;3;4;5";
$tabla=str_split($conjunto,2);
echo "Los elementos son:";
foreach ($tabla as $valor) {
echo $valor." ";
}
?>
Da como resultado:
$tabla=str_split($cadena,$longitud);
Otro ejemplo:
<?php
$conjunto="11=12=13=14=15";
$tabla=str_split($conjunto,3);
echo "Los elementos son:";
foreach ($tabla as $valor) {
echo $valor."<br/>";
}
?>
www.FreeLibros.me
http://www.eni-training.com/client_net/mediabook.aspx?idR=87310 13/16
24/4/2014 ENI Training - Libro online
Da como resultado:
12=
13=
14=
15=
Por ejemplo:
<?php
$tabla = array("Juan","Roberto","Pablo");
array_push($tabla,"Pedro","Alonso");
echo $tabla[4];
?>
Da como resultado:
Alonso
array_push($tabla,$valor1,$valor2,...);
Otro ejemplo:
<?php
$tabla = array();
for ($i=0;$i<=10;$i++) {
array_push($tabla,$i);
echo $tabla[$i].";";
}
?>
Da como resultado:
0;1;2;3;4;5;6;7;8;9;10;
Por ejemplo:
<?php
$tabla = array("Juan","Roberto","Pablo");
$nombre = array_pop($tabla);
echo "El nombre eliminado es:".$nombre;
?>
www.FreeLibros.me
http://www.eni-training.com/client_net/mediabook.aspx?idR=87310 14/16
24/4/2014 ENI Training - Libro online
Da como resultado:
$valor_eliminado=array_pop($tabla);
Otro ejemplo:
<?php
$tabla = array("Juan","Roberto","Pablo");
echo "Antes de la eliminación, el número de elementos en la tabla
es:".count($tabla)."<br />";
$numero_elementos = count($tabla);
for ($i=0;$i<$numero_elementos;$i++) {
$nombre = array_pop($tabla);
}
echo "El último nombre eliminado es:".$nombre."<br />";
echo "Después de la eliminación, el número de elementos de la tabla
es:".count($tabla);
?>
Da como resultado:
La función array_rand() permite seleccionar uno a varios elementos de una tabla de forma
aleatoria y devolver las claves correspondientes.
Por ejemplo:
<?php
$tabla = array("Juan","Roberto","Pablo");
$clave_aleatoria = array_rand($tabla);
echo "El nombre seleccionado al azar es:".$tabla[$clave_aleatoria];
?>
Da como resultado:
$clave_seleccionada=array_rand($tabla, $numero_seleccionado);
www.FreeLibros.me
http://www.eni-training.com/client_net/mediabook.aspx?idR=87310 15/16
24/4/2014 ENI Training - Libro online
<?php
$tabla = array("Juan","Roberto","Pablo");
$tabla_clave_aleatoria = array_rand($tabla,2);
echo "El primer número seleccionado al azar es:"
tabla[$tabla_clave_aleatoria[0]]."<br />";
echo "El segundo número seleccionado al azar es:"
tabla[$tabla_clave_aleatoria[1]];
?>
www.FreeLibros.me
http://www.eni-training.com/client_net/mediabook.aspx?idR=87310 16/16
24/4/2014 ENI Training - Libro online
a. strlen()
Por ejemplo:
<?php
$nombre = "Roberto";
$longitud = strlen($nombre);
echo "La longitud de la cadena es:".$longitud;
?>
Da como resultado:
$longitud= strlen($cadena);
Otro ejemplo:
<?php
?>
Da como resultado:
b. substr()
La función substr() devuelve un trozo de la cadena partiendo de una posición y con una longitud
dada.
Por ejemplo:
www.FreeLibros.me
http://www.eni-training.com/client_net/mediabook.aspx?idR=87311 1/17
24/4/2014 ENI Training - Libro online
<?php
$nombre = "Roberto";
$trozo = substr($nombre,2,3);
echo "El trozo de la cadena es:".$trozo;
?>
Da como resultado:
No necesita indicar la longitud. La función devuelve los caracteres hasta el final de la cadena de
caracteres.
$trozo_cadena =
substr($cadena,$posicion_inicio,longitud_cadena);
Otro ejemplo:
<?php
?>
Da como resultado:
c. strstr()
La función strstr() devuelve un trozo de la cadena desde un carácter hasta el final de la cadena.
Por ejemplo:
<?php
$email = "Roberto.lopez@españa.es";
$trozo = strstr($email,’@’);
echo "El trozo de la cadena es:".$trozo;
?>
Da como resultado:
www.FreeLibros.me
http://www.eni-training.com/client_net/mediabook.aspx?idR=87311 2/17
24/4/2014 ENI Training - Libro online
La función devuelve la cadena de caracteres, que va del carácter @ hasta el final de la cadena.
$trozo_cadena = strstr($cadena,$caracter_busqueda);
Otro ejemplo:
<?php
$email = "Roberto.lopez@españa.es";
$trozo = strstr($email,’.’);
echo "El trozo de la cadena es:".$trozo;
?>
Da como resultado:
d. str_replace()
Por ejemplo:
<?php
$email = "Roberto.lopez@españa.es";
$nuevo_nombre = str_replace(’españa’,’mexico’,$email);
echo "El nuevo nombre de la cadena es:".$nuevo_nombre;
?>
Da como resultado:
La sintaxis es:
$nueva_cadena = str_replace($cadena_buscada,
$cadena_que_sustituye ,$cadena_principal);
<?php
$tabla_cadena_buscada =
array("a","e","i","o","u","y","A","E","I","O","U","Y");
$email = "Roberto.lopez@españa.es";
www.FreeLibros.me
http://www.eni-training.com/client_net/mediabook.aspx?idR=87311 3/17
24/4/2014 ENI Training - Libro online
$nuevo_nombre = str_replace($tabla_cadena_buscada,’’,$email);
echo "El nuevo nombre de la cadena quitando todas las vocales
es:" nuevo nombre;
?>
Da como resultado:
En este ejemplo, la función str_replace sustituye todas las vocales de la tabla por una cadena
vacía.
e. trim()
Por ejemplo:
<?php
?>
Da como resultado:
$nueva_cadena = trim($cadena);
Esta función elimina los espacios, las tabulaciones y los saltos de línea.
f. strtolower()
Por ejemplo:
<?php
$nombre = "ROBERTO";
$nombre = strtolower($nombre);
echo "El nombre de la cadena en minúsculas es:".$nombre;
?>
Da como resultado:
www.FreeLibros.me
http://www.eni-training.com/client_net/mediabook.aspx?idR=87311 4/17
24/4/2014 ENI Training - Libro online
$cadena_minusculas = strtolower($cadena);
g. strtoupper()
Por ejemplo:
<?php
$nombre = "Juan";
$nombre = strtoupper($nombre);
echo "El nombre de la cadena en mayúsculas es:".$nombre;
?>
Da como resultado:
$cadena_mayusculas = strtoupper($cadena);
h. strpos()
Por ejemplo:
<?php
$email = "Juan.lopez@españa.es";
$posicion = strpos($email,’@’);
echo "La posición de @ es:".$posicion;
?>
Da como resultado:
La posición de @ es:10
www.FreeLibros.me
http://www.eni-training.com/client_net/mediabook.aspx?idR=87311 5/17
24/4/2014 ENI Training - Libro online
$posicion = strpos($cadena,$ocurrencia_buscada);
Otro ejemplo:
<?php
$email = "Juan.lopez@españa.es";
$posicion = strrpos($email,’f’);
echo "La última posición de la letra ñ es:".$posicion;
?>
Da como resultado:
i. str_word_count()
Por ejemplo:
<?php
?>
Da como resultado:
$posicion = str_word_count($cadena);
Esta función puede utilizar un argumento opcional, que es el formato. Si vale 0, la función devuelve el
número de palabras como antes. Si vale 1, la función devuelve una tabla que contiene las palabras de
la cadena de caracteres.
Por ejemplo:
<?php
www.FreeLibros.me
http://www.eni-training.com/client_net/mediabook.aspx?idR=87311 6/17
24/4/2014 ENI Training - Libro online
?>
Da como resultado:
Array ( [0] => Hola [1] => hace [2] => buen [3] => tiempo)
Si este parámetro vale 2, la función devuelve una tabla que contiene las palabras de la cadena de
caracteres y la posición de la primera letra de la palabra clave.
Por ejemplo:
<?php
?>
Da como resultado:
Array ( [0] => Hola [6] => hace [10] => buen [14] => tiempo )
En esta función, la noción de la palabra depende de la localización actual. Así, la coma no se considera
como una palabra.
j. str_pad()
Por ejemplo:
<?php
$cadena_inicio = "Hola";
echo str_pad($cadena_inicio, 10, ’!’);
?>
Da como resultado:
Hola!!
La función toma la cadena de origen "Hola" y la completa con la cadena "!" hasta un total de 10
caracteres.
str_pad($cadena_origen, $numero_carácter_total,
$cadena_para_completar);
www.FreeLibros.me
http://www.eni-training.com/client_net/mediabook.aspx?idR=87311 7/17
24/4/2014 ENI Training - Libro online
<?php
echo str_pad(’’, 60, ’ ’);
?>
Por ejemplo, si quiere saber si un correo electrónico contiene el carácter @ y el carácter . o si quiere
cambiar el formato de una fecha del inglés al español, el uso de expresiones regulares permiten hacerlo
en un solo registro.
En este soporte, utilizaremos PCRE (Perl-Compatible Regular Expression), que usa las funciones de
expresiones regulares más rápidas. También disponemos de POSIX (Portable Operating System
Interface), donde las funciones comienzan por ereg, pero hoy en día están obsoletas. La codificación
debe hacerse en ANSI en Notepad++, para que los siguientes ejemplos funcionen correctamente.
Por ejemplo:
<?php
?>
Da como resultado:
$pattern es una cadena que indica a la función preg_match()cómo debe realizar la búsqueda.
Esta cadena empieza y termina con un delimitador que suele ser el símbolo /. Aunque también podrá
ver el símbolo #.
Por ejemplo:
<?php
www.FreeLibros.me
http://www.eni-training.com/client_net/mediabook.aspx?idR=87311 8/17
24/4/2014 ENI Training - Libro online
echo "La cadena Web se ha encontrado.";
}
else {
echo "La cadena Web no se ha encontrado.";
}
?>
Da como resultado:
La función preg_replace() sustituye el contenido por otro que pasa en argumento. Esta
función devuelve la cadena de caracteres transformada.
Por tanto su sintaxis es:
$cadena_transformada =
preg_replace($pattern,$cadena_para_sustituir,$cadena original);
Si no quiere tener en cuenta las mayúsculas y las minúsculas, solo tiene que agregar i después del
último /.
Por ejemplo:
<?php
?>
Da como resultado:
Como puede observar, la búsqueda se realiza gracias al patrón de búsqueda (pattern). Puede
agregarle muchas otras opciones. Vamos a ver las más utilizadas.
Hasta ahora, la búsqueda de la cadena de caracteres se realiza en una frase. Por ejemplo, si busca la
cadena "designer":
<?php
www.FreeLibros.me
http://www.eni-training.com/client_net/mediabook.aspx?idR=87311 9/17
24/4/2014 ENI Training - Libro online
}
else {
echo "La cadena designer no se ha encontrado.";
}
?>
Da como resultado:
Pero si busca solamente la palabra aquellas palabras que comienzan con "designer", debe
agregar\b delante de la palabra del patrón de búsqueda.
Por ejemplo:
<?php
?>
Da como resultado:
En efecto: designer forma parte de la palabra webdesigner, pero no es una palabra propiamente
dicha.
<?php
?>
Da como resultado:
Si desea encontrar una palabra aislada, es suficiente con incluirla dentro de \b.
Por ejemplo:
Muestra:
www.FreeLibros.me
http://www.eni-training.com/client_net/mediabook.aspx?idR=87311 10/17
24/4/2014 ENI Training - Libro online
<?php
?>
c. El símbolo O
Por ejemplo:
<?php
?>
Da como resultado:
d. Comienzo de la cadena
Este símbolo es ˆ y permite buscar una cadena empezando por una palabra.
Por ejemplo:
<?php
?>
www.FreeLibros.me
http://www.eni-training.com/client_net/mediabook.aspx?idR=87311 11/17
24/4/2014 ENI Training - Libro online
Da como resultado:
e. Fin de cadena
Este símbolo es $, y permite buscar una cadena que termina con una palabra.
Por ejemplo:
<?php
?>
Da como resultado:
Una clase permite definir un conjunto de caracteres que están en una cadena. Su sintaxis es [...], con
los caracteres dentro de los corchetes.
Por ejemplo:
<?php
?>
Da como resultado:
Por ejemplo:
<?php
www.FreeLibros.me
http://www.eni-training.com/client_net/mediabook.aspx?idR=87311 12/17
24/4/2014 ENI Training - Libro online
echo "La cadena termina con la palabra ban o bon o bun.";
}
else {
echo "La cadena no termina con la palabra ban o bon o bun.";
}
?>
Da como resultado:
De este modo, se ha añadido un carácter $ al final de la expresión regular y por tanto la cadena debe
terminar con las palabras ban, bon o bun.
Resulta muy tedioso escribir todas las letras del alfabeto y los dígitos del 0 al 9 en una clase.
Afortunadamente, el símbolo - (guión), permite definir un rango de caracteres o números.
Por ejemplo:
<?php
?>
Da como resultado:
La expresión regular es verdadera si la cadena contiene otra cadena que comienza con p, seguida de
cualquier otra letra del alfabeto y después una e. Por tanto, la palabra "puerto" encaja bien en este
supuesto.
Otro ejemplo:
<?php
?>
Da como resultado:
www.FreeLibros.me
http://www.eni-training.com/client_net/mediabook.aspx?idR=87311 13/17
24/4/2014 ENI Training - Libro online
La expresión regular es verdadera si la cadena contiene un espacio seguido de una cifra entre 0 y 9.
Como la cadena contiene el número 10 precedido de un espacio, cumple la expresión regular.
Si no quiere los caracteres de una clase, tiene que agregar el símbolo ˆ al principio de la clase. Este
símbolo es el mismo que el que indica la palabra al comienzo de la cadena.
Por ejemplo:
<?php
?>
Da como resultado:
En efecto, la palabra admiración contiene una letra n seguida de un carácter que no es una letra, por
lo que la expresión regular devuelve verdadero.
i. Los cuantificadores
Los cuantificadores sirven para definir el número de veces que se repite un carácter o una clase. Los
tres principales cuantificadores son:
Por ejemplo:
<?php
?>
Da como resultado:
La expresión regular busca en la cadena "En el puerto de Amsterdam" la letra d seguida de la letra a
y de la letra m.
www.FreeLibros.me
http://www.eni-training.com/client_net/mediabook.aspx?idR=87311 14/17
24/4/2014 ENI Training - Libro online
Por ejemplo:
<?php
?>
Da como resultado:
La expresión regular busca en la cadena "En el puerto de Amsterdam" la letra d seguida de una o
varias veces la letra a y de la letra m.
El símbolo * indica cero, una o varias apariciones del carácter o de la clase anterior.
Por ejemplo:
<?php
?>
Da como resultado:
La expresión regular busca en la cadena "En el puerto de Amsterdam" la letra d seguida de una o
varias veces la letra a y seguida de la letra m.
j. Intervalos de reconocimiento
Sirven para definir con precisión cuántas veces se puede repetir un carácter o un grupo de caracteres.
Este intervalo se realiza con las llaves {}.
Si quiere que la letra "a" se repita exactamente dos veces, la expresión regular es: a{2}
Si quiere que la letra "a" se repita al menos dos veces, la expresión regular es: a{2,}
Si quiere que la letra "a" se repita entre dos y cinco veces, la expresión regular es: a{2,5}
Por ejemplo:
Da como resultado:
www.FreeLibros.me
http://www.eni-training.com/client_net/mediabook.aspx?idR=87311 15/17
24/4/2014 ENI Training - Libro online
<?php
if (preg_match("/1{1,}/","N° de teléfono:0034912569875.")) {
echo "Está por lo menos una vez el número 1 en su N° de
teléfono.";
}
else {
echo "No está el número 1 en su N° de teléfono.";
}
?>
Si en su expresión regular pone una cadena con un ?, por ejemplo, si quiere buscar la cadena
"¿Quién?", no tiene que interpretar el ? como un cuantificador que indica 0 o 1 del carácter
anterior. Para evitar esto, tiene que usar el símbolo \ (barra invertida) que permite evitar el
símbolo siguiente \, es decir, no interpretarlo como un símbolo, sino como un carácter.
Por ejemplo:
<?php
?>
Da como resultado:
Observe que resulta muy difícil escribir una expresión regular. Por fortuna, puede encontrar fácilmente
en Internet las expresiones regulares más utilizadas.
A continuación encontrará una expresión regular que comprueba si una dirección de correo electrónico
es válida:
<?php
$email = "Juan.lopez@españa.es";
if (preg_match("/ˆ[a-z0-9._-]+@[a-z0-9._-]{2,}\.[a-z]{2,4}$/",
$email)) {
echo "La dirección de correo electrónico es válida.";
}
else {
echo "La dirección de correo electrónico no es válida.";
}
www.FreeLibros.me
http://www.eni-training.com/client_net/mediabook.aspx?idR=87311 16/17
24/4/2014 ENI Training - Libro online
?>
Da como resultado:
www.FreeLibros.me
http://www.eni-training.com/client_net/mediabook.aspx?idR=87311 17/17
24/4/2014 ENI Training - Libro online
1. Operadores de cadena
a. La concatenación
Ha tenido la oportunidad de ver, en el capítulo Las bases del lenguaje PHP, la concatenación, que se
designa con . (punto) o , (coma), y que permite unir dos cadenas de caracteres.
Por ejemplo:
<?php
$nombre = "Juan";
$nombre = "ESTEFANIA";
echo $nombre." ".$apellido; //concatenación del nombre +
un espacio + el apellido
?>
Da como resultado:
Juan ESTEFANIA
b. Asignación
También puede utilizar la combinación .=, que permite concatenar una cadena a una variable y
asignarla a esta variable.
Por ejemplo:
<?php
$nombre = "Juan";
$apellido = "López";
$nombre .= " "; //concatenación del nombre + un espacio
$nombre .= $apellido; //concatenación del nombre + el apellido
echo $nombre;
?>
Es igual a:
<?php
$nombre = "Juan";
$apellido = ”López”;
$nombre = $nombre." "; //concatenación del nombre + un espacio
$nombre = $nombre.$nombre; //concatenación del nombre + el apellido
echo $nombre;
?>
www.FreeLibros.me
http://www.eni-training.com/client_net/mediabook.aspx?idR=87312 1/10
24/4/2014 ENI Training - Libro online
Da como resultado:
Juan López
2. Operadores aritméticos
a. La suma
Por ejemplo:
<?php
$numero = 11;
$resultado = $numero + 5;
echo $resultado;
?>
Da como resultado:
16
b. La resta
Por ejemplo:
<?php
$numero = 11;
$resultado = $numero - 5;
echo $resultado;
?>
Da como resultado:
c. La multiplicación
Por ejemplo:
<?php
$numero = 11;
$resultado = $numero * 3;
echo $resultado;
?>
www.FreeLibros.me
http://www.eni-training.com/client_net/mediabook.aspx?idR=87312 2/10
24/4/2014 ENI Training - Libro online
Da como resultado:
33
d. La división
Por ejemplo:
<?php
$numero = 10;
$resultado = $numero / 5;
echo $resultado;
?>
Da como resultado:
e. El módulo
Por ejemplo:
<?php
$numero = 11;
$resultado = $numero % 5;
echo $resultado;
?>
Da como resultado:
Este operador es muy útil para saber si un número es divisible por otro.
Por ejemplo:
<?php
$numero = 11;
$resto = $numero % 5;
if ($resto == 0) {
echo "El número ".$numero." es divisible por 5";
}
else {
echo "El número ".$numero." No es divisible por 5";
}
?>
www.FreeLibros.me
http://www.eni-training.com/client_net/mediabook.aspx?idR=87312 3/10
24/4/2014 ENI Training - Libro online
Da como resultado:
f. El incremento
Por ejemplo:
<?php
$numero = 10;
echo ++$numero; //incrementa y muestra
echo ";";
echo $numero;
?>
Da como resultado:
11;11
Otro ejemplo:
<?php
$numero = 10;
echo $numero++; //muestra e incrementa
echo ";";
echo $numero;
?>
Da como resultado:
10;11
g. La resta
Por ejemplo:
<?php
$numero = 10;
echo --$numero; //resta y muestra
echo ";";
echo $numero;
?>
Da como resultado:
www.FreeLibros.me
http://www.eni-training.com/client_net/mediabook.aspx?idR=87312 4/10
24/4/2014 ENI Training - Libro online
9;9
Otro ejemplo:
<?php
$numero = 10;
echo $numero--; //muestra y resta
echo ";";
echo $numero;
?>
Da como resultado:
10;9
3. Operadores de comparación
a. La igualdad
Por ejemplo:
<?php
$numero_1 = 11;
$numero_2 = 11.0;
if ($numero_1 == $numero_2) {
echo "Los dos números son idénticos";
}
else {
echo "Los dos números no son idénticos";
}
?>
Da como resultado:
En efecto, los números 11 y 11.0 no son del mismo tipo, pero los valores son iguales.
Por el contrario, el operador === prueba el valor y el tipo. Por tanto, 11, de tipo int, es distinto de
11.0, que es de tipo float.
Ejemplo:
<?php
$numero_1 = 11;
$numero_2 = 11.0;
if ($numero_1 === $numero_2) {
echo "Los dos números son idénticos";
}
www.FreeLibros.me
http://www.eni-training.com/client_net/mediabook.aspx?idR=87312 5/10
24/4/2014 ENI Training - Libro online
else {
echo "Los dos números no son idénticos";
}
?>
Da como resultado:
b. La diferencia
Por ejemplo:
<?php
$numero = 11;
$cadena = "11";
if ($numero != $cadena) {
echo "El número y la cadena son diferentes";
}
else {
echo "El número y la cadena no son diferentes";
}
?>
Da como resultado:
Por el contrario, !== prueba el valor y el tipo de las dos variables, por tanto:
<?php
$numero = 11;
$cadena = "11";
if ($numero !== $cadena) {
echo "El número y la cadena son diferentes";
}
else {
echo "El número y la cadena nos son diferentes";
}
?>
Da como resultado:
c. La comparación
Por ejemplo:
www.FreeLibros.me
http://www.eni-training.com/client_net/mediabook.aspx?idR=87312 6/10
24/4/2014 ENI Training - Libro online
<?php
$numero_1 = 11;
$numero_2 = 12;
if ($numero_1 < $numero_2) {
echo "El número ".$numero_1" es estrictamente inferior al número
".$numero_2;
}
else {
echo "El número ".$numero_1" no es estrictamente inferior al número "
.$numero_2;
}
?>
Da como resultado:
Por ejemplo:
<?php
$numero_1 = 11;
$numero_2 = 12;
if ($numero_1 > $numero_2) {
echo "El número ".$numero_1" es estrictamente superior al número
".$numero_2";
}
else {
echo "El número ".$numero_1" no es estrictamente superior al número
".$numero_2";
}
?>
Da como resultado:
4. El operador ternario
El operador se designa por ?. Es igual a if else, pero en una sola línea. Su sintaxis es:
condición?expresión1:expresión2
Por ejemplo:
Da como resultado:
www.FreeLibros.me
http://www.eni-training.com/client_net/mediabook.aspx?idR=87312 7/10
24/4/2014 ENI Training - Libro online
<?php
$numero_1 = 11;
$numero_2 = 12;
echo ($numero_1 == $numero_2)?"Los dos números son idénticos":
"Los dos números no son idénticos";
?>
5. Operadores lógicos
a. Y
Por ejemplo:
<?php
$edad = 10;
$nombre = "Juan";
if ($edad == 10 && $nombre == "Juan") {
echo "ok";
}
else {
echo "no correcto";
}
?>
Da como resultado:
ok
Para que se compruebe la condición if, es necesario que $edad sea igual a 10 y que $nombresea
igual a "Juan". Como se da el caso, muestra ok.
b. O
Por ejemplo:
<?php
$edad = 10;
$nombre = "Roberto";
if ($edad == 10 || $nombre == "Juan") {
www.FreeLibros.me
http://www.eni-training.com/client_net/mediabook.aspx?idR=87312 8/10
24/4/2014 ENI Training - Libro online
echo "ok";
}
else {
echo "no correcto";
}
?>
Da como resultado:
ok
Para que se compruebe la condición if, $edad debe ser igual a 10 o bien $nombre igual a "Juan".
Como es el caso, muestra ok.
Otro ejemplo:
<?php
$edad = 11;
$nombre = "Roberto";
if ($edad == 10 && $nombre == "Juan") {
echo "ok";
}
else {
echo "no correcto";
}
?>
Da como resultado:
no correcto
No existe ni $nombre igual a "Juan", ni $edad igual a 10, entonces la condición if es falsa y por
tanto se ejecuta el código correspondiente al bloque del else (si no).
Si los operadores || y && están seguidos, el operador && tiene prioridad sobre el operador ||.
Otro ejemplo:
<?php
$edad = 11;
$nombre = "Roberto";
if ($nombre == "Roberto" || $edad == 11 && $edad == 10) {
echo "ok";
}
else {
echo "no correcto";
}
?>
Y es igual a:
www.FreeLibros.me
http://www.eni-training.com/client_net/mediabook.aspx?idR=87312 9/10
24/4/2014 ENI Training - Libro online
<?php
$edad = 11;
$nombre = "Roberto";
if ($nombre == "Roberto" || ($edad == 11 && $edad == 10)) {
echo "ok";
}
else {
echo "no correcto";
}
?>
Da como resultado:
ok
<?php
$edad = 11;
$nombre = "Roberto";
if (($nombre == "Roberto" || $edad == 11) && $edad == 10) {
echo "ok";
}
else {
echo "no correcto";
}
?>
Y da como resultado:
no correcto
Por tanto, según donde ponga los paréntesis, el significado de la condición puede ser completamente
diferente.
www.FreeLibros.me
http://www.eni-training.com/client_net/mediabook.aspx?idR=87312 10/10
24/4/2014 ENI Training - Libro online
Las funciones
1. Creación
Las funciones permiten reutilizar varias veces el código PHP. Por ejemplo, si tiene una página Web con
precio sin IVA de diferentes productos, puede crear una función para calcular el precio con IVA de cada
producto. Esto evita escribir en cada línea el cálculo en PHP. En su desarrollo, intente agrupar el código.
Así el mantenimiento es más fácil. De hecho, cuanto más se escribe el código, es más probable que
cometa errores.
La sintaxis para crear una función es: función nombre_de_la función ($argumento) { }
Nunca ponga espacios ni caracteres especiales en el nombre de una función. El parámetro también se
llama argumento.
Intente nombrar la función con palabras separadas por el símbolo _ o con mayúsculas que expliquen lo
que hace la función, por ejemplo: nombre_de_la_función o NombreDeLaFunción.
Por ejemplo:
<?php
función calculo_iva($precio_bruto) {
return $precio_bruto * 1.21;
}
?>
Esta función calcula el precio con IVA a partir del precio sin IVA, que pasa como parámetro, y devuelve
el resultado a través de la palabra clave return. Una función no está obligada a devolver un resultado;
puede servir solo para mostrar un mensaje, por ejemplo.
Por ejemplo:
<?php
calculo_iva(12);
?>
O al final:
<?php
función calculo_iva($precio_bruto) {
return $precio_bruto * 1.21;
}
$precio_iva = calculo_iva(12);
echo "12 euros sin IVA corresponden a ".$precio_iva" euros con IVA";
?>
Da como resultado:
www.FreeLibros.me
http://www.eni-training.com/client_net/mediabook.aspx?idR=87313 1/15
24/4/2014 ENI Training - Libro online
El número 12 pasa con el parámetro de la función; por tanto $precio_bruto se convierte en igual a
12, y la función devuelve 12*1.21 (14.52) en la variable $precio_iva.
<?php
function junta_palabra($palabra1,$palabra2,$palabra3) {
$devuelve = $palabra1." ".$palabra2." ".$palabra3;
Return $devuelve;
}
echo junta_palabra("Hola","Juan","ESTEFANIA");
?>
Da como resultado:
<?php
function muestra_Hola() {
echo "Hola";
}
muestra_Hola();
?>
Da como resultado:
Hola
Las variables declaradas o que pasan como argumentos a una función solo son válidas en la función.
Por ejemplo:
<?php
function muestra_palabra($nombre) {
echo $nombre;
}
muestra_palabra("Hola "); //muestra Hola
echo $nombre; //error porque $nombre no se define
?>
Da como resultado:
www.FreeLibros.me
http://www.eni-training.com/client_net/mediabook.aspx?idR=87313 2/15
24/4/2014 ENI Training - Libro online
Hola
<?php
$nombre = "Juan";
function muestra_palabra($nombre) {
echo $nombre;
}
muestra_palabra("Hola "); //muestra Hola
echo $nombre; //muestra Juan
?>
Da como resultado:
Hola Juan
Atención: la variable $nombre definida antes que la función no es la misma que $nombre pasada con
el parámetro de la función.
Lo mismo ocurre con una variable declarada fuera de la función, que tampoco es válida en la función.
Por ejemplo:
<?php
$nombre = "Juan";
function muestra_palabra() {
echo $nombre; //muestra un error
}
muestra_palabra();
?>
Da como resultado:
<?php
$nombre = "Juan";
function muestra_palabra() {
global $nombre;
echo $nombre;
www.FreeLibros.me
http://www.eni-training.com/client_net/mediabook.aspx?idR=87313 3/15
24/4/2014 ENI Training - Libro online
}
muestra_palabra();
?>
Da como resultado:
Juan
La otra solución consiste en utilizar la tabla asociativa $GLOBALS, que contiene todas las variables con
su valor. Esta tabla tiene un alcance global a toda la página php (capítulo Transmitir datos de una
página a otra - Las variables superglobales).
<?php
function muestra_numero() {
$numero = 0;
$numero=$numero + 1;
echo $numero."; ";
}
muestra_numero(); //muestra 1
muestra_numero(); //muestra 1
?>
Da como resultado:
1; 1;
<?php
function muestra_numero() {
static $numero = 0;
$numero=$numero + 1;
echo $numero."; ";
}
muestra_numero(); //muestra 1
muestra_numero(); //muestra 2
?>
Da como resultado:
1; 2;
www.FreeLibros.me
http://www.eni-training.com/client_net/mediabook.aspx?idR=87313 4/15
24/4/2014 ENI Training - Libro online
5. Funciones útiles
La función isset() permite probar que existe una variable. Si existe, devuelve true, y si no
existe, false.
Por ejemplo:
<?php
?>
Da como resultado:
La variable existe.
Por ejemplo:
<?php
?>
Da como resultado:
var_dump($variable);
Por ejemplo:
<?php
?>
www.FreeLibros.me
http://www.eni-training.com/client_net/mediabook.aspx?idR=87313 5/15
24/4/2014 ENI Training - Libro online
Da como resultado:
array(3) { [0]=> string(6) "Fresa" [1]=> string(6) "Plátano" [2]=> array(3) { [0]=>
int(1) [1]=> int(2) [2]=> int(3) } }
Por ejemplo:
<?php
?>
Da como resultado:
La variable no es nula.
Por ejemplo:
<?php
function always_false() {
return false;
}
if (empty(alway_false())) {
echo ’Se mostrará esto’
}
?>
Da como resultado:
Se mostrará esto
www.FreeLibros.me
http://www.eni-training.com/client_net/mediabook.aspx?idR=87313 6/15
24/4/2014 ENI Training - Libro online
<?php
function añadir_señor($argumento) {
$argumento = $argumento . " Señor";
}
$texto = "Hola";
añadir_señor($texto);
echo $texto;
?>
Da como resultado:
Hola
Se pasa la variable $texto como argumento a la función; no se cambia su valor en la función, solo se
envía su valor a la función.
El paso del parámetro se realiza agregando el símbolo & delante de la variable. Tiene como efecto
pasar la dirección de memoria de la variable y así puede modificar su valor.
<?php
?>
Da como resultado:
Hola Señor
Se pasa la variable $texto como argumento a la función con ayuda de &$argumento y se modifica al
concatenar $argumento con la cadena de caracteres " Señor". Al salir de la función,$texto tiene
como valor $argumento, es decir, "Hola Señor".
Por ejemplo:
<?php
function muestra_argumentos($argumento1,$argumento2) {
echo "El valor del primer argumento es:".func_get_arg(0);
www.FreeLibros.me
http://www.eni-training.com/client_net/mediabook.aspx?idR=87313 7/15
24/4/2014 ENI Training - Libro online
echo "El valor del segundo argumento es:".func_get_arg(1);
}
muestra_argumentos("Hola","Roberto");
?>
Da como resultado:
Por ejemplo:
<?php
function muestra_numero_argumentos($argumento1,$argumento2) {
echo "El número de argumentos es:".func_num_args();
}
muestra_numero_argumentos("Hola","Roberto");
?>
Da como resultado:
Por ejemplo:
<?php
function muestra_argumentos($argumento1,$argumento2) {
$num_args = func_num_args();
$arg_lista = func_get_args();
for ($i = 0; $i < $num_args; $i++) {
echo "El argumento $i es: " . $arg_lista[$i] . "<br />\n";
}
}
muestra_argumentos("Hola","Roberto");
?>
Da como resultado:
El argumento 0 es:Hola
El argumento 1 es:Roberto
Por ejemplo:
www.FreeLibros.me
http://www.eni-training.com/client_net/mediabook.aspx?idR=87313 8/15
24/4/2014 ENI Training - Libro online
<?php
function muestra_numero_argumentos($argumento1,$argumento2) {
echo "El número de argumentos es:".func_num_args();
}
if (function_exists(’muestra_numero_argumentos’)) {
echo "La función existe.";
} else {
echo "La función no existe.";
}
?>
Da como resultado:
La función existe.
8. Recursividad
La recursividad significa que una función se llama a sí misma. Es muy útil para navegar en una
arborescencia, sobre todo si se desconoce de antemano el número de ramas.
Por ejemplo:
<?php
function funcion_recursiva($n)
{
$n++; //incrementa n de 1 en 1
echo "$n,";
if($n < 10){ // si n es inferior a 10, recurre a la función
funcion_recursiva($n);
}
}
funcion_recursiva(0); // muestra los números de 1 a 10
?>
Da como resultado:
1,2,3,4,5,6,7,8,9,10,
En la condición if($n < 10), la función se llama a sí misma, y se puede llamar hasta diez veces en
total. De hecho, si no hubiera una condición ($n < 10), el bucle sería infinito.
A continuación veremos el código que muestra los valores de las tablas tridimensionales:
<?php
function mostrar_tabla($tabla,$titulo="",$nivel=0) {
www.FreeLibros.me
http://www.eni-training.com/client_net/mediabook.aspx?idR=87313 9/15
24/4/2014 ENI Training - Libro online
// Parámetros
// - $tabla = tabla que debe mostrar el contenido
// - $titulo = título que hay que mostrar encima del contenido
// - $nivel = nivel de visualización
if ($titulo != "") { // Si hay un título, mostrarlo.
echo "<br /><b>".$titulo."</b><br />";
}
// Comprobar si hay datos.
if (isset($tabla)) { // Hay datos
// Navegar por la tabla que se pasa como argumento.
foreach ($tabla as $clave => $valor) {
// mostrar la clave (con indentation función
// del nivel).
// htmlentities() es la función que convierte los
//caracteres especiales HTML
echo str_pad(’’,12*$nivel, ’ ’).
htmlentities($clave).’ = ’;
// mostrar el valor
if (is_array($valor)) { // comprueba si es una tabla
echo ’<br />’;
// Llama recursivamente a mostrar_tabla para
// mostrar la tabla en cuestión
mostrar_tabla($valor,’’,$nivel+1);
} else { // es un valor escalonado
// mostrar el valor.
echo htmlentities($valor).’<br />’;
}
}
} else { // no hay datos
echo ’<br />’;
}
}
// Declaración de las tablas.
$tab_caracteristica_ESTEFANIA = array("nombre" => "PABLO",
"profesión" => "ministro","edad" => 50);
$tab_caracteristica_LUNA= array("nombre" => "ROBERTO",
"profesión" => "agricultor","edad" => 45);
$tab_persona[’ESTEFANIA’] = $tab_caracteristica_ESTEFANIA;
$tab_persona[’LUNA’] = $tab_caracteristica_LUNA;
?>
Da como resultado:
Apellido/Características
ESTEFANIA =
nombre = PABLO
profesión = ministro
edad = 50
LUNA =
nombre = ROBERTO
www.FreeLibros.me
http://www.eni-training.com/client_net/mediabook.aspx?idR=87313 10/15
24/4/2014 ENI Training - Libro online
profesión = agricultor
edad = 45
La principal ventaja de esta función recursiva es que, si tiene una tabla de tres, cuatro o más
dimensiones, no es preciso cambiar el código, porque no depende del número de dimensiones.
Ya ha visto algunas de ellas en secciones anteriores, como substr() o implode(). Ahora vamos a
ver algunas funciones complementarias que son también muy útiles.
La función rand() permite generar un valor aleatorio comprendido entre 0 y 32768. Puede pasar
como argumento de entrada unos límites mínimo y máximo.
Por ejemplo:
<?php
?>
Da como resultado:
24751
13
Por ejemplo:
<?php
echo round(3.141592);
?>
Da como resultado:
Esta función acepta la precisión como argumento complementario, es decir, el número de dígitos que
quiera poner después de la coma.
Por ejemplo:
www.FreeLibros.me
http://www.eni-training.com/client_net/mediabook.aspx?idR=87313 11/15
24/4/2014 ENI Training - Libro online
<?php
?>
Da como resultado:
3.14
Otro ejemplo:
<?php
?>
Da como resultado:
3.78
Por ejemplo:
<?php
echo abs(-5.2);
?>
Da como resultado:
5.2
Por ejemplo:
<?php
echo abs("68");
?>
Da como resultado:
68
www.FreeLibros.me
http://www.eni-training.com/client_net/mediabook.aspx?idR=87313 12/15
24/4/2014 ENI Training - Libro online
La función uniqid() permite generar de forma aleatoria un valor de trece caracteres, de tal manera
que este valor sea único. A veces es muy útil para generar identificadores únicos que se van a
insertar en la base de datos.
Por ejemplo:
<?php
?>
Da como resultado:
Por ejemplo:
<?php
echo phpversión();
?>
Da como resultado:
5.3.3
Por ejemplo:
<?php
phpinfo();
?>
www.FreeLibros.me
http://www.eni-training.com/client_net/mediabook.aspx?idR=87313 13/15
24/4/2014 ENI Training - Libro online
La función ini_get_all() devuelve toda la información del archivo PHP.ini, pero en forma de tabla.
Para terminar, la función get_loaded_extensions() devuelve una tabla que contiene todas las
extensiones que se han descargado. Lo veremos en el capítulo Configuración.
f. Enviar un e-mail
www.FreeLibros.me
http://www.eni-training.com/client_net/mediabook.aspx?idR=87313 14/15
24/4/2014 ENI Training - Libro online
La función mail() permite enviar un e-mail. Es una función básica que no debe utilizar si quiere
enviar un gran volumen de mensajes de correo electrónico, porque con cada envío cierra y vuelve a
abrir una conexión al servidor. Hay otras funciones más prácticas y eficaces, como PEAR o PHPMailer.
Sin embargo, el estudio de esta función permite ver las bases de envío de un e-mail, que son
comunes a todas las funciones.
El encabezado permite definir el remitente del e-mail (From), el tipo MIME, la codificación y otros
parámetros. Puede encontrar más información en el siguiente enlace:
http://www.php.net/manual/es/function.mail.php
El remitente (From), la dirección SMTP y el número de puerto SMTP se definen en el archivo PHP.ini, al
que puede acceder desde el menú Configuración - PHP.
Por ejemplo:
<?php
$to = ’[email protected]’;
$subject = ’Asunto’;
$message = ’¡Hola a todos!’;
$headers = ’From: [email protected]’."\r\n"
’Reply-To: [email protected]’."\r\n"
’MIME-Version: 1.0’."\r\n";
La función mail() no se puede autentificar y por tanto no funciona en modo local si, por ejemplo,
utiliza el servidor SMTP de Gmail. Deberá utilizar la librería Mail-1.2.0 de PEAR que está disponible en
la siguiente dirección: http://pear.php.net/package/Mail/download/1.2.0/
El e-mail que ha envíado está en formato texto. Para enviarlo en formato HTML, debe declarar este
formato en el encabezado (header):
www.FreeLibros.me
http://www.eni-training.com/client_net/mediabook.aspx?idR=87313 15/15
24/4/2014 ENI Training - Libro online
Por ejemplo:
<?php
function añadir($argumento1,$argumento2) {
return $argumento1 + $argumento2;
}
function sustraer($argumento1,$argumento2) {
return $argumento1 - $argumento2;
}
function operacion($tipo_operacion,$valor1,$valor2) {
return $type_operacion($valor1,$valor2);
}
echo "6 + 4 =".operacion(añadir,6,4).", ";
echo "6 - 4 =".operacion(sustraer,6,4);
?>
Da como resultado:
6 + 4 =10, 6 - 4 =2
Observe que el tipo de operación se pasa como parámetro a la función operacion. Esta función
recupera el tipo de operación (añadir, por ejemplo) y va a recurrir a la función añadir con sus
parámetros. Pero para que esto funcione, ya debe existir la función añadir.
Este concepto puede ser de gran utilidad si crea el objeto en PHP, como veremos más adelante.
1. Ejercicio
a. Enunciados
Cree une función que muestre una frase que contenga de forma aleatoria las tres palabras «Hola»,
«Señor» y «Roberto». Cada palabra solo puede aparecer una vez. Esta función recibe como
parámetros las tres palabras «Hola», «Señor» y «Roberto».
Ejercicio 2 (difícil)
Cree una tabla que contenga diez dígitos aleatorios comprendidos entre 1 y 100, y ordénelos,
utilizando métodos como la ordenación de tabla o sort(). Debe crear una función que intercambie dos
valores en una tabla. Muestre estos valores separados por una coma.
Ejercicio 3 (medio)
Escriba una función que permita calcular el factorial de un número de manera recursiva.
www.FreeLibros.me
http://www.eni-training.com/client_net/mediabook.aspx?idR=87314 1/5
24/4/2014 ENI Training - Libro online
Ejercicio 4 (difícil)
Retome el ejercicio 1, pero ahora debe generalizar la función para que tome como parámetro una
tabla que contenga cualquier número de palabras.
La tabla A tiene los elementos 3, 8, 15 y 16. Cree una tabla B con ayuda de un bucle que contenga
todos los elementos comprendidos entre 1 y 20, salvo los elementos de la tabla A. Cree una función
que calcule al cubo este dígito. Muestre en una tabla HTML los elementos de la tabla B en la primera
columna y en una segunda columna los elementos de B al cubo.
b. Soluciones
<?php
function muestra($palabra1,$palabra2,$palabra3) {
$frase = "";
$valor_al azar = rand(1,6); //Hay 6 posibles combinaciones
if ($valor_al azar == 1) {
$frase = $palabra1." ".$palabra2." ".$palabra3;
}
else if ($valor_al azar == 2) {
$frase = $palabra1." ".$palabra3." ".$palabra2;
}
else if ($valor_al azar == 3) {
$frase = $palabra2." ".$palabra1." ".$palabra3;
}
else if ($valor_al azar == 4) {
$frase = $palabra2." ".$palabra3." ".$palabra1;
}
else if ($valor_al azar == 5) {
$frase = $palabra3." ".$palabra1." ".$palabra2;
}
else if ($valor_al azar == 6) {
$frase = $palabra3." ".$palabra2." ".$palabra1;
}
echo $frase;
}
$palabra1 = "Hola";
$palabra2 = "Señor";
$palabra3 = "Roberto";
muestra($palabra1,$palabra2,$palabra3);
?>
<?php
www.FreeLibros.me
http://www.eni-training.com/client_net/mediabook.aspx?idR=87314 2/5
24/4/2014 ENI Training - Libro online
$tabla1 = array();
$longitud=10;
while($longitud>0)
{
// búsqueda del mayor valor de la tabla
$maximo = 1;
for($i=1; $i<=$longitud; $i++) {
if($tabla1[$i]>$tabla1[$maximo]) {
$maximo = $i;
}
}
//intercambia el máximo con el último elemento
intercambiar($tabla1, $maximo, $longitud);
//mostrar la tabla
for ($i=1;$i<=10;$i++) { //tabla de 1 a 10
echo $tabla1[$i].",";
}
?>
<?php
function factorial($numero)
{
if($numero === 0) // condición de parada
return 1;
else
return $numero * factorial($numero-1);
}
echo "El factorial de 20 es:".factorial(20);
?>
www.FreeLibros.me
http://www.eni-training.com/client_net/mediabook.aspx?idR=87314 3/5
24/4/2014 ENI Training - Libro online
<?php
function muestra($tab) {
$tabla_fin = array(); //tabla que contiene las palabras para
//mostrar aleatoriamente
$j=0; //contador de esta tabla
$numero_elementos = sizeof($tab);
while ($j < $numero_elementos) {
$clave_aleatoria = array_rand($tab);
//si el valor obtenido aleatoriamente ya está prestente en
//la tabla de fin, disminuye $i para volver a empezar
//a ejecutar un bucle una vez más.
if (! in_array($tab[$clave_aleatoria],$tabla_fin)) {
$tabla_fin[$j] = $tab[$clave_aleatoria];
$j++;
}
}
foreach ($tabla_fin as $val) {
echo $val." ";
}
}
$tabla_palabra[0] = "Hola";
$tabla_palabra[1] = "Señor";
$tabla_palabra[2] = "Roberto";
$tabla_palabra[3] = "Pepe";
muestra($tabla_palabra);
?>
<?php
www.FreeLibros.me
http://www.eni-training.com/client_net/mediabook.aspx?idR=87314 4/5
24/4/2014 ENI Training - Libro online
}
echo "</tabla>";
?>
www.FreeLibros.me
http://www.eni-training.com/client_net/mediabook.aspx?idR=87314 5/5
24/4/2014 ENI Training - Libro online
Las fechas
En esta parte tratamos todas las funciones PHP que permiten manipular las fechas. Normalmente las
fechas se recuperan en un formato con un idioma concreto, y esto le obliga a convertirlas a su idioma.
La función time() devuelve la hora actual, que se mide en segundos desde el inicio de UNIX
(1 de Enero de 1970 00:00:00 GMT). Esta hora también se llama timestamp UNIX.
Por ejemplo:
<?php
echo time();
?>
Da como resultado:
1381329777
time()
Esta función se utiliza sobre todo para realizar cálculos con fechas, por ejemplo para encontrar la
duración de procesamiento en la base de datos.
Por ejemplo:
<?php
echo date(’d.m.y’);
?>
Da como resultado:
09.10.13
$fecha_del_dia = fecha($formato)
siendo $formato una cadena que contiene las letras que permiten definir el formato.
A continuación mostramos una lista con los principales formatos que se utilizan en la función date. Esta
lista no es exhaustiva y puede encontrar más información en el siguiente
enlace:http://www.php.net/manual/es/function.date.php
Día
J Día del mes con dos dígitos sin ningún cero inicial: de 1 a 31.
d Día del mes con dos dígitos con un cero inicial en la función del día: de 01 a 31.
www.FreeLibros.me
http://www.eni-training.com/client_net/mediabook.aspx?idR=87315 1/7
24/4/2014 ENI Training - Libro online
Semana
Mes
F Mes, textual, versión amplia en inglés, como por ejemplo January o December.
Año
Hora
Esta función date() puede tomar también como parámetro opcional el timestamp UNIX para definir otra
fecha distinta a la fecha del día que quiere mostrar.
Por ejemplo:
<?php
?>
Da como resultado:
www.FreeLibros.me
http://www.eni-training.com/client_net/mediabook.aspx?idR=87315 2/7
24/4/2014 ENI Training - Libro online
La función mktime() devuelve el timestamp UNIX desde una fecha que se pasa como
parámetro.
Por ejemplo:
<?php
?>
Da como resultado:
1328050800
Su sintaxis es:
$timestamp = mktime($hora,$minuto,$segundo,$mes,$día,$año)
Esta función corrige los datos no válidos automáticamente. Por ejemplo, 32 de Enero se
corregirá como 1 de Febrero.
Por ejemplo:
<?php
?>
Da como resultado:
0.31211200 1328104356
1328104356.3121
0.3121
$microsegundo = microtime($bool)
www.FreeLibros.me
http://www.eni-training.com/client_net/mediabook.aspx?idR=87315 3/7
24/4/2014 ENI Training - Libro online
Por ejemplo:
<?php
print_r(getdate());
?>
Da como resultado:
Array ( [seconds] => 37 [minutes] => 48 [hours] => 10 [mday] => 15 [wday] => 3 [mon]
=> 6 [year] => 2011 [yday] => 165 [weekday] => Wednesday [month] => June [0] =>
1308127717 )
$tabla = getdate()
La función checkdate() indica si una fecha es válida o no. Esta función tiene en cuenta los
años bisiestos. Toma como parámetros el mes, el día y el año, y devuelve verdadero o falso.
Por ejemplo:
<?php
if($valido == true )
{
echo ’La fecha es válida’;
}
else
{
echo ’La fecha no es válida’;
}
?>
Da como resultado:
La fecha no es válida
$valido = checkdate($mes,$día,$año)
Por ejemplo:
<?php
www.FreeLibros.me
http://www.eni-training.com/client_net/mediabook.aspx?idR=87315 4/7
24/4/2014 ENI Training - Libro online
echo strtotime("now").", ".date(’d-m-Y’,strtotime("now")). "<br />";
?>
Da como resultado:
1381822566, 15-10-2013
1315605600, 10-09-2011
1381960800, 17-10-2013
1381183200, 08-10-2013
1381908966, 16-10-2013
1382427366, 22-10-2013
1383215768, 31-10-2013
$timestamp = strtotime($cadena)
La función strftime() permite convertir una fecha que tiene la forma de timestamp en una
cadena formateada correctamente. Toma como parámetro el formato de tipo cadena de
caracteres y timestamp como opción, si no quiere la fecha actual. Esta función se utiliza
con setlocale(), que permite definir el país en el que nos encontramos.
Por ejemplo:
<?php
setlocal(LC_ALL, "es_ES","esp");
echo strftime("En España el día es: %A <br />");
setlocal(LC_TIME, "fr_FR","fra");
echo strftime("En Francia el mes es %B.\n");
?>
Da como resultado:
www.FreeLibros.me
http://www.eni-training.com/client_net/mediabook.aspx?idR=87315 5/7
24/4/2014 ENI Training - Libro online
Hoy es 09 10 2013
$cadena = strftime($formato)
Opciones de formato:
%j: número del día del año con tres dígitos: de 001 a 365.
%U:número de la semana en el año: el primer domingo del año, siendo el primer día de la primera
semana.
%W: número de la semana en el año: el primer lunes del año, siendo el primer día de la primera semana.
%t: tabulación.
%n: vuelta al registro.
www.FreeLibros.me
http://www.eni-training.com/client_net/mediabook.aspx?idR=87315 6/7
24/4/2014 ENI Training - Libro online
<?php
date_default_timezone_set(’Europa/Madrid’);
?>
Por ejemplo:
<?php
date_default_timezone_set(’Europa/Madrid’);
$format = ’Y-m-d H:i:s’;
$date = date_create_from_format($format, ’2011-11-15 12:14:19’);
echo "Muestra con el formato día-mes-año hora:minuto:segundo -> "
.date-formato($date, ’d-m-Y H:i:s’);
?>
Da como resultado:
www.FreeLibros.me
http://www.eni-training.com/client_net/mediabook.aspx?idR=87315 7/7
24/4/2014 ENI Training - Libro online
Los archivos
1. Introducción
A veces resulta muy útil almacenar información en un archivo del servidor, en lugar de en la base de
datos. Puede ser más rápido y accesible; sin embargo, es menos seguro y pueden surgir errores en la
escritura si hay conexiones simultáneas.
Para empezar, debe crear un archivo llamado «archivo.txt» en el directorio www, es decir, donde están
sus páginas PHP. Este archivo debe tener derechos de escritura para poder escribir en ellos. Esto se
produce automáticamente cuando trabaja en modo local, pero probablemente tendrá que cambiar los
permisos del archivo si lo transfiere por FTP a otra ubicación.
2. Lectura rápida
La función file_get_contents() permite leer el contenido de un archivo y lo devuelve
en una cadena de caracteres.
<?php
$contenido = file_get_contents(archivo.txt’);
echo $contenido;
?>
Da como resultado:
"¡Hola!"
<?php
$archivo = ’archivo.txt’;
$numero=readfile($archivo);
echo "<br /> El número de caracteres del archivo es:".$numero;
?>
Da como resultado:
"¡Hola!"
www.FreeLibros.me
http://www.eni-training.com/client_net/mediabook.aspx?idR=87316 1/15
24/4/2014 ENI Training - Libro online
En este ejemplo, el archivo de texto contiene la frase "¡Hola!", un salto de línea y la frase "Señora
ESTEFANIA."
<?php
$tabla = file(’archivo.txt’);
foreach ($tabla as $línea) {
echo $línea."<br />";
}
?>
Da como resultado:
"¡Hola!"
"Señora ESTEFANIA."
3. Escritura rápida
La función file_put_contents() permite escribir en un archivo el contenido de una cadena de
caracteres. Toma como parámetro el nombre del archivo y la variable que contiene el texto que va a
insertar en el archivo. Si ya existe el archivo, su contenido se elimina.
Por ejemplo:
<?php
?>
Por ejemplo:
<?php
?>
La variable $recurso contiene un objeto que permite manipular el archivo. Veremos más adelante
www.FreeLibros.me
http://www.eni-training.com/client_net/mediabook.aspx?idR=87316 2/15
24/4/2014 ENI Training - Libro online
cómo se utiliza.
La ’w’ abre el archivo solo en modo de escritura, vacía el archivo y lo crea si aún no existe.
La ’w+’ abre el archivo en modo de lectura y escritura, vacía el archivo y lo crea si aún no existe.
La ’a’ abre el archivo solo en modo de escritura y además crea el archivo si aún no existe. Lo que
escriba después no modificará el texto que ya existe.
La ’a+’ abre el archivo en modo de lectura y escritura y además crea el archivo que aún no existe.
La función fclose() permite cerrar el archivo. Esta función devuelve true o false en caso de
error.
Por ejemplo:
<?php
?>
5. Leer y escribir
La función fgetc() permite leer el archivo carácter a carácter. Es preciso que incluya un bucle para
navegar por todos los caracteres del archivo.
Por ejemplo:
<?php
fclose($recurso);
?>
Da como resultado:
Observe que no lee el salto de línea; por tanto esta función no es muy práctica.
La función fgets() permite leer el archivo línea a línea. Por tanto, es preciso incluir esta
función en un bucle para navegar por todas las líneas del archivo. Toma como parámetro el
www.FreeLibros.me
http://www.eni-training.com/client_net/mediabook.aspx?idR=87316 3/15
24/4/2014 ENI Training - Libro online
recurso del archivo y el tamaño de cada línea como opción. La función recupera este número
de caracteres o los caracteres hasta que se encuentra un final de línea.
Por ejemplo:
<?php
?>
Da como resultado:
"¡Hola!"
"Señora ESTEFANIA."
<?php
?>
Da como resultado:
"¡Hol
a!""
Señor
a EST
EFANI
A."
www.FreeLibros.me
http://www.eni-training.com/client_net/mediabook.aspx?idR=87316 4/15
24/4/2014 ENI Training - Libro online
La función fread() permite leer un archivo completo y devolver su contenido en una cadena
de caracteres. Toma como parámetro el recurso, y como opción, la longitud máxima en bytes.
Por ejemplo:
<?php
?>
Da como resultado:
Observe que las cadenas "¡Hola!" y "Señora ESTEFANIA." están en la misma línea, ya que el salto de
línea del archivo de texto no corresponde al salto de línea HTML (<br />).
La función fwrite() permite escribir en un archivo. Toma como parámetros el recurso y una
cadena de caracteres que se va a insertar en el archivo.
Por ejemplo:
<?php
?>
Si escribe:
<?php
?>
www.FreeLibros.me
http://www.eni-training.com/client_net/mediabook.aspx?idR=87316 5/15
24/4/2014 ENI Training - Libro online
Si quiere escribir Hola en una línea y Señora LUNA en otra, debe insertar un salto de línea después de
Hola. El salto de línea en formato texto es: \r\n. Se escribe con la constante PHP_EOL en PHP.
Por tanto:
<?php
?>
Hola
Señora LUNA.
Por ejemplo:
<?php
?>
Hola
La función rewind() permite colocar el cursor al principio del archivo. Esto tiene el efecto de
volver a escribir sobre el texto existente.
Por ejemplo:
<?php
www.FreeLibros.me
http://www.eni-training.com/client_net/mediabook.aspx?idR=87316 6/15
24/4/2014 ENI Training - Libro online
?>
La cadena de caracteres "Adiós" se sustituye por la cadena de caracteres "Hasta pronto", ya que la
función rewind() va a colocar el cursor de escritura al principio del archivo antes de escribir "Hasta
pronto".
Tenga en cuenta que los caracteres que se han escrito sustituyen a aquellos que ya están presentes.
La función fputs() permite escribir una línea en un archivo. Toma como parámetros el
recurso y la cadena de caracteres que va a escribir.
Por ejemplo:
<?php
?>
Si después de las instrucciones fgets o fputs quiere volver al principio del archivo, utilice
la función fseek(). Esta función toma como parámetros el recurso y la posición en el
archivo.
Por ejemplo:
<?php
?>
Señora LUNA.
Para terminar, la función ftell() permite conocer la posición actual del cursor. Esta función
toma como parámetro el recurso.
Por ejemplo:
www.FreeLibros.me
http://www.eni-training.com/client_net/mediabook.aspx?idR=87316 7/15
24/4/2014 ENI Training - Libro online
<?php
?>
Da como resultado:
16
6. Concurrencia
Cuando tiene un archivo de texto en un servidor, puede que varias personas escriban en él
simultáneamente, lo que podría causar un error.
Para evitar este problema, existe la función flock(), que toma como parámetro el recurso y una
constante que establece el tipo de bloqueo solicitado.
Un bloqueo puede significar que está utilizando el archivo. Hay cuatro tipos de bloqueo:
Por ejemplo:
<?php
?>
www.FreeLibros.me
http://www.eni-training.com/client_net/mediabook.aspx?idR=87316 8/15
24/4/2014 ENI Training - Libro online
7. Manipulación de archivos
La función copy() permite volver a copiar un archivo. Esta función toma como parámetro
una cadena de caracteres que contiene el archivo de origen y otra cadena de caracteres que
contiene el archivo de destino.
Por ejemplo:
<?php
copy("archivo.txt","prueba.txt");
?>
La función file_exists() permite probar si hay un archivo o una carpeta. Esta función
toma como parámetro una cadena de caracteres que contiene el nombre del archivo o de la
carpeta.
Por ejemplo:
<?php
$archivo = ’archivo.txt’;
if(file_exists($archivo)){
echo "Este archivo existe.";
}
else {
echo "Este archivo no existe.";
}
?>
La función is_file() también permite probar si hay un archivo, pero no funciona con
directorios. Esta función toma como parámetro una cadena de caracteres que contiene el
nombre del archivo.
Por ejemplo:
<?php
$archivo = ’archivo.txt’;
if(file_exists($archivo)){
echo "Este archivo existe.";
}
else {
echo "Este archivo no existe.";
}
?>
www.FreeLibros.me
http://www.eni-training.com/client_net/mediabook.aspx?idR=87316 9/15
24/4/2014 ENI Training - Libro online
Por ejemplo:
<?php
$archivo = ’archivo.txt’;
if(file_exists($archivo)){
echo "Este archivo es ejecutable.";
}
else {
echo "Este archivo no es ejecutable.";
}
?>
La función touch() permite crear un archivo. Esta función toma como parámetro una cadena
de caracteres que contiene el nombre del archivo. Si ya existe el archivo, solo cambia la fecha
de su última modificación.
Por ejemplo:
<?php
touch("archivo.txt");
?>
La función unlink() permite eliminar un archivo. Esta función toma como parámetro una
cadena de caracteres que contiene el nombre del archivo. Es importante que compruebe si el
archivo existe antes de eliminarlo; de lo contrario, PHP generará un error.
Por ejemplo:
<?php
if(file_exists("archivo.txt")){
unlink("archivo.txt");
}
?>
La función rename() permite volver a nombrar un archivo. Esta función toma como
parámetro una cadena de caracteres que contiene el antiguo nombre del archivo y otra
www.FreeLibros.me
http://www.eni-training.com/client_net/mediabook.aspx?idR=87316 10/15
24/4/2014 ENI Training - Libro online
Por ejemplo:
<?php
if(file_exists("archivo.txt")){
rename("archivo.txt","nuevo_archivo.txt");
}
?>
La función filesize() devuelve el tamaño del archivo. Esta función toma como parámetro
una cadena de caracteres que contiene el nombre del archivo.
Por ejemplo:
<?php
echo filesize("archivo.txt");
?>
Da como resultado:
23
8. Manipulación de directorios
Esta parte utiliza conceptos de POO (Programación Orientada Objetos). En el capítulo El objeto se
explican los requisitos para entender las sintaxis.
La función dir() devuelve una instancia de la clase Directory. Es decir, esta función va a
poner el cursor en un directorio lo que permitirá que a continuación pueda leerse ese
directorio. Esta función toma como parámetro una cadena de caracteres que contiene la ruta
del directorio.
Por ejemplo, si quiere leer los archivos contenidos en el directorio C:\Program Files\EasyPHP-DevServer-
13.1VC11\data\localweb:
<?php
?>
Da como resultado:
www.FreeLibros.me
http://www.eni-training.com/client_net/mediabook.aspx?idR=87316 11/15
24/4/2014 ENI Training - Libro online
Cursor: Recurso id #3
..
archivo.txt
prueba.php
La función dir() crea un objeto $directory que contiene las propiedades handle y path, que
tienen como valor la ruta de la carpeta. En el próximo capítulo veremos las nociones de objeto y
propiedad. Por ahora, recuerde que existe el método read(), que permite leer los archivos de un
directorio.
La función is_dir() devuelve true si el directorio existe y false si no. Esta función toma
como parámetro una cadena de caracteres que contiene el nombre del directorio.
Por ejemplo:
<?php
if (is_dir("/Program Files/EasyPHP-DevServer-13.1VC11\data\localweb")) {
echo "La carpeta existe.";
}
else {
echo "La carpeta no existe.";
}
?>
Da como resultado:
La carpeta existe.
La función opendir() permite abrir un directorio. Esta función toma como parámetro una
cadena de caracteres que contiene el nombre del directorio. Devuelve un cursor a su
directorio. Esta función se asocia con readdir(), que permite leer todos los archivos y los
subdirectorios de un directorio.
Por ejemplo:
<?php
?>
www.FreeLibros.me
http://www.eni-training.com/client_net/mediabook.aspx?idR=87316 12/15
24/4/2014 ENI Training - Libro online
Da como resultado:
archivo.txt
prueba.php
Por ejemplo, si en nuestro directorio localweb tenemos los dos archivos prueba.php y archivo.txt y un
subdirectorio llamado imagen:
<?php
?>
Da como resultado:
La función glob() devuelve una tabla que contiene todos los archivos de un directorio
respetando la máscara. Esta función toma como parámetro una cadena de caracteres que
contiene la máscara de los archivos que hay que devolver.
Por ejemplo, si en nuestro directorio localweb tenemos los dos archivos prueba.php y archivo.txt y un
subdirectorio llamado imagen:
<?php
$archivo = glob(’./*.txt’);
print_r($archivo);
?>
Da como resultado:
La máscara ./*.txt son todos los archivos de texto del directorio actual.
www.FreeLibros.me
http://www.eni-training.com/client_net/mediabook.aspx?idR=87316 13/15
24/4/2014 ENI Training - Libro online
Si quiere buscar todos los archivos .jpg del directorio imagen que se encuentra en el directorio actual,
es decir localweb, escriba el siguiente código:
<?php
$archivo = glob(’./imagen/*.jpg’);
print_r($archivo);
?>
A diferencia de Windows, la función glob distingue entre mayúsculas y minúsculas; por tanto, si
tiene archivos con una extensión JPG, el código anterior no los encontrará.
Por ejemplo, si en el directorio localweb hay dos archivos prueba.php y archivo.txt y un subdirectorio
llamado imagen:
<?php
?>
Da como resultado:
C:\Program Files\EasyPHP-DevServer-13.1VC11\data\localweb
C:\Program Files\EasyPHP-DevServer-13.1VC11\data\localweb\imagen
<?php
?>
Da como resultado:
C:\Program Files\EasyPHP-DevServer-13.1VC11\data\localweb
C:\Program Files\EasyPHP-DevServer-13.1VC11\data\localweb\css
www.FreeLibros.me
http://www.eni-training.com/client_net/mediabook.aspx?idR=87316 14/15
24/4/2014 ENI Training - Libro online
<?php
?>
Da como resultado:
C:\Program Files\EasyPHP-DevServer-13.1VC11\data\localweb\
Eliminación realizada.
La función dirname() devuelve la ruta matriz del nombre del directorio, una cadena de
caracteres que se ha pasado como parámetro.
Por ejemplo:
<?php
$ruta = "/EasyPHP-DevServer-13.1VC11/data/localweb/imagen";
$directorio = dirname($ruta);
echo $directorio;
?>
Da como resultado:
/EasyPHP-DevServer-13.1VC11\data\localweb
La función pathinfo() devuelve la ruta del nombre del directorio, una cadena de
caracteres que se ha pasado como parámetro.
Por ejemplo:
<?php
$tabla_info = pathinfo("/EasyPHP-DevServer-13.1VC11/data/localweb");
echo $tabla_info["dirname"]; //ruta
echo $tabla_info["basename"]; //directorio
echo $tabla_info["filename"]; //archivo
Da como resultado:
/EasyPHP-DevServer-13.1VC11/data
localweb
localweb
www.FreeLibros.me
http://www.eni-training.com/client_net/mediabook.aspx?idR=87316 15/15
24/4/2014 ENI Training - Libro online
Los includes
La función include() es muy útil porque permite llamar a otra página PHP en una página PHP. Si
marca include(’funciones.php’), equivale a pegar el código contenido en la página
funciones.php en el lugar donde llama a la función include(). Por tanto, esta función recibe como
parámetro el nombre de la página PHP que va a incluir.
Por ejemplo, supongamos que tiene una página PHP llamada variable.php que contiene el siguiente
código:
<?php
$apellido = "López";
$nombre = "Roberto";
?>
<?php
include("variable.php");
echo $nombre." ".$apellido;
?>
Da como resultado:
Roberto López
Si su archivo variable.php se encuentra en el directorio inc, el código para llamar a esta página es:
<?php
include("inc/variable.php");
echo $nombre." ".$apellido;
?>
La página PHP se puede especificar con una ruta relativa o absoluta. Una ruta absoluta se marca desde
la raíz del disco (por ejemplo, C:\Program Files\easy PHP), mientras que una ruta relativa se marca desde
el lugar donde se encuentra su archivo PHP. En el próximo capítulo verá que el archivophp.ini incluye una
directiva include_path que contiene la ruta de búsqueda de los archivos de inclusión.
El archivo que va a incluir puede tener la extensión inc y así recurrir a la variable.inc en lugar de la
variable.php. También puede contener solo HTML. Si tiene que insertar un menú en todas las páginas de
su sitio Web, cree un archivo menu.php que contenga su menú en HTML. Haga un include ("menu.php")
en todas las páginas de su sitio Web. Esto es muy importante para mantener el sitio; si realiza una
modificación en el menú, bastará con que la defina una sola vez para que dicha modificación se visualice
en todas partes.
La función include_once() evita que se repita varias veces la inclusión. Puede ocurrir que
su archivo include se llame involuntariamente en otro archivo include. Su sintaxis es la misma
que la de la función include().
www.FreeLibros.me
http://www.eni-training.com/client_net/mediabook.aspx?idR=87317 1/2
24/4/2014 ENI Training - Libro online
La función require_once() evita que se repita varias veces la inclusión de tipo require.
www.FreeLibros.me
http://www.eni-training.com/client_net/mediabook.aspx?idR=87317 2/2
24/4/2014 ENI Training - Libro online
Ejercicios
1. Enunciados
Cree un archivo de texto que almacene el número de veces que se visita una página.
Mueva tres imágenes a un directorio de imágenes y cree una página PHP que cree un archivo de texto que contenga el nombre y el tamaño de estas imágenes. A
continuación, copie estas imágenes en un directorio de archivo que esté al mismo nivel que el directorio de imágenes.
Cree una página que escriba en un archivo log.txt la fecha y la hora actual y que muestre en microsegundos el tiempo que se tarda en mover tres imágenes del
directorio de imágenes al directorio de archivo.
2. Soluciones
?>
<?php
//(C:\Program Files\EasyPHP-DevServer-13.1VC11\data\localweb\imagen)
while ($archivo = readdir($cursor)) { //mientras exista un
//archivo en el directorio
if ($archivo != "." && $archivo != "..") {
fputs($recurso,$archivo.’ ’); //inserción del
//nombre del archivo
fputs($recurso,filesize(’./imagenes/’.$archivo).’
bytes’.PHP_EOL); //inserción del tamaño del archivo
}
}
closedir($cursor);
}
}
fclose($recurso);
?>
www.FreeLibros.me
http://www.eni-training.com/client_net/mediabook.aspx?idR=87318 1/2
24/4/2014 ENI Training - Libro online
<?php
?>
www.FreeLibros.me
http://www.eni-training.com/client_net/mediabook.aspx?idR=87318 2/2
24/4/2014 ENI Training - Libro online
1. $GLOBALS
En el capítulo Funciones y estructuras de control - Las funciones, hemos visto que hay variables locales
y globales. Estas variables tienen un alcance determinado dependiendo de dónde se declaran.
En PHP existe la tabla $GLOBALS o "superglobal" que contiene valores válidos, sea cual sea su
alcance, es decir, en cualquier ubicación de la página PHP. Esta tabla tiene como índice el nombre de las
variables, y como valor, el valor de las variables.
Por ejemplo:
<?php
$nombre = "Juan";
$apellido = "Gómez";
funcion concatenada() {
$GLOBALS[’nombre’] = $GLOBALS[’nombre’] . " " . $GLOBALS[’apellido’];
}
?>
Da como resultado:
Juan Gómez
Si ha escrito en la función $nombre = $nombre . " " . $apellido; PHP generará un error debido a que
estas variables no tienen el alcance necesario para que la función las pueda conocer.
Puede pensar que resulta más sencillo declarar solo las variables superglobales, pero no es
así. Esto evita muchas confusiones a la hora de declarar las variables en modo local y sobre
todo ahorra mucha memoria si muchos usuarios visitan su sitio Web de manera simultánea; cada
variable $GLOBALS ocupará memoria en su servidor y correrá el riesgo de saturarse. Si utiliza
variables locales, PHP liberará la memoria que ya no se utiliza.
Más adelante veremos que existen otras variables superglobales. Se escriben siempre con mayúsculas,
en forma de tabla y son válidas en todas las páginas PHP.
2. $_SERVER
$_SERVER es una tabla que se crea automáticamente y que contiene información, como rutas del
script, encabezamientos, etc.
www.FreeLibros.me
http://www.eni-training.com/client_net/mediabook.aspx?idR=87320 1/10
24/4/2014 ENI Training - Libro online
Por ejemplo:
<?php
echo $_SERVER[’REMOTE_ADDR’];
?>
Da como resultado:
127.0.0.1
Si está trabajando con su equipo y su servidor Web crea la dirección http://127.0.0.1 y está ejecutando
esta página PHP, $_SERVER[’REMOTE_ADDR’] reenvía esta misma dirección.
Por ejemplo:
<?php
echo $_SERVER[’PHP_SELF’];
?>
Da como resultado:
/prueba.php
Estos métodos son: GET, POST, PUT y HEAD, y se explicarán más adelante.
Por ejemplo:
<?php
echo $_SERVER[’REQUEST_METHOD’];
?>
Da como resultado:
GET
Por ejemplo, si llama a la página PHP pasando como argumento una variable var igual a 1, es decir,
http://127.0.0.1/prueba.php?var=1:
<?php
echo $_SERVER[’QUERY_STRING’];
www.FreeLibros.me
http://www.eni-training.com/client_net/mediabook.aspx?idR=87320 2/10
24/4/2014 ENI Training - Libro online
?>
Da como resultado:
var=1
Por ejemplo:
<?php
echo $_SERVER[’HTTP_USER_AGENT’];
?>
Da como resultado:
Por ejemplo:
<?php
echo $_SERVER[’HTTP_ACCEPT_LANGUAGE’];
?>
Da como resultado:
es_ES
Por ejemplo:
<?php
echo $_SERVER[’HTTP_HOST’];
?>
Da como resultado:
127.0.0.1
www.FreeLibros.me
http://www.eni-training.com/client_net/mediabook.aspx?idR=87320 3/10
24/4/2014 ENI Training - Libro online
3. $_ENV
Esta tabla contiene las variables de entorno del sistema operativo, como el nombre de usuario y del
equipo. Tenga cuidado al comprobar si php.ini tiene variables_order = "EGPCS". En el siguiente
capítulo explicaremos el contenido de este archivo, al que se accede a través del menúConfiguration -
PHP. A continuación, debe reiniciar el servidor Web una vez que guarde el archivo.
Por ejemplo:
<?php
echo $_ENV[’USERNAME’];
?>
Da como resultado:
Juan Gómez
Por ejemplo:
<?php
echo $_ENV[’COMPUTERNAME’];
?>
Da como resultado:
EQUIPO 1
$_ENV[’OS’]: permite conocer el sistema operativo de la persona que ejecuta esta página
PHP.
Por ejemplo:
<?php
echo $_ENV[’OS’];
?>
Da como resultado:
Windows_NT
Si introduce el siguiente código, podrá obtener todos los valores de la tabla $_ENV:
www.FreeLibros.me
http://www.eni-training.com/client_net/mediabook.aspx?idR=87320 4/10
24/4/2014 ENI Training - Libro online
<?php
echo ’<pre>’;
print_r($_ENV);
echo ’</pre>’;
?>
Da como resultado:
Array
(
4. $_SESSION
Una sesión es un archivo que se almacena en el servidor de cada una de las personas que se conectan
en su sitio Web. Se destruye automáticamente cuando la persona abandona el sitio Web.
$_SESSION es una tabla asociativa que permite almacenar cualquier valor de cada usuario. Esta tabla
es válida en todas las páginas PHP del sitio Web y permite pasar variables de una página a otra. Tenga
cuidado con no abusar de ella, porque si se conecta mucha gente en su sitio Web puede llenar la
memoria del servidor Web.
Antes de utilizar $_SESSION, es imprescindible reiniciar la sesión o llamar a una sesión existente en
cada página donde quiera utilizar $_SESSION. Esto se denomina session_start();.
La función session_destroy() sirve para destruir la sesión actual. Tenga cuidado porque esta función
no destruye las variables de la sesión asociadas a la sesión actual. Debe utilizar también
lafunción unset($_SESSION). La sesión se destruirá automáticamente cuando el usuario cierre la
ventana de su navegador.
<?php
session_start();
$_SESSION[’nombre’] = ’Juan’;
?>
Da como resultado:
La página prueba.php contiene un botón que envía a la página mostrar_sesion.php. En esta página
aparece el siguiente código:
<?php
session_start();
www.FreeLibros.me
http://www.eni-training.com/client_net/mediabook.aspx?idR=87320 5/10
24/4/2014 ENI Training - Libro online
?>
Da como resultado:
5. $_COOKIE
Una cookie es un archivo que contiene información que se almacena en el equipo del visitante. Cada
navegador utiliza sus propias cookies. Se pueden almacenar durante varios meses y, por ejemplo,
permite mostrar automáticamente su nombre de usuario cuando vuelve a un sitio Web. No almacene
información crítica ya que el usuario puede acceder fácilmente a una parte de estos archivos. Por otro
lado, si una persona prohíbe las cookies en su navegador, su sitio Web no le funcionará.
$_COOKIE también es una tabla global; por lo tanto, es válido en todas las páginas de su sitio Web.
<?php
$_COOKIE[’nombre’] = ’Juan’;
?>
Da como resultado:
La página prueba.php contiene un botón que envía a la página mostrar_cookie.php. En esta página el
código es:
<?php
?>
Da como resultado:
<?php
www.FreeLibros.me
http://www.eni-training.com/client_net/mediabook.aspx?idR=87320 6/10
24/4/2014 ENI Training - Libro online
setcookie("nombre","Juan");
//¡Recargar la página!
if (isset($_COOKIE[’nombre’])) { //comprueba si la cookie está
presente
echo "El nombre en cookie es:".$_COOKIE[’nombre’];
}
?>
Da como resultado:
Este tiempo se expresa en segundos con la función time(), que reenvía el tiempo actual en segundos
y el tiempo en segundos tras el cual su cookie se eliminará. Si no marca un tiempo de expiración, la
cookie se destruirá cuando se cierre el navegador.
Por ejemplo:
<?php
//¡Recargar la página!
if (isset($_COOKIE[’nombre’])) { //comprueba si la cookie está
presente
echo "El nombre en cookie es:".$_COOKIE[’nombre’];
}
?>
Da como resultado:
Esta cookie es válida durante un año en su navegador, salvo que decida eliminar manualmente todas
las cookies de su navegador.
De momento hemos visto cómo se almacena una cadena de caracteres o un número. También puede
almacenar una cookie en una tabla. Solo tiene que serializar, es decir, transformar la tabla en una
cadena de caracteres. Para mostrar los valores nuevamente, deberá deserializar.
Por ejemplo:
<?php
$tabla = array(’Juan’,’Roberto’,Ana);
www.FreeLibros.me
http://www.eni-training.com/client_net/mediabook.aspx?idR=87320 7/10
24/4/2014 ENI Training - Libro online
a 1 año
$cadena_serializada = serialize($tabla); //serialización de la tabla
setcookie("serializa",$cadena_serializada,time()+$tiempo_expiracion);
//¡Recargar la página!
if (isset($_COOKIE["serializa"])) { //comprueba si la cookie está
presente
$nueva_tabla = unserialize($_COOKIE["serializa"]);//deserializa
print_r($nueva_tabla); //muestra los valores de la tabla
}
?>
Da como resultado:
Array ( [0] => Juan [1] => Roberto [2] => Ana )
6. $_FILES
$_FILES es una tabla asociativa que contiene información de archivos que se han transmitido al
servidor Web.
Esta tabla contiene el nombre, el tipo, el nombre temporal, el error y el tamaño del archivo que se ha
enviado.
Por ejemplo:
Da como resultado:
www.FreeLibros.me
http://www.eni-training.com/client_net/mediabook.aspx?idR=87320 8/10
24/4/2014 ENI Training - Libro online
Observe también el campo oculto cuyo nombre es MAX_FILE_SIZE. Este campo sirve para definir el
tamaño máximo del archivo que va a transmitir. Pero tenga cuidado, ya que no todos los navegadores
tienen en cuenta este campo; por lo tanto, por seguridad se recomienda configurar este tamaño
máximo en el archivo PHP.ini introduciendo upload_max_file-size = 2M. Si supera este límite, el
servidor Web devuelve un error. El archivo PHP.ini también permite configurar otras opciones relativas a
archivos que se han transmitido. La propiedad file_uploads permite autorizar o no el envío de archivos.
La propiedad upload_tmp_dir permite definir el directorio temporal que almacena el archivo que se ha
transmitido. La propiedad post_max_size permite definir el tamaño máximo de los datos que ha
enviado el formulario (imagen + texto). La propiedadpost_max_size siempre tiene que ser mayor
que upload_max_filesize.
Observe el código de la página upload.php a la que se llama en la acción del formulario y que permite
recibir toda la información sobre el archivo que se transmite.
Array
(
[photo] => Array
(
[name] => Hydrangeas.jpg
[type] => imagen/pjpeg
[tmp_name] => C:\Program Files\EasyPHP-DevServer-13.1VC11\
binarias\tmp\php2AO.tmp
[error] => 0
[size] => 595284
)
)
Si se produce un error y desea mostrar el tipo de error y a continuación mover el archivo a un directorio
específico:
<?php
if ($_FILES[’photo’][’error’]) {
switch ($_FILES[’photo’][’error’]){
case 1: // UPLOAD_ERR_INI_SIZE
www.FreeLibros.me
http://www.eni-training.com/client_net/mediabook.aspx?idR=87320 9/10
24/4/2014 ENI Training - Libro online
echo "El tamaño del archivo supera el límite permitido
por el servidor (argumento upload_max_filesize del archivo
php.ini).";
break;
case 2: // UPLOAD_ERR_FORM_SIZE
echo " El tamaño del archivo supera el límite permitido
por el formulario (argumento post_max_size del archivo php.ini).";
break;
case 3: // UPLOAD_ERR_PARTIAL
echo "El envío del archivo se ha interrumpido durante
la transferencia.";
break;
case 4: // UPLOAD_ERR_NO_FILE
echo "El tamaño del archivo que ha enviado es nulo.";
break;
}
}
else {
//si no hay error entonces $_FILES[’nombre del_archivo’][’error’] es 0
echo "No hay error en la carga del archivo.<br />";
if ((isset($_FILES[’photo’][’name’])&&($_FILES[’photo’][’error’] ==
UPLOAD_ERR_OK))) {
$ruta destino = ’archivos/’;
//desplazamiento del archivo del directorio temporal (almacenado
//por defecto) al directorio de destino con la función
//move_uploaded_file($archivo_uploaded,
$carpeta_nombre_archivo_destino)
move_uploaded_file($_FILES[’photo’][’tmp_name’],
$ruta_destino.$_FILES[’photo’][’name’]);
echo "El archivo ".$_FILES[’photo’][’name’]." se ha copiado
en el directorio archivos";
}
else {
echo "El archivo no se ha podido copiar en el directorio
archivos.";
}
}
?>
Da como resultado:
www.FreeLibros.me
http://www.eni-training.com/client_net/mediabook.aspx?idR=87320 10/10
24/4/2014 ENI Training - Libro online
El método GET
Cuando instala su página PHP en su servidor Web después de comprar un nombre de dominio, como
www.sitio.es, obtendrá lo siguiente: http://www.sitio.es/prueba.php
Si pasa de una página PHP a otra, se pierde toda la información de la primera página. Para guardar
esta información, puede transmitirla a la URL que llama a la segunda página PHP.
Añada el signo de interrogación después del nombre de la página PHP, el nombre de la variable, el
símbolo = y su valor. Para añadir otras variables con sus valores, añada el símbolo &, el nombre de la
variable, el símbolo =, su valor, etc.
No se recomienda tener más de 256 caracteres en la URL; por lo tanto, este método tiene sus
limitaciones.
En el siguiente ejemplo, se crean dos páginas PHP, get_envia.php y get_recibe.php para transmitir los
datos de una página a otra.
Esta página contiene un enlace que llama la página get_recibe.php con los valores apellido y nombre,
así como sus respectivos valores.
Esta tabla tiene el nombre de las variables pasadas en la URL, y como valor el valor de estas variables
que se pasanen la URL.
www.FreeLibros.me
http://www.eni-training.com/client_net/mediabook.aspx?idR=87321 1/7
24/4/2014 ENI Training - Libro online
<head>
<title>Ejercicio con GET</title>
<meta http-equiv="Content-Type" content="text/html;
charset=iso-8859-1" />
</head>
<body>
<?php
?>
</body>
</html>
Da como resultado:
Ahora cambie en la URL de su navegador el valor del nombre y escriba Pedro en lugar de Juan:
http://127.0.0.1/get_recibe.php?apellido=Gómez&nombre=Pedro
Da como resultado:
Cualquier persona que vaya a su sitio Web puede cambiar el valor de estas variables pasadas en la
URL, y esto puede ser muy peligroso. Por lo tanto, evite este método de transmisión de datos.
Puede, eso sí, utilizar este método para pasar como argumento la visualización de un mensaje o
cualquier cosa que no suponga un riesgo en su aplicación.
Para evitar este error, debe comprobar si $_GET[’apellido’] y $_GET[’nombre’] están vacíos.
www.FreeLibros.me
http://www.eni-training.com/client_net/mediabook.aspx?idR=87321 2/7
24/4/2014 ENI Training - Libro online
Vamos a utilizar la función isset(), que permite comprobar si una variable está vacía o no.
?>
</body>
</html>
con get_recibe.php:
if (isset($_GET["numero"])) {
for ($i=1;$i <= $_GET["numero"];$i++) {
echo "¡Hola!"."<br />";
www.FreeLibros.me
http://www.eni-training.com/client_net/mediabook.aspx?idR=87321 3/7
24/4/2014 ENI Training - Libro online
}
}
else {
echo "El número no se especifica.";
}
?>
</body>
</html>
Da como resultado:
¡Hola!
¡Hola!
¡Hola!
¡Hola!
¡Hola!
Ahora bien, si alguien escribe en la URL número=azerty, el código no muestra nada. Pero si
escribe número=121654165131321, su código va a intentar hacer el bucle 121654165131321veces
y esto puede provocar un error o bloquear su sitio Web.
Para evitar que esto ocurra, debe convertir $_GET["numero"] en numérico y comprobar que está
dentro de un cierto rango de valores.
?>
</body>
</html>
www.FreeLibros.me
http://www.eni-training.com/client_net/mediabook.aspx?idR=87321 4/7
24/4/2014 ENI Training - Libro online
4. Información complementaria
Si pasa en la URL dos argumentos con el mismo nombre, $_GET va a tener en cuenta el último
nombre.
Por ejemplo:
Da como resultado:
El nombre es:Roberto
Por ejemplo:
www.FreeLibros.me
http://www.eni-training.com/client_net/mediabook.aspx?idR=87321 5/7
24/4/2014 ENI Training - Libro online
<title>Ejercicio con GET</title>
<meta http-equiv="Content-Type" content="text/html;
charset=iso-8859-1" />
</head>
<body>
<?php
Da como resultado:
El servidor Web entenderá que hay dos variables argumento y Gómez, cuando lo que quiere hacer es
pasar como argumento Juan&Gómez.
Para realizar esto, debe codificar la URL, es decir, transformar los caracteres especiales en un código
que el servidor Web pueda entender.
Estas funciones toman como argumento la URL que debe codificar y devuelven la URL sin los
caracteres especiales. Se diferencian en que la función rawurlencode() transforma los espacios en
%20, mientras que la función urlencode() los transforma en +.
Por ejemplo:
<?php
?>
Da como resultado:
Juan%26Gómez+Pablo
Juan%26Gómez%20Pablo
Para pasar como argumento el valor "Juan&Gómez Pablo", debe escribir la siguiente URL:
http://127.0.0.1/get_recibe.php?argumento=Juan%26Gómez%20Pablo
Otro ejemplo:
www.FreeLibros.me
http://www.eni-training.com/client_net/mediabook.aspx?idR=87321 6/7
24/4/2014 ENI Training - Libro online
La página get_envia.php contiene un enlace que llama a la página get_recibe.php con el argumento
Juan&Gómez.
</body>
</html>
<a href="get_recibe.php?argumento=Juan%26Gómez">
get_recibe.php con argumento</a>
La página get_recibe.php:
Da como resultado:
El argumento es:Juan&Gómez
www.FreeLibros.me
http://www.eni-training.com/client_net/mediabook.aspx?idR=87321 7/7
24/4/2014 ENI Training - Libro online
El método POST
Todos los datos que están contenidos en un formulario se envían a la otra página PHP a través del
método POST y se reciben en una tabla superglobal $_POST.
Para entenderlo mejor, vamos a crear una página PHP con el nombre formulario.php que contiene un
formulario con el nombre y el apellido.
Observe que en la etiqueta <form> está el atributo method con el valor POST, que es obligatorio para
transmitir los valores que se han introducido en el formulario. Si escribe method=GET, los datos que se
han introducido se transmiten a la URL.
www.FreeLibros.me
http://www.eni-training.com/client_net/mediabook.aspx?idR=87322 1/17
24/4/2014 ENI Training - Libro online
A continuación, la etiqueta <form> debe contener la acción, es decir, el nombre de la página PHP al
que se llama cuando hace clic en enviar (que es de tipo submit).
Cuando hace clic en enviar, todos los valores de los objetos que están en el formulario se envían a la
página recibe_post.php, que los recibe en la tabla $_POST.
Si escribe en la página formulario.php Juan en el nombre y Gómez en el apellido, haga clic en enviary
obtendrá lo siguiente:
Nombre:Juan
Apellido:Gómez
www.FreeLibros.me
http://www.eni-training.com/client_net/mediabook.aspx?idR=87322 2/17
24/4/2014 ENI Training - Libro online
El atributo value es opcional. Representa el valor que se muestra en la zona de texto. En todas las
zonas del formulario, el atributo name es obligatorio, ya que representa la clave de la
tabla$_POST que permite recuperar el valor de la zona de texto.
<?php
echo $_POST["campo1"];
?>
Da como resultado:
valor1
www.FreeLibros.me
http://www.eni-training.com/client_net/mediabook.aspx?idR=87322 3/17
24/4/2014 ENI Training - Libro online
Cuando hace clic en enviar, la página formulario.php transmite el valor que ha introducido en la zona
de texto a la página recibe_post.php, que recupera este valor en la tabla $_POST y lo muestra.
<?php
echo $_POST["campo1"];
?>
Da como resultado:
valor1
c. Área de texto
www.FreeLibros.me
http://www.eni-training.com/client_net/mediabook.aspx?idR=87322 4/17
24/4/2014 ENI Training - Libro online
<textarea name="campo1">valor1</textarea>
El valor se escribe por defecto entre las etiquetas <textarea> y </textarea>, y no en value.
<?php
echo $_POST["campo1"];
?>
Da como resultado:
valor1
www.FreeLibros.me
http://www.eni-training.com/client_net/mediabook.aspx?idR=87322 5/17
24/4/2014 ENI Training - Libro online
<select name="pais">
<option value="F">Francia</option>
<option value="E">España</option>
<option value="R">Rusia</option>
</select>
<?php
echo $_POST["pais"];
?>
<select name="pais">
<option>Francia</option>
<option>España</option>
<option>Rusia</option>
</select>
<?php
echo $_POST["pais"];
?>
España
Puede introducir el atributo selected="selected" en la opción que permite mostrar un país por
defecto.
<select name="pais">
<option>Francia</option>
<option selected="selected">España</option>
<option>Rusia</option>
</select>
www.FreeLibros.me
http://www.eni-training.com/client_net/mediabook.aspx?idR=87322 6/17
24/4/2014 ENI Training - Libro online
El nombre se escribe con corchetes para indicar que el valor que se ha enviado con POST es de tipo
tabla. De hecho, como hay muchas opciones, no podrá recuperar estos valores en una variable. Por lo
tanto, la tabla se utiliza para recuperar los valores que ha seleccionado.
<?php
if (isset($_POST["pais"])) {//para que no haya error si
//no selecciona ningún país
echo "Los países seleccionados son:";
print_r ($_POST["pais"]);
} else {
echo "ningún país seleccionado.";
}
?>
www.FreeLibros.me
http://www.eni-training.com/client_net/mediabook.aspx?idR=87322 7/17
24/4/2014 ENI Training - Libro online
<select name="pais[]"multiple="multiple">
<option>Francia</option>
<option>España</option>
<option>Rusia</option>
<option>Alemania</option>
</select>
<?php
if (isset($_POST["pais"])) {//para que no haya error si
//no selecciona ningún país
echo "Los países seleccionados son:";
foreach ($_POST["pais"] as $valor) {
echo $valor." ";
}
} else {
echo "ningún país seleccionado.";
}
?>
www.FreeLibros.me
http://www.eni-training.com/client_net/mediabook.aspx?idR=87322 8/17
24/4/2014 ENI Training - Libro online
El nombre se escribe con corchetes para indicar que el valor que se ha enviado con POST es de tipo
tabla. De hecho, como hay varias opciones, no se permite recuperar estos valores en una variable.
Por lo tanto, se utiliza una tabla para recuperar los valores que ha seleccionado.
<?php
if (isset($_POST["pais"])) {//para que no haya error si
//no selecciona ningún país
echo "Los países seleccionados son:";
print_r ($_POST["pais"]);
} else {
echo "ningún país seleccionado.";
}
?>
El atributo value no es obligatorio, al igual que en las listas, ya que puede recuperar la elección del
usuario con ayuda de las claves de la tabla:
www.FreeLibros.me
http://www.eni-training.com/client_net/mediabook.aspx?idR=87322 9/17
24/4/2014 ENI Training - Libro online
<?php
if (isset($_POST["pais"])) {//para que no haya error si
//no selecciona ningún país
echo "Los países seleccionados son:";
foreach ($_POST["pais"] as $clave => $valor) {
echo $clave."->".$valor." ";
}
} else {
echo "ningún país seleccionado.";
}
?>
www.FreeLibros.me
http://www.eni-training.com/client_net/mediabook.aspx?idR=87322 10/17
24/4/2014 ENI Training - Libro online
El atributo name debe ser el mismo en todo el grupo de sus botones de opción.
El código PHP que permite recibir el valor del botón de opción es:
<?php
if (isset($_POST["pais"])) {//para que no haya error si
//no selecciona ningún país
echo "El país seleccionado es:";
echo $_POST["pais"];
} else {
echo "ningún país seleccionado.";
}
?>
www.FreeLibros.me
http://www.eni-training.com/client_net/mediabook.aspx?idR=87322 11/17
24/4/2014 ENI Training - Libro online
<input type="radio" name="pais" value="F" />Francia<br />
<input type="radio" name="pais" value="E" checked="checked"/>España<br />
<input type="radio" name="pais" value="R" />Rusia<br />
<input type="radio" name="pais" value="A" />Alemania
Este campo no aparece en la pantalla. Almacena valores invisibles para el usuario. Atención, el
usuario puede mostrar todavía el origen de la página Web y ver el valor que se ha almacenado en
este campo.
El código PHP que permite recibir el valor del campo oculto es:
<?php
echo $_POST["campo1"];
?>
Da como resultado:
valor1
i. El botón submit
Este campo es obligatorio en el formulario para poder enviar los datos con POST.
<?php
echo $_POST["boton"];
?>
Da como resultado:
enviar
El atributo name no es obligatorio para enviar el formulario. Solo es necesario si hay varios botones
de tipo submit. De hecho, puede enviar un formulario con JavaScript.
www.FreeLibros.me
http://www.eni-training.com/client_net/mediabook.aspx?idR=87322 12/17
24/4/2014 ENI Training - Libro online
<head>
<title>Ejemplo con POST</title>
<meta http-equiv="Content-Type" content="text/html;
charset=iso-8859-1" />
</head>
<body>
<form action="recibe_post.php" method="POST" name="formulario">
<h2>Formulario de envío de radio-buttons</h2>
eleccion del pais: <br /><input type="radio" name="pais" value="F"
/>Francia<br />
<input type="radio" name="pais" value="E" />España<br />
<input type="radio" name="pais" value="R" />Rusia<br />
<input type="radio" name="pais" value="a" />Alemania<br /><br />
<input type="submit" name="enviar" value="enviar" />
<input type="submit" name="enviar" value="cancelar" />
</form>
</body>
</html>
echo $_POST["enviar"];
?>
</body>
</html>
O
enviar
cancelar
Esto permite ejecutar diferentes acciones según el botón en el que hace clic.
www.FreeLibros.me
http://www.eni-training.com/client_net/mediabook.aspx?idR=87322 13/17
24/4/2014 ENI Training - Libro online
<SCRIPT language="JAVASCRIPT">
function enviar_formulario() {
document.formulario.action="recibe_post.php";
document.formulario.submit();
}
</SCRIPT>
</head>
<body>
<form method="POST" name="formulario">
<h2>Formulario de envío de radio-buttons</h2>
eleccion del pais: <br /><input type="radio" name="pais" value="F"
/>Francia<br />
<input type="radio" name="pais" value="E" />España<br />
<input type="radio" name="pais" value="R" />Rusia<br />
<input type="radio" name="pais" value="a" />Alemania<br /><br />
<input type="button" name="enviar" value="enviar"
OnClick="enviar_formulario();"/>
</form>
</body>
</html>
En este caso, es un botón normal de tipo button, el que ejecuta la función Java-
Scriptenviar_formulario(). Esta función define la acción y presenta el formulario. Esto es muy
útil para validar campos antes de enviar el formulario.
El código de la página completa recibe_post.php permite saber si se ha hecho clic en un botón de tipo
submit:
Da como resultado:
j. El botón reset
www.FreeLibros.me
http://www.eni-training.com/client_net/mediabook.aspx?idR=87322 14/17
24/4/2014 ENI Training - Libro online
Este botón sirve para borrar todos los valores que se han introducido, comprobado o seleccionado en
el formulario.
k. Formulario completo
A continuación se muestra el código que contiene todos los controles de entrada posibles de un
formulario:
www.FreeLibros.me
http://www.eni-training.com/client_net/mediabook.aspx?idR=87322 15/17
24/4/2014 ENI Training - Libro online
<meta http-equiv="Content-Type" content="text/html;
charset=iso-8859-1" />
</head>
<body>
<form action="recibe_post.php" method="POST" name="formulario">
<h2>Formulario general de envío</h2>
nombre:<input type="text" name="nombre" /><br />
contraseña:<input type="text" name="password" /><br /> <br />
nacionalidad:<select name="nacionalidad">
<option value="F">Francesa</option>
<option value="E">Española</option>
<option value="R">Rusa</option>
<option value="A">Alemana</option>
</select><br /><br />
La página PHP recibe_post.php que permite mostrar todos los datos introducidos es:
www.FreeLibros.me
http://www.eni-training.com/client_net/mediabook.aspx?idR=87322 16/17
24/4/2014 ENI Training - Libro online
foreach ($_POST["pais"] as $clave => $valor) {
echo $valor." ";
}
} else {
echo "ningún país seleccionado.";
}?>
<br />
idiomas:<?php if (isset($_POST["idioma"])) {//para que no
// haya error si no selecciona ningún país
foreach ($_POST["idioma"] as $clave => $valor) {
echo $valor." ";
}
} else {
echo "ningún idioma seleccionado.";
}?>
<br />
campo oculto: <?php echo $_POST["campo oculto"];?><br />
comentario: <?php echo $_POST["comentario"];?><br />
</body>
</html>
www.FreeLibros.me
http://www.eni-training.com/client_net/mediabook.aspx?idR=87322 17/17
24/4/2014 ENI Training - Libro online
Otros métodos
1. El método $_REQUEST
$_REQUEST es una tabla asociativa que reagrupa los métodos $_GET, $_POST y $_COOKIE. Esta
tabla también es superglobal; por lo tanto, es accesible en todos los scripts PHP. Si los datos se envían
con POST, GET o COOKIE, se pueden recuperar con $_REQUEST.
En el siguiente ejemplo, la página formulario.php contiene dos botones : uno para enviar los datos con
POST y el otro con GET.
document.location.href="recibe_post.php?nombre="+documento.formulario.
nombre.value+"&nombre="+documento.formulario.nombre.value;
}
</SCRIPT>
</head>
<body>
<form action="recibe_post.php" method="POST" name="formulario">
<h2>Formulario para enviar el nombre y los apellidos</h2>
Nombre: <input type="text" name="nombre" /><br />
Apellidos: <input type="text" name="apellidos" /><br />
<input type="submit" name="enviarPOST" value="Enviar por POST" />
<input type="button" name="enviarGET" value="Enviar por GET"
onClick="enviar_formulario()"/>
www.FreeLibros.me
http://www.eni-training.com/client_net/mediabook.aspx?idR=87323 1/2
24/4/2014 ENI Training - Libro online
</form>
</body>
</html>
El método $_REQUEST, que recupera los datos de la tabla $_GET y de la tabla $_POST, se puede
utilizar para recibir los datos de las dos tablas al mismo tiempo.
Si hace clic en enviar por GET o en enviar por POST, da como resultado:
Su apellido es:MORALES
Su nombre es:David
www.FreeLibros.me
http://www.eni-training.com/client_net/mediabook.aspx?idR=87323 2/2
24/4/2014 ENI Training - Libro online
Por ejemplo:
El valor que se introduce en la zona junto al nombre se transmite por $ POST, ya que las dos zonas se
denominan nombre.
www.FreeLibros.me
http://www.eni-training.com/client_net/mediabook.aspx?idR=87324 1/1
24/4/2014 ENI Training - Libro online
Por ejemplo:
Si pulsa en el botón enviar1, solo se envían los valores de los campos nombre1 y apellido1.
www.FreeLibros.me
http://www.eni-training.com/client_net/mediabook.aspx?idR=87325 1/1
24/4/2014 ENI Training - Libro online
1. Introducción
Los datos introducidos en un formulario no son seguros. De hecho, los usuarios pueden escribir letras
cuando solicita una edad o introducir un código SQL que puede destruir su nombre. Esta última acción
se denomina inyección SQL. Para evitar que un usuario pueda hacer inoperativo su sitio Web, es
necesario proteger los datos introducidos. Se puede comprobar en JavaScript (lado cliente) que los
datos introducidos se corresponden con lo que quiere, pero no es el propósito ni es suficiente. También
debe codificar las comprobaciones en PHP (lado servidor) antes de guardar los datos en la base de
datos.
2. Datos obligatorios
Esta prueba consiste en comprobar si el usuario ha reasignado una zona del formulario.
Las zonas de tipo texto, textarea, hidden y password se comprueban de la siguiente manera:
<?php
//Suponiendo que el formulario contenga el campo nombre
if ($_POST[’nombre’]!= ’’) {
echo "Su nombre es".$_POST[’nombre’];
}
else
{
echo "El nombre no se ha introducido.";
}
?>
<?php
//Suponiendo que el formulario contenga una lista llamada pais
if (isset($_POST[’pais’]) == true) {
echo "Los países son:";
print_r ($_POST[’pais’]);
}
else
{
echo "El país no se ha seleccionado.";
}
?>
Para evitar esto, añada la función trim(), que elimina los espacios y a continuación el valor.
<?php
//Suponiendo que el formulario contenga el campo apellido
www.FreeLibros.me
http://www.eni-training.com/client_net/mediabook.aspx?idR=87326 1/5
24/4/2014 ENI Training - Libro online
if (trim($_POST[’apellido’])!= ’’) {
echo "Su apellido es:".trim($_POST[’apellido’]);
}
?>
4. Longitud máxima
Esta vez el problema es la longitud de la cadena de caracteres que recupera con POST. Por ejemplo, el
apellido no debe contener más de 20 caracteres, ya que la base de datos no lo acepta. Puede realizar
una comprobación inicial introduciendo el atributo maxlength=20 en la etiqueta <input type=
"text" />, pero no es suficiente. También debe realizar el control del servidor en PHP:
<?php
//Suponiendo que el formulario contenga un campo apellido
$apellido = trim($_POST[’apellido’]);
if (strlen($apellido) <= 20) {
echo "Su apellido es:".$apellido;
}
else
{
echo "El apellido contiene más de 20 caracteres.";
}
?>
5. Caracteres permitidos
Una vez que haya comprobado que sus datos no están vacíos y que la longitud es correcta, debe
revisar que no contengan caracteres no permitidos. Por ejemplo, la edad no debe contener letras y el
correo electrónico debe incluir un punto (.) y @. Para realizar esto correctamente, utilice las expresiones
regulares que hemos visto con anterioridad.
Por ejemplo, para comprobar que la contraseña contiene letras y cifras entre 4 y 8 caracteres:
<?php
?>
<?php
www.FreeLibros.me
http://www.eni-training.com/client_net/mediabook.aspx?idR=87326 2/5
24/4/2014 ENI Training - Libro online
else
{
echo "El número no es válido.";
}
?>
<?php
6. Magic quotes
Los datos que recupera por $_GET o $_POST se pueden utilizar para insertarlos en una base de datos.
Para ello, utilice el lenguaje SQL y así podrá crear una consulta SQL como la siguiente:
Puede surgir un problema si el usuario introduce una cadena de caracteres que contiene un apóstrofo,
por ejemplo: L’Hospitalet.
Magic quotes es una funcionalidad PHP que se puede argumentar en el archivo php.ini, y permite
proteger automáticamente los datos que han transmitido GET, POST o COOKIE.
Esta función evita los caracteres especiales, es decir, añade el carácter \ (barra invertida) delante de
’ (apóstrofos), " (comillas), \ (barras invertidas) y NULL.
Sin embargo, esta funcionalidad está obsoleta desde la versión 5.3.0 de PHP y ya no existe desde la
versión 5.4. Se recomienda que usted mismo asigne los caracteres especiales. Para desactivar magic
quotes, introduzca el valor magic_quotes_gpc = Off en el archivo php.ini.
La función addslashes() desempeña la misma tarea, ya que evita los caracteres especiales.
Para evitar que un usuario guarde scripts maliciosos, utilice la función htmlspecialchars(), que
www.FreeLibros.me
http://www.eni-training.com/client_net/mediabook.aspx?idR=87326 3/5
24/4/2014 ENI Training - Libro online
El juego de caracteres es UTF-8, en lugar de ISO-8859-1 desde la versión PHP5.5 por defecto.
La doble codificación permite codificar una cadena que ya está codificada si el valor es true.
La función htmlspecialchars_decode() permite la conversión inversa.
En el siguiente ejemplo, el código que recibe los datos está protegido correctamente:
<?php
//Suponiendo que el formulario contenga un área password
$password = htmlspecialchars (addslashes(trim($_POST[’password’])));
echo "Puede poner la variable $password en su consulta SQL.";
$sql = "INSERT INTO client (apellido, password) VALUES
(’GÓMEZ’,’".$password."’)";
?>
7. Redirección de página
A veces es muy útil llamar una página PHP sin hacer clic en un botón. Para ello puede redireccionar una
página PHP con la función header().
Para redireccionar una página PHP o HTML, debe utilizar el atributo location de la
función header().
Por ejemplo:
<?php
header("Location:http://www.google.es"); // Redirecciona a
// http://www.google.es
?>
O bien:
<?php
header("Location:redireccion.php"); // Redirecciona la página
// redireccion.php
?>
www.FreeLibros.me
http://www.eni-training.com/client_net/mediabook.aspx?idR=87326 4/5
24/4/2014 ENI Training - Libro online
<?php
header("Location:redireccion.php?apellido=Gómez&nombre=Juan");
// Redirecciona la página redireccion.php que pasa apellido y nombre
// como argumento
?>
Para llamar las páginas PHP en URL absoluta, debe utilizar las variables
globales $_SERVER[’HTTP_HOST’] que dan el nombre del servidor
y $_SERVER[’PHP_SELF’] que dan la ruta y el nombre de la página PHP actual:
<?php
$url_absoluta = "http://".$_SERVER[’HTTP_HOST’].rtrim(dirname($_SERVER
[’PHP_SELF’]),’/\\’).’ /redireccion.php’;
header("Location:".$url_absoluta); // Redirecciona la página
// redireccion.php
?>
La función header() envía las consultas http a la página HTML y las acciones se explican en el
siguiente sitio Web: http://php.net/manual/es/function.header.php
Su página PHP no debe contener código HTML y por tanto ningún echo antes de utilizar la
función header, ya que provoca un error.
www.FreeLibros.me
http://www.eni-training.com/client_net/mediabook.aspx?idR=87326 5/5
24/4/2014 ENI Training - Libro online
Ejercicios
1. Enunciados
Ejercicio 1 (fácil)
Cree una página login.php que contenga un formulario con una zona inicio de sesión y una zona
contraseña. Añada el botón "comprobar", de tipo submit, que llama la página verif_login.php. Esta
página muestra "inicio de sesión correcto" si el apellido es igual a "Gómez" y la contraseña "alibaba".
De lo contrario, esta página redirecciona a la página inicio de sesión.php con el mensaje "inicio de
sesión incorrecto".
Cree una página tabla.php que contenga un formulario con una lista de selección simple que contenga
los países y debajo una zona de tipo <div> que muestre las ciudades según el país que seleccione. El
formulario contiene un botón de tipo "submit" que permite volver a llamar la misma página según el
país que seleccione. Se trata de realizar esta página sin necesidad de utilizar JavaScript. Cuando
muestra la página por primera vez, debe mostrar el primer país de la lista con sus correspondientes
ciudades. Las dos tablas son:
$pais = array(’Francia’,’Italia’,’Alemania’,’Rusia’);
$ciudades[’Francia’][0] = "París";
$ciudades[’Francia’][1] = "Lyon";
$ciudades[’Francia’][2] = "Marsella";
$ciudades[’Italia’][0] = "Roma";
$ciudades[’Italia’][1] = "Milán";
$ciudades[’Italia’][2] = "Nápoles";
$ciudades[’Alemania’][0] = "Berlín";
$ciudades[’Alemania’][1] = "Múnich";
$ciudades[’Alemania’][2] = "Fráncfort";
$ciudades[’Rusia’][0] = "Moscú";
$ciudades[’Rusia’][1] = "San Petersburgo";
$ciudades[’Rusia’][2] = "Nizhny-Novgorod";
Retome el ejercicio 1 y muestre en la página inicio de sesión.php el número de veces que el usuario ha
intentado iniciar sesión antes de utilizar los inicios de sesión y contraseñas correctos. Muestre también
todos los inicios de sesión y contraseñas que se han intentado introducir.
2. Soluciones
login.php:
www.FreeLibros.me
http://www.eni-training.com/client_net/mediabook.aspx?idR=87327 1/5
24/4/2014 ENI Training - Libro online
verfi_login.php:
?>
</body>
</html>
tabla.php:
www.FreeLibros.me
http://www.eni-training.com/client_net/mediabook.aspx?idR=87327 2/5
24/4/2014 ENI Training - Libro online
<title>Ejercicio país</title>
<meta http-equiv="Content-Type" content="text/html;
charset=iso-8859-1" />
</head>
<body>
<h2>Seleccione un país</h2>
<form action="tabla.php" method="POST">
<?php
$pais = array(Francia,’Italia’,’Alemania’,’Rusia’);
$ciudades[Francia][0] = "París";
$ciudades[Francia][1] = "Lyon";
$ciudades[Francia][2] = "Marsella";
$ciudades[’Italia’][0] = "Roma";
$ciudades[’Italia’][1] = "Milán";
$ciudades[’Italia’][2] = "Nápoles";
$ciudades[’Alemania’][0] = "Berlín";
$ciudades[’Alemania’][1] = "Múnich";
$ciudades[’Alemania’][2] = "Fráncfort";
$ciudades[’Rusia’][0] = "Moscú";
$ciudades[’Rusia’][1] = "San Petersburgo";
$ciudades[’Rusia’][2] = "Nizhny-Novgorod";
?>
pais:<select name="pais" >
<?php
if (isset($_POST[’pais’])) {
$pais_seleccionado = $_POST[’pais’];
}
else {
$pais_seleccionado = "Francia";
}
www.FreeLibros.me
http://www.eni-training.com/client_net/mediabook.aspx?idR=87327 3/5
24/4/2014 ENI Training - Libro online
inicio de sesión.php:
<?php
session_start();
if (isset($_SESSION[’num_vez])) {
$_SESSION[’num_vez] = $_SESSION[’num_vez]+1;
}
else {
//inicio de sesión num_vez
$_SESSION[’num_vez] = 0;
//inicio de sesión login_password
$_SESSION[’login_password’]="";
}
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="es" lang="es">
<head>
<title>Ejercicio login</title>
<meta http-equiv="Content-Type" content="text/html;
charset=iso-8859-1" />
</head>
<body>
<h2>Escriba su inicio de sesión y su contraseña</h2>
<form action="verif_login.php" method="POST">
inicio de sesion:<input type="text" name="login" /><br /><br />
contraseña:<input type="text" name="password" /><br /><br />
<input type="submit" name="enviar" value="validar"/>
<br /><br />
<?php
if (isset($_GET[’message’]) && $_GET[’message’] == ’1’) {
echo "<span style=’color:#ff0000’>inicio de sesión incorrecto
</span>";
}
?>
<br />
Ha intentado <?php echo $_SESSION[’num_veces];?> veces.
<br />
<?php
if ($_SESSION[’login_password’]!= "") {?>
Los inicios de sesión y contraseña intentados son:<?php echo
substr($_SESSION[’login_password’],0,strlen($_SESSION
[’login_password’])-2);
//¿quita el; el último espacio?>
<?php } ?>
</form>
</body>
</html>
verif_login.php:
<?php
session_start();
$_SESSION[’login_password’] = $_SESSION[’login_password’].$_POST
[’login’]." y ".$_POST[’password’].", ";
www.FreeLibros.me
http://www.eni-training.com/client_net/mediabook.aspx?idR=87327 4/5
24/4/2014 ENI Training - Libro online
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="es" lang="es">
<head>
<title>Ejercicio inicio de sesión</title>
<meta http-equiv="Content-Type" content="text/html;
charset=iso-8859-1" />
</head>
<body>
<?php
?>
</body>
</html>
www.FreeLibros.me
http://www.eni-training.com/client_net/mediabook.aspx?idR=87327 5/5
24/4/2014 ENI Training - Libro online
La librería GD
Para crear una imagen en PHP, debe utilizar las funciones de la librería GD. Una librería es un archivo de
extensión dll que contiene numerosas funciones PHP.
Para activar esta librería, en primer lugar hay que abrir el archivo PHP.ini (menú de configuración -> PHP)
y quitar el punto y coma que está delante de la línea extension=php_gd2.dll, en la parte inferior
del archivo. A continuación, reinicie el servidor Web (menú reiniciar).
Atención: si usted alberga su sitio Web en un proveedor de servicios, debe asegurarse de que esta
librería está activa, porque no siempre es así.
www.FreeLibros.me
http://www.eni-training.com/client_net/mediabook.aspx?idR=87329 1/1
Creación de una imagen
1. Header
Header indica al navegador que la página PHP reenvía una imagen, y no una página HTML. También
indica el tipo de imagen que se ha creado: JPG o PNG.
Si tiene una imagen con mucho color, como por ejemplo una foto, es mejor utilizar el formato JPG o bien
el formato PNG, que gestiona la transpariencia.
<?php
header("Content-type: imagen/png");
?>
Por ejemplo:
<?php
header("Content-type: imagen/png");
$imagen = imagecreate(300,150);
?>
Este código crea una imagen de 300 x 150 píxeles. La función imagecreatecolor() equivale
a imagecreate(), pero sin el límite de 256 colores.
La variable $imagen es un objeto que permite manipular una imagen. Este concepto se ha explicado
en el capítulo referente a los archivos con la función fopen().
Por ejemplo:
<?php
header("Content-type: image/png");
$imagen = imagecreate(300,150);
$color_fondo = imagecolorallocate($imagen, 0, 255, 0);
?>
Esta función colorea el fondo de la imagen y almacena este color en una variable ($color_fondo)
para poder utilizarlo más adelante.
Para mostrar la imagen, utilice la función imagepng() tomando como parámetro el recurso. Para
www.FreeLibros.me
mostrar una imagen JPG, utilice la función imagejpeg(). Compruebe que Notepad++ lo codifica
correctamente en ANSI; de lo contrario, no se podrá visualizar la imagen.
Por ejemplo:
<?php
header("Content-type: image/png");
$imagen = imagecreate(300,150);
$color_fondo = imagecolorallocate($imagen, 0, 255, 0);
imagepng($imagen);
?>
Esta imagen, representada con un rectángulo verde en otra página PHP, se visualizará nombrando la
imagen como una imagen normal. Introduzca su nombre en el atributo src de la etiqueta img:
Para guardar la imagen en el disco, agregue en el segundo parámetro opcional la ruta y el nombre de
la imagen en la función imagepng().
Por ejemplo:
<?php
$imagen = imagecreate(300,150);
$color_fondo = imagecolorallocate($imagen, 0, 255, 0);
imagepng($imagen, "fuente/imagen1.png");
?>
Para crear una imagen desde una imagen que ya existe, utilice la función imagecreatefromjpeg(), y
tome como parámetros el nombre de la imagen de tipo JPG.
Por ejemplo, una imagen Koala.jpg ubicada en el mismo lugar que su página PHP:
<?php
header("Content-type: image/jpeg");
$imagen = imagecreatefromjpeg("Koala.jpg");
imagejpeg($imagen);
?>
Todo esto tiene la ventaja de que crea imágenes dinámicas, cuya forma y contenido pueden cambiar
dependiendo de los datos incluidos en la base de datos.
Para terminar el script, agregue la función imagedestroy($resorigen), que libera del servidor la
memoria que ha ocupado la imagen.
<?php
header("Content-type: image/jpeg");
$imagen = imagecreatefromjpeg("Koala.jpg");
imagejpeg($imagen);
imagedestroy($imagen);
?>
www.FreeLibros.me
www.FreeLibros.me
Texto y color
1. El color
Esta función es imagecolorallocate(), y se ha tratado anteriormente. Pone color de fondo a una
imagen y almacena este color en una variable. Toma como parámetros el recurso y el código RGB.
La sintaxis es:
Las variables $rojo, $verde y $azul van de 0 a 255. Puede encontrar el código del color que
necesite en los programas Paint o Photoshop.
<?php
header("Content-type: image/png");
$imagen = imagecreate(300,150);
$color_fondo = imagecolorallocate($imagen, 0, 0, 255);
imagepng($imagen);
imagedestroy($imagen);
?>
2. El texto
La función que permite escribir el texto es imagestring(), que toma como parámetro el recurso, el
tamaño de la fuente entre 0 y 5, las coordenadas x e y, la cadena de caracteres y el color de la cadena.
La sintaxis es:
<?php
header("Content-type: image/png");
$imagen = imagecreate(300,150);
$color_fondo = imagecolorallocate($imagen, 110, 210, 220);
//azul claro
$negro = imagecolorallocate($imagen, 0, 0, 0);
imagestring($imagen, 3, 50, 50, "Aquí mi texto.", $negro);
imagepng($imagen);
imagedestroy($imagen);
?>
Aquí se representa el resultado con las coordenadas x e y. Las coordenadas 0,0 corresponden al
ángulo superior izquierdo, y las coordenadas 50,50 a la posición de inicio de la cadena de caracteres.
www.FreeLibros.me
La función imagestringup() permite escribir el texto en forma vertical. Toma los mismos parámetros
que la función imagestring().
3. La transparencia
Debe utilizar el formato PNG para administrar la transparencia.
La función imagecolortransparent() convierte un color en color transparente. Toma como
parámetros el recurso y el color que va a convertir en transparente.
La sintaxis es:
imagecolortransparent($recurso, $color);
Este ejemplo muestra un texto negro en un rectángulo de color azul claro, pero el azul claro se
convierte en transparente.
<?php
header("Content-type: image/png");
$imagen = imagecreate(300,150);
$color_fondo = imagecolorallocate($imagen, 110, 210, 220); //azul claro
$negro = imagecolorallocate($imagen, 0, 0, 0);
imagestring($imagen, 3, 50, 50, "Este es mi texto.", $negro);
imagecolortransparent($imagen, $color_fondo);
imagepng($imagen);
imagedestroy($imagen);
?>
www.FreeLibros.me
El alto de la imagen en miniatura.
En el siguiente ejemplo, el código PHP permite crear una imagen en miniatura de la imagen Koala.jpg y
la llama mini_Koala.jpg.
<?php
// Creación de la miniatura
imagecopyresampled($destino, $imagen_origen, 0, 0, 0, 0,
$ancho_destino, $alto_destino, $ancho_origen,
$alto_origen);
La imagen de destino.
En el siguiente ejemplo, el código PHP coloca una imagen pequeña ordenador.png sobre la imagen
Koala.jpg:
<?php
header ("Content-type: image/jpeg");
www.FreeLibros.me
$origen = imagecreatefrompng("ordenador.png"); // El ordenador es
// el origen
$destino = imagecreatefromjpeg("Koala.jpg"); // El Koala es
// el destino
Da como resultado:
<?php
header ("Content-type: image/jpeg");
www.FreeLibros.me
$origen = imagecreatefrompng("ordenador.png"); // El ordenador es
// el origen
$destino = imagecreatefromjpeg("Koala.jpg"); // El Koala es
// el destino
Da como resultado:
www.FreeLibros.me
Las formas
Las funciones de la librería GD dibujan formas como círculos, rectángulos, polígonos, etc.
A continuación mostramos algunas funciones con $recurso de una imagen que se ha creado
anteriormente:
Por ejemplo:
<?php
header("Content-type: image/png");
$recurso = imagecreate(300,150);
$blanco = imagecolorallocate($recurso, 255, 255, 255);
$negro = imagecolorallocate($recurso, 0, 0, 0);
//registro de 3 puntos con sus coordenadas x e y
$registro_puntos = array(20, 30, 160, 70, 110, 150);
//creación del polígono de 3 puntos en negro.
imagepolygon($recurso, $registro_puntos, 3, $negro);
//mostrar la imagen
www.FreeLibros.me
imagepng($recurso);
imagedestroy($recurso);
?>
www.FreeLibros.me
Ejemplos
1. Ejemplo 1
Un ejemplo común consiste en mostrar un gráfico que representa el número de visitas diarias a un sitio
Web. Estos datos pueden proceder de una base de datos MySQL, pero se indican de forma fija en el
ejemplo.
<?php
header("Content-type: image/png");
$registro_visitas = array(520, 458, 642, 741, 254, 657, 356, 912, 259, 712);
$anchoImagen = 450;
$altoImagen = 400;
$imagen = imagecreate($anchoImagen, $altoImagen);
$blanco = imagecolorallocate($imagen, 255, 255, 255);
$negro = imagecolorallocate($imagen, 0, 0, 0);
$rojo = imagecolorallocate($imagen, 255, 0, 0);
imagePng($imagen);
imagedestroy($imagen);
?>
Da como resultado:
www.FreeLibros.me
2. Ejemplo 2
En este ejemplo se utiliza la función imagerotate() para rotar la imagen y cambiar el color de fondo:
<?php
header(’Content-type: image/gif’);
imagegif($imagen);
imagedestroy($imagen);
?>
Da como resultado:
www.FreeLibros.me
www.FreeLibros.me
Presentación
1. Introducción
Una base de datos es un conjunto estructurado de datos que administra un equipo. Si desea guardar
la información en su sitio Web, como el nombre o los apellidos o lo necesario para crear un blog, está
obligado a utilizar una base de datos. En teoría, puede utilizar un archivo de texto, pero en la práctica
esto no es recomendable, porque puede provocar muchos problemas, por ejemplo, si varias personas
están tratando de escribir al mismo tiempo.
Hay varios programas de bases de datos, como Oracle o SQL Server, pero no son gratuitos y solo
resultan realmente útiles en la gestión de un gran volumen de datos. En este capítulo vamos a ver la
base de datos MySQL, que es gratuita y está incluida en EasetPHP. Puede instalar MySQL en un
servidor distinto al servidor Web, pero en la práctica se instala en el mismo lugar.
Una base de datos permite almacenar datos y también clasificarlos, de esta manera se pueden
encontrar rápidamente con el lenguaje SQL (Structured Query Language). El lenguaje SQL se utiliza para
ejecutar acciones en la base de datos, como crear tablas, añadir o eliminar datos...
Tiene la ventaja de ser común a todas las bases de datos. Por supuesto, hay algunas diferencias entre
las bases de datos, pero la mayoría de las consultas que se ejecutan son válidas en todas partes.
Estas consultas se van a ejecutar desde el código PHP y pueden devolver datos en una tabla para
mostrarlos posteriormente.
2. Estructura
Una base de datos se constituye por tablas. Una tabla es un conjunto de campos (columnas).
www.FreeLibros.me
EDAD: edad de la persona
Por lo tanto, esta tabla contiene cuatro líneas o registros, y no existe un límite para el número de
registros, excepto el impuesto por el tamaño de su disco duro.
www.FreeLibros.me
PHPMyAdmin
PHPMyAdmin se incluye en EasetPHP para gestionar su interfaz Web de base de datos. Esta interfaz
cuenta con diferentes menús para crear bases de datos, tablas, campos, añadir o eliminar datos...
Así, puede administrar su base de datos sin tener que escribir el comando SQL.
Para acceder a PHPMyAdmin, haga clic con el botón derecho del ratón sobre la ”e” de EasyPHP en la
barra de tareas y en Administración. Haga clic en Abrir del módulo Administración MySQL:
PhpMyAdmin 4.0.3.
Ahora va a aprender a crear una base de datos y a utilizar todas las herramientas de PHPMyAdmin.
Introduzca el nombre de la base de datos que desee crear en la zona introducida y mantenga
por defecto el idioma utilizado (interclase). Haga clic en Crear.
A la izquierda aparecerá su base de datos. En el siguiente ejemplo, la base de datos se llama _prueba.
www.FreeLibros.me
Nunca introduzca caracteres especiales en los nombres de la base, de la tabla, de los campos o
cualquier otro objeto en la base de datos. Así podrá evitar complicaciones.
Ahora tenemos que crear una tabla que muestre el número de campos que contiene. Es un valor
indicativo, porque todo puede cambiar después.
Id_persona (Int), apellidos (Varchar 20), Nombre (Varchar 20) y Edad (Int).
www.FreeLibros.me
Aparecen cuatro registros, cada uno de ellos en un campo distinto.
La columna Tipo contiene el tipo de campo. Los tres tipos más utilizados son INT (entero de
-2147483648 a 2147483647), VARCHAR (cadena de caracteres de longitud máxima de 255 caracteres) y
Date.
TINYINT: número entero codificado en un byte. Valores de -128 a 127 (0 a 255 en unsigned)
(char).
SMALLINT: número entero codificado con dos bytes. Valores de -32768 a 32767 (0 a 65535 en
unsigned) (small int).
MEDIUMINT: número entero codificado con tres bytes. Valores de -8388608 a 8388607 (0 a
16777215 en unsigned).
DECIMAL: número decimal en forma de cadena de caracteres (el tamaño puede variar: 1 cifra
=> 1 carácter).
FLOAT: número decimal de simple precisión, codificado con cuatro bytes. Valores de
38
-3.402823466x10 a -1.175494351x10 -38 y de 1.175494351x10 -38 a 3.402823466x10 38 .
DOUBLE: número decimal de doble precisión, codificado con ocho bytes. Valores de
308 -308
-1.7976931348623157x10 a -2.2250738585072014x10 y de 2.2250738585072014x10 -
308
a 1.7976931348623157x10 308 .
BOOL: booleano con un valor verdadero o falso (se considera el valor 0 como falso).
BIT(M): campo de tipo bit en el que M indica el número de bytes por cada valor (entre 1 y 64).
www.FreeLibros.me
TIMESTAMP: sin información complementaria, equivale a DATETIME pero sin los separadores.
Puede crear un TIMESTAMP incompleto (por ejemplo AAMMDDHH).
CHAR: cadena de caracteres de longitud fija. Es una longitud comprendida entre 1 y 255.
TINYTEXT: texto de longitud variable que puede tener hasta 255 caracteres.
TEXT: texto de longitud variable que puede tener hasta 65535 caracteres.
MEDIUMTEXT: texto de longitud variable que puede tener hasta 16777215 caracteres.
LONGTEXT: texto de longitud variable que puede tener hasta 4294967295 caracteres.
BLOB: dato binario que puede almacenar archivos o texto. En este caso, los tipos TINYBLOB,
BLOB, MEDIUMBLOB y LONGBLOB son idénticos a sus homólogos TEXT, con la diferencia de que
las búsquedas en un tipo BLOB tienen en cuenta las mayúsculas y minúsculas.
Existen otros tipos de datos como ENUM o SPATIAL, aunque apenas se utilizan. Encontrará mas
información en http://dev.mysql.com
La columna Predeterminado permite definir el valor por defecto que hay que insertar si no se ha
informado en la consulta.
La columna Nulo permite definir la autorización del valor Null. Si selecciona esta casilla, el valor Null está
autorizado. La base de datos guarda Null en un campo cuando no se ha informado el valor.
www.FreeLibros.me
La columna Índice puede contener cuatro valores:
INDEX: la base de datos va a optimizar los datos de este campo. Normalmente los
identificadores están indexados, ya que las consultas tienen filtros o uniones en estos
identificadores.
PRIMARY: el valor del campo es único y tiene un índice. Solo puede haber una «clave primaria»
por cada tabla.
La columna A_I (Auto_incremento) permite especificar que este campo se incrementa automáticamente
en la base de datos.
La columna MIME-type permite definir el contenido del campo si quiere guardar un archivo en la base de
datos.
La columna Transformación del navegador permite elegir entre una gran selección de transformaciones
que ya están predefinidas. Hay transformaciones globales y transformaciones de tipo MIME ligadas. Las
transformaciones globales se pueden utilizar para cualquier tipo MIME. Se tendrá en cuenta, en su caso,
el tipo MIME. Las transformaciones de tipo ligadas funcionan generalmente con algunos tipos MIME.
Puede utilizar transformaciones de tipos MIME en las que la función no se ha definido. No hay control a la
hora de asegurarse de que ha seleccionado la transformación correcta, así que tenga cuidado con el
formato de su resultado.
La columna Opciones de transformación es un campo de texto libre. Introduzca aquí las opciones
concretas de la función de transformación.
www.FreeLibros.me
Haga clic en le botón Guardar.
Observe que PHPMyAdmin muestra el código SQL que equivale a crear la tabla con sus correspondientes
campos.
A la izquierda puede seleccionar su base de datos (_prueba), las tablas de su base de datos, los campos
y los índices. Por ahora solo hay una, que es la tabla Persona.
Pestaña Insertar:
www.FreeLibros.me
Esta pestaña se utiliza para introducir valores en la tabla. Puede introducir valores de dos en dos.
www.FreeLibros.me
PHPMyAdmin muestra el código SQL que equivale a la inserción de esta nueva persona.
Ahora haga clic en la pestaña Examinar para que aparezca el registro que acaba de insertar.
Puede visualizar una versión imprimible, haciendo clic en Previsualización para imprimir.
www.FreeLibros.me
Puede exportar este contenido en formato SQL con el botón Exportar.
También puede crear una vista (sección SQL avanzado - Otros objetos de MySQL en este capítulo) y un
gráfico que representa los datos de la tabla, lo que no es demasiado útil con un solo dato.
Para terminar, puede guardar esta consulta con un marcador, lo que le permitirá reutilizarlo desde la
pestaña SQL.
www.FreeLibros.me
La pestaña Buscar permite buscar datos en la tabla desde varios filtros.
La pestaña Exportar permite realizar copias de seguridad de su base de datos con formatos diferentes,
como un archivo de Excel, un archivo de texto o un archivo SQL. Se recomienda elegir el formato SQL, ya
que permite guardar los datos y la estructura de la base de datos. También será más fácil para
importarlo a otra base de datos más adelante
La pestaña Seguimiento permite crear una versión nueva y volver a este estado si hay una mala
gestión.
La pestaña Operaciones permite cambiar el nombre de la tabla, mover la tabla a otra base de datos y
copiar los datos o la estructura en otra base de datos.
www.FreeLibros.me
El lenguaje SQL
1. Presentación
En este apartado, no se muestra la forma de instalar el servidor MySQL. Va a utilizar PHPMyAdmin y
especialmente la pestaña SQL para ejecutar las diferentes consultas.
Se recomienda no poner caracteres especiales en los nombres de bases de datos, tablas o campos.
Debe tratar de usar solo caracteres no acentuados, cifras y el símbolo _. Si añade espacios en sus
nombres, tiene que delimitarlos con comillas o apóstrofes.
Hemos visto en la presentación de PHPMyAdmin que una base de datos contiene tablas que a su vez
contienen campos. Por lo tanto, la sintaxis para hacer referencia a un campo en la consulta es:
nombre_base_de_datos.nombre_tabla.nombre_campo
Cuando ejecuta una consulta SQL con la pestaña SQL de PHPMyAdmin, debe saber en qué lugar se
ubica en relación con la base de datos. Si ya ha seleccionado la base de datos, se mostrará el nombre
del servidor y el nombre de su base de datos en la parte superior de la página PHPMyAdmin:
En este caso, no es necesario recordar el nombre de su base de datos en la consulta, puesto que ya
está dentro de ella.
Y no:
En el resto de este capítulo, se utiliza la base de datos _prueba, que contiene la tabla Persona con los
campos Id_person, Nombre, Apellidos y Edad.
2. Leer datos
La instrucción que permite leer en una tabla es SELECT.
Por ejemplo:
FROM: de o en
www.FreeLibros.me
Por lo tanto, esta consulta significa: leer todos los campos de la tabla Persona.
Seleccione la tabla Persona y copie esta consulta en la pestaña SQL de PHPMyAdmin y haga clic
enContinuar:
Para mostrar solo algunos campos, únicamente tiene que nombrarlos separados por comas.
Por ejemplo:
Da como resultado:
3. Escribir datos
La instrucción que permite escribir en una tabla es INSERT INTO.
Por ejemplo:
(Nombre, Apellidos, Edad): nombre de los campos en los que quiere guardar un valor.
(’Luis’,’Del Morán’,38): valores que han entrado en el mismo orden que los nombres
www.FreeLibros.me
de los campos. No olvide escribir los valores de tipo carácter o fecha con apóstrofes o
comillas.
Observe que no se ha añadido el campo id_person a la consulta. Esto es normal, ya que este campo es
autoincremental; por lo tanto, la base de datos informa automáticamente este campo.
No está obligado a indicar el nombre del campo y su valor si el campo es autoincremental y si acepta el
valor NULL.
Por ejemplo:
4. Filtrar datos
La instrucción que permite filtrar datos en una tabla es WHERE.
www.FreeLibros.me
Esta instrucción no permite recuperar cierta información.
Puede añadir una o varias condiciones después de la palabra clave WHERE. Deben estar separadas por
AND (y) u OR (o bien).
=: igual a.
<>: diferente a.
LIKE: comparación parcial. Este operador se utiliza con el símbolo %, que significa cualquier
número de caracteres.
BETWEEN valor1 AND valor2: filtra entre los valores valor1 y valor2.
Por ejemplo, para obtener todas las personas cuyo apellido no contiene la letra u y la edad está
comprendida entre 20 y 47 años:
www.FreeLibros.me
SELECT * FROM Persona WHERE Nombre NOT LIKE ’%u%’ AND Edad BETWEEN 20 AND 47
Da como resultado:
Otro ejemplo consiste en obtener todas las personas cuyo apellido está más allá de DEL en orden
alfabético y la letra a está presente en el nombre:
SELECT * FROM Persona WHERE Apellidos > ’Luna’ OR Nombre LIKE ’%r%’
Da como resultado:
www.FreeLibros.me
5. Los alias
Un alias permite volver a nombrar un campo o una tabla en la consulta que está en curso.
Su sintaxis es:
nombre_tabla AS nombre_alias
Por ejemplo:
Da como resultado:
Observe que el campo Edad se ha convertido en Edad_de_la_persona, que solo es válido en esta
consulta.
Da como resultado:
Un alias puede ser muy útil cuando utiliza uniones en su consulta y cuando las tablas tienen el mismo
nombre de campos. A continuación veremos un ejemplo.
www.FreeLibros.me
6. Ordenar datos
La instrucción que permite ordenar datos es ORDER BY. Solamente se puede aplicar en SELECT.
Un campo (columna)
Un alias
Da como resultado:
El orden se realiza de manera ascendente (ASC). Para invertir el orden aplicado, debe añadir la palabra
clave DESC.
Da como resultado:
Puede ordenar siguiendo varios campos, es decir, el orden se realiza a partir del segundo campo si el
valor es el mismo que el del primero.
www.FreeLibros.me
Por ejemplo, para ordenar según la edad y, en caso de edades iguales, por apellidos:
Da como resultado:
7. Eliminar datos
La instrucción que permite eliminar datos es DELETE.
Por ejemplo:
Atención: Si olvida la condición que está contenida en la cláusula WHERE, se eliminan todos los
registros de la tabla.
8. Modificar datos
La instrucción que permite modificar datos es UPDATE.
Por ejemplo:
SET: palabra clave que precede a los nombres de los campos que va a asignar.
www.FreeLibros.me
Ejecute esta consulta en la pestaña SQL y haga clic en Examinar:
Puede modificar varios campos (columnas) a la vez. Solo tiene que añadir los campos con su valor,
separados por comas.
Por ejemplo:
Esta consulta ha modificado el apellido, el nombre y la edad de la persona cuyo id_person es igual a 4.
Observe que, al instar consultas de tipo INSERT, debe escribir los valores de tipo VARCHAR, TEXT o
DATE con apóstrofos o dobles comillas.
Si no introduce la palabra clave WHERE, no hay filtro y por lo tanto las modificaciones se realizan en
todos los registros.
Por ejemplo, para modificar la edad a 55 años de todas aquellas personas mayores o igual a de 50
años:
www.FreeLibros.me
9. Las uniones
En una consulta de tipo SELECT, a veces es muy útil traer información de dos tablas que se
corresponden entre sí.
Por ejemplo, cree una tabla Idiomas que contenga dos campos:
Haga clic en su base de datos (_prueba) y escriba "Idiomas" en la zona "Crear nueva tabla en la base
de datos _prueba". Haga clic en Continuar, rellene la estructura de los dos campos introduciendo como
índices el Id autoincremental y Primary. Haga clic en Grabar.
Para añadir la opción del idioma en la tabla Persona, haga clic en ésta en la tabla Persona y en la
pestaña Estructura. Haga clic en Continuar para añadir un campo al final de la tabla. Este campo se
llama "Id_idioma" y es de tipo "int". Haga clic en Grabar.
www.FreeLibros.me
Muestre los datos de la tabla Persona:
Si quiere que Nanie Morales tenga como idioma "Francés", modifique a 1 (haciendo clic en el lápiz) el
valor de su Id_idioma.
Si desea que Luis y David tengan como idioma el "Inglés", modifique a 2 (haciendo clic en el lápiz) el
valor de su Id_idioma.
www.FreeLibros.me
Las instrucciones que permiten realizar una unión entre dos tablas es JOIN y ON.
Por ejemplo, para realizar una unión entre la tabla Persona y la tabla Idiomas:
Da como resultado:
Observe que solo se han mostrado tres personas. Esto ocurre porque JOIN realiza por defecto una
unión interna, es decir, la consulta vuelve a enviar los datos que tienen una correspondencia entre las
dos tablas. Como Estefanía. María y Carlos tienen un Id_idioma igual a 0 y 0 no existe en la tabla
Idiomas, no aparecen. La unión interna se designa INNER JOIN.
Por el contrario, la unión externa devuelve todos los registros, incluso aquellos que no tienen
correspondencia entre las dos tablas. Una unión externa se designa LEFT JOIN o RIGHT JOIN.
En el ejemplo anterior, si quiere mostrar todas las personas, incluidas aquellas que no tienen
correspondencia en la tabla Idiomas, debe utilizar LEFT JOIN.
Da como resultado :
www.FreeLibros.me
La instrucción LEFT JOIN devuelve todos los datos de la tabla a la izquierda (Persona) incluso si no
tienen correspondencia en la tabla de la derecha (Idiomas). MySQL rellena las zonas sin
correspondencia con los valores NULL. La unión externa se designa OUTER JOIN.
La instrucción RIGHT JOIN devuelve todos los Idiomas, incluso si no tienen correspondencia en la tabla
Persona, pero esto no tiene mucho sentido funcional.
Existe otra manera de escribir la unión interna, aunque esta sintaxis está obsoleta:
equivale a:
La sintaxis con las tres tablas llamadas tabla1, tabla2 y tabla3 con tabla1 unida a la tabla2 con el
Id_tabla2 y tabla2 unida a la tabla3 con el Id_tabla3 es:
SELECT *
FROM Tabla1
INNER JOIN Tabla2 ON Tabla1.Id_tabla2 = Tabla2.Id
INNER JOIN Tabla3 ON Tabla2.Id_tabla3 = Tabla3.Id
Puede combinar los filtros (WHERE), el orden (ORDER BY) y los alias con las uniones.
Por ejemplo:
Muestra en orden alfabético los apellidos, el nombre y el idioma de las personas. El campo apellidos
contiene la cadena de caracteres ’a’:
www.FreeLibros.me
10. El agrupamiento
A continuación la tabla Persona se completa de la siguiente manera:
La instrucción que permite agrupar datos es GROUP BY. Se utiliza con las funciones:
SUM: suma
MIN: mínimo
MAX: máximo
AVG: medio
Da como resultado:
Aquí los datos no se agrupan, porque se trata de obtener la edad máxima entre todas las personas.
Si quiere obtener la edad máxima de las personas por idioma, debe agrupar en el identificador del
idioma:
www.FreeLibros.me
SELECT MAX(Edad) as Edad_Máxima, Etiqueta
FROM Persona
LEFT JOIN Idiomas ON Persona.Id_idioma = Idiomas.Id
GROUP BY Id_idioma
Da como resultado:
Da como resultado:
En una consulta de agrupamiento, no puede utilizar el filtro WHERE. Utilice la cláusula HAVING para
filtrar el resultado. Las condiciones que debe poner después de la palabra clave HAVING son las mismas
que en la palabra clave WHERE.
Da como resultado:
www.FreeLibros.me
Otro ejemplo consiste en mostrar la edad media de las personas que tienen la cadena de caracteres
"a" en sus apellidos:
Da como resultado:
www.FreeLibros.me
SQL avanzado
a. Limitar datos
Esta consulta significa: leer los tres primeros registros que contienen todos los campos de la tabla
Persona ordenados por Nombre.
También puede añadir el número de registro con el que quiere recuperar datos agregando este
número antes del número de registros.
Por ejemplo, para recuperar los registros de la quinta a la sexta, ambas incluidas:
www.FreeLibros.me
SELECT * FROM Persona ORDER BY Nombre LIMIT 4,2
b. Valores distintos
La instrucción que permite tomar únicamente los valores de registros distintos devueltos
porSELECT es DISTINCT.
Por ejemplo:
En realidad, dos personas se llaman David pero estos nombres sólo aparecen una vez con la palabra
clave DISTINCT.
c. Convertir en mayúsculas
www.FreeLibros.me
Puede crear un alias para UPPER(apellidos) de esta manera:
d. Convertir en minúsculas
www.FreeLibros.me
e. Redondear un número decimal
Si tiene el campo precio_iva = 31.2698754 y solo quiere las dos cifras después de la coma, escriba:
ROUND(precio_iva,2)
Y devuelve 31.27.
ABS(temperatura)
Y devuelve 31.2698754.
g. Número aleatorio
SELECT rand()
www.FreeLibros.me
Por lo tanto, para obtener un número entero aleatorio entre 0 y 30:
h. Longitud de un campo
www.FreeLibros.me
También existe la función LTRIM() para eliminar los espacios a la izquierda y RTRIM() para eliminar
los espacios a la derecha.
La instrucción que permite extraer una subcadena en un campo o una cadena de caracteres
es SUBSTR().
Esta función toma como argumentos el nombre del campo, la posición de inicio y como opción la
longitud de la subcadena que va a recuperar.
Por ejemplo, para mostrar los tres primeros caracteres del nombre:
Par ejemplo, para mostrar el nombre y los apellidos separados por un espacio:
www.FreeLibros.me
l. Posición de una cadena de caracteres en un campo
Esta función toma como argumentos el nombre del campo o de la cadena de caracteres de inicio y la
cadena de caracteres que hay que buscar. Esta función devuelve 0 si no se ha encontrado la cadena.
La instrucción que permite devolver una cadena completada por la izquierda por una secuencia de
caracteres es LPAD().
www.FreeLibros.me
Esta función toma como argumentos el campo o la cadena de caracteres, la longitud total del campo
con los caracteres que se han añadido y el carácter que hay que añadir.
Por ejemplo, para mostrar el carácter ":" antes de los apellidos de manera que el campo tenga
25 caracteres de longitud total:
La instrucción que permite sustituir una cadena de caracteres en un campo o en otra cadena de
caracteres es REPLACE().
Esta función toma como argumentos la cadena de caracteres principal o el campo, la cadena de
caracteres que se busca y la cadena de caracteres de sustitución.
Por ejemplo, para sustituir ’Da’ por ’Da--’ en el nombre de las personas:
www.FreeLibros.me
o. Probar el valor de un campo
La instrucción que permite probar una expresión (como el valor de un campo por ejemplo) es IF().
Esta función toma como argumentos la condición, el valor que tiene que devolver si la condición es
verdadera y el valor que tiene que devolver si la condición es falsa.
Por ejemplo, para mostrar "Senior" en personas de más de 60 años y "Otro" para las otras personas:
La otra instrucción que permite probar el valor de un campo es CASE WHEN THEN.
Esta instrucción puede contener varias veces la palabra clave WHEN y por lo tanto puede obtener
varios resultados posibles según las condiciones que se han pasado en WHEN.
Por ejemplo, para mostrar "Senior" en personas de más de 60 años, "Medio" en personas entre 35 y
60 años y "Junior" en personas de menos de 35 años:
www.FreeLibros.me
Select Nombre,
Apellidos,
Edad,
CASE WHEN Edad > 60 THEN ’SENIOR’
WHEN Edad BETWEEN 35 AND 60 THEN ’Medio’
WHEN Edad < 35 THEN ’Junior’
END as Categoría
FROM Persona
ORDER BY Nombre
Por ejemplo:
La instrucción que permite devolver la parte de la fecha de un campo que contiene la fecha y la hora
www.FreeLibros.me
es DATE().
Esta función toma como argumento el campo o la fecha completa.
Por ejemplo:
La instrucción que permite devolver la diferencia en número de días entre dos fechas
es DATEDIFF().
Esta función toma como argumentos el primer campo o una fecha, y a continuación un segundo campo
o una fecha.
Por ejemplo:
La instrucción que permite añadir un intervalo de tiempo a una fecha es DATE_ADD() o ADDDATE().
Esta función toma como argumentos la fecha o el campo y la palabra clave INTERVAL seguida del valor
y de la unidad (días, mes, semana...).
www.FreeLibros.me
Las palabras clave de los intervalos son:
MICROSECOND: microsegundos
SECOND: segundos
MINUTE: minutos
HOUR: horas
DAY: días
WEEK: semanas
MONTH: meses
QUARTER: trimestres
YEAR: años
www.FreeLibros.me
SELECT ADDTIME(’22:58:02’,’00:01:02’) as nueva_hora
www.FreeLibros.me
Esta instrucción se ubica entre dos consultas que deben devolver el mismo número de columnas y del
mismo tipo.
Por ejemplo, para unir esta consulta que devuelve los apellidos y el nombre de personas mayores de
50 años:
Y esta consulta que devuelve los apellidos y el nombre de personas cuyo nombre es David:
Escriba lo siguiente:
2. Las subconsultas
Una subconsulta es una consulta llamada en otra consulta. Una subconsulta se escribe entre
paréntesis y puede contener otras subconsultas.
Subconsulta escalonada
www.FreeLibros.me
He aquí una consulta que muestra las personas que tienen una edad menor que el resultado de la
subconsulta anterior:
Puede utilizar como criterio de comparación el operador IN. Este operador devuelve la cifra 1 si se
presenta en la lista una expresión.
Por ejemplo:
Devuelve 1.
Otro ejemplo: mostrar las personas cuya edad es 48, 55, 36 años:
www.FreeLibros.me
También puede poner una subconsulta en lugar de un grupo de cifras.
Por ejemplo, para mostrar las personas que tienen la misma edad que aquellas cuyo nombre comienza
por ’D’:
De hecho, SELECT Edad FROM Persona WHERE Nombre like ’D%’ devuelve la edad de
David Manrique y David Olis.
También puede utilizar el operador NOT IN para excluir los elementos de una lista.
www.FreeLibros.me
La palabra clave EXISTS permite probar la existencia de datos de una subconsulta.
Por ejemplo, si quiere mostrar todas las personas, siempre y cuando al menos una de ellas sea mayor
o igual a 62 años:
La consulta SELECT * FROM Persona WHERE Edad >= 62 devuelve al menos un registro, por lo
tanto WHERE EXISTS es verdadero y la consulta Select Nombre, Apellidos, Edad FROM
Persona devuelve todo el mundo.
También puede utilizar NOT EXISTS para probar la ausencia de datos de una subconsulta.
Subconsulta correlacionada
Una subconsulta correlacionada o anidada es una subconsulta que se ejecuta en cada registro de la
consulta principal, ya que la columna de la subconsulta hace referencia a una columna de la consulta
principal. Por lo tanto, cada registro de la consulta principal puede cambiar con el resultado del registro
de la subconsulta.
Por ejemplo, para mostrar todas las personas con los mismos nombres:
www.FreeLibros.me
SELECT Id_person, Nombre, Apellidos
FROM persona P1
WHERE Apellidos IN (
Select Nombre,Apellidos
FROM persona P2
WHERE P1.Id_person <> P2.Id_person
)
Observe que la cláusula WHERE de la subconsulta hace referencia a la tabla P1 de la consulta principal.
Esta consulta busca todos los registros que tienen los mismos apellidos en la tabla Persona, pero no el
mismo Id_person; de lo contrario, la consulta devolvería todo el mundo.
Una función devuelve un valor de manera sistemática, lo que no es obligatorio en el caso de los
procedimientos.
Una función se utiliza básicamente en una consulta SQL, mientras que un procedimiento es un
programa autónomo que se puede ejecutar con PHP.
gestión de errores.
llamada al procedimiento.
Estas funcionalidades aparecen con MySQL 5 y permiten disponer de consultas SQL que se vuelven a
utilizar y que además son más seguras.
Si tiene una consulta SQL que se ejecuta en 10 páginas PHP distintas, puede ser interesante tener en
su lugar un procedimiento almacenado que contenga esta consulta y que sea este procedimiento el
que se ejecute 10 veces. Si quiere modificar su consulta SQL, solo la tiene que cambiar una vez en el
procedimiento se haya almacenado.
PHPMyAdmin no permite crear un procedimiento almacenado o una función con sus menús. Por lo tanto,
escriba el código SQL que permite crearlo.
www.FreeLibros.me
Por ejemplo, para crear un procedimiento almacenado sin argumento llamado creacion_persona:
Las palabras clave CREATE PROCEDURE significan que va a crear un procedimiento. A continuación
escriba su nombre seguido de la palabra clave BEGIN y las instrucciones SQL seguidas de la palabra
clave END. Atención, añada el delimitador // al final del procedimiento almacenado.
www.FreeLibros.me
En esta ventana puede cambiar su nombre, tipo (procedimiento o función), definición o creador.
Un procedimiento o función se considera ”determinista” si siempre devuelve el mismo resultado para los
mismos parámetros de entrada.
Respecto al Acceso de datos SQL, CONTAINS SQL, es necesario que la rutina contenga consultas SQL.
READS SQL DATA permite indicar que la rutina no realiza ningún acceso en modo escritura, sino solo en
modo lectura. MODIFIES SQL DATA permite indicar que la rutina no tiene consultas SQL. Estos
parámetros se usan para mejorar el rendimiento.
CALL creacion_persona();
www.FreeLibros.me
Copie esta consulta en la pestaña SQL de PHPMyAdmin y haga clic en Continuar:
Puede pasar los argumentos al procedimiento almacenado. Estos argumentos pueden ser de tipo:
OUT: variable de salida del procedimiento almacenado. Esta variable se actualiza al final del
procedimiento almacenado y se devuelve a PHP.
Para hacer este procedimiento más versátil, va a tomar como argumentos los apellidos, el nombre y la
edad de la persona que va a insertar.
DROP PROCEDURE significa «eliminar el procedimiento», ya que debe eliminarse antes de volver a
crearlo.
www.FreeLibros.me
CALL creation_persona(’Emilio’,’Martin’,15);
CALL cubo(5,@RESULTADO);
SELECT @RESULTADO;
El valor de vuelta se ubica en la variable @RESULTADO. El nombre de esta variable tiene que estar
obligatoriamente precedido por el símbolo @.
Los procedimientos almacenados se utilizan cuando se quiere ejecutar consultas SQL. En el ejemplo
anterior, es más lógico crear una función:
www.FreeLibros.me
CREATE FUNCTION funcion_cubo (valor_entrada INT) RETURNS BIGINT
RETURN valor_entrada*valor_entrada*valor_entrada;
Las palabras clave CREATE FUNCTION significan que va a crear una función. A continuación escriba su
nombre, seguido de los argumentos de entrada. Debe seleccionar el tipo de valor devuelto después de
la palabra clave RETURNS. Para terminar, escriba el valor devuelto después de la palabra clave RETURN.
SELECT funcion_cubo(5);
Puede modificar, ejecutar, exportar o eliminar la función con ayuda de la misma pestaña que se utiliza
en los procedimientos almacenados.
Existe un lenguaje que permite crear condiciones, bucles, variables y otros objetos en el
procedimiento almacenado, pero no es el objetivo de este capítulo.
a. Las tablas
Una vez que ha creado la tabla Persona en PHPMyAdmin, habrá observado que este código muestra:
La palabra clave CREATE se utiliza para crear la tabla. Si quiere eliminarla, utilice la palabra clave
DROP:
Para modificar una tabla, puede utilizar la palabra clave ALTER, pero la sintaxis es mucho más
compleja, ya que depende de lo que quiera hacer con los campos. Puede modificar, añadir o eliminar
un campo, cambiar su tipo...
www.FreeLibros.me
Tiene más información en el siguiente enlace: http://dev.mysql.com/doc/refman/5.0/es/alter-table.html
Las palabras clave siempre son CREATE, DROP y ALTER, sea para crear, eliminar, modificar una base,
una tabla, un índice o cualquier otro objeto de la base de datos.
b. Los índices
Los índices se utilizan para mejorar el rendimiento de una tabla. Cuando crea un índice en el campo
de tipo identificador, la base de datos devuelve rápidamente el identificador entre todos los demás.
Resulta imprescindible si tiene muchos registros, ya que la operación puede ser 100 veces más
rápida.
Hemos visto en PHPMyAdmin cómo se crea un índice, pero también se puede crear en SQL. Su sintaxis
es igual que en los otros objetos SQL, es decir, debe utilizar la palabra clave CREATE:
Hay varias opciones para que sea única, para crear un índice en varios campos al mismo tiempo, etc.
MyISAM: permite los índices en los campos de tipo fulltext y es muy rápido en las consultas
de tipo SELECT o INSERT.
Una transacción permite asegurar que una secuencia de instrucción SQL se ha realizado
correctamente. Si surge un problema tras una consulta, la transacción anula todas las demás
consultas.
c. Las vistas
Una vista es una consulta SQL almacenada en el servidor que contiene una consulta de tipo SELECT y
que se utiliza como una tabla.
Por ejemplo, para crear una vista llamada vista_ejemplo que muestra las cuatro primeras letras del
nombre y los apellidos de las personas menores de 35 años y los apellidos y el nombre de las
personas mayores de 35 años:
www.FreeLibros.me
WHERE Edad > 35;
En PHPMyAdmin, tiene la nueva tabla vista_ejemplo. Haga clic en ella para mostrar sus datos:
La sentencia SELECT contiene una clausula UNION. El conjunto final es las personas con edad <35
años y >35 años.
d. Trigger
Un trigger es un objeto asociado a una tabla que se activa cuando se producen determinados
eventos. Por ejemplo se puede comprobar el contenido de una tabla antes de realizar una inserción o
eliminación.
Solamente se puede activar antes (before) o después (after) de un update, insert o delete.
Por ejemplo, para crear un trigger que se llama COMPRUEBA_EDAD, que establece la edad máxima en
100 en el supuesto de que fuera superior a 100, si se crea una nueva persona:
www.FreeLibros.me
En lenguaje SQL:
Si inserta una persona con una edad superior a 100, se le asignará 100 a su edad.
Siempre es posible modificar la edad y asignar un valor superior a 100 porque el trigger está
asociado al evento INSERT y no al evento UPDATE. Además no es posible tener dos triggers
asociados al mismo evento y la misma acción sobre la misma tabla.
www.FreeLibros.me
Ejercicios SQL
Para realizar estos ejercicios, la tabla Persona y la tabla Idiomas se tienen que crear en la base de datos
_prueba. Estas tablas contienen los siguientes datos:
Tabla Persona:
Tabla Idiomas:
El script SQL que permite crear las tablas con sus datos es:
SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";
-- --------------------------------------------------------
www.FreeLibros.me
(4, ’Ruso’);
-- --------------------------------------------------------
A continuación escriba el script SQL en la pestaña SQL de PHPMyAdmin. Este script elimina las tablas
Idiomas y Persona y las vuelve a crear con sus datos.
1. Enunciados
Cree una consulta que permita mostrar los apellidos, el nombre y la edad de todas las personas
mayores de 50 años.
Ejercicio 2 (fácil)
Cree una consulta que permita mostrar los apellidos, el nombre y la edad de todas las personas que
hablen francés y cuyos apellidos contengan ’Ma’.
www.FreeLibros.me
Ejercicio 3 (fácil)
Cree una consulta que permita mostrar los apellidos, el nombre y la edad de las tres primeras personas
con Nombre en orden alfabético.
Cree una consulta que permita mostrar la edad media y el idioma de las personas agrupadas por
idioma.
Cree una consulta que permita mostrar la edad media redondeada a la unidad de las personas
agrupadas por idioma que tienen la cadena de caracteres ’es’ contenida en su idioma.
Ejercicio 6 (difícil)
Cree una consulta que permita mostrar las tres primeras letras del nombre concatenadas con un
espacio concatenado a su vez con las tres primeras letras de los apellidos de las personas mayores de
30 años. Y además, las tres últimas letras del nombre concatenadas con un espacio concatenado a su
vez con las tres últimas letras de los apellidos de las personas menores de 30 años.
www.FreeLibros.me
Ejercicio 7 (dificultad media)
Cree una consulta que permita mostrar la hora actual si el nombre contiene seis caracteres y la hora
actual más una hora en otros casos.
Ejercicio 8 (difícil)
Cree una consulta que permita mostrar todos los idiomas que no habla David Manrique Adán.
Cree una consulta que permita mostrar la suma de edades agrupadas por idioma de todas las
personas que hablan los idiomas que no hablan las personas de 18 a 25 años.
www.FreeLibros.me
2. Soluciones
www.FreeLibros.me
Solución del ejercicio 7
www.FreeLibros.me
Acceso a las bases de datos con PHP
1. Introducción
Hemos visto anteriormente las diferentes consultas SQL; vamos a ver ahora cómo se ejecutan en PHP y a mostrar el resultado.
En esta parte del capítulo aprenderá a leer, insertar, modificar y eliminar datos desde formularios PHP.
Hay dos extensiones que utilizan las funciones para acceder a MySQL. Son mysql_ y mysqli_. Estas dos extensiones son muy similares, pero mysqli_ es más reciente
(versión 5 de PHP) y tiene algunas funcionalidades complementarias. Por lo tanto, utilizaremos mysqli_ en lo que queda de capítulo. En el próximo capítulo,
presentaremos la extensión PDO (PHP Data Object). Es una extensión aún más reciente y completa a la hora de utilizar objetos.
2. Conexión
La función que permite conectarse a MySQL es mysqli_connect().
Esta función toma como argumentos:
El host: cadena de caracteres que contiene el nombre o la dirección IP del host, que
corresponde a "localhost" o 127.0.0.1 si trabaja en modo local.
El puerto: número de puerto opcional para conectarse al servidor MySQL, que por defecto
equivale a 3306.
Esta función devuelve falso en caso de error, o un objeto mysqli que contiene el identificador de conexión en caso de éxito.
Por ejemplo:
<?php
$base = mysqli_connect(’127.0.0.1’, ’root’, ’’);
mysqli_select_db($base,’_prueba’) ;
?>
3. Desconexión
www.FreeLibros.me
La función que permite desconectarse de MySQL es mysqli_close().
Por ejemplo:
4. Consultas no preparadas
a. Leer datos
Esta función devuelve false en caso de fallo y true o un identificador de sesión en caso de éxito.
Esta función toma como argumento el resultado que ha devuelto la función mysqli_query() y devuelve el número de registros enviado por la consulta SQL.
Da como resultado:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="es" lang="es">
<head>
<title>Ejercicio con mysqli</title>
<meta http-equiv="Content-Type" content="text/html;
charset=iso-8859-1" />
</head>
<body>
<?php
// Conexión a la base de datos
$base = mysqli_connect("127.0.0.1", "root", "", "_prueba");
if ($base) {
echo ’Conexión realizada.<br />’;
echo ’Información del servidor:’.mysqli_GET_host_info($base).
’<br />’;
// Ejecución de la consulta
$resultado = mysqli_query($base, ’SELECT * FROM Persona’);
if ($resultado == FALSE) {
echo "Error en la ejecución de la consulta.<br />";
}
else {
// Examinar el número de registros
echo ’Número de personas: ’.mysqli_num_rows($resultado).’<br />’;
}
if (mysqli_close($base)) {
echo ’Desconexión realizada.<br />’;
}
else {
echo ’Error en la desconexión.’;
}
}
else {
printf(’Error %d : %s.<br/>’,mysqli_connect_errno(),
mysqli_connect_error());
}
?>
</body>
</html>
Conexión realizada.
Información del servidor:MySQL host info: 127.0.0.1 con TCP/IP
Número de personas: 6
Desconexión realizada.
En adelante, ya no escribimos el código HTML del inicio de la página; solo indicamos el código
PHP.
Si ahora quiere mostrar los datos de la tabla Persona, debe utilizar fetch, que permite leer el registro actual y desplazarse al siguiente registro.
www.FreeLibros.me
<?php Da como resultado:
// Conexión a la base de datos
La variable $registro es una tabla en la que los índices son los
$base = mysqli_connect("127.0.0.1", "root", "", "_prueba");
if ($base) { nombres de los campos que ha devuelto la consulta. Esta tabla
echo ’Conexión realizada.<br />’; se elimina con los nuevos valores de cada registro. Fetch permite
echo ’Información del servidor:’.mysqli_GET_host_info($base). pasar de registro en registro y, si no hay más registros, la
’<br />’; condición del bucle while es falsa. Por lo tanto, el script sale del
// Ejecución de la consulta bucle.
$resultado = mysqli_query($base, ’Select Nombre, Apellidos FROM Persona’);
if ($resultado == FALSE) { Otra función que permite el fetch es mysqli_fetch_row().
echo "Error en la ejecución de la consulta.<br />";
} Esta función toma como argumento el resultado que la
else { función mysqli_query() ha devuelto y devuelve una tabla
//fetch en cada registro devuelto por la consulta indexada que tiene como índice un contador de 0 a n que
while ($registro = mysqli_fetch_assoc($resultado)) { representa las columnas en el orden establecido por la consulta.
// Examinar apellidos y nombre de las personas
echo "Apellidos:".$registro[’Apellido’]." Por ejemplo, para mostrar los apellidos y el nombre de la tabla
y nombre:".$registro[’Nombre’]."<br />"; Persona:
}
} Da como resultado la misma información que antes.
Conexión realizada.
Información del servidor:MySQL host info: 127.0.0.1 a través de TCP/IP
Apellidos:Morales Honhon y nombre:Nanie
Apellidos:Manrique Adán y nombre:David
Apellidos:Malasaña Agora y nombre:María
Apellidos:Magalán y nombre:Roberto
Apellidos:Olís de las Heras y nombre:Manuel
Apellidos: Germán y nombre:Margarita
Desconexión realizada.
<?php
// Conexión a la base de datos
$base = mysqli_connect("127.0.0.1", "root", "", "_test");
if ($base) {
echo ’Conexión realizada.<br />’;
echo ’Información del servidor:’.mysqli_GET_host_info($base).
’<br />’;
// Ejecución de la consulta
$resultado = mysqli_query($base, ’Select Nombre, Apellidos FROM Persona’);
if ($resultado == FALSE) {
echo "Error en la ejecución de la consulta.<br />";
}
else {
//fetch en cada registro devuelto por la consulta
while ($registro = mysqli_fetch_row($resultado)) {
// Examinar apellidos y nombre de las personas
echo "Apellidos:".$registro[0]." y nombre:".$registro[1]."<br />";
}
}
if (mysqli_close($base)) {
echo ’Desconexión realizada.<br />’;
}
else {
echo ’Error en la desconexión.’;
}
}
else {
printf(’Error %d : %s.<br/ >’,mysqli_connect_errno(),
mysqli_connect_error());
}
?>
Da como resultado:
www.FreeLibros.me
<?php
// Conexión a la base de datos
$base = mysqli_connect("127.0.0.1", "root", "", "_prueba");
if ($base) {
echo ’Conexión realizada.<br />’;
echo ’Información del servidor:’.mysqli_GET_host_info($base).
’<br />’;
// Ejecución de la consulta
$resultado = mysqli_query($base, ’Select Nombre, Apellidos FROM Persona’);
if ($resultado == FALSE) {
echo "Error en la ejecución de la consulta.<br />";
}
else {
//fetch en cada registro devuelto por la consulta
while ($objeto = mysqli_fetch_object($resultado)) {
// Examinar apellidos y nombre de las personas
echo "Apellidos:".$objeto->Apellido." y nombre:".$objeto->Nombre."<br />";
}
}
if (mysqli_close($base)) {
echo ’Desconexión realizada.<br />’;
}
else {
echo ’Error en la desconexión.’;
}
}
else {
printf(’Error %d : %s.<br/ >’,mysqli_connect_errno()
,mysqli_connect_error());}
?>
Conexión realizada.
Información del servidor:MySQL host info: 127.0.0.1 con TCP/IP
Apellidos:Morales Honhon y nombre:Nanie
Apellidos:Manrique Adán y nombre:David
Apellidos:Malasaña Agora y nombre:María
Apellidos:Magalán y nombre:Roberto
Apellidos:Olís de las Heras y nombre:Manuel
Apellidos: Germán y nombre:Margarita
Desconexión realizada.
b. Escribir datos
Por ejemplo, si quiere insertar una persona llamada Nadia González Pérez, de 31 años de edad:
if (mysqli_close($base)) {
echo ’Desconexión realizada.<br />’;
}
else {
echo ’Error en la desconexión.’;
}
}
else {
printf(’Error %d :
%s.<br/>’,mysqli_connect_errno(),mysqli_connect_error());
}
?>
Observe que el id_person no se ha añadido en la consulta. De hecho, es autoincremental; por lo tanto, la base de datos asignará un nuevo nombre al id_person.
www.FreeLibros.me
Cuando inserta una nueva persona, no conoce su identificador. Para recuperar el último Id autoincremental que se ha añadido a la base de datos, debe utilizar la
función mysqli_insert_id(). Esta función toma como argumento el objeto de conexión y devuelve el último identificador autoincremental que se ha añadido en la
base de datos.
Por ejemplo, para insertar una persona llamada David Morales de 61 años de edad, añada después de echo "Persona guardada.<br />"; los
siguientes registros:
Da como resultado:
$id = mysqli_insert_id($base);
echo "Su identificador de sesión es:".$id.".<br />";
Conexión realizada.
Información del servidor:MySQL host info: 127.0.0.1 con TCP/IP
Persona guardada.
Su identificador de sesión es: 8.
Desconexión realizada.
c. Eliminar datos
Da como resultado:
<?php
// Conexión a la base de datos
$base = mysqli_connect("127.0.0.1", "root", "", "_prueba");
if ($base) {
echo ’Conexión realizada.<br />’;
echo ’Información del servidor:’.mysqli_GET_host_info($base).
’<br />’;
if (mysqli_close($base)) {
echo ’Desconexión realizada.<br />’;
}
else {
echo ’Error en la desconexión.’;
}
}
else {
printf(’Error %d : %s.<br/>’,mysqli_connect_errno(),
mysqli_connect_error());
}
?>
Conexión realizada.
Información del servidor:MySQL host info: 127.0.0.1 con TCP/IP
Persona eliminada.
Desconexión realizada.
d. Actualizar datos
Por ejemplo, para modificar la persona cuyo nombre es David cambiando su apellido por MORALES y su edad de 61 a 62 años:
Da como resultado:
<?php
// Conexión a la base de datos
www.FreeLibros.me
$base = mysqli_connect("127.0.0.1", "root", "", "_prueba");
if ($base) {
echo ’Conexión realizada.<br />’;
echo ’Información del servidor:’.mysqli_GET_host_info($base).
’<br />’;
if (mysqli_close($base)) {
echo ’Desconexión realizada.<br />’;
}
else {
echo ’Error en la desconexión.’;
}
}
else {
printf(’Error %d : %s.<br/>’,mysqli_connect_errno(),
mysqli_connect_error());
}
?>
Conexión realizada.
Información del servidor:MySQL host info: 127.0.0.1 con TCP/IP
Número de personas modificadas:1.
Desconexión realizada.
5. Consultas preparadas
a. Introducción
Una consulta preparada se utiliza mucho, ya que tiene varias ventajas. En primer lugar, evita la inyección SQL, ya que no se pueden ejecutar los datos de la consulta.
En segundo lugar, si quiere ejecutar varias veces seguidas una consulta de tipo INSERT con distintos valores, no necesita reconstruir la consulta cada vez. Simplemente
debe unir los nuevos valores y ejecutarla de nuevo. Por lo tanto, una consulta preparada es más segura y a veces más rápida que una consulta no preparada.
b. Leer datos
Antes de ejecutar la consulta, debe prepararla, es decir, escribir la consulta sustituyendo los valores por signos de interrogación, que a continuación se sustituyen por
valores.
La consulta: cadena de caracteres que contiene la consulta SQL con los signos de
interrogación.
Los tipos: cadena de caracteres que contiene los tipos de datos que pasan como
argumentos en el mismo orden. Los tipos son:
s en las cadenas de caracteres,
b en los blob.
www.FreeLibros.me
Las variables: lista de variables que están unidas a los argumentos de la consulta sql,
separadas por comas.
Para ejecutar la consulta, utilice la función mysqli_stmt_execute(). Esta función toma como argumento el objeto consulta que la
función mysqli_prepare() ha devuelto y devuelve falseen caso de error y true en caso contrario.
En una consulta de tipo SELECT puede almacenar los valores devueltos por la consulta SQL. Utilice la función mysqli_stmt_bind_result(), que va a asociar las
columnas de un resultado a unas variables.
Esta función toma como argumento el objeto consulta que la función mysqli_prepare() ha devuelto y las variables que corresponden a cada columna.
Devuelve true en caso de éxito yfalse en caso de fallo.
Debe ejecutar la consulta preparada con la función mysqli_stmt_execute(). Esta función toma como argumento el objeto consulta que la
función mysqli_prepare() ha devuelto y devuelve false en caso de error y true en caso contrario.
Para leer los valores en un bucle, utilice la función mysqli_stmt_fetch(). Esta función toma como argumento el objeto consulta que la
función mysqli_prepare() ha devuelto y devuelve false en caso de error y true en caso contrario.
Para terminar, debe cerrar una consulta preparada con la función mysqli_stmt_close(). Esta función toma como argumento el objeto consulta que la
función mysqli_prepare() ha devuelto. Devuelve true en caso de éxito y false en caso de fallo.
Por ejemplo, para mostrar los apellidos y el nombre de personas mayores de 35 años:
Da como resultado:
<?php
// Conexión a la base de datos
$base = mysqli_connect("127.0.0.1", "root", "", "_test");
if ($base) {
echo ’Conexión realizada.<br />’;
echo ’Información del servidor:’.mysqli_GET_host_info($base).
’<br />’;
$sql = "Select Nombre, Apellidos FROM Persona WHERE Edad > ?";
// Preparación de la consulta
$resultado = mysqli_prepare($base, $sql);
// Enlace de argumentos.
$ok = mysqli_stmt_bind_param($resultado, ’i’,$Edad);
$Edad=35; // Mientras no ejecute la consulta,
// puede inicializar la variable
// Ejecución de la consulta.
$ok = mysqli_stmt_execute($resultado);
if ($ok == FALSE) {
echo "Error en la ejecución de la consulta.<br />";
}
else {
// Asociación de variables de resultado.
$ok = mysqli_stmt_bind_result($resultado,$Apellido,$Nombre);
// Lectura de valores.
echo "Apellidos y nombre de personas que tengan una edad > 35<br />";
while (mysqli_stmt_fetch($resultado)) {
echo $Apellido.", ".$Nombre."<br />";
}
mysqli_stmt_close($resultado);
}
if (mysqli_close($base)) {
echo ’Desconexión realizada.<br />’;
}
else {
echo ’Error en la desconexión.’;
}
}
else {
printf(’Error %d : %s.<br/ >’,mysqli_connect_errno(),
mysqli_connect_error());
}
?>
Conexión realizada.
Información del servidor:MySQL host info: 127.0.0.1 con TCP/IP
Apellidos y nombre de personas que tengan una edad >35
Morales Honhon, Nanie
Manrique Adán, David
Magalán, Roberto
Desconexión realizada.
c. Escribir datos
Debe preparar la consulta con mysqli_prepare(), unir las variables a la consulta con mysqli_stmt_bind_param() y ejecutar
con mysqli_stmt_execute(). Estas tres funciones se explican en la sección anterior.
Por ejemplo, para insertar una persona llamada Mónica Prieto, de 63 años:
Da como resultado:
<?php
// Conexión a la base de datos
$base = mysqli_connect("127.0.0.1", "root", "", "_prueba");
if ($base) {
echo ’Conexión realizada.<br />’;
echo ’Información del servidor:’.mysqli_GET_host_info($base).
www.FreeLibros.me
’<br />’;
if ($ok == FALSE) {
echo "Error en la ejecución de la consulta.<br />";
}
else {
echo "Persona añadida.<br />";
}
mysqli_stmt_close($resultado);
if (mysqli_close($base)) {
echo ’Desconexión realizada.<br />’;
}
else {
echo ’Error en la desconexión.’;
}
}
else {
printf(’Error %d : %s.<br/>’,mysqli_connect_errno(),
mysqli_connect_error());
}
?>
Conexión realizada.
Información del servidor:MySQL host info: 127.0.0.1 con TCP/IP
Persona añadida.
Desconexión realizada.
d. Modificar datos
Para obtener el número de registros que la consulta de tipo UPDATE ha modificado, utilice la función mysqli_stmt_affected_rows().
Esta función toma como argumento el objeto consulta que la función mysqli_prepare() ha devuelto y devuelve -1 en caso de error y el número de registros
actualizados en caso contrario.
Por ejemplo, para modificar la persona cuyo apellido es MORALES, cambiando su apellido de nuevo a Morales y su edad de 62 a 61 años:
Da como resultado:
<?php
// Conexión a la base de datos
$base = mysqli_connect("127.0.0.1", "root", "", "_prueba");
if ($base) {
echo ’Conexión realizada.<br />’;
echo ’Información del servidor:’.mysqli_GET_host_info($base).
’<br />’;
if ($ok == FALSE) {
echo "Error en la ejecución de la consulta.<br />";
}
else {
echo "Número de personas modificadas:
".mysqli_stmt_affected_rows($resultado).".<br />";
}
mysqli_stmt_close($resultado);
if (mysqli_close($base)) {
echo ’Desconexión realizada.<br />’;
}
else {
echo ’Error en la desconexión.’;
}
}
else {
printf(’Error %d : %s.<br/>’,mysqli_connect_errno(),
mysqli_connect_error());
}
?>
Conexión realizada.
Información del servidor:MySQL host info: 127.0.0.1 con TCP/IP
Número de personas modificadas:1.
Desconexión realizada.
www.FreeLibros.me
e. Eliminar datos
De la misma manera que para escribir o modificar datos, vamos a utilizar las
funciones mysqli_prepare(), mysqli_stmt_bind_param() y mysqli_stmt_execute() para eliminar datos.
Da como resultado:
<?php
// Conexión a la base de datos
$base = mysqli_connect("127.0.0.1", "root", "", "_prueba");
if ($base) {
echo ’Conexión realizada.<br />’;
echo ’Información del servidor:’.mysqli_GET_host_info($base).
’<br />’;
if ($ok == FALSE) {
echo "Error en la ejecución de la consulta.<br />";
}
else {
echo "Persona eliminada.<br />";
}
mysqli_stmt_close($resultado);
if (mysqli_close($base)) {
echo ’Desconexión realizada.<br />’;
}
else {
echo ’Error en la desconexión.’;
}
}
else {
printf(’Error %d : %s.<br/>’,mysqli_connect_errno(),
mysqli_connect_error());
}
?>
Conexión realizada.
Información del servidor:MySQL host info: 127.0.0.1 con TCP/IP
Persona eliminada.
Desconexión realizada.
f. Almacenar un resultado
Si quiere saber el número de registros seleccionados en una consulta de tipo SELECT, hay una función que permite almacenar el resultado y otra que obtiene el número
de registros de este resultado.
La función mysqli_stmt_store_result() permite almacenar en la memoria el resultado de una consulta. Esta función toma como argumento el objeto consulta
que la función mysqli_prepare() ha devuelto y devuelve false en caso de error y true en caso contrario.
La función mysqli_stmt_num_rows() permite devolver el número de registros de una consulta preparada. Esta función toma como argumento el objeto consulta
que la función mysqli_prepare() ha devuelto y devuelve 0 en caso de error y el número de registros de la consulta en caso contrario.
La función mysqli_stmt_free_result() permite liberar memoria con el resultado que se ha obtenido con mysqli_stmt_store_result(). Esta función
toma como argumento el objeto consulta que la función mysqli_prepare() ha devuelto y no devuelve nada.
Por ejemplo, para mostrar el número de personas que son mayores de 35 años:
Da como resultado:
<?php
// Conexión a la base de datos Este método consume memoria; por lo tanto, debe tener cuidado
$base = mysqli_connect("127.0.0.1", "root", "", "_prueba"); con lo que almacena en ella.
if ($base) {
echo ’Conexión realizada.<br />’;
echo ’Información del servidor:’.mysqli_GET_host_info($base).
’<br />’;
$sql = "Select Nombre, Apellidos FROM Persona WHERE Edad > ?";
// Preparación de la consulta
$resultado = mysqli_prepare($base, $sql);
// Enlace de argumentos.
$ok = mysqli_stmt_bind_param($resultado, ’i’,$Edad);
$Edad = 35; //mientras no ejecute la consulta,
//puede inicializar la variable
// Ejecución de la consulta.
$ok = mysqli_stmt_execute($resultado);
if ($ok == FALSE) {
echo "Error en la ejecución de la consulta.<br />";
}
else {
// Asociación de variables de resultado.
$ok = mysqli_stmt_bind_result($resultado,$Apellido,$Nombre);
// Almacenamiento de valores.
$ok = mysqli_stmt_store_result($resultado);
www.FreeLibros.me
echo "Número de personas que tengan una edad > 35:
".mysqli_stmt_num_rows($resultado)."<br />";
//Liberación del resultado
mysqli_stmt_free_result($resultado);
mysqli_stmt_close($resultado);
}
if (mysqli_close($base)) {
echo ’Desconexión realizada.<br />’;
}
else {
echo ’Error en la desconexión.’;
}
}
else {
printf(’Error %d : %s.<br/>’,mysqli_connect_errno(),
mysqli_connect_error());
}
?>
Conexión realizada.
Información del servidor:MySQL host info: 127.0.0.1 con TCP/IP
Número de personas que tengan una edad > 35: 2
Desconexión realizada.
Las funciones que permiten recuperar los errores de una consulta preparada son mysqli_stmt_errno() y mysqli_stmt_error().
La función mysqli_stmt_errno() permite devolver el número de error. Esta función toma como argumento el objeto consulta que la
función mysqli_prepare() ha devuelto y devuelve 0 si no hay error.
La función mysqli_stmt_error() permite devolver el mensaje de error. Esta función toma como argumento el objeto consulta que la
función mysqli_prepare() ha devuelto.
Estas funciones muestran los errores una vez que se ejecuta la consulta. Para ver los errores de preparación, utilice las
funciones mysqli_errno() y mysqli_error().
Por ejemplo, si añade una persona con un identificador que ya existe:
<?php
// Conexión a la base de datos
$base = mysqli_connect("127.0.0.1", "root", "", "_prueba");
if ($base) {
echo ’Conexión realizada.<br />’;
echo ’Información del servidor:’.mysqli_GET_host_info($base).
’<br />’;
www.FreeLibros.me
PDO
En esta parte, vamos a poner en práctica algunas nociones de PDO. Para la correcta compresión de su
sintaxis, es preciso asimilar los conceptos que se explican en el capítulo El objeto.
1. Introducción
PDO (PHP Data Object) es una librería de funciones PHP que permite acceder a cualquier base de datos,
ya que aporta una capa de abstracción al acceso a las bases de datos. Es un lenguaje orientado a
objetos, aunque el funcionamiento no es muy distinto al de mysqli. Siempre se debe escribir la consulta
y ejecutarla.
Para activar esta librería, abra el archivo PHP.ini, al que se accede con el menú Configuration, PHP. A
continuación, compruebe que no hay ningún punto y coma delante del registro:
Esta librería se escribe en lenguaje objeto; por lo tanto, la sintaxis puede ser confusa. En el capítulo El
objeto se explica más detalladamente la programación orientada a objetos.
La sección PHPMyAdmin explica cómo debe crear la base con los datos.
www.FreeLibros.me
2. Conexión
Para conectarse a base de datos MySQL, debe crear una instancia de la clase PDO, es decir, crear un
objeto que es un elemento de la clase PDO, pero con algunos argumentos. Este concepto se explica de
manera más concreta en el capítulo de programación orientada a objeto.
<?php
$base = new PDO(’mysql:host=127.0.0.1;dbname=_prueba’, ’root’, ’’);
?>
Para comprobar si el código ha generado un error, debe escribir el código con la instrucción try {}
catch (Exception $e) {}.
Por ejemplo:
<?php
try {
$base = new PDO(’mysql:host=127.0.0.1;dbname=_prueba’, ’root’, ’’);
}
catch (Exception $e) {
die(’Error : ’ . $e->GetMessage());
}
?>
Si en el bloque try pasa un error, PHP pasa automáticamente al bloque catch y por lo tanto ejecuta
la instrucción die(). La función die() equivale a la función exit(), es decir, termina el script actual
mostrando un mensaje.
Para recuperar los errores que se producen, debe añadir el siguiente código:
$base->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
Desde la versión 5.5 de PHP, es posible usar el bloque finally. Es bloque se ubica después del catch y
siempre se ejecuta.
Por ejemplo:
www.FreeLibros.me
<?php
try {
$base = new PDO(’mysql:host=127.0.0.1;dbname=_prueba’, ’root’, ’’);
$base->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
echo "Conexión ok.";
}
catch (Exception $e) {
die(’Error : ’ . $e->GetMessage());
}
finally {
}
?>
Da como resultado:
Conexión ok.
3. Consultas no preparadas
a. Leer datos
Este método forma parte del objeto conexión que ha devuelto con new PDO(). Toma como
argumento la consulta SQL en forma de cadena de caracteres.
Esta función devuelve un objeto resultado que contiene todo lo que la consulta SQL vuelve a enviar.
Este método forma parte del objeto $resultado que el método query() ha devuelto.
<?php
try
{
$base = new PDO(’mysql:host=127.0.0.1;dbname=_prueba’, ’root’, ’’);
$base->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
www.FreeLibros.me
die(’Error : ’.$e->GetMessage());
}
?>
Da como resultado:
Número de personas:6
Si ahora quiere mostrar los datos de la tabla Persona, debe utilizar fetch, que permite leer el registro
actual y desplazarse al siguiente registro.
Este método forma parte del objeto $resultado que el método query() ha devuelto.
Por ejemplo, para mostrar los apellidos y los nombres contenidos en la tabla Persona:
<?php
try
{
$base = new PDO(’mysql:host=127.0.0.1;dbname=_test’, ’root’, ’’);
$base->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
?>
Da como resultado:
Número de personas:6
Apellidos:Morales y nombre:Luna
Apellidos:López y nombre:María
www.FreeLibros.me
Apellidos:Prieto y nombre:Mónica
b. Escribir datos
El método que permite ejecutar una consulta SQL de tipo UPDATE, INSERT o DELETE es: exec().
Este método forma parte del objeto conexión que se ha devuelto por new PDO(). Toma como
argumento la consulta SQL en forma de cadena de caracteres.
Por ejemplo, para insertar una persona llamada Oliver Durán, de 36 años de edad:
<?php
try
{
$base = new PDO(’mysql:host=127.0.0.1;dbname=_test’, ’root’, ’’);
$base->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
?>
Por lo tanto, cuando inserta una nueva persona, no conoce su identificador. Para recuperar el último
Id autoincremental que se ha añadido en la base de datos, debe utilizar
el método lastInsertId(). Este método forma parte del objeto conexión que se ha devuelto
por new PDO() y devuelve el último entero autoincremental que se ha añadido en la base de datos.
Por ejemplo, para insertar una persona llamada Gerardo Roldán, de 64 años de edad:
<?php
try
{
$base = new PDO(’mysql:host=127.0.0.1;dbname=_prueba’, ’root’, ’’);
$base->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
www.FreeLibros.me
$base->exec($sql);
echo "El identificador de la última persona añadida es:";
echo $base->lastInsertId().".";
}
catch(Excepción $e)
{
// mensaje en caso de error
die(’Error : ’.$e->GetMessage());
}
?>
Da como resultado:
c. Eliminar datos
El método que permite ejecutar una consulta SQL de tipo UPDATE, INSERT o DELETE es: exec().
Este método forma parte del objeto conexión que se ha devuelto por new PDO(). Toma como
argumento la consulta SQL en forma de cadena de caracteres.
<?php
try
{
$base = new PDO(’mysql:host=127.0.0.1;dbname=_prueba’, ’root’, ’’);
$base->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
?>
Da como resultado:
Persona eliminada.
d. Actualizar datos
www.FreeLibros.me
El método que permite ejecutar una consulta SQL de tipo UPDATE, INSERT o DELETE es: exec().
Este método forma parte del objeto conexión que se ha devuelto por new PDO(). Toma como
argumento la consulta SQL en forma de cadena de caracteres.
Para obtener el número de registros modificados en una consulta de tipo UPDATE, utilice el retorno del
método exec(), que devuelve el número de registros afectados.
Por ejemplo, para modificar el apellido Prieto por Lucas y la edad de 36 a 33 años:
<?php
try
{
$base = new PDO(’mysql:host=127.0.0.1;dbname=_prueba’, ’root’, ’’);
$base->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
?>
Da como resultado:
4. Consultas preparadas
a. Leer datos
El método que permite preparar una consulta SQL de tipo SELECT, UPDATE, DELETE o INSERT
es:prepare().
Este método forma parte del objeto conexión que se ha devuelto por new PDO(). Toma como
argumento una cadena de caracteres que contiene la consulta SQL con apellidos o marcadores que
hay que unir a valores diferentes.
Esta función devuelve un objeto de tipo PDOStatement que contiene todo lo que vuelve a enviar la
consulta SQL.
Por ejemplo, para mostrar los apellidos y los nombres incluidos en la tabla Persona con una edad > 5
y un apellido que comienza por ’Mo’:
<?php
try
{
$base = new PDO(’mysql:host=127.0.0.1;dbname=_prueba’, ’root’, ’’);
www.FreeLibros.me
$base->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
$resultado->closeCursor();
}
catch(Excepción $e)
{
// mensaje en caso de error
die(’Error : ’.$e->GetMessage());
}
?>
Da como resultado:
Y
Apellidos:Morales HonHon, Nombre:Nanie
<?php
try
{
$base = new PDO(’mysql:host=127.0.0.1;dbname=_prueba’, ’root’, ’’);
$base->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
$sql = "Select Nombre, Apellidos FROM Persona WHERE Edad > :Edad
AND Apellidos LIKE :apellido";
// Preparación de la consulta con los marcadores
$resultado = $base->prepare($sql);
$resultado->ejecuta(array(’edad’ => 5,’apellido’ => ’Mo%’)); //execute
toma como parámetro una tabla que contiene como clave el número
de marcadores y sus valores correspondientes
while ($registro = $resultado->fetch())
{
echo ’Apellidos:’.$registro[’Apellido’].’,
Nombre:’.$registo[’Nombre’].’<br />’;
}
$resultado->closeCursor();
}
catch(Exception $e)
{
// mensaje en caso de error
die(’Error : ’.$e->GetMessage());
}
?>
www.FreeLibros.me
Da como resultado:
Esta solución tiene la ventaja de ser un poco más legible en los argumentos que pasan a la consulta
SQL.
b. Escribir datos
Al igual que para leer datos, va a utilizar los métodos prepare() y execute().
Por ejemplo, para insertar una persona llamada Clara Rincón López, de 42 años de edad:
<?php
try
{
$base = new PDO(’mysql:host=127.0.0.1;dbname=_prueba’, ’root’, ’’);
$base->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
}
catch(Excepción $e)
{
// mensaje en caso de error
die(’Error : ’.$e->GetMessage());
}
?>
Da como resultado:
Si quiere ejecutar una consulta de inserción varias veces seguidas, utilice el enlace de argumentos
con el método bindParam().
Por ejemplo, para insertar una persona llamada Juan López Ruiz, de 57 años, y otra persona llamada
Bob Martínez, de 45 años de edad:
<?php
www.FreeLibros.me
try
{
$base = new PDO(’mysql:host=127.0.0.1;dbname=_prueba’, ’root’, ’’);
$base->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
$resultado->closeCursor();
}
catch(Exception $e)
{
// mensaje en caso de error
die(’Error : ’.$e->GetMessage());
}
?>
Da como resultado:
c. Eliminar datos
Al igual que para escribir y leer datos, va a utilizar los métodos prepare() y execute().
Par ejemplo, para eliminar el registro Martínez:
<?php
try
www.FreeLibros.me
{
$base = new PDO(’mysql:host=127.0.0.1;dbname=_prueba’, ’root’, ’’);
$base->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
}
catch(Exception $e)
{
// mensaje en caso de error
die(’Error : ’.$e->GetMessage());
}
?>
Da como resultado:
Persona eliminada.
d. Modificar datos
Al igual que para escribir y leer datos, va a utilizar los métodos prepare() y execute().
Por ejemplo, para modificar la edad de Nanie Morales HonHon de 55 a 36 años:
<?php
try
{
$base = new PDO(’mysql:host=127.0.0.1;dbname=_prueba’, ’root’, ’’);
$base->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
}
catch(Excepción $e)
{
// mensaje en caso de error
die(’Error : ’.$e->GetMessage());
}
?>
Da como resultado:
Persona modificada.
www.FreeLibros.me
Un procedimiento almacenado tiene un nombre y puede tener argumentos de entrada y de salida.
Lo hemos explicado más detalladamente en este capítulo, sección SQL avanzado - Los procedimientos
almacenados y funciones.
<?php
try
{
// Conexión a la base de datos
$base = new PDO(’mysql:host=127.0.0.1;dbname=_prueba’, ’root’, ’’);
$base->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
Da como resultado:
Este procedimiento vuelve a enviar el valor en entrada al cubo. El problema es que hay un bug en
PDO/MySQL que impide recuperar el valor de retorno de manera estándar. Por lo tanto, debe ejecutar
una segunda consulta para recuperar el valor de salida.
<?php
try
{
// Conexión a la base de datos
$base = new PDO(’mysql:host=127.0.0.1;dbname=_prueba’, ’root’, ’’);
www.FreeLibros.me
$base->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
$statement->nextRowset();
//lectura del argumento de salida
$row = $statement->fetchObject();
echo "El valor ".$entrada." Al cubo es:".$row->salida;
}
catch(Exception $e)
{
// mensaje en caso de error
die(’Error : ’.$e->GetMessage());
}
?>
Da como resultado:
www.FreeLibros.me
Ejercicios
1. Enunciados
Cree una página login.php que contenga un área login y una zona password con un botón de tipo
submit. Esta página llama a comprobar_login.php, que comprueba si el login y la contraseña se
encuentran en la base de datos. Retome el ejercicio 1 del capítulo Transmitir datos de una página a
otra y modifique la página verif_login.php para mostrar "login correcto" si la persona se halla en la base
de datos o para que se redireccione a la página login.php en caso contrario. También debe crear una
tabla inicio de sesion_password que contenga el Id, el login y la contraseña.
www.FreeLibros.me
Todos los campos son obligatorios. El Enlace muestra un pdf que contiene las condiciones generales y
es necesario haber pulsado sobre el enlace y después marcar la casilla de selección para poder enviar
el formulario.
Ahora creé una página conexión.php encargada de realizar la conexión a la base de datos y después
una página añadir.php que compruebe si la persona todavía no está registrada con su email y
almacene los datos del formulario en la base de datos. Esta página también debe comprobar los
errores y devolver un mensaje en la página inicio.php.
Se propone otros ejercicios relacionados con las base de datos al final de este libro.
2. Soluciones
www.FreeLibros.me
Password VARCHAR( 20 ) NOT NULL
) ENGINE = MYISAM ;
login.php:
comprobar_login.php:
try
{
$base = new PDO(’mysql:host=127.0.0.1;dbname=_test’, ’root’, ’’);
$base->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
www.FreeLibros.me
if ($numero registro != 0) {
echo "<h2>¡login correcto!</h2>";
}
else {
header("location:login.php?mensaje=1");
}
$resultado->closeCursor();
} 0
catch(Exception $e)
{
// mensaje en caso de error
die(’Error : ’.$e->GetMessage());
}
?>
</body>
</html>
Página inicio.php
<!doctype html>
<html>
<head>
<meta charset="ISO-8859-1">
<title>Inscripció a Formación para todos</title>
www.FreeLibros.me
#case1 {
margin-right:20px;
margin-top:-4px;
}
</style>
<script>
// Función de comprobación de la aceptación y otros campos para
los navegadores no compatibles con HTML5
function verif() {
if (document.form1.acceptation.checked == false) {
alert("Debe aceptar las condiciones.");
return false;
}
else {
//para IE8 y <
if (document.form1.nom.value==""
|| document.form1.apellidos.value==""
|| document.form1.titulo.value==""
|| document.form1.inicio.value==""
|| document.form1.fin.value==""
|| document.form1.email.value=="" ) {
alert("Todos los campos son obligatorios.");
return false;
}
else {
return true;
}
}
}
var check_ok=0; // inicialización a 0 -> el usuario no ha leído
las condiciones.
function verif_check() {
if (check_ok == 0) {
document.form1.acceptation.checked = false;
alert("Debe leer las condiciones.");
}
}
function maj_check() {
check_ok=1; // el usuario ha leído las condiciones
}
</script>
$(function() {
$("#fin").datepicker();
});
jQuery(function($){
www.FreeLibros.me
$.datepicker.regional[’fr’] = {
closeText: ’Cerrar’,
prevText: ’<Prec’,
nextText: ’Suguiente;’,
currentText: ’Actual’,
monthNames: [’Enero’,’Febrero’,’Marzo’,’Abril’,’Mayo’,
’Junio’,’Julio’,’Agosto’,’Septiembre’,’Octubre’,’Noviembre’,
’Diciembre’],
monthNamesShort: [’Ene’,’Feb’,’Mar’,’Abr’,’May’,’Jun’,
’Jul’,’Ags’,’Sep’,’Oct’,’Nov’,’Dic’],
dayNames: [’Domingo’,’Lunes’,’Martes’,’Miércoles’,’Jueves’,
’Viernes’,’Sábado’],
dayNamesShort: [’Dom’,’Lun’,’Mar’,’Mir’,’Jue’,’Vie’,’Sáb’],
dayNamesMin: [’Do’,’Lu’,’Ma’,’Mi’,’Ju’,’Vi’,’Sa’],
weekHeader: ’Sm’,
dateFormat: ’dd/mm/yy’,
firstDay: 1,
isRTL: false,
showMonthAfterYear: false,
yearSuffix: ’’};
$.datepicker.setDefaults($.datepicker.regional[’fr’]);
});
</script>
</head>
<body>
<div id="div1">
<h2>Bienvenido al sitio de incripción "Formación
para todos"</h2><br />
<h4>Rellene todos los campos del formulario y</h4>
<h4>haga clic en el botón Enviar para validar su
inscripción</h4><br />
<form action="ajouter.php" name="form1" method="POST"
onsubmit="return verif()">
<table>
<tr><td>Nombre: </td><td><input type="text" name="nom"
placeholder="Escriba un nombre" required="required" maxlength="25"/>
</td></tr>
<tr><td>Apellido: </td><td><input type="text" name=
"apellidos" placeholder="Escriba sus apellidos" required="required"
maxlength="25"/>
</td></tr>
<tr><td>Título de la formación: </td><td><input
type="text" name="titulo" placeholder="Título" required="
required" maxlength="100"/></td></tr>
<tr><td>Inicio de la formación: </td><td><input
type="text" name="inicio" id="inicio" placeholder="Indique la fecha
de inicio" required="required" /></td></tr>
<tr><td>Fin de la formacion : </td><td><input
type="text" name="fin" id="fin" placeholder="Indique la fecha de fin"
required="required"/></td></tr>
<tr><td>Dirección email: </td><td><input type="email"
name="email" placeholder="Dirección de mail válida"
required="required"
maxlength="100"/></td></tr>
<tr><td align="right"><input type="checkbox"
name="acceptation" id="case1" onclick="verif_check()"/> </td><td>
Acepto las condiciones, accesibles en <a href="conditions.pdf"
style="color:blue" onclick="maj_check()" target="_blanck">este enlace
</a>.</td></tr>
<tr><td colspan="2"><br /></td></tr>
www.FreeLibros.me
<tr><td colspan="2" align="center"><input type="submit"
name="go" value="Enviar" /></td></tr>
</table>
</form>
<br />
<h4 style="color:red;">
<?php
if (isset($_GET[’mensaje’]) && $_GET[’mensaje’] == 1) {
echo "Su inscripción se ha registrado.";
}
if (isset($_GET[’mensaje’]) && $_GET[’mensaje’] == 2) {
echo "Un de los campos está vacío.";
}
if (isset($_GET[’mensaje’]) && $_GET[’mensaje’] == 3) {
echo "Ya ha realizado la solicitud.";
}
?>
</h4>
<br />
</div>
</body>
</html>
Página conexión.php:
<?php
//connexion a la base de dato
$base = mysqli_connect("127.0.0.1", "root", "", "formacion");
?>
Página añadir.php
<?php
include(’conexion.php’);
if ($base)
{
$message=0;
$Nombre = htmlentities(addslashes($_POST[’nombre’]));
//funciones para evitar la inyección de script malintencionado
$Apellidos = htmlentities(addslashes($_POST[’apellidos’]));
$titulo = htmlentities(addslashes($_POST[’titulo’]));
$inicio = htmlentities(addslashes($_POST[’inicio’]));
$Fin = htmlentities(addslashes($_POST[’fin’]));
$Email = htmlentities(addslashes($_POST[’email’]));
if ($Nombre == "" || $Apellidos == "" || $titulo == "" ||
$inicio == "" || $Fin == "" || $Email == "") {
// caso en el que el usuario esquiva el javascript
$mensaje=2; //un de los campos es vacío
}
else {
$nbr=0; //nombre de persona que ya tiene este email
// VERIFICACIÓN SI LA PERSONA ESTÁ INSCRITA
================================================================
$sql = "SELECT Nombre, Apellidos FROM inscripcion WHERE
Email LIKE ? OR (Nombre LIKE ? AND Apellidos LIKE ?)";
// Preparación de la consulta
$resultado = mysqli_prepare($base, $sql);
www.FreeLibros.me
$ok = mysqli_stmt_bind_param($resultado, ’sss’,$Email,
$Nombre,$Apellidos);
// Ejecución de la consulta.
$ok = mysqli_stmt_execute($resultado);
if ($ok == FALSE) {
echo "Error de ejecución de la consulta.<br />";
$mensaje=0;
}
else {
// Asociación de las variables de resultado.
$ok = mysqli_stmt_bind_result($resultado,$Nombre,
$Apellidos);
// Almacena los valores.
$ok = mysqli_stmt_store_result($resultado);
$nbr=mysqli_stmt_num_rows($resultado);
//Libera el resultado
mysqli_stmt_free_result($resultado);
mysqli_stmt_close($resultado);
}
if ($nbr > 0) {
$mensaje=3; //Ya ha realizado la petición";
}
else {
// INSERCIÓN DE NUEVOS DATOS
===================================================================
===========
$sql = "INSERT INTO inscription (Nombre, Apellidos,
titulo, inicio, Fin, Email) VALUES (?,?,?,?,?,?)";
// Preparación de la consulta
$resultado_insert = mysqli_prepare($base, $sql);
date_default_timezone_set(’Europe/Paris’);
$dt_inicio = date_create_from_format(’d/m/Y’,$inicio);
//creación de un objeto Date a partir de la cadena de caracteres
$inicio
$dt_fin = date_create_from_format(’d/m/Y’, $Fin);
//creación de un objeto Date a partir de la cadena de caracteres $Fin
$ok = mysqli_stmt_bind_param($resultado_insert,
’ssssss’,$Nombre,$Apellidos,$titulo,$dt_inicio->format(’Y/m/d’),
$dt_fin->format(’Y/m/d’),$Email);
// Ejecución de la consulta.
$ok = mysqli_stmt_execute($resultado_insert);
if ($ok == FALSE)
{
echo "Error de ejecución de la consulta.<br />";
$mensaje=0;
}
else
{
$mensaje=1; //echo "Datos añadidos.";
}
mysqli_stmt_close($resultado_insert);
}
}
if (mysqli_close($base) == false) {
echo ’Error de desconnexion.’;
$mensaje=0;
}
}
else
{
www.FreeLibros.me
printf(’Error %d : %s.<br/>’,mysqli_connect_errno(),
mysqli_connect_error());
$mensaje=0;
}
www.FreeLibros.me
Introducción
El objetivo de este capítulo no es explicar todas las complejidades de la programación orientada a
objetos (POO), sino ver las bases para que pueda programar un código simple o entender cómo funciona
un código objeto que ya existe.
Por ahora, el código que se muestra es de carácter procedimental, es decir, puede crear las funciones a
las que llama cuando las necesita, todo en orden cronológico.
En POO, casi todo son objetos y todos los objetos interactúan entre sí.
Un objeto tiene unas características, que son los atributos, y unas acciones, que son los métodos.
Por ejemplo, el objeto Animal tiene como atributos el color y el peso, y tiene como métodos moverse y
comer.
www.FreeLibros.me
La clase
1. Introducción
Una clase sirve para fabricar objetos partiendo de un modelo. Estos objetos tienen sus
propiosatributos y ciertos métodos.
Por ejemplo, la clase Animal tiene los atributos color y peso y los métodos comer y moverse.
Cuando se crean ejemplares de animales en la clase Animal, se crea una instancia de esta clase. Crear
una instancia de una clase significa que se crea un objeto de un tipo determinado (Animal) con ciertos
atributos (color, peso).
<?php
class Animal // palabra clave class seguida del nombre de la clase.
{
// Declaración de atributos y métodos.
}
?>
Se recomienda crear una clase por cada archivo PHP que tenga el mismo nombre que la clase.
2. La encapsulación
Todos los atributos en POO deben estar ocultos de otras personas que utilizan sus clases. Si trabaja
en equipo y crea la clase Animal, los otros programadores no van a poder cambiar directamente los
atributos de su clase. De esta forma, los atributos color y peso se ocultan en otras clases; se declaran
privadas. La clase Animal tiene métodos para leer o escribir en estos atributos. Este es el principio de
encapsulación, que permite proteger el código cuando trabaja en equipo.
La clase Animal, que tiene como propiedades el color y el peso, dispone de un método para modificar su
color, un método para leer el color, un método para modificar su peso, un método para leer su peso, así
como otros métodos tales como comer o moverse (ver la sección Actualizar y leer los atributos de la
instancia, más adelante en este capítulo).
private: solo el código de su clase puede ver y acceder a este atributo o método.
public: todas las demás clases pueden acceder a este atributo o método.
www.FreeLibros.me
protected: solo el código de su clase y de sus subclases pueden acceder a este atributo o
método.
<?php
class Animal // palabra clave seguida del nombre de la clase.
{
// Declaración de atributos.
private $color;
private $peso;
}
?>
<?php
class Animal // palabra clave seguida del nombre de la clase.
{
// Declaración de atributos.
private $color = "gris";
private $peso = 10;
}
?>
Para añadir los métodos a su clase, las normas de visibilidad son las mismas que en los atributos:
<?php
class Animal // palabra clave seguida del nombre de la clase.
{
// Declaración de atributos y métodos.
private $color = "gris";
private $peso = 10;
}
?>
www.FreeLibros.me
Por ejemplo, para aplicar el método añadir_un_kilo() en la clase Animal:
<?php
class Animal // palabra clave seguida del nombre de la clase.
{
// Declaración de atributos y métodos.
private $color = "gris";
private $peso = 10;
}
?>
Cuando llama al método añadir_un_kilo(), añadirá 1 al peso actual y por lo tanto el peso final
será 11.
Las propiedades se declaran con el símbolo $, pero se llaman con $this sin este símbolo.
5. Utilización de la clase
Como primer paso, tenemos que crear un archivo que contenga un código PHP Animal.class.php.
Para utilizar la clase Animal, debe incluirla en la página donde la quiere llamar.
<?php
include(’Animal.class.php’);
?>
Ahora que ha cargado la clase, puede instanciarla, es decir, crear un objeto que tenga como modelo la
clase Animal:
<?php
//carga de la clase
www.FreeLibros.me
include(’Animal.class.php’);
La variable $perro es una instancia de la clase Animal, con los atributos propios de color, peso, y
como métodos comer, moverse, añadir_un_kilo.
Generalmente sus nombres van precedidos del prefijo get para leer el valor del atributo y set para
escribir el valor del atributo.
<?php
class Animal // palabra clave seguida del nombre de la clase.
{
// Declaración de atributos
private $color = "gris";
private $peso = 10;
//accesos
public function getColor()
{
return $this->color; //devuelve el color
}
public function setColor($color)
{
$this->color = $color; //escrito en el atributo color
}
//métodos
public function comer()
{
//método para acceder a las propiedades
//color y peso
}
www.FreeLibros.me
//color y peso
}
}
?>
Los accesos son públicos y por lo tanto permiten leer o escribir en los atributos desde cualquier otra
clase o página PHP.
<?php
//carga de la clase
include(’Animal.class.php’);
//leer el peso
echo "El peso del perro es:".$perro->getPeso()." kg<br />";
//añadir un kilo al perro
$perro->añadir_un_kilo();
//leer el peso
echo "El peso del perro es:".$perro->getPeso()." kg<br />";
//actualizar el peso del perro
$perro->setPeso(15);
//leer el peso
echo "El peso del perro es:".$perro->getPeso()." kg<br />";
?>
Da como resultado:
<?php
//carga de la clase
include(’Animal.class.php’);
www.FreeLibros.me
//actualizar el peso del perro
$perro->setPeso(18);
//leer el peso
echo "El peso del perro es:".$perro->getPeso()." kg<br />";
//actualizar el color del perro
$perro->setColor("negro");
//leer el color
echo "El color del perro es:".$perro->getColor()."<br />";
?>
Da como resultado:
$gato y $perro son objetos de tipo Animal. Pueden pasar como argumento un método, siempre y
cuando acepte este tipo de objeto.
Para probar este ejemplo, cambie el método comer() de la clase Animal. Se convierte
en comer_animal(Animal $animal_comido) y toma como argumento un objeto de tipo Animal.
<?php
class Animal
{
// Declaración de atributos
private $color = "gris";
private $peso = 10;
//accesos
public function getColor()
{
return $this->color; //devuelve el color
}
public function setColor($color)
{
$this->color = $color; //escrito en el atributo color
www.FreeLibros.me
}
//Métodos
public function comer_animal(Animal $animal_comido)
{
//el animal que come aumenta su peso tanto
//como el del animal comido
$this->peso = $this->peso + $animal_comido->peso;
//el peso del animal comido y su color se restablecen a 0
$animal_comido->peso = 0;
$animal_comido->color = "";
}
}
?>
<?php
//carga de la clase
include(’Animal.class.php’);
www.FreeLibros.me
//leer el peso
echo "El peso del pez es:".$pez->getPeso()." kg<br />";
//actualizar el color del pez
$pez->setColor("blanco");
//leer el color
echo "El color del pez es:".$pez->getColor()."<br /><br />";
?>
Da como resultado:
El objeto $gato llama al método comer_animal ($pez) y pasa como argumento el objeto de tipo
Animal $pez. Es decir, el objeto $pez con sus atributos y sus métodos se pasan como argumento.
Esto permite pasar como argumento varios valores con un único parámetro. El
método comer_animal(Animal $animal_comido) solo acepta un argumento de tipo Animal.
$gato->comer_animal("Rana");
O de esta manera:
$gato->comer_animal(4);
8. El constructor
El constructor, como su nombre indica, sirve para construir un objeto del tipo clase. Cuando escribe new
Animal(), por defecto llama al constructor de la clase Animal.
Puede crear sus propios constructores y así pasar como argumento el valor de los atributos que desea
asignar a su objeto.
www.FreeLibros.me
Para añadir un constructor que toma como argumentos el peso y el color, la página Animal.class.php se
convierte en:
<?php
class Animal
{
// Declaración de atributos
private $color = "gris";
private $peso = 10;
<?php
//carga de la clase
include(’Animal.class.php’);
?>
Da como resultado:
Llamar al constructor.
Se muestra en primer lugar "Llamar al constructor", ya que la instrucción echo que se ha escrito en el
constructor __construct de su clase Animal se llama cada vez que ejecuta new Animal().
www.FreeLibros.me
El constructor toma como argumento los valores de sus atributos. Esto evita llamar los
métodos setColor() y setPeso().
9. El destructor
El destructor sirve para destruir el objeto con el fin de liberarlo de la memoria. Se llama
automáticamente al final del script PHP o cuando se destruye el objeto.
Para destruir un objeto, puede utilizar la función unset(). Esta función toma como argumento el
objeto que hay que destruir.
<?php
?>
Por defecto llama al destructor. Puede modificarlo si añade la función __destruct() en la clase.
<?php
class Animal
{
// Declaración de atributos
private $color = "gris";
private $peso = 10;
Etc.
.
.
.
}
?>
www.FreeLibros.me
10. Ejercicio
Enunciado (fácil)
pez1, gris, 10 kg
pez2, rojo, 7 kg
Solución
<?php
//carga de la clase
include(’Animal.class.php’);
?>
Da como resultado:
Llamada al constructor.
Llamada al constructor.
Llamada al destructor
Llamada al destructor
www.FreeLibros.me
Ejemplo de declaración de una constante normal:
define(’PI’,3.1415926535);
Una constante de clase representa una constante pero que está unida a esta clase.
Si lee el código, no puede saber inmediatamente que el número 10 representa el peso del animal.
const PESO_LIGERO = 5;
const PESO_MEDIO = 10;
const PESO_PESADO = 15;
Las constantes siempre están en mayúsculas, sin el símbolo $ y precedidas de la palabra clave const.
<?php
class Animal
{
// Declaración de atributos
private $color = "gris";
private $peso = 10;
//constantes de clase
const PESO_LIGERO = 5;
const PESO_MEDIO = 10;
const PESO_PESADO = 15;
etc.
.
.
.
?>
Para llamar a esta constante desde la página uso.php, la sintaxis es algo peculiar. Debe
escribir ::entre la clase y su constante:
<?php
//carga de la clase
include(’Animal.class.php’);
www.FreeLibros.me
$pez1->comer_animal($pez2);
//leer el peso
echo "El nuevo peso del pez1 es:".$pez1->getPeso()." kg<br />";
//leer el nuevo peso
echo "El nuevo peso del pez2 es:".$pez2->getPeso()." kg<br />";
?>
Da como resultado:
Llamada al constructor.
Llamada al constructor.
Animal::PESO_MEDIO siempre es 10, sea cual sea la instancia. Por lo tanto, la constante no está unida
a la instancia, sino a la clase. Por este motivo la sintaxis es peculiar.
a. Método estático
El método estático está unido a la clase, pero no al objeto. En el ejemplo de la clase Animal, un
método estático está unido al Animal, y no a los perros, los gatos o los peces.
Para convertir un método estático, debe añadir la palabra clave static delante de function.
Por ejemplo, modifique el método moverse() para convertirlo en estático y muestre "El animal se
mueve.".
<?php
class Animal
{
// Declaración de atributos
private $color = "gris";
private $peso = 10;
//constantes de clase
const PESO_LIGERO = 5;
const PESO_MEDIO = 10;
const PESO_PESADO = 15;
www.FreeLibros.me
//accesos
public function getColor()
{
return $this->color; //devuelve el color
}
public function setColor($color)
{
$this->color = $color; //escrito en el atributo color
}
//métodos
public function comer_animal(Animal $animal_comido)
{
//el animal que come aumenta su peso tanto como
//el del animal comido
$this->peso = $this->peso + $animal_comido->peso;
//el peso del animal comido y su color se restablecen a 0
$animal_comido->peso = 0;
$animal_comido->color = "";
}
}
?>
Es imposible escribir en un método estático la palabra clave $this, ya que representa el objeto, y el
método estático está unido a la clase.
Para llamar a este método desde la página uso.php, debe utilizar la misma sintaxis que en las
constantes (también unidas a la clase), es decir, introducir :: entre la clase y su método estático:
<?php
//carga de la clase
include(’Animal.class.php’);
www.FreeLibros.me
?>
Da como resultado:
El animal se mueve.
Puede llamar al método estático desde un objeto, pero el método estático no puede cambiar nada de
este objeto:
<?php
//carga de la clase
include(’Animal.class.php’);
?>
Da como resultado:
Llamada al constructor
El animal se mueve.
b. Atributo estático
Un atributo estático es un atributo propio de la clase y no del objeto, al igual que en los métodos
estáticos. Es el mismo principio que en una constante, salvo que el atributo está en una variable y
puede cambiar su valor.
Por ejemplo, para añadir un atributo estático que representa a un contador que indica el número de
veces que se instancia la clase:
<?php
class Animal
{
// Declaración de atributos
private $color = "gris";
private $peso = 10;
//constantes de clase
const PESO_LIGERO = 5;
const PESO_MEDIO = 10;
const PESO_PESADO = 15;
etc.
.
www.FreeLibros.me
.
.
?>
Para cambiar el valor de este contador, no puede utilizar $this. De hecho, $this representa un
objeto (perro, gato), y no la clase Animal. El contador es de tipo estático y por lo tanto está unido a la
clase. Para llamar a este atributo en la clase, debe utilizar la palabra clave self, que representa la
clase.
Para añadir 1 al contador cada vez que vaya a instanciar la clase Animal, debe modificar el
constructor. A continuación debe añadir un método que permita leer este atributo privado con ayuda
de un método de tipo public static y getContador().
<?php
class Animal
{
// Declaración de atributos
private $color = "gris";
private $peso = 10;
//constantes de clase
const PESO_LIGERO = 5;
const PESO_MEDIO = 10;
const PESO_PESADO = 15;
self::$contador = self::$contador + 1;
}
...
?>
La página uso.php:
<?php
//carga de la clase
include(’Animal.class.php’);
www.FreeLibros.me
$perro1 = new Animal("rojo",10);
//instanciar la clase Animal
$perro2 = new Animal("gris",5);
//instanciar la clase Animal
$perro3 = new Animal("negro",15);
//instanciar la clase Animal
$perro4 = new Animal("blanco",8);
?>
Da como resultado:
Llamada al constructor.
Llamada al constructor.
Llamada al constructor.
Llamada al constructor.
www.FreeLibros.me
La herencia
1. Introducción
La herencia es un concepto muy importante en POO. Permite reutilizar el código de una clase sin
necesidad de volver a escribirlo.
Una clase hija hereda de una clase madre, es decir, accede a todos los atributos y los métodos públicos
de la clase madre.
Por ejemplo, la clase Mamífero hereda de la clase Animal, y la clase Coche hereda de la clase Vehículo.
Si la clase A es una subcategoría de la clase B, entonces puede hacer que la clase A (Mamífero o Coche)
herede de la clase B (Animal o Vehículo).
En el siguiente esquema puede observar como las clases Pez y Gato son ejemplos de herencia de la
clase Animal.
Para crear la clase Pez que hereda de la clase Animal, debe utilizar la palabra clave extends entre el
nombre de la clase hija y el nombre de la clase madre.
<?php
class Pez extends Animal
{
}
?>
<?php
class Pez extends Animal
{
private $vive_en_el_mar; //tipo de pez
www.FreeLibros.me
//accesos
public function getType()
{
if ($this->vive_en_el_mar){
return "vive_en_el_mar";
}
else if ($this->vive_en_el_mar===falso){
return "no_vive_en_el_mar";
}else {return "";}
}
public function setType($vive_en_el_mar)
{
$this->vive_en_el_mar = $vive_en_el_mar;
//escrito en el atributo vive_en_el_mar
}
//método
public function nadar()
{
echo "Nado <br />";
}
}
?>
<?php
class Gato extends Animal
{
private $raza; //raza del gato
//accesos
public function getRaza()
{
return $this->raza; //devuelve la raza
}
public function setRaza($raza)
{
$this->raza = $raza; //escrito en el atributo raza
}
//método
public function maullar()
{
echo "Miau <br />";
}
}
?>
Las clases Gato y Pez, que heredan de la clase Animal, tienen acceso a los atributos públicos de la
clase Animal.
La página uso.php:
<?php
//carga de clases
include(’Animal.class.php’);
include(’Pez.class.php’);
include(’Gato.class.php’);
www.FreeLibros.me
//instanciar la clase Pez que llama al constructor de
//la clase Animal
$pez = new Pez("gris",8);
//instanciar la clase Gato que llama al constructor de la
//clase Animal
$gato = new Gato("blanco",4);
//leer el peso con el acceso de la clase madre
echo "El peso del pez es:".$pez->getPeso()." kg<br />";
//leer el peso con el acceso de la clase madre
echo "El peso del gato es:".$gato->getPeso()." kg<br />";
$pez->setType(true);
//leer el tipo con el acceso de su propia clase
echo "El tipo de pez es:".$pez->getType()."<br />";
//llamada al método de la clase Pez
$pez->nadar();
$gato->setRaza("Angora");
//leer la raza con el acceso de su propia clase
echo "La raza del gato es:".$gato->getRaza()."<br />";
//llamada al método de la clase gato
$gato->maullar();
?>
Da como resultado:
Llamada al constructor.
Llamada al constructor.
Nado
Miau
La clase Pez no tiene acceso a los atributos de la clase Gato y viceversa, ya que una hereda de la otra.
Las clases Pez y Gato no tienen directamente acceso a los atributos privados color y peso de la clase
Animal. Deben pasar por sus accesos públicos.
2. Protected
Este tipo de visibilidad equivale a private, salvo que las clases hijas puedan ver los
atributos protected de la clase madre.
Por ejemplo, vamos a añadir el atributo $edad de visibilidad protegida (protected) en la clase
madre Animal:
www.FreeLibros.me
<?php
class Animal
{
// Declaración de atributos
private $color = "gris";
private $peso = 10;
protected $edad = 0;
etc.
Este atributo no tiene acceso público; por lo tanto, ninguna de las otras clases hijas que heredan de
Animal y de la clase Animal pueden modificarlo o leerlo.
<?php
//carga de clases
include(’Animal.class.php’);
include(’Pez.class.php’);
?>
Da como resultado:
www.FreeLibros.me
La clase Pez no tiene acceso al atributo peso de la clase Animal, ya que es privado.
En conclusión, se recomienda poner los atributos en visibilidad protected, ya que la propia clase, las
clases hijas y las que heredan tienen acceso a este atributo.
3. Sustitución
La Sustitución sirve para modificar un método que ya existe en una clase madre, con el objetivo de
cambiar el comportamiento. El método existe en dos clases diferentes y según el contexto se ejecuta el
de la clase hija o el de la clase madre.
//método sustituido
public function comer_animal(Animal $animal_comido)
{
if (isset($animal_comido->raza)){
$animal_comido->raza="";
}
if (isset($animal_comido->vive_en_el_mar)){
$animal_comido->vive_en_el_mar="")
}
}
El problema es que este método inicializa correctamente el atributo vive_ en_ el_mar del pez comido,
pero ya no inicializa su peso y su color. No puede cambiar aquí su peso y su color, ya que estos
atributos son privados en la clase Animal.
//Método sustituido
public function comer_animal(Animal $animal_comido)
{
// al método comer_animal() de la clase padre,
// es decir Animal
padre::comer_animal($animal_comido);
if (isset($animal_comido->raza)){
$animal_comido->raza="";
}
if (isset($animal_comido->vive_en_el_mar)){
$animal_comido->vive_en_el_mar="")
}
}
www.FreeLibros.me
padre es una palabra clave que designa la clase madre, es decir, la clase Animal.
La página uso.php:
<?php
//carga de clases
include(’Animal.class.php’);
include(’Pez.class.php’);
?>
Da como resultado:
Llamada al constructor.
Llamada al constructor.
4. Herencia en cascada
La herencia múltiple no existe en PHP. Una clase solo puede heredar de una única clase, que a su vez
puede heredar de una clase, etc.
www.FreeLibros.me
Este ejemplo muestra que las clases Pez Espada y Carpa heredan de la clase Pez, que a su vez hereda
de la clase Animal.
www.FreeLibros.me
Las clases abstractas
Las clases abstractas se escriben con la palabra clave abstract delante de la palabra class. Una
clase abstracta no se puede instanciar, es decir, no permite crear una instancia. Puede escribir métodos
abstractos, que son métodos donde solo escribe la firma precedida por la palabra
clave abstract: abstract visibilidad function nombre_método (atributo tipo_atributo...). Estas clases
solo sirven para obligar, a las clases que heredan de la clase abstracta, a reemplazar los métodos
abstractos declarados en la clase abstracta.
En el siguiente ejemplo, la clase Animal es abstracta, ya que no se quiere crear (instanciar) animales,
sino peces o gatos.
<?php
abstract class Animal
{
// Declaración de atributos
private $color = "gris";
private $peso = 10;
//constantes de clase
const PESO_LIGERO = 5;
const PESO_MEDIO = 10;
const PESO_PESADO = 15;
self::$contador = self::$contador + 1;
}
//accesos
public function getColor()
{
return $this->color; //devuelve el color
}
public function setColor($color)
{
$this->color = $color; //escrito en el atributo color
}
public function getPeso()
{
return $this->peso; //devuelve el peso
}
public function setPeso($peso)
{
$this->peso = $peso; //escrito en el atributo peso
www.FreeLibros.me
}
//métodos públicos
}
?>
Observe que el método abstracto respira() no tiene cuerpo, es decir, no hay llaves {} en la
aplicación del método.
Como las clases Pez y Gato heredan de la clase Animal, está obligado a definir de nuevo el
método respira() en las clases Pez y Gato.
Y en la clase Gato:
www.FreeLibros.me
<?php
//carga de clases
include(’Animal.class.php’);
include(’Pez.class.php’);
include(’Gato.class.php’);
?>
Da como resultado:
Llamada al constructor.
Llamada al constructor.
El pez respira.
El gato respira.
www.FreeLibros.me
Las clases finales
Cuando una clase es final, no se puede crear la clase hija que hereda de esta clase. Esto tiene poco
interés práctico.
<?php
final class Pez extends Animal
{
private $vive en el mar; //tipo de pez
//accesos
...
//método
public function nadar()
{
echo "Nado <br />";
}
}
?>
También puede declarar los métodos finales. Estos métodos no se podrán sustituir.
www.FreeLibros.me
Los métodos mágicos
Un método mágico es un método al que se llama automáticamente cuando se produce un
acontecimiento.
Por ejemplo __construct es un método mágico. Se ejecuta automáticamente cuando instancia la clase
que contiene __construct.
Los métodos mágicos __get y __set permiten leer o modificar los atributos que no existen y en los que
el acceso está prohibido.
<?php
class Animal
{
// Declaración de atributos
private $color = "gris";
public $peso = 10;
//métodos públicos
public function comer ()
{
}
}
?>
Cuando crea una instancia de la clase Animal, puede acceder al atributo peso porque es público, pero no
al atributo color porque es privado.
www.FreeLibros.me
<?php
//carga de clases
include(’Animal.class.php’);
$perro->color = "negro";
echo $perro->color."<br />";
?>
Muestra un error porque intenta acceder directamente al atributo color, que es privado:
Llamada al constructor.
<?php
class Animal
{
// Declaración de atributos
private $color = "gris";
public $peso = 10;
private $tab_atributos = array();
//métodos mágicos
public function __get($nombre)
{
echo "__get <br />";
if (isset ($this->tab_atributos[$nombre]))
return $this->tab_atributos[$nombre];
}
www.FreeLibros.me
//métodos públicos
public function comer ()
{
...
}
}
?>
La página uso.php:
<?php
//carga de clases
include(’Animal.class.php’);
$perro->color = "negro";
echo $perro->color."<br />";
if (isset($perro->peso)) {
echo "El atributo peso existe.<br />";
}
else {
echo "El atributo peso no existe.<br />";
}
$perro->peso = 25;
echo $perro->peso."<br />";
?>
Da como resultado:
Llamada al constructor.
__set
__get
Negro
www.FreeLibros.me
25
Explicación:
$perro->color = "negro"; da como resultado: __set. El atributo color es privado; por lo tanto,
no se puede acceder a él y llama automáticamente a __set y el valor se almacena en la
tabla $tab_atributos.
echo $perro->color."<br />"; da como resultado: __get y negro. El atributo color siempre es
privado; por lo tanto, llama automáticamente a __get para mostrar el color.
$perro->peso = 25; no muestra nada porque no llama a la función __set. El atributo peso es
público, puede acceder directamente a él.
echo $perro->peso."<br />"; da como resultado 25. El atributo peso es público y por lo tanto
puede acceder directamente a él.
Para eliminar un atributo que el método mágico __set ha añadido, debe ejecutar el método
mágico __unset($atributo), que eliminará el atributo de la tabla $tab_atributos.
Para terminar, los métodos mágicos __call y __callStatic permiten llamar a los métodos privados
o que no existen. La función method_exist() comprueba si un método existe en un objeto. Toma
como argumento el objeto y el nombre del método. Devuelve true si el método existe yfalse si no.
La clase Animal con un método público comer() y un método privado moverse() se convierte en:
<?php
class Animal
{
// Declaración de atributos
private $color = "gris";
public $peso = 10;
private $tab_atributos = array();
www.FreeLibros.me
//métodos mágicos
public function __get($nombre)
{
echo "__get <br />";
if (isset ($this->tab_atributos[$nombre]))
return $this->tab_atributos[$nombre];
}
//método público
public function comer()
{
echo "Método público comer() <br />";
}
//método privado
private function moverse($lugar)
{
echo "Método privado moverse() <br />";
}
}
?>
La página uso.php:
www.FreeLibros.me
<?php
//carga de clases
include(’Animal.class.php’);
?>
Da como resultado:
Llamada al constructor.
Animal::moverse("París");
www.FreeLibros.me
Namespaces
Cuando trabaja en proyectos grandes en equipo, es útil modularizar las clases y las funciones. De esta
manera, cada desarrollador puede trabajar con su propio módulo. Desde PHP 5.3, las namespaces
(espacio de nombres), permiten esta modularización. Un namespace es una especie de carpeta virtual en
la que almacena sus objetos. De esta manera es posible usar clases o funciones con el mismo nombre,
en namespaces diferentes.
Un namespace se declara con la palabra clave namespace, seguido de su nombre, al inicio del archivo.
Por ejemplo:
Espacio_nombre.php
<?php
// Definición del espacio de nombres.
namespace Biblioteca;
// Definición de una constante.
const PI = 3.1416;
// Definición de una función.
function miFuncion() {
echo "Hola <br />";
}
// Definición de una clase.
class miClase {
/*
...
*/
}
?>
Uso_espacio_nombres.php:
<?php
include(’espacio_nombres.php’);
Biblioteca\miFuncion(); //Llamada al namespace Biblioteca raíz
?>
Muestra:
Hola
Namespace Espacio1/subespacio1;
Las rutas para encontrar una función, clase o constante en un espacio de nombres son relativos si
empieza por el namespace o absoluto si empieza con /.
Por ejemplo:
Espacio_nombres.php:
<?php
www.FreeLibros.me
// Definición del espacio de nombres.
namespace Biblioteca;
Uso_espacio_nombres.php
<?php
namespace Project;
include(’espacio_nombres.php’);
// Muestra el espacio de nombres actual.
echo ’Espacio de nombres actual = ’, __NAMESPACE__,’<br />’;
\Biblioteca\miFuncion(); //Llamada al namespace Biblioteca raíz
echo \Biblioteca\PI."<br />";
$gato = new \Biblioteca\Animal();
$gato->setColor("negro");
echo "El color del gato es:".$gato->getColor();
?>
Muestra:
Hola
3.1416
Para terminar, puede crear un alias en el espacio de nombres o en un objeto contenido en el espacio de
nombres.
www.FreeLibros.me
Use\Biblioteca as biblio;
<?php
namespace Project ;
include (´espacio_nombres.php’) ;
//Muestra el espacio de nombres actual.
echo ’Espacio de nombres actual = ’, _NAMESPACE_’<br />’;
\Biblioteca\miFuncion() ; llamada al namespace Biblioteca raíz
use\Biblioteca as biblio; // alias de un namespace
echo Biblioteca\PI., ”<br />”;
use \Biblioteca|Animal as ani; // alias de una clase
$gato = new ani (); // Llamada al alias de la clase
//Animal$gato->setColor (”negro”),
echo ”El color del gato es : ”.$gato->getColor();
?>
Muestra:
Hola
3.1416
www.FreeLibros.me
Ejercicios
1. Enunciados
Ejercicio 1 (fácil)
Cree las cinco clases del esquema teniendo en cuenta su herencia. Todos los métodos son públicos y
los atributos son privados.
Cree los accesos de todos los atributos. Cree un constructor en la clase vehículo que tome como
argumento el color y el peso. Modifique el método circula() para que muestre "El vehículo circula".
Modifique el método añadir_persona(peso_persona) para que cambie el peso del vehículo en
función del peso de la persona que pasa como argumento.
Cree la página mostrar.php y un vehículo negro de 1500 kg. Haga que circule.
Aplique el método repintar(color) para cambiar el color definido en la clase Vehículo. Ejecute el
método poner_gasolina(litros) para cambiar el peso definido en la clase Vehículo. En este
ejercicio, un litro equivale a un kilo.
En la página mostrar.php, cree un coche verde de 1400 kg. Añada dos personas de 65 kg cada una.
www.FreeLibros.me
Muestre su color y su nuevo peso.
Cree un objeto Dos_ruedas negro de 120 kg. Añada una persona de 80 kg. Ponga 20 litros de
gasolina.
Cree un camión azul de 10000 kg y de 10 metros de longitud con 2 puertas. Añada un remolque de 5
metros y una persona de 80 kg.
Cree un método público estático en la clase Vehículo que se designe como ver_atributo.
Este método toma como argumento un objeto y muestra el valor de todos sus atributos (si existen), es
decir, el color, el peso, el número de puertas, la cilindrada, la longitud y el número de cadenas para la
nieve.
Muestre todos los valores de los atributos del dos ruedas con la función ver_atributo.
Cree un camión blanco de 6000 kg.
Añada una persona de 84 kg. Vuelva a pintarlo, en color azul. Incluya 2 puertas.
Muestre todos los valores de los atributos del camión con la función ver_atributo.
Añada un constructor en la clase Cuatro_ruedas que tome como argumento el color, el peso y el
número de puertas.
www.FreeLibros.me
que cambia de color. Este cambio de color se realiza con el método setColor().
Cambie el acceso setPeso() de la clase Vehículo para que el peso total del coche tenga como
máximo 2100 kg.
Muestre todos los atributos del coche y el número de veces que se cambia el color con el
método ver_atributo($objeto).
Al final de este bloque encontrará un ejercicio que utiliza POO para hacer un Blog.
2. Soluciones
Vehículo.class.php:
www.FreeLibros.me
<?php
class vehículo
{
// Declaración de atributos
private $color;
private $peso;
//métodos públicos
public function circula()
{
}
?>
Cuatro_ruedas.class.php:
<?php
class Cuatro_ruedas extends vehículo
{
// Declaración de atributos
private $numero_puertas;
//método público
public function repintar($color)
{
}
?>
Dos_ruedas.class.php:
<?php
class Dos_ruedas extends vehículo
{
// Declaración de atributos
private $cilindrada;
//método público
public function poner_gasolina($litros)
{
}
?>
www.FreeLibros.me
Coche.class.php:
<?php
class Coche extends Cuatro_ruedas
{
// Declaración de atributos
private $numero_cadenas_nieve;
//métodos públicos
public function añadir_cadenas_nieve($num)
{
}
?>
Camión.class.php:
<?php
class Camion extends Cuatro_ruedas
{
// Declaración de atributos
private $longitud;
//métodos públicos
public function añadir_remolque($longitud_remolque)
{
}
?>
Vehiculo.class.php:
<?php
class vehiculo
{
// Declaración de atributos
private $color;
private $peso;
//constructor
public function __construct($color, $peso) // Constructor
//que solicita 2 argumentos.
{
$this->color = $color; // Inicialización del color.
$this->peso = $peso; // Inicialización del peso.
www.FreeLibros.me
}
//accesos
public function getColor()
{
return $this->color; //devuelve el color
}
public function setColor($color)
{
$this->color = $color; //escrito en el atributo color
}
//métodos públicos
public function circula()
{
echo "El vehículo circula.<br />";
}
}
?>
Cuatro_ruedas.class.php:
<?php
class Cuatro_ruedas extends vehículo
{
// Declaración de atributos
private $numero_puertas;
//accesos
public function getNumeroPuertas()
{
return $this->numero_puertas; //devuelve el número
//de puertas
}
public function setNumeroPuertas($numero_puertas)
{
$this->numero_puertas = $numero_puertas; //escrito en
//el atributo número_puertas
}
//método público
public function repintar($color)
{
www.FreeLibros.me
}
?>
Dos_ruedas.class.php:
<?php
class Dos_ruedas extends vehículo
{
// Declaración de atributos
private $cilindrada;
//accesos
public function getCilindrada()
{
return $this->cilindrada; //devuelve la cilindrada
}
public function setCilindrada($cilindrada)
{
$this->cilindrada = $cilindrada; //escrito en el atributo
//cilindrada
}
//método público
public function poner_gasolina($numerolitros)
{
}
?>
Coche.class.php:
<?php
class Coche extends Cuatro_ruedas
{
// Declaración de atributos
private $numero_cadenas_nieve;
//accesos
public function getNumeroCadenasNieve()
{
return $this->numero_cadenas_nieve; //devuelve el
//numero_cadenas_nieve
}
public function setNumeroCadenasNieve($numero_cadenas_nieve)
{
$this->numero_cadenas_nieve = $numero_cadenas_nieve;
//escrito en el atributo numero_cadenas_nieve
}
//métodos públicos
public function añadir_cadenas_nieve($numero)
{
www.FreeLibros.me
public function quitar_cadenas_nieve($numero)
{
}
?>
Camion.class.php:
<?php
class Camion extends Cuatro_ruedas
{
// Declaración de atributos
private $longitud;
//accesos
public function getLongitud()
{
return $this->longitud; //devuelve la longitud
}
public function setLongitud($longitud)
{
$this->longitud = $longitud; //escrito en el atributo
//longitud
}
//métodos públicos
public function añadir_remolque($longitud_remolque)
{
}
?>
Mostrar.php:
<?php
//carga de clases
include(’vehículo.class.php’);
?>
Da como resultado:
El vehículo circula.
www.FreeLibros.me
Solución del ejercicio 3
Cuatro_ruedas.class.php:
<?php
class Cuatro_ruedas extends vehículo
{
// Declaración de atributos
private $numero_puertas;
//accesos
public function getNumeroPuertas()
{
return $this->numero_puertas; //devuelve el número
//de puertas
}
public function setNumeroPuertas($numero_puertas)
{
$this->numero_puertas = $numero_puertas; //escrito en
//el atributo número puertas
}
//Método público
public function repintar($color)
{
$this->setColor($color);
}
}
?>
Dos_ruedas.class.php:
<?php
class Dos_ruedas extends vehículo
{
// Declaración de atributos
private $cilindrada;
//accesos
public function getCilindrada()
{
return $this->cilindrada; //devuelve la cilindrada
}
public function setCilindrada($cilindrada)
{
$this->cilindrada = $cilindrada; //escrito en el atributo
//cilindrada
}
//método público
public function poner_gasolina($numerolitros)
{
$this->setPeso($this->getPeso()+$numerolitros);
}
www.FreeLibros.me
}
?>
Coche.class.php:
<?php
class Coche se extends Cuatro_ruedas
{
// Declaración de atributos
private $numero_cadenas_nieve=0;
//accesos
public function getNumeroCadenasNieve()
{
return $this->numero_cadenas_nieve;
// devuelve el numero_cadenas_nieve
}
public function setNumeroCadenasNieve($numero_cadenas_nieve)
{
$this->numero_cadenas_nieve = $numero_cadenas_nieve;
// escrito en el atributo numero_cadenas_nieve
}
//métodos públicos
public function añadir_cadenas_nieve($numero)
{
$this->numero_cadenas_nieve =
$this->numero_cadenas_nieve + $numero;
}
}
?>
Camion.class.php:
<?php
class Camion extends Cuatro_ruedas
{
// Declaración de atributos
private $longitud;
//accesos
public function getLongitud()
{
return $this->longitud; //devuelve la longitud
}
public function setLongitud($longitud)
www.FreeLibros.me
{
$this->longitud = $longitud; //escrito en el atributo
//longitud
}
//métodos públicos
public function añadir_remolque($longitud_remolque)
{
$this->longitud = $this->longitud + $longitud_remolque;
}
}
?>
Mostrar.php:
<?php
//carga de clases
include(’vehículo.class.php’);
include(’Cuatro_ruedas.class.php’);
include(’Dos_ruedas.class.php’);
include(’Coche.class.php’);
include(’Camion.class.php’);
//repintar en rojo
$coche->repintar("rojo");
//añadir 2 cadenas para la nieve
$coche->añadir_cadenas_nieve(2);
echo "El color del coche es: ".$coche->getColor()."<br />";
echo "El número de cadenas para la nieve del coche es: ".$coche->
getNumeroNeumaticoNieve()."<br /><br />";
//instanciar el camión
$camion = new Camion("azul",10000);
$camion->setLongitud(10);
$camion->setNumeroPuertas(2);
$camion->añadir_remolque(5);
$camion->añadir_persona(80);
echo "El color del camión es: ".$camion->getColor()."<br />";
echo "El peso del camión es: ".$camion->getPeso()."<br />";
echo "La longitud del camión es: ".$camión->getLongitud()."<br />";
echo "El número de puertas del camión es: ".$camion->getNumeroPuertas()."
<br />";
?>
www.FreeLibros.me
Da como resultado:
Vehículo.class.php:
<?php
abstract class vehículo
{
// Declaración de atributos
private $color;
private $peso;
//constructor
public function __construct($color, $peso)
//Constructor que solicita 2 argumentos.
{
$this->color = $color; // Inicialización del color.
$this->peso = $peso; // Inicialización del peso.
}
//accesos
public function getColor()
{
return $this->color; //devuelve el color
}
public function setColor($color)
{
$this->color = $color; //escrito en el atributo color
}
www.FreeLibros.me
//métodos públicos
public function circula()
{
echo "El vehículo circula.<br />";
}
?>
Cuatro_ruedas.class.php:
<?php
class Cuatro_ruedas extends vehículo
{
// Declaración de atributos
private $numero_puertas;
//accesos
public function getNumeroPuertas()
{
return $this->numero_puertas; //devuelve el número
//de puertas
}
public function setNumeroPuertas($numeros_puertas)
{
$this->numero_puertas = $numero_puertas; //escrito en
//el atributo número_puertas
}
//métodos públicos
public function retomar($color)
{
www.FreeLibros.me
$this->setColor($color);
}
}
?>
Dos_ruedas.class.php:
<?php
class Dos_ruedas extends vehículo
{
// Declaración de atributos
private $cilindrada;
//accesos
public function getCilindrada()
{
return $this->cilindrada; //devuelve la cilindrada
}
public function setCilindrada($cilindrada)
{
$this->cilindrada = $cilindrada; //escrito en el
//atributo cilindrada
}
//método público
public function poner_gasolina($numerolitros)
{
$this->setPeso($this->getPeso()+$numerolitros);
}
}
?>
Mostrar.php:
<?php
//carga de clases
include(’vehículo.class.php’);
include(’Cuatro_ruedas.class.php’);
include(’Dos_ruedas.class.php’);
include(’Camion.class.php’);
www.FreeLibros.me
$dos_ruedas = new Dos_ruedas("rojo",150);
$dos_ruedas->añadir_persona(70);
echo "El peso de dos ruedas es: ".$dos_ruedas->getPeso()."<br />";
$dos_ruedas->setColor("verde");
$dos_ruedas->setCilindrada(1000);
vehículo::mostrar_atributo($dos_ruedas);
echo "<br />";
//instanciar el camión
$camion = new Camion("blanco",6000);
$camion->añadir_persona(84);
$camion->setColor("azul");
$camion->setNumeroPuertas(2);
vehículo::mostrar_atributo($camión );
?>
Da como resultado:
El color es:verde
El peso es:222
La cilindrada es:1000
El color es:azul
El peso es:6084
La longitud es:
Vehículo.class.php:
<?php
abstract class vehículo
{
// Declaración de atributos
private $color;
private $peso;
const SALTO DE LÍNEA = ’<br />’;
static protected $numero_cambio_color=0;
//constructor
public function __construct($color, $peso)
//Constructor que solicita 2 argumentos.
{
$this->color = $color; // Inicialización del color.
$this->peso = $peso; // Inicialización del peso.
}
//accesos
public function getColor()
{
return $this->color; //devuelve el color
}
www.FreeLibros.me
public function setColor($color)
{
$this->color = $color; //escrito en el atributo color
self::$numero_cambio_color =
elf::$numero_cambio_color + 1;
}
//métodos públicos
public function rouler()
{
echo "El vehículo circula.<br />";
}
www.FreeLibros.me
?>
Cuatro_ruedas.class.php:
<?php
class Cuatro_ruedas extends vehículo
{
// Declaración de atributos
private $numero_puertas;
//constructor
public function __construct($color, $peso, $numero_puertas)
//Constructor que solicita 3 argumentos.
{
$this->setColor($color); // Inicialización del color.
$this->setPeso($peso); // Inicialización del peso.
$this->numero_puertas = $numero_puertas; // Inicialización
//del número de puertas.
}
//accesos
public function getNumeroPuertas()
{
return $this->numero_puertas; //devuelve el número de puertas
}
public function setNumeroPuertas($numero_puertas)
{
$this->numero_puertas = $numero_puertas; //escrito en
//el atributo número_puertas
}
//métodos públicos
public function retomar($color)
{
$this->setColor($color);
}
}
?>
Coche.class.php:
<?php
class Coche extends Cuatro_ruedas
{
// Declaración de atributos
private $numero_cadenas_nieve=0;
//accesos
public function getNumeroCadenasNieve()
{
return $this->numero_cadenas_nieve; //devuelve
//el numero_cadenas_nieve
www.FreeLibros.me
}
public function setNumeroCadenasNieve
($numero_cadenas_nieve)
{
$this->numero_cadenas_nieve = $numero_cadenas_nieve;
//escrito en el atributo numero_cadenas_nieve
}
//métodos públicos
public function añadir_cadenas_nieve($numero)
{
$this->numero_cadenas_nieve =
$this->numero_cadenas_nieve + $;
}
}
?>
Mostrar.php:
<?php
//carga de clases
include(’vehículo.class.php’);
include(’Cuatro_ruedas.class.php’);
include(’Coche.class.php’);
//instanciar el coche
$coche = new Coche("verde",2100,4);
$coche->añadir_cadenas_nieve(2);
$coche->añadir_persona(80);
$coche->setColor("azul");
$coche->quitar_cadenas_nieve(4);
$coche->repintar("negro");
vehículo::mostrar_atributo($coche);
www.FreeLibros.me
?>
Da como resultado:
El color es:negro
El peso es:2100
www.FreeLibros.me
PHP.ini
Este archivo contiene una serie de directivas que se pueden activar y que influyen en el comportamiento
de PHP. Por ejemplo, define las carpetas, añade librerías PHP, cambia los parámetros de MySQL, etc.
No se explican todas las directivas en este medio, sólo las que más se usan. Atención, los valores que
cambie en el archivo de configuración PHP.ini en local, no son forzosamente las mismas que las de
vuestro host y su sitio Web corre el riesgo de no volver a funcionar cuando vuelva a subirlas a su
proveedor. Por tanto debe asegurarse de que los valores del host no son incompatibles con los definidos
en su PHP.ini en local.
Cuando hay un punto y coma delante de una línea en el archivo, quiere decir que esta línea se está
comentando. Para tener en cuenta esta directiva, debe quitar el punto y coma, cambiar el valor de la
directiva, guardar la carpeta y reiniciar el servidor Web.
asp_tags: permite añadir código PHP a los tags <% %> (ver capítulo Las bases del lenguaje
PHP). Esta directiva está por defecto en modo off.
display_errors: permite mostrar los errores de PHP. Esta directiva está por defecto en modo on.
error_reporting: permite mostrar los tipos de errores. Esta directiva por defecto
E_ALL|E_STRICT, y muestra todos los errores, avisos y errores de sintaxis. Es recomendable
cambiar este valor por E_ALL&~E_DEPRECATED, que ya no muestra los errores de sintaxis.
include_path: permite definir el directorio que contiene los archivos include (ver capítulo
Funciones y estructuras de control - Los includes). Cuando utiliza la
función include() o require(), PHP busca automáticamente en esta carpeta.
variables_order: permite definir las tablas superglobales que PHP tiene en cuenta. Esta
directiva es GPCS (Get Post Cookie and Session). Para probar todos los capítulos y sobre todo
las variables de entorno, debe poner EGPCS, E en Entorno.
display_startup_errors: permite ver los errores cuando arranca el servidor web. Por defecto,
esta directiva está en on pero es aconsejable ponerla en off en modo producción.
Archivo upload
upload_max_filesize: permite definir el tamaño máximo del archivo que se va a enviar. Este
valor está en 2 GB por defecto (ver capítulo Transmitir datos de una página a otra).
file_uploads: permite autorizar el envío del archivo. Esta directiva está en modo on por defecto.
upload_tmp_dir: permite definir el directorio temporal que va a almacenar los archivos que se
van a transmitir.
post_max_size: permite definir el tamaño máximo de los datos que envía el formulario (imagen
+ texto). Esta directiva debe ser siempre superior a upload_max_filesize.
Para activar las librerías, como por ejemplo la librería GD o PDO, debe quitar el punto y coma que está
www.FreeLibros.me
delante de la línea relativa a esta librería (por ejemplo, extensión=php_gd2.dll). A continuación, reinicie el
servidor Web (menú Reiniciar).
www.FreeLibros.me
Archivo de configuración MySQL: My.ini
Este archivo contiene las directivas que hay que activar sin que pueda afectar a MySQL. Proporciona los
mejores parámetros de ajuste de MySQL para aumentar el rendimiento y la seguridad.
También puede ubicar este archivo en la carpeta C:\Windows, o en la carpeta /etc en Unix.
Las líneas precedidas de almohadilla son comentarios. Para actualizar una directiva, debe quitar la #,
modificar el valor, guardar el archivo y reiniciar el servidor MySQL.
El administrador de la base de datos puede cambiar las directivas, pero hay que tener en cuenta que,
para poder conectarse a MySQL, el puerto y la contraseña están en el área Cliente.
Puede introducir la directiva skip-networking si nadie se conecta a distancia a la directiva MySQL, que
será solo accesible en modo local.
www.FreeLibros.me
Archivo de configuración Apache: Httpd.conf
Es el archivo de configuración del servidor Web Apache. Contiene directivas que pueden influir en el
funcionamiento del servidor Web. Se recomiendan estas directivas, aunque puede activarlas o
desactivarlas añadiendo o eliminando la # delante de la línea.
Debe reiniciar el servidor Web para que se puedan aplicar posibles modificaciones.
Estas directivas permiten cambiar los módulos o la seguridad de algunos directorios de su sitio Web.
Este archivo contiene una explicación exhaustiva de las directivas, y va dirigido a webmasters y
administradores de sitios Web. Las directivas más importantes son:
DocumentRoot: directorio de base del sitio Web ("www" por defecto, ubicado en el directorio
de instalación de EasyPHP).
Listen: establece el puerto Apache o la dirección que atiende las peticiones de los clientes (por
defecto, 80).
ErrorLog: ruta del archivo que define una lista de errores surgidos por el uso de Apache.
LogLevel: define el nivel en el que los errores detectados se almacenan en el archivo "log".
También puede modificar la configuración de un sitio web o de algunas carpetas si añade un archivo
.htaccess. Puede prohibir listar el contenido de una carpeta, administrar los errores 404, volver a escribir
las direcciones (URL, rewriting), etc.
Por ejemplo, si quiere prohibir el contenido de un directorio, escriba en el archivo .htaccess del directorio
lo siguiente:
Options - Indices
www.FreeLibros.me
Fallos de seguridad XSS
Los fallos de seguridad XSS o Cross Site Scripting consisten en la ejecución del código HTML, JavaScript o
VBScript sin conocimiento del webmaster.
1. XSS no permanente
Este tipo de fallos de seguridad se puede encontrar cuando recurre a una página PHP con información
que se pasa en la URL.
<?php
echo $_GET[’nombre’];
?>
Da como resultado:
A
Juan
<script>alert(’Hola’)</script>
La página get_recibe abre un pop-up que muestra "Hola". El navegador ejecuta JavaScript que se ha
generado con la instrucción echo $_GET[’nombre’];
En este caso, el código intruso es una alerta, pero el usuario puede introducir un código para leer las
cookies, redirigir a otra URL, etc.
Para impedir esto, los navegadores suelen activar la seguridad XSS por defecto, que procede de un
script que se encuentra en la URL y que por tanto no se ejecuta.
Sin embargo, no puede saber con antelación la configuración del navegador del usuario, por lo que se
recomienda añadir código PHP para impedir estos scripts.
Utilice la función htmlentities() cuando recupere la información con $_GET o $_POST. Esta función
traduce los caracteres especiales y hace inoperativos los scripts maliciosos. Por defecto convierte las
dobles comillas e ignora las simples. Para utilizar las comillas simples, añada la constante ENT_QUOTES.
<?php
echo htmlentities($_GET[’nombre’], ENT_QUOTES);
?>
Y da como resultado:
<script>alert(’Hola’)</script>
www.FreeLibros.me
Si muestra el código de origen de la página, aparecerá lo siguiente:
<script>alert(Hola)</script>
2. XSS permanente
Supongamos que el script malicioso se ha insertado en la base de datos con un mensaje en el foro, el
blog o en un e-mail. Este mensaje se ejecuta cada vez que una persona lee el mensaje en Internet.
Por ejemplo, si una página recupera el nombre, el apellido y el mensaje con POST, dará el siguiente
resultado:
<?php
echo htmlentities($_POST[’nombre’], ENT_QUOTES);
echo htmlentities($_POST[’apellido’, ENT_QUOTES]);
echo htmlentities($_POST[’mensaje’], ENT_QUOTES);
?>
Los caracteres especiales se insertan en la base de datos y el script no se ejecuta cuando se muestra
el mensaje que lo contiene.
3. Error de página
Si recurre a su página PHP utilizando como parámetro el nombre de una página contenida en un
include, aparecerá lo siguiente: http://127.0.0.1:8888/get_recibe.php?pagina=pagina1
<?php
include("files/".htmlentities($_GET[’pagina’]).".php");
?>
Aparecerá en su página un mensaje de error, con un e-mail que contiene la URL que provoca dicho
error, siempre y cuando se haya activado el informe de error.
Cuando lea su e-mail, se ejecutará el script, ya que tendrá su código JavaScript en el e-mail.
Para evitar esto, añada el código error_reporting(0) en la página de inicio. El resultado será no
mostrar el error y no enviará el e-mail de la URL que contiene el script malicioso.
www.FreeLibros.me
Derechos de la base de datos
Cuando se conecta a la base de datos en modo "root", tiene todos los derechos sobre ella. Y si se
conecta a una página PHP en modo root, puede ser víctima de una inyección SQL que puede eliminar
datos o incluso una tabla completa.
Para evitarlo, cree en su base de datos unos usuarios que tendrán derechos limitados y conéctese a
través de estos en su código PHP. De esta manera, haga lo que haga el usuario, nunca podrá eliminar
los datos.
Para crear un usuario, seleccione su base de datos en PHP-MyAdmin y haga clic en la pestañaPrivilegios.
Con esto se trata de agregar un usuario que tenga solamente derechos en modo de lectura.
Haga clic en el enlace Agregar un nuevo usuario. Introduzca el nombre "EstefaniaMorales" en el nombre
y "123" en la contraseña. A continuación, compruebe los datos con la opción SELECT.
www.FreeLibros.me
A continuación, cuando se conecte a su base de datos en una página PHP en modo de lectura, use la
cuenta "EstefaniaMorales".
<?php
// Conexión a la base de datos
$base = mysqli_connect("127.0.0.1", "root", "", "_prueba");
?>
Sino:
<?php
// Conexión a la base de datos solo en modo de lectura
$base = mysqli_connect("127.0.0.1", "EstefaniaMorales", "123", "_prueba");
?>
www.FreeLibros.me
Inyección SQL (addslashes)
La inyección SQL tiene como objetivo inyectar un código SQL que ha escrito un usuario malicioso. Este
código permite iniciar la sesión sin conocer necesariamente la contraseña, mostrar todas las contraseñas
e incluso destruir la tabla por completo.
<?php
$login = $_POST[’login’];
$password = $_POST[’contraseña’];
$sql = "SELECT * FROM Persona WHERE login=’".$login."’
and password=’".$password."’";
?>
Si la consulta devuelve una fila, significa que la persona existe en la base de datos y que, por tanto, la
puede conectar.
’ OR 1=1 OR ’
El código OR 1=1 es correcto; entonces la consulta devuelve todos los registros de la tabla Persona. Así
puede pensar que la persona existe realmente en la base de datos.
Si quiere evitarlo, añada la función addslashes() cuando recupere los datos con POST, y no con GET.
Esta función agrega el carácter \ (barra invertida) delante de ’ (apóstrofos), " (comillas), \ (barra
invertida) y NULL.
<?php
$login = addslashes($_POST[’login’]);
$password = addslashes($_POST[’contraseña’]);
$sql = "SELECT * FROM Persona WHERE login=’".$login."’
and password=’".$password."’";
?>
SELECT * FROM Persona WHERE login=’ pepe’ and password = ’\’ OR 1=1 OR \"
El código OR 1=1 se interpreta como una cadena de caracteres; por lo tanto, ya no se ejecuta.
Este método no es seguro al cien por cien, porque en algunas consultas se puede eludir esta protección.
www.FreeLibros.me
Para estar totalmente seguro, se recomienda utilizar las consultas que se han explicado en capítulos
anteriores.
www.FreeLibros.me
Comprobación de la sesión
La sesión permite almacenar un objeto en la memoria hasta que el usuario se conecte a su sitio Web. Es
el caso, por ejemplo, de un sitio Web que contiene una página que permite iniciar sesión antes de
acceder a otras páginas de su sitio Web, que son: pagina1.php, pagina2.php...
Compruebe en su página de inicio que la persona existe en la base de datos antes de dirigirse a la
pagina1.php. Nada impide que la persona escriba directamente http://www.misitio.es/pagina1.php para
acceder de forma inmediata a esta página sin tener que identificarse. Esta persona debe conocer el
nombre de la página PHP, pero algunas veces los nombres de estas páginas son muy concretos:
login.php, mostrar.php, forum.php.
Para solucionar este problema, utilice las sesiones. Cuando una persona se identifique, almacene en la
sesión su identificador y compruebe que la sesión se reconoce en cada página de su sitio Web.
De este modo, se mostrará en todas las páginas PHP de su sitio Web (salvo la página de conexión, que
utiliza el identificador de la sesión) lo siguiente:
<?php
session_start();
if (!isset($_SESSION[’login’])) {
//redireccionar a la página de conexión
header("Location:conexion.php");
}
?>
www.FreeLibros.me
Rendimiento
Evite las variables globales: estas variables permanecen en memoria todo el tiempo de
ejecución de la página PHP.
Indique los campos que se usan en las Joins y las cláusulas where.
Use consultas preparadas, sobretodo si su consulta está en su bucle. En este caso es mejor
poner la consulta en un procedimiento almacenado que la ejecutará varias veces. Así tendrá
un único acceso a la base de datos desde la página PHP.
www.FreeLibros.me
Crear un blog (procedimiento)
Cree un formulario para añadir el contenido al blog:
Cree una página PHP para añadir el contenido a la base de datos y copie a la carpeta de
imágenes la imagen que se ha transmitido. Esta página mostrará lo siguiente:
Cree una página PHP que muestre los distintos contenidos que se han añadido al blog.
www.FreeLibros.me
Solución
SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";
DROP TABLE IF EXISTS contenido;
CREATE TABLE contenido (
Id int(11) NOT NULL AUTO_INCREMENT,
Titulo varchar(25) NOT NULL,
Fecha Datetime NOT NULL,
Comentario text NOT NULL,
Imagen varchar(25) NOT NULL,
PRIMARY KEY (Id)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=2 ;
www.FreeLibros.me
<p>Título: <input type="text" name="titulo" /></p>
<p>Comentario: <br /><textarea name="comentario" rows="10"
cols="50"></textarea></p>
<input type="hidden" name="MAX_FILE_SIZE" value="2097152">
<p>Seleccione una foto con un tamaño inferior a 2 MB.</p>
<input type="file" name="foto">
<br /><br />
<input type="submit" name="ok" value="Enviar">
</form>
<br />
<a href="mostrar blog.php" >Página de visualización del blog</a>
</body>
</html>
/* Comprobar la conexión*/
if (!$connect) {
echo "fallo de conexión : ".mysqli_connect_error();
exit();
}
if ($_FILES[’imagen’][’error’]) {
switch ($_FILES[’imagen’][’error’]){
case 1: // UPLOAD_ERR_INI_SIZE
echo "El tamaño del archivo supera el límite
permitido por el servidor (parámetro upload_max_filesize del archivo
php.ini).";
break;
case 2: // UPLOAD_ERR_FORM_SIZE
echo "El tamaño del archivo supera el límite permitido
por el formulario (parámetro post_max_size del archivo php.ini).";
break;
case 3: // UPLOAD_ERR_PARTIAL
echo "El envío del archivo se ha interrumpido durante
la transmisión.";
break;
case 4: // UPLOAD_ERR_NO_FILE
echo "El tamaño del archivo que ha enviado es nulo.";
break;
}
}
else {
//si no hay ningún error, entonces $_FILES[’nombre
del_archivo’][’error’]
//vaut 0
echo "Ningún error en la transferencia del archivo.<br />";
www.FreeLibros.me
if ((isset($_FILES[’photo’][’name’])&&($_FILES[’imagen’][’error’] ==
UPLOAD_ERR_OK))) {
$destino de ruta = ’imágenes/’;
//desplazamiento del archivo del directorio temporal (almacenado
//por defecto) al directorio de destino
move_uploaded_file($_FILES[’imagen’][’tmp_name’],
$destino de ruta.$_FILES[’imagen’][’name’]);
echo "El archivo ".$_FILES[’imagen’][’name’]." Se ha copiado en el
directorio de fotos";
}
else {
echo "El archivo no se ha copiado en el directorio de fotos.";
}
}
if ($iniciar_sesion != 0) {
echo "<br />La adición del comentario se ha hecho con éxito.<br /><br />";
}
else {
echo "<br />El comentario no se ha añadido.<br /><br />";
}
?>
<a href="formulario_añadir.php" >volver a la página de añadir</a>
</body>
</html>
/* Comprobar la conexión */
if (!$connect) {
echo "fallo de la conexión : ".mysqli_connect_error();
exit();
}
www.FreeLibros.me
Date_default_timezone_set(’Europe/Paris’);
/* busca la matriz asociativa */
while ($lregistro = mysqli_busca_assoc($resultado)) {
$dt_inicio = Date_create_from_format(’Y-m-d H:i:s’,
$registro[’Fecha’]);
echo "<h3>".$registro[’Título’]."</h3>";
echo "<h4>El ".$dt_inicio->formato(’d/m/Y H:i:s’)."</h4>";
echo "<div style=’width:400px’>".$registro[’Comentario’]."
</div>";
if ($registro[’Imagen’] != "") {
echo "<img src=’imagen/".$registro[’imagen’].
"’ width=’200px’
height=’200px’/>";
}
echo "<hr />";
}
}
?>
<br />
<a href="formulario_añadir.php" >Volver a la página de inserción</a>
</body>
</html>
www.FreeLibros.me
Crear un blog (objeto)
Vuelva a repetir el ejercicio A, pero ahora utilice objetos.
Cree una clase Blog cuyos atributos coincidan con los campos de la tabla Contenido. Cree una clase
Manager que tenga la conexión PDO como atributo, así como unos métodos que permitan leer y escribir
en la tabla Contenido. Las páginas mostrar_blog.php, insertar_contenido.php y añadir_contenido.php no
deben contener consultas SQL.
Solución
SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";
--
--
-- --------------------------------------------------------
--
--
DROP TABLE IF EXISTS `contenido`;
CREATE TABLE IF NOT EXISTS `contenido` (
`Id` int(11) NOT NULL AUTO_INCREMENT,
`Titulo` varchar(25) NOT NULL,
`Fecha` Datetime NOT NULL,
`Comentario` text NOT NULL,
`Imagen` varchar(25) NOT NULL,
PRIMARY KEY (`Id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=2 ;
www.FreeLibros.me
<br /><br />
<input type="submit" name="ok" value="Enviar">
</form>
<br />
<a href="mostrar_blog.php" >Página de visualización del blog
</a>
</body>
</html>
if ($_FILES[’imagen’][’error’]) {
switch ($_FILES[’imagen’][’error’]){
case 1: // UPLOAD_ERR_INI_SIZE
echo "El tamaño del archivo supera el límite permitido por
el servidor (parámetro upload_max_filesize del archivo
php.ini).";
break;
case 2: // UPLOAD_ERR_FORM_SIZE
echo "El tamaño del archivo supera el límite permitido por
el formulario (parámetro post_max_size del archivo php.ini).";
break;
case 3: // UPLOAD_ERR_PARTIAL
echo "El envío del formulario se ha interrumpido durante
su transmisión.";
break;
case 4: // UPLOAD_ERR_NO_FILE
echo "El tamaño del archivo que ha enviado es nulo.";
break;
}
}
else {
//si no hay error entonces $_FILES[’nombre del archivo’]
//[’error’] vale 0
www.FreeLibros.me
//(almacenado por defecto) al directorio de destino
move_uploaded_file($_FILES[’imagen’][’tmp_name’], $destino
de ruta.$_FILES[’imagen’][’name’]);
echo "El archivo ".$_FILES[’imagen’][’name’]." Se ha copiado
en el directorio imágenes";
}
else {
echo "El archivo no se ha copiado en el directorio imágenes.";
}
}
if ($iniciar_sesion != 0) {
echo "<br />Añadir comentario de éxito.<br />;
}
else {
echo "<br />El comentario no se ha podido añadir.<br />;
}
}
catch(Exception $e)
{
// mensaje en caso de error
die(’Error : ’.$e->getMessage());
}
?>
<a href="formulario_añadir.php" >Volver a la página de inserción</a>
</body>
</html>
La página mostrar_blog.php:
www.FreeLibros.me
$base = new PDO(’mysql:host=127.0.0.1;dbname=Blog’, ’root’, ’’);
$base->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
}
catch(Exception $e)
{
// mensaje en caso de error
die(’Error : ’.$e->getMessage());
}
?>
<br />
<a href="formulario_añadir.php" >Volver a la página de inserción</a>
</body>
</html>
La página Blog.class.php:
<?php
class Blog
{
// Declaración de atributos
private $id;
private $Titulo;
private $date;
private $Comentario;
private $Imagen;
//de acceso
public function getId()
{
return $this->id; //vuelve al inicio de sesión
}
public function setId($id)
www.FreeLibros.me
{
$this->id = $id; //escrito en el atributo de id
}
}
?>
<?php
class Manager
{
private $base; // Instancia de PDO
www.FreeLibros.me
}
}
?>
www.FreeLibros.me
Crear una newsletter
Cree una página PHP que recupere la lista de nombres y de e-mails de personas. A continuación envíe un
mensaje por e-mail. También actualice en la base de datos la fecha de envío a cada una de estas
personas.
Solución
) ENGINE = MYISAM ;
/* Comprobar la conexión */
if (!$connect) {
echo "Fallo de la conexión : ".mysqli_connect_error();
exit();
}
www.FreeLibros.me
$from = $from."Mime-Version: 1.0\nContent-Type: text/html; charset=ISO-8859-1\n";
// envío del mail
mail($registro[’Email’],’Newsletter’,$message,$from);
</body>
</html>
www.FreeLibros.me
Crear un flujo RSS
Cree una página PHP con el flujo RSS que muestre las últimas novedades del periódico "El País" a la
siguiente dirección: http://ep01.epimg.net/rss/elpais/portada.xml
Solución
</body>
</html>
www.FreeLibros.me
Gestión de un parque informático en MVC
El objetivo es crear varios archivos PHP que permitan mostrar y buscar las máquinas en un parque
informático. También será necesario visualizar un gráfico que represente el número de máquinas por
sala. Estos archivos deben respetar la arquitectura Modelo Vista Controlador.
Inicio:
Lista:
www.FreeLibros.me
Búsqueda:
www.FreeLibros.me
Gráfico:
Solución
www.FreeLibros.me
La página ver.php:
La página común.php:
La página formulario_busqueda.php:
La página indice.php:
La página lista.php:
www.FreeLibros.me
La página busqueda.php:
La página controladores/parque.php:
<?php
class parc extends controlador {
var $models = array(’parque_model’);
//Action indice
function indice(){
$this->render(’indice’); //llamada de la vista indice.php
}
function busqueda($ip){
$d[’record’] = $this->parque_model->getByIP($ip);
$this->set($d);
$this->render(’busqueda’); //llamada de la vista busqueda.php
}
$d[’record’] = $this->parque_model->getNumeroPCSalla();
$nb_maximum = 0; //mayor número de PC
$val1=0; // número de PC en una sala
$val2=0; // numéro de la sala
$tabla_PC = array(); //clave de la tabla = n° de sala,
valor de la tabla = número de PC en la sala
foreach($d[’record’] as $clave=>$val) {
$val1 = $val["número"];
if ($val1 > $num_maximo) {
$num_maximo = $val1;
}
$val2 = $val["sala"];
$tabla_PC[$val2] = $val1;
}
$largoImage = 450;
altoImage = 400;
$image = imagecreate($largoImage, $altoImage);
$blanco = imagecolorallocate($image, 255, 255, 255);
$negro = imagecolorallocate($image, 0, 0, 0);
$azul = imagecolorallocate($image, 100, 100, 255);
www.FreeLibros.me
}
function formulario_busqueda(){
$this->render(’formulario_busqueda’);
//llamada de la vista formulario_busqueda.php
}
}
?>
La página core/controlador.php:
<?php
class controlador{
var $vars = array();
var $layout = ’default’;
function __construct(){
if(isset($_POST)){
$this->data = $_POST;
}
if(isset($this->models)){
foreach($this->models as $v){
$this->loadModel($v); //charga del modelo, aquí parque_model
}
}
}
function set($d){
$this->vars = array_merge($this->vars,$d);
//fusiona las tablas $this->vars et $d
}
www.FreeLibros.me
$content_for_layout = ob_get_clean(); //Lee el contenido de
memoria de salida y la borra
//Esto permite recuperar el contenido de la vista y almacenar
en la variable $content_for_layout
require(ROOT.’views/layout/’.$this->layout.’.php’);
}
function loadModel($name){
require_once(ROOT.’models/’.strtolower($name).’.php’);
$this->$name = new $name();
}
} ?>
La página core/model.php:
class Model{
public $table;
public $id;
private static $base;
private static $servidor=’127.0.0.1’;
private static $bdd=’parque_info’; //nombre de la base de datos
private static $user=’root’ ;
private static $mdp=’’ ;
www.FreeLibros.me
/** * Permite hacer una consulta compleja * @param $sql
Consulta a realizar * */
public function query($sql){
$req = mysqli_query(Model::$base, $sql)
or die(mysqli_error(Model::$base)."<br/> => ".$sql);
$d = array();
while($data = mysqli_fetch_assoc($req)){
$d[] = $data;
}
return $d;
}
}
La página models/parque_model.php:
<?php
class parque_model extends Model{
var $table = ’ordenadores’; //nombre de la tabla
}
?>
La página views/layout/default.php:
<HTML>
<HEAD> <TITLE> Parque inform&ático </TITLE> </HEAD>
<BODY> <h1>Gestión del parque informático</h1>
<?php echo $content_for_layout;?> <p> <a href="<?php echo
WEBROOT; ?>indice.php">Inicio</a> </p>
<BODY>
</HTML>
La página views/parque/ver.php:
La página views/parque/formulario_busqueda.php.
www.FreeLibros.me
<body>
<h2> Selección de una máquina de dominio</h2>
<form name="formip" method="post" action="<?php echo
WEBROOT; ?>busqueda.php"> <p>Dirección IP del parque:</p>
<p><input name="addip" size="15" maxlength="15" type="text"></p>
<p><input value="Buscar" type="submit"></p>
</form>
</body>
La página views/parque/indice.php:
La página views/parque/busqueda.php:
<h2><a>Ver máquinas</a></h2>
<?php
if (isset($record[0])) { //si hay máquinas
echo "<table border=1 width=\"100%\">";
$Lista_indices=array_keys((array)$record[0]);
echo "<tr>";
while($indice=each($Lista_indices)) {
echo "<th>";
echo $indice[’value’];
echo "</th>";
}
echo "</tr>";
foreach((array)$record as $clave_tabla=>$linea) {
echo "<tr>";
foreach($linea as $clave=>$valor) {
echo "<td align=center>";
echo $valor;
echo "</td>";
}
echo "</tr>";
}
echo "</table>";
}
else {
echo "No existen máquinas que cumplan sus criterios.";
}
?>
--
-- Estructura de la tabla `ordenadores`
--
www.FreeLibros.me
`ip` char(15) NOT NULL,
`mac` char(17) NOT NULL,
`nombre` char(15) NOT NULL,
`sala` int(11) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=82 ;
--
-- Contenido de la tabla `ordenadores`
--
www.FreeLibros.me
Crear un sitio Web para gestionar becarios
Se trata de insertar en la tabla aquellos becarios que están en proceso de formación. Estos becarios
tienen nombre, apellidos, una nacionalidad, un tipo de formación y un formador en una sala entre dos
fechas determinadas.
Esta página tiene un código JavaScript que activa el área de formadores y las fechas, según el tipo de
formación que seleccione.
www.FreeLibros.me
Puede modificar todos los becarios al mismo tiempo:
www.FreeLibros.me
Esta página contiene un JavaScript que activa las áreas de formadores y las fechas, según el tipo de
formación que seleccione.
Solución
Ejecute el script para crear unas tablas con sus correspondientes datos:
SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";
www.FreeLibros.me
(2, ’García Arripe’, ’Pablo’, 2),
(3, ’Mártin Cruz’, ’Emilio’, 3),
(4, ’Gonzalez Sánchez’, ’María’, 4);
www.FreeLibros.me
DROP TABLE IF EXISTS becario_formador;
CREATE TABLE becario_formador (
Id_becario int(11) NOT NULL,
Id_formador int(11) NOT NULL,
Fecha_inicio Date NOT NULL,
Fecha_fin Date NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
www.FreeLibros.me
/* Comprobar la conexión */
if (!$connect) {
echo "Fallo de la conexión : ".mysqli_connect_error();
exit();
}
setlocale (LC_TIME, ’es-ES.utf-8’,’esp’);
?>
<head>
<title>Ejercicio formación</title>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-
8859-15" />
<script language="JavaScript">
function comprueba_date(fecha_recibida) {
if (fecha_recibida == ’’) {
alert(’fecha no válida’);
document.formulario.enviar.disabled=true;
}
else {
document.formulario.enviar.disabled=false;
}
}
function enable_formador() {
var tabla_formacion = new Array();
<?php
$consulta = "SELECT * FROM _tipo_formacion_formador ORDER BY
Id__tipo_formacion";
if ($resultado = mysqli_query($connect,$consulta)) {
$incremento = 0;
$Id__tipo_formacion = 0;
/* busca la matriz asociativa */
while ($registro = mysqli_busca_assoc($resultado)) {
//creación dinámica de una tabla JavaScript de dos dimensiones
//que contiene el Id_formacion en la primera dimensión,
//un contador en la segunda dimensión y el Id_formador como valor.
if ($Id__tipo_formacion == $registro[’Id__tipo_formacion’]) {
echo "matriz_formacion[".$registro[’Id__tipo_formacion’]."]
[".$increment."]=".$registro[’Id_formador’].";\n";
}
else {
$Id__tipo_formacion = $registro[’Id__tipo_formacion’];
$incremento = 0;
echo "matriz_formacion[".$registro[’Id__tipo_formacion’]."]
= new Array();\n";
echo "matriz_formacion[".$registro[’Id__tipo_formacion’]."]
[".$increment."]=".$registro[’Id_formador’].";\n";
}
$incremento = $incremento + 1;
}
/*libera el objeto resultado */
mysqli_free_result($resultado);
}
?>
//reajustar los checkbox
var i;
var obj_input;
for (i = 0; i < document.formulario.elementos.length; i++)
{
obj_input = document.formulario.elementos[i];
www.FreeLibros.me
if(obj_input.type=="checkbox") // comprueba si CheckBox
{
obj_input.disabled=true;
obj_input.checked=false;
}
if(obj_input.name.substring(0,5)=="inicio" ||
obj_input.name.substring(0,3)=="fin") // comprueba si fecha inicio o
// si fecha de fin
{
obj_input.disabled=true;
}
}
document.getElementById(
"inicio"+matriz_formador[i]).disabled=false;
document.getElementById(
"fin"+matriz_formador[i]).disabled=false;
}
}
</script>
</head>
<body onload="enable_formador()">
if ($resultado = mysqli_query($connect,$consulta)) {
www.FreeLibros.me
onchange="enable_formador()">
<?php
$consulta = "SELECT * FROM _tipo_formacion";
if ($resultado = mysqli_query($connect,$consulta)) {
if ($resultado = mysqli_query($connect,$consulta)) {
/* Cierre de la conexión */
mysqli_close($connect);
?>
</body>
</html>
www.FreeLibros.me
La página añadir_becario.php inserta el becario en la base de datos:
/* Comprobar la conexión */
if (!$connect) {
echo "Fallo de la conexión : ".mysqli_connect_error();
exit();
}
?>
<head>
<title>Ejercicio formación</title>
<meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-15" />
</head>
<body>
if (isset($_POST[’formador’])) {?>
<br />
<?php //define la zona de España para la fecha
date_default_timezone_set(’Europe/Paris’);
?>
<br />
www.FreeLibros.me
¡El becario se ha agregado con éxito!
<br />
<a href="formacion.php">Regreso a agregar becario</a>
</body>
</html>
/* Comprobar la conexión */
if (!$connect) {
echo "Fallo de la conexión : ".mysqli_connect_error();
exit();
}
?>
<head>
<title>Ejercicio formación</title>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-15" />
</head>
<body>
if ($resultado = mysqli_query($connect,$consulta)) {
Fecha_default_timezone_set(’Europe/Paris’);
/* busca la matriz asociativa */
while ($registro = mysqli_busca_assoc($resultado)) {
echo "<tr>";
echo "<td>".$registro[’Apellido’]."</td>";
echo "<td>".$registro[’Nombre’]."</td>";
echo "<td>".$registro[’Nacionalidad’]."</td>";
echo "<td>".$registro[’Tipo_formacion’]."</td>";
echo "<td>";
$consulta_formador = "SELECT * FROM becario_formador INNER JOIN
formador ON becario_formador.Id_formador = formador.Id_
www.FreeLibros.me
formador INNER JOIN sala ON formador.Id_sala = sala.Id_sala WHERE
becario_formador.Id_becario = ".$registro[’Id’];
if ($resultado_formador =
mysqli_query($connect,$consulta_formador)) {
/* busca la matriz asociativa */
while ($registro_formador =
mysqli_busca_assoc($resultado_formador)) {
$dt_inicio = date_create_from_format(’Y-m-d’,
$registro_formador[’Fecha_inicio’]);
echo $registro_formador[’Nombre’]." - ".$registro_formador[
’Etiqueta’]." - ".$dt_inicio->format(’d/m/Y’)." -
".$registro_formador[’Fecha_fin’]."<br />";
}
}
echo " </td>";
echo "<td><input type=’checkbox’ name=’supresión[]’
value=’".$registro[’Id_becario’]."’ /></td>";
echo "</tr>";
}
}
/* Cierre de la conexión */
mysqli_close($connect);
?>
</tabla>
<br />
<input type="submit" name="eliminar" value="eliminar" />
</form>
<br />
<a href="formacion.php">Añadir un becario</a> <a
href="lista_becario_que_modificar.php">Modificar un becario</a>
</body>
</html>
/* Comprobar la conexión */
if (!$connect) {
echo "Fallo de la conexión : ".mysqli_connect_error();
exit();
}
?>
<head>
<title>Ejercicio formación</title>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-15" />
</head>
<body>
www.FreeLibros.me
<?php
if (isset($_POST[’eliminar’])) {
/* Comprobar la conexión */
if (!$connect) {
echo "Fallo de la conexión : ".mysqli_connect_error();
exit();
}
?>
<head>
<title>Ejercicio formación</title>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-15" />
<script language="JavaScript">
function comprueba_Fecha(Fecha_recibida) {
if (Fecha_recibida == ’’) {
alert(’Fecha no válida’);
document.formulario.enviar.disabled=true;
}
else {
document.formulario.enviar.disabled=false;
}
}
www.FreeLibros.me
param) { //elimina la selección de los checkbox si modifica la del
//tipo de formación
obj_input.checked=false;
}
}
if(obj_input.name.substring(0,5)=="inicio" ||
obj_input.name.substring(0,3)=="fin") // se prueba si fecha inicio
// o fecha fin
{
obj_input.disabled=true;
}
}
<?php
$consulta_stag = "SELECT *, becario.Id AS Id_becario FROM
becario".
" ORDER BY Nombre";
if ($resultado_stag = mysqli_query($connect,$consulta_stag)) {
if ($resultado = mysqli_query($connect,$consulta)) {
$incremento = 0;
$Id__tipo_formacion = 0;
/* busca la matriz asociativa */
while ($registro = mysqli_busca_assoc($resultado)) {
if ($Id__tipo_formacion == $registro[’Id__tipo_formacion’]) {
echo "matriz_formacion[".
$registro[’Id__tipo_formacion’]."][".$increment."]=".
$registro[’Id_formador’].";\n";
}
else {
$Id__tipo_formacion = $registro[’Id__tipo_formacion’];
$incremento = 0;
echo "matriz_formacion[".
$registro[’Id__tipo_formacion’]."] = new Array();\n";
echo "matriz_formacion[".
$registro[’Id__tipo_formacion’]."][".$increment."]=".
$registro[’Id_formador’].";\n";
}
$incremento = $incremento + 1;
}
/*libera el objeto resultado */
mysqli_free_result($resultado);
}
?>
id_formacion=document.formulario._tipo_formacion<?php echo
$registro_stag[’Id_becario’];?>.options[document.formulario.tipo_
formacion<?php echo
$registro_stag[’Id_becario’];?>.selectedIndex].value;
var matriz_formador = new Array();
matriz_formador = matriz_formacion[id_formacion];
for(var i= 0; i < matriz_formador.length; i++)
www.FreeLibros.me
{
document.getElementById("formador"+matriz_formador[i]+"_<?php
echo $registro_stag[’Id_becario’];?>").disabled=false;
document.getElementById("inicio"+matriz_formador[i]+"_<?php
echo $registro_stag[’Id_becario’];?>").disabled=false;
document.getElementById("fin"+matriz_formador[i]+"_<?php
echo $registro_stag[’Id_becario’];?>").disabled=false;
}
<?php }//fin while
}//fin si ?>
}
</script>
</head>
<body onload="enable_formador(0)">
if ($resultado = mysqli_query($connect,$consulta)) {
date_default_timezone_set(’Europe/Paris’);
/* busca la matriz asociativa */
while ($registro = mysqli_busca_assoc($resultado)) {
echo "<tr>";
echo "<td><input type=’text’ name=’apellido".
$registro[’Id_becario’]."’ value=’".$registro[’Apellido’]."’ />
</td>";
echo "<td><input type=’text’ name=’nombre".
$registro[’Id_becario’]."’ value=’".$registro[’Nombre’]."’ /></td>";
echo "<td>";
echo ’<select name="nacionalidad’.
$registro[’Id_becario’].’">’;
$consulta_nac = "SELECT * FROM nacionalidad";
if ($resultado_nac = mysqli_query($connect,$consulta_nat)) {
/* busca la matriz asociativa */
while ($registro_nac = mysqli_busca_assoc($resultado_nat)) {
if ($registro_nac[’Id_nacionalidad’] == $registro[’Id_nacionalidad’]) {
echo "<option value=’".$registro_nac[’Id_nacionalidad’]."
’ selected=’selected’ >".$registro_nac[’Etiqueta’]."</option>";
}
else {
echo "<option value=’".$registro_nac[’Id_nacionalidad’].
"’>".$registro_nac[’Etiqueta’]."</option>";
}
}
/* libera el objeto resultado */
mysqli_free_result($resultado_nat);
www.FreeLibros.me
}
echo "</select>";
echo "</td>";
echo "<td>";
echo ’<select name="_tipo_formacion’.$registro[’Id_becario’].’"
onchange="enable_formador(’.$registro[’Id_becario’].’)">’;
$consulta_form = "SELECT * FROM _tipo_formacion";
if ($resultado_form = mysqli_query($connect,$consulta_form)) {
/* busca la matriz asociativa */
while ($registro_form = mysqli_busca_assoc($resultado_form)) {
if ($registro_form[’Id__tipo_formacion’] ==
$registro[’Id__tipo_formacion’]) {
echo "<option value=’".$registro_form
[’Id__tipo_formacion’]."’ selected=’selected’>".$registro_form
[’Etiqueta’]."</option>";
}
else {
echo "<option value=’".$registro_form
[’Id__tipo_formacion’]."’>".$registro_form[’Etiqueta’]."</option>";
}
}
/*libera el objeto resultado */
mysqli_free_result($resultado_form);
}
echo "</select>";
echo "</td>";
echo "<td>";
$consulta_todo_formador = "SELECT * FROM formador left join
sala on formador.id_sala = sala.id_sala";
if ($resultado_todo_formador =
mysqli_query($connect,$consulta_todo_formador)) {
if ($resultado_formador =
mysqli_query($connect,$consulta_formador)) {
/* busca la matriz asociativa */
while ($registro_formador =
mysqli_busca_assoc($resultado_formador)) {
if ($registro_formador[’Id_formador’] ==
$registro_todo_formador[’Id_formador’]) {
$dt_inicio = date_create_from_format(’Y-m-d’,
$registro_formador[’Fecha_inicio’]);
$dt_fin = date_create_from_format(’Y-m-d’,
$registro_formador[’Fecha_fin’]);
$checked = "checked=’checked’";
}
}
}
echo "<input tipo=’checkbox’ ".$checked." id=’
www.FreeLibros.me
formador".$registro_todo_formador[’Id_formador’]."_".
$registro[’Id_becario’]."’ name=’formador".$registro[’Id_becario’].
"[]’ value=’".$registro_todo_formador[’Id_formador’]."’ />";
echo $registro_todo_formador[’Nombre’]." - ".
$registro_todo_formador[’Etiqueta’]." - <input tipo=’text’ size=’8’
name=’inicio".$registro_todo_formador[’Id_formador’]."_".
$registro[’Id_becario’]."’ id=’inicio".$registro_todo_formador
[’Id_formador’]."_".$registro[’Id_becario’]."’ value=’"
.$dt_inicio->format(’d/m/Y’)."’ onchange=’comprueba_date(this.value)’ />";
echo "<input type=’text’ size=’8’ name=’fin".
$registro_todo_formador[’Id_formador’]."_".$registro[’Id_becario’]."’
id=’fin".$registro_todo_formador[’Id_formador’]."_"
.$registro[’Id_becario’]."’ value=’".$dt_fin->format(’d/m/Y’).
"’ onchange=’comprueba_date(this.value)’ /><br />";
}
/*libera el objeto resultado */
mysqli_free_result($resultado_todo_formador);
}
echo " </td>";
echo "<td><input type=’checkbox’ name=’modificacion[]’
value=’".$registro[’Id_becario’]."’ /></td>";
echo "</tr>";
}
}
/* Cierre de la conexión */
mysqli_close($connect);
?>
</tabla>
<br />
<input type="submit" name="modificar" value="modificar" />
</form>
<br />
<a href="formacion.php">Añadir un becario</a> <a
href="lista_becario_que_eliminar.php">Eliminar un becario</a>
</body>
</html>
/* Comprobar la conexión */
if (!$connect) {
echo "Fallo de la conexión : ".mysqli_connect_error();
exit();
}
?>
<head>
<title>Ejercicio formación</title>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-
8859-15" />
www.FreeLibros.me
</head>
<body>
<?php
if (isset($_POST[’modificacion’])) {
date_default_timezone_set(’Europe/Paris’);
foreach ($_POST[’modificación’] as $valor) {
//Para modificar la tabla becario_formador, hay que
//eliminar y crear los que están controlados
$consulta = "DELETE FROM becario_formador WHERE Id_becario
= ".$valor;
$resultado = mysqli_query($connect,$consulta);
if (isset($_POST[’formador’.$valor])) {
foreach ($_POST[’formador’.$valor] as $valor_formador) {
$dt_inicio = date_create_from_format(’d/m/Y’,
$_POST[’inicio’.$valor_formador."_".$valor]);
$dt_fin = date_create_from_format(’d/m/Y’,
$_POST[’fin’.$valor_formador."_".$valor]);
$consulta_formador = "INSERT INTO becario_formador
(Id_becario, Id_formador, Fecha_inicio, Fecha_fin) VALUES
(".$valor.",".$valor_formador.",’".$dt_inicio->format(’Y/m/d’)."’,
’".$dt_fin->format(’Y/m/d’)."’)";
$resultado_formador =
mysqli_query($connect,$consulta_formador);
}
}
$consulta_becario = "UPDATE becario SET
Apellido=’".htmlentities(addslashes($_POST[’apellido’.$valor]),
ENT_QUOTES)."’
,Nombre=’".htmlentities(addslashes($_POST[’nombre’.$valor]),
ENT_QUOTES)."’,Id_nacionalidad=".$_POST[’nacionalidad’.$valor].",
Id__tipo_formacion=".$_POST[’_tipo_formacion’.$valor]." WHERE Id =
".$valor;
$resultado_becario =
mysqli_query($connect,$consulta_becario);
}
}
/* Cierre de la conexión */
mysqli_close($connect);
header(’location:lista_becario_que_modificar.php’);
?>
</body>
</html>
www.FreeLibros.me