Sie sind auf Seite 1von 139

Curso de PHP

Tema 1: Introduccin
Jos Mariano Gonzlez Romano
Departamento de Lenguajes y Sistemas
Informticos
Universidad de Sevilla
Autor
Introduccin a PHP
Lenguajes de script
PHP es un lenguaje de script del lado del servidor. Otros
lenguajes similares son ASP, JSP o ColdFusion
Los scripts PHP estn incrustados en los documentos HTML
y el servidor los interpreta y ejecuta antes de servir las
pginas al cliente
El cliente no ve el cdigo PHP sino los resultados que
produce
Introduccin a PHP
Breve historia de PHP
Creado por Rasmus Lerdorf para uso personal en 1994
PHP = Personal Hypertext Processor
Versin actual: PHP 4
Es un mdulo que se aade al servidor web y fue concebido
inicialmente para Apache
Por qu PHP?
Por sus ventajas: es potente, fcil de aprender, de libre
distribucin, permite el acceso a bases de datos y otras
funcionalidades orientadas a la red
Dispone de abundante soporte en la Web
Introduccin a PHP
Requisitos
Servidor web Apache (www.apache.org)
con el mdulo PHP (www.php.net)
y la base de datos MySQL (www.mysql.com) si se desea crear
pginas dinmicas
Otras utilidades
Herramientas para la gestin de MySQL, como PHPMyAdmin
(www.phpmyadmin.net)
Editores de PHP, como DevPHP (www.sourceforge.net)
Manuales de PHP y MySQL
Curso de PHP
Tema 2: Lenguaje PHP bsico
Tema 2: Lenguaje PHP bsico
1. Sintaxis bsica
2. Tipos de datos
3. Variables
4. Constantes
5. Expresiones y operadores
6. Estructuras de control
7. Funciones
8. Tablas
9. Bibliotecas de funciones
Sintaxis bsica
PHP es sensible a las maysculas
Cmo se incrusta en la pgina web?
<?PHP ... ?>
recomendado, siempre disponible
<?= expresin ?>
equivale a <? echo expresin ?>
Las instrucciones se separan con un ; como en C. La marca
final ?> implica un ;
Comentarios: como en C, /* */ y //
Sintaxis bsica
Para imprimir: echo y print
echo: muestra una o ms cadenas
echo cadena1 [, cadena2]; // no es una funcin
echo Hola mundo;
echo Hola , mundo;
print: muestra una cadena
print cadena; // no es una funcin
print Hola mundo;
print Hola . mundo;
Sintaxis bsica
Ejemplo:
<HTML>
<HEAD>
<TITLE>Mi primer programa en PHP</TITLE>
</HEAD>
<BODY>
<?PHP
print (Hola mundo);
?>
</BODY>
</HTML>
Sintaxis bsica
Uso de \n para generar cdigo HTML legible
a) Sin \n
print (<P>Prrafo 1</P>);
print (<P>Prrafo 2</P>);
<P>Prrafo 1</P><P>Prrafo 2</P>
Prrafo 1
Prrafo 2
Cdigo PHP
Cdigo HTML
Salida
Sintaxis bsica
Uso de \n para generar cdigo HTML legible
b) Con \n
print (<P>Prrafo 1</P>\n);
print (<P>Prrafo 2</P>\n);
<P>Prrafo 1</P>
<P>Prrafo 2</P>
Prrafo 1
Prrafo 2
Cdigo PHP
Cdigo HTML
Salida
Sintaxis bsica
Ejercicio 1: programa que muestra un mensaje
Ilustra cmo incrustar cdigo PHP en un documento HTML
y cmo imprimir desde PHP
Sintaxis bsica
Inclusin de ficheros externos:
include()
require()
Ambos incluyen y evalan el fichero especificado
Diferencia: en caso de error include() produce un warning y
require() un error fatal
Se usar require() si al producirse un error debe interrumpirse la
carga de la pgina
Ejemplo:
Sintaxis bsica
<HTML>
<HEAD>
<TITLE>Ttulo</TITLE>
<?PHP
// Incluir bibliotecas de funciones
require ("$libdir/conecta.php");
require ("$libdir/fecha.php");
require ("$libdir/cadena.php");
require ("$libdir/globals.php");
?>
</HEAD>
<BODY>
<?PHP
include ("cabecera.html");
?>
// Cdigo HTML + PHP
. . .
<?PHP
include ("pie.html");
?>
</BODY>
</HTML>
Tipos de datos
PHP soporta 8 tipos de datos primitivos:
boolean, integer, double, string
array, object
resource, NULL
El tipo de una variable no se suele especificar. Se decide en
tiempo de ejecucin en funcin del contexto y puede variar
Funciones de inters:
La funcin gettype() devuelve el tipo de una variable
Las funciones is_type comprueban si una variable es de un tipo
dado:
is_array(), is_bool(), is_float(), is_integer(), is_null(),
is_numeric(), is_object(), is_resource(), is_scalar(),
is_string()
La funcin var_dump() muestra el tipo y el valor de una variable.
Es especialmente interesante con los arrays
Tipos de datos
Tipo integer (nmeros enteros)
27, -5, 0
Tipo double (nmeros reales)
1.234, -5.33
Tipo boolean (lgico)
Valores: true, false (insensibles a las maysculas)
El 0 y la cadena vaca tienen valor false
Tipos de datos
Tipo string:
Las cadenas se encierran entre comillas simples o dobles:
simples: admite los caracteres de escape \ (comilla simple) y \\
(barra). Las variables NO se expanden
dobles: admite ms caracteres de escape, como \n, \r, \t, \\, \$,
\. Los nombres de variables S se expanden
$a = 9;
print a vale $a; // muestra a vale $a
print a vale $a; // muestra a vale 9
Acceso a un carcter de la cadena:
La forma es $inicial = $nombre{0};
Variables
Las variables siempre van precedidas de un $
El nombre es sensible a las maysculas
Comienzan por letra o subrayado, seguido de letras, nmeros o
subrayado
Variables predefinidas:
$GLOBALS, $_SERVER, $_GET, $_POST, $_COOKIES, $_FILES,
$_ENV, $_REQUEST, $_SESSION
mbito: globales al fichero (excepto funciones) o locales a una
funcin
Ejemplo:
$valor = 5;
print El valor es: . $valor . \n;
print El valor es: $valor\n; // ojo: comillas dobles
Resultado:
El valor es: 5
Constantes
Definicin de constantes:
define (CONSTANTE, hola);
print CONSTANTE;
No llevan $ delante
Slo se pueden definir constantes de los tipos escalares
(boolean, integer, double, string)
Expresiones y operadores
Operadores aritmticos:
+, -, *, /, %, ++, --
Operador de asignacin:
=
operadores combinados: .=, +=, etc
$a = 3; $a += 5; a vale 8
$b = hola ; $b .= mundo; b vale hola mundo
Equivale a $b = $b . mundo;
Operadores de comparacin:
==, !=, <, >, <=, >= y otros
Operador de control de error: @. Antepuesto a una expresin, evita
cualquier mensaje de error que pueda ser generado por la expresin
Operadores lgicos:
and (&&), or (||), !, xor
and/&& y or/|| tienen diferentes prioridades
Operadores de cadena:
concatenacin: . (punto)
asignacin con concatenacin: .=
Estructuras de control
if-else
while
do .. while
for
foreach
switch
Estructuras de control
if-else
if (expresin1)
sentencia 1
else if (expresin2)
sentencia 2
...
else if (expresin n)
sentencia n
else
sentencia n+1
Mismo comportamiento que en C
Las sentencias compuestas se encierran entre llaves
elseif puede ir todo junto
Estructuras de control
while
while (expresin)
sentencia
Mismo comportamiento que en C
Estructuras de control
for
for (expresin1; expresin2; expresin3)
sentencia
Mismo comportamiento que en C
Estructuras de control
switch
switch (expresin)
{
case valor 1:
sentencia 1
break;
case valor 2:
sentencia 2
break;

case valor n:
sentencia n
break;
default
sentencia n+1
}
Mismo comportamiento que en C, slo que la expresin del
case puede ser integer, float o string
Estructuras de control
Ejercicio 2: programa que calcula una tabla de multiplicar
Ilustra cmo manejar variables y cmo usar bucles
Funciones
Ejemplo:
function suma ($x, $y)
{
$s = $x + $y;
return s;
}
$a=1;
$b=2;
$c=suma ($a, $b);
print $c;
Funciones
Por defecto los parmetros se pasan por valor
Paso por referencia:
function incrementa (&$a)
{
$a = $a + 1;
}
$a=1;
incrementa ($a);
print $a; // Muestra un 2
Funciones
Argumentos por defecto
function muestranombre ($titulo = "Sr.")
{
print "Estimado $titulo:\n";
}
muestranombre ();
muestranombre ("Prof.");
Salida:
Estimado Sr.:
Estimado Prof.:
Funciones
Los argumentos con valores por defecto deben ser siempre los
ltimos:
function muestranombre ($nombre, $titulo= "Sr.")
{
print "Estimado $titulo $nombre:\n";
}
muestranombre (Fernndez);
muestranombre (Fernndez, "Prof.");
Salida:
Estimado Sr. Fernndez:
Estimado Prof. Fernndez:
Tablas
Sintaxis:
array ([clave =>] valor, ...)
La clave es una cadena o un entero no negativo. El valor puede
ser de cualquier tipo vlido en PHP, incluyendo otro array
Ejemplos:
$color = array (rojo=>101, verde=>51, azul=>255);
$medidas = array (10, 25, 15);
Acceso:
$color[rojo] // No olvidar las comillas
$medidas[0]
El primer elemento es el 0
Tablas
La estructura de control foreach permite iterar sobre arrays
Sintaxis:
foreach (expresin_array as $valor)
sentencia
foreach (expresin_array as $clave => $valor)
sentencia
Ejemplos:
foreach ($color as $valor)
print Valor: $valor<BR>\n;
foreach ($color as $clave => $valor)
print Clave: $clave; Valor: $valor<BR>\n;
Salida:
Valor: 101
Valor: 51
Valor: 255
Clave: rojo; Valor: 101
Clave: verde; Valor: 51
Clave: azul; Valor: 255
Bibliotecas de funciones
Existen muchas bibliotecas de funciones en PHP
Algunos ejemplos:
Funciones de manipulacin de cadenas
Funciones de fecha y hora
Funciones de arrays
Funciones de ficheros
Funciones matemticas
Funciones de bases de datos
Funciones de red
Algunas bibliotecas requieren la instalacin de componentes
adicionales
Todas las funciones de biblioteca estn comentadas en la
documentacin de PHP
Bibliotecas de funciones
Ejemplo 3: programa que muestra la fecha actual
Ilustra cmo usar comentarios, tablas y funciones (propias y
de biblioteca). Tambin cmo usar el manual de PHP
Curso de PHP
Tema 3: Formularios
Tema 3: Formularios
1. Acceso a formularios HTML desde PHP
2. El formulario de PHP
3. Subida de ficheros al servidor
4. Campos dinmicos con JavaScript
5. Validacin de los datos de un formulario
Acceso a formularios desde PHP
Desde PHP se puede acceder fcilmente a los datos
introducidos desde un formulario HTML
Acceso a formularios desde PHP
Fichero uno.php
<HTML>
<BODY>
<FORM ACTION=dos.php METHOD=POST>
Edad: <INPUT TYPE=text NAME=edad>
<INPUT TYPE=submit VALUE=aceptar>
</FORM>
</BODY>
</HTML>
Fichero dos.php
<HTML>
<BODY>
<?PHP
print (La edad es: $edad);
?>
</BODY>
</HTML>
Acceso a formularios desde PHP
Acceso a formularios desde PHP
A partir de PHP 4.2.0, el valor por defecto de la directiva de
PHP register_globals es off
Esto tiene una gran importancia sobre los formularios, ya
que no es posible acceder a las variables enviadas de la
manera anterior (como variables globales). En su lugar hay
que utilizar la variable predefinida de PHP $_REQUEST,
escribiendo $_REQUEST[edad] en lugar de $edad
Se puede poner register_globals = on en el fichero de
configuracin php.ini, pero no es recomendable por motivos
de seguridad. Una alternativa que permite hacer mnimos
cambios en el cdigo ya existente es la siguiente:
$edad = $_REQUEST[edad];
Acceso a formularios desde PHP
Fichero uno.php
<HTML>
<BODY>
<FORM ACTION=dos.php METHOD=POST>
Edad: <INPUT TYPE=text NAME=edad>
<INPUT TYPE=submit VALUE=aceptar>
</FORM>
</BODY>
</HTML>
Fichero dos.php
<HTML>
<BODY>
<?PHP
$edad = $_REQUEST[edad];
print (La edad es: $edad);
?>
</BODY>
</HTML>
Acceso a formularios desde PHP
Ejercicio 1: formulario simple
Ilustra cmo acceder a los valores introducidos desde un
formulario HTML
Acceso a formularios desde PHP
Acceso a los diferentes tipos de elementos de entrada de
formulario
Elementos de tipo INPUT
TEXT
RADIO
CHECKBOX
BUTTON
FILE
HIDDEN
PASSWORD
SUBMIT
Elemento SELECT
Simple / mltiple
Elemento TEXTAREA
Acceso a formularios desde PHP
TEXT
Introduzca la cadena a buscar:
<INPUT TYPE="text" NAME="cadena" VALUE="valor por defecto" SIZE="20">
<?PHP
print ($cadena);
//print ($_REQUEST [cadena]);
?>
Acceso a formularios desde PHP
RADIO
<INPUT TYPE="radio" NAME="titulacion" VALUE=II CHECKED>I.Informtica
<INPUT TYPE="radio" NAME="titulacion" VALUE="ITIG">I.T.I. Gestin
<INPUT TYPE="radio" NAME="titulacion" VALUE="ITIS">I.T.I. Sistemas
<?PHP
print ($titulacion);
//print ($_REQUEST [titulacion]);
?>
Acceso a formularios desde PHP
CHECKBOX
<INPUT TYPE="checkbox" NAME="extras[]" VALUE="garaje" CHECKED>Garaje
<INPUT TYPE="checkbox" NAME="extras[]" VALUE="piscina">Piscina
<INPUT TYPE="checkbox" NAME="extras[]" VALUE="jardin">Jardn
<?PHP
$n = count ($extras);
for ($i=0; $i<$n; $i++)
print ($extras[$i]<BR>\n);
//foreach ($_REQUEST[extras] as $extra)
//print ($extra<BR>\n);
?>
Acceso a formularios desde PHP
BUTTON
<INPUT TYPE="button" NAME="nueva" VALUE="Aadir una ms">
<?PHP
if ($nueva)
print ("Se va a aadir una nueva");
//if ($_REQUEST [nueva])
//print ("Se va a aadir una nueva");
?>
Acceso a formularios desde PHP
FILE
<FORM ACTION="procesa.php" METHOD="post
ENCTYPE="multipart/form-data">
<INPUT TYPE="file" NAME="fichero">
</FORM>
Acceso a formularios desde PHP
HIDDEN
<?PHP
print(<INPUT TYPE=hidden NAME=username VALUE=$usuario>\n);
?>
<?PHP
print ($username);
//print ($_REQUEST [username]);
?>
Acceso a formularios desde PHP
PASSWORD
Contrasea: <INPUT TYPE="password" NAME="clave">
<?PHP
print ($clave);
//print ($_REQUEST [clave]);
?>
Acceso a formularios desde PHP
SUBMIT
<INPUT TYPE="submit" NAME="enviar" VALUE="Enviar datos">
<?PHP
if ($enviar)
print ("Se ha pulsado el botn de enviar");
//if ($_REQUEST [enviar])
//print ("Se ha pulsado el botn de enviar");
?>
Acceso a formularios desde PHP
SELECT simple
<SELECT NAME="titulacion">
<OPTION VALUE="II" SELECTED>Ingeniera Informtica
<OPTION VALUE="ITIG">Ingeniera Tcnica en Informtica de Gestin
<OPTION VALUE="ITIS">Ingeniera Tcnica en Informtica de Sistemas
</SELECT>
<?PHP
print ($titulacion);
//print ($_REQUEST [titulacion]);
?>
Acceso a formularios desde PHP
SELECT mltiple
<SELECT MULTIPLE SIZE="3" NAME="idiomas[]">
<OPTION VALUE="ingles" SELECTED>Ingls
<OPTION VALUE="frances">Francs
<OPTION VALUE="aleman">Alemn
<OPTION VALUE="holandes">Holands
</SELECT>
<?PHP
$n = count ($idiomas);
for ($i=0; $i<$n; $i++)
print ($idiomas[$i]<BR>\n);
//foreach ($_REQUEST[idiomas] as $idioma)
//print ($idioma<BR>\n);
?>
Acceso a formularios desde PHP
TEXTAREA
<TEXTAREA COLS=30" ROWS=4" NAME="comentario">
Este libro me parece ...
</TEXTAREA>
<?PHP
print ($comentario);
//print ($_REQUEST [comentario]);
?>
Acceso a formularios desde PHP
Ejercicio 2: programa que muestra los datos
introducidos desde un formulario
Ilustra cmo acceder a los valores introducidos desde todos
los tipos de elementos de entrada de un formulario, con
excepcin de los tipos BUTTON y FILE, que se tratan en
ejercicios posteriores
El formulario de PHP
La forma habitual de trabajar con formularios en PHP es
utilizar un nico programa que procese el formulario o lo
muestre segn haya sido o no enviado, respectivamente
Ventajas:
Disminuye el nmero de ficheros
Permite validar los datos del formulario en el propio formulario
Procedimiento:
si se ha enviado el formulario:
Procesar formulario
si no:
Mostrar formulario
fsi
El formulario de PHP
Para saber si se ha enviado el formulario se acude a la
variable correspondiente al botn de envo. Si este botn
aparece de la siguiente forma en el formulario HTML:
<INPUT TYPE="SUBMIT" NAME="enviar VALUE="procesar">
entonces la condicin anterior se transforma en:
if (isset($enviar))
o bien
if ($enviar == procesar)
El formulario de PHP
Ejercicio 3: formulario de PHP
Ilustra cmo crear pginas multipropsito que sirven tanto
para mostrar un formulario como para procesarlo
Subida de ficheros al servidor
Para subir un fichero al servidor se utiliza el elemento de
entrada FILE
Hay que tener en cuenta una serie de consideraciones
importantes:
El elemento FORM debe tener el atributo
ENCTYPE="multipart/form-data
El fichero tiene un lmite en cuanto a su tamao. Este lmite se
fija de dos formas diferentes:
En el fichero de configuracin php.ini
En el propio formulario
Subida de ficheros al servidor
;;;;;;;;;;;;;;;;
; File Uploads ;
;;;;;;;;;;;;;;;;
; Whether to allow HTTP file uploads.
file_uploads = On
; Temporary directory for HTTP uploaded files (will use
; system default if not specified).
;upload_tmp_dir =
; Maximum allowed size for uploaded files.
upload_max_filesize = 2M
php.ini
formulario
<INPUT TYPE=HIDDEN NAME=MAX_FILE_SIZE VALUE='102400'>
<INPUT TYPE=FILE NAME="fichero">
Subida de ficheros al servidor
Consideraciones (cont)
Debe darse al fichero un nombre que evite coincidencias con
ficheros ya subidos. Por ello, y como norma general, debe
descartarse el nombre original del fichero y crear uno nuevo
que sea nico
El fichero subido se almacena en un directorio temporal y
hemos de moverlo al directorio de destino usando la funcin
move_upload_file()
Procedimiento:
si se ha subido correctamente el fichero:
Asignar un nombre al fichero
Mover el fichero a su ubicacin definitiva
si no:
Mostrar un mensaje de error
fsi
Subida de ficheros al servidor
HTML
<INPUT TYPE="HIDDEN" NAME="MAX_FILE_SIZE" VALUE="102400">
<INPUT TYPE="FILE" SIZE="44" NAME="imagen">
La variable $_FILES contiene toda la informacin del fichero
subido:
$_FILES['imagen']['name']
Nombre original del fichero en la mquina cliente
$_FILES['imagen']['type']
Tipo mime del fichero. Por ejemplo, "image/gif"
$_FILES['imagen']['size']
Tamao en bytes del fichero subido
$_FILES['imagen']['tmp_name']
Nombre del fichero temporal en el que se almacena el fichero
subido en el servidor
$_FILES['imagen]['error']
Cdigo de error asociado al fichero subido
Subida de ficheros al servidor
PHP
if (is_uploaded_file ($_FILES['imagen']['tmp_name']))
{
$nombreDirectorio = "img/";
$idUnico = time();
$nombreFichero = $idUnico . "-" . $_FILES['imagen']['name'];
move_uploaded_file ($_FILES['imagen']['tmp_name'],
$nombreDirectorio . $nombreFichero);
}
else
print ("No se ha podido subir el fichero\n");
Subida de ficheros al servidor
Ejercicio 4: subida de un fichero al servidor
Ilustra cmo subir ficheros a un servidor, cmo controlar su
tamao, cmo crear un nombre nico para el fichero y
cmo almacenarlo en el lugar deseado
Campos dinmicos con JavaScript
Es habitual que un campo de un formulario deba cambiar de
valor al modificarse otro campo del mismo formulario
Si el nuevo valor est almacenado en una base de datos, la
solucin es volver a cargar el formulario con los nuevos
requisitos
En algunos casos el nuevo valor puede calcularse de forma
automtica, para lo cual podemos usar JavaScript
Ejemplo: introduccin de una fecha
Campos dinmicos con JavaScript
Ejercicio 5: formulario con campos que se actualizan
dinmicamente
Ilustra cmo actualizar el valor de un campo de un
formulario en funcin del valor de otro, por medio de
funciones en JavaScript
Validacin de formularios
Toda la informacin proveniente de un formulario debe
considerarse por norma como contaminada, y hay que
validarla antes de darla por buena y procesarla
Lo ms eficiente es mostrar los errores sobre el propio
formulario para facilitar su correccin. Procedimiento:
si se ha enviado el formulario:
si hay errores:
Mostrar formulario con errores
si no:
Procesar formulario
fsi
si no:
Mostrar formulario
fsi
Validacin de formularios
Este procedimiento se puede resumir para que slo haya que
mostrar una vez el formulario, bien con los valores por defecto
o con los valores introducidos, y con los errores en su caso:
si se ha enviado el formulario:
validar datos
fsi
si se ha enviado el formulario y no hay errores:
Procesar formulario
si no:
Mostrar formulario con valores por defecto o ya
enviados
fsi
Validacin de formularios
Ejercicio 6: validacin de los datos introducidos en un
formulario
Ilustra cmo realizar una validacin de los datos
introducidos en un formulario en el propio formulario
Curso de PHP
Tema 4: Acceso a bases de datos
MySQL en PHP
Tema 4: Acceso a bases de datos
MySQL en PHP
1. Bases de datos en la Web
2. Lenguaje SQL
3. Funciones de PHP para el acceso a bases de datos
MySQL
4. Ejercicios
5. Consulta avanzada de tablas
Bases de datos en la Web
Las bases de datos permiten almacenar de una forma
estructurada y eficiente toda la informacin de un sitio web
Ventajas
Proporcionar informacin actualizada
Facilitar la realizacin de bsquedas
Disminuir los costes de mantenimiento
Implementar sistemas de control de acceso
Almacenar preferencias de los usuarios
Bases de datos en la Web
Esquema bsico de un sitio web soportado por bases de datos:
Lenguaje SQL
SQL (Structured Query Language) es el lenguaje que se
utiliza para comunicarse con la base de datos
Procedimiento de comunicacin con la base de datos:
Pgina
PHP
Base de
datos
orden SQL
resultado
Lenguaje SQL
Las instrucciones ms habituales son SELECT, INSERT,
UPDATE, DELETE
Veamos su sintaxis bsica y algunos ejemplos de uso
Para ello utilizaremos una tabla noticias con cinco campos:
un identificador nico de la noticia, el ttulo de la noticia, el
texto de la noticia, la categora de la noticia y la fecha de
publicacin de la noticia
ttulo
texto
categora
noticias
id
fecha
Lenguaje SQL
SELECT
Sintaxis:
SELECT expresin FROM tabla
[WHERE condicin]
[ORDER BY {unsigned_integer | col_name | formula} [ASC | DESC] ,...]
[LIMIT [offset,] row_count | row_count OFFSET offset]
Ejemplo:
SELECT * from noticias WHERE fecha=CURDATE() LIMIT 10 ORDER BY fecha
DESC
Obtiene las noticias del da con un tope mximo de 10, ordenadas de
la ms reciente a la ms antigua
Lenguaje SQL
INSERT
Sintaxis:
INSERT [INTO] nombre_tabla [(nombre_columna,...)]
VALUES ((expresin | DEFAULT),...), (...),...
INSERT [INTO] nombre_tabla
SET nombre_columna=(expresin | DEFAULT), ...
Ejemplo:
INSERT INTO noticias (id, titulo, texto, categoria, fecha) VALUES
(37, Nueva promocin en Nervin, 145 viviendas de lujo en
urbanizacin ajardinada situadas en un entorno privilegiado,
promociones, CURDATE())
Inserta una noticia con los valores indicados
Lenguaje SQL
UPDATE
Sintaxis:
UPDATE nombre_tabla
SET nombre_columna1=expr1 [, nombre_columna2=expr2 ...]
[WHERE condicin]
[ORDER BY ...]
[LIMIT row_count]
Ejemplo:
UPDATE noticias SET categoria = ofertas WHERE id=37
Modifica la categora de la noticia con id=37 de la tabla
Lenguaje SQL
DELETE
Sintaxis:
DELETE FROM nombre_tabla
[WHERE condicin]
[ORDER BY ...]
[LIMIT row_count]
Ejemplo:
DELETE FROM noticias WHERE fecha < CURDATE()-10
Borra las noticias con ms de 10 das de antigedad
Funciones de PHP para el acceso a
bases de datos MySQL
Los pasos para acceder desde PHP a una base de datos
son los siguientes:
Conectar con el servidor de bases de datos
Seleccionar una base de datos
Enviar la instruccin SQL a la base de datos
Obtener y procesar los resultados
Cerrar la conexin con el servidor de bases de datos
Acceso a bases de datos MySQL
Las funciones concretas de MySQL que realizan estas
operaciones son:
Conectar con el servidor de bases de datos:
mysql_connect()
Seleccionar una base de datos:
mysql_select_db()
Enviar la instruccin SQL a la base de datos:
mysql_query()
Obtener y procesar los resultados:
mysql_num_rows() y mysql_fetch_array()
Cerrar la conexin con el servidor de bases de datos:
mysql_close()
Acceso a bases de datos MySQL
Conectar con el servidor de bases de datos: mysql_connect()
Devuelve un identificador de la conexin en caso de xito y
false en caso contrario
Sintaxis:
$conexion = mysql_connect (servidor, username, password);
Ejemplo:
$conexion = mysql_connect (localhost, cursophp, )
or die (No se puede conectar con el servidor);
$conexion = mysql_connect (localhost, cursophp-ad, php.hph)
or die (No se puede conectar con el servidor);
Acceso a bases de datos MySQL
Seleccionar una base de datos: mysql_select_db()
Devuelve true en caso de xito y false en caso contrario
Sintaxis:
mysql_select_db (database);
Ejemplo:
mysql_select_db (lindavista)
or die (No se puede seleccionar la base de datos);
Acceso a bases de datos MySQL
Enviar la instruccin SQL a la base de datos: mysql_query()
Devuelve un identificador o true (dependiendo de la
instruccin) si la instruccin se ejecuta correctamente y false
en caso contrario
Sintaxis:
$consulta = mysql_query (instruccin, $conexion);
Ejemplo:
$consulta = mysql_query (select * from noticias, $conexion)
or die (Fallo en la consulta);
Acceso a bases de datos MySQL
Obtener y procesar los resultados: mysql_num_rows(),
mysql_fetch_array()
En el caso de que la instruccin enviada produzca unos
resultados, mysql_query() devuelve las filas de la tabla
afectadas por la instruccin
mysql_num_rows() devuelve el nmero de filas afectadas
Para obtener las distintas filas del resultado se utiliza la funcin
mysql_fetch_array(), que obtiene una fila del resultado en un
array asociativo cada vez que se invoca
Sintaxis:
$nfilas = mysql_num_rows ($consulta);
$fila = mysql_fetch_array ($consulta);
Acceso a bases de datos MySQL
Ejemplo:
Ttulo 1 Texto 1 05/02/2004
noticias
1
Ttulo 2 Texto 2 05/02/2004 2
Ttulo 3 Texto 3 04/02/2004 3
Ttulo 4 Texto 4 01/02/2004 4
Ttulo 5 Texto 5 31/01/2004 5
Instruccin:
select * from noticias where categoria=promociones
ofertas
promociones
promociones
costas
promociones
Acceso a bases de datos MySQL
Ejemplo:
Ttulo 1 Texto 1 05/02/2004
noticias
1
Ttulo 2 Texto 2 05/02/2004 2
Ttulo 3 Texto 3 04/02/2004 3
Ttulo 4 Texto 4 01/02/2004 4
Ttulo 5 Texto 5 31/01/2004 5
Instruccin:
select * from noticias where categoria=promociones
ofertas
promociones
promociones
costas
promociones
$consulta
$nfilas=3
Acceso a bases de datos MySQL
Obtencin de las filas:
$nfilas = mysql_num_rows ($consulta);
if ($nfilas > 0)
{
for ($i=0; $i<$nfilas; $i++)
{
$fila = mysql_fetch_array ($consulta);
procesar fila i-sima de los resultados
}
}
Acceso a bases de datos MySQL
Obtener los resultados: mysql_num_rows(),
mysql_fetch_array()
Para acceder a un campo determinado de una fila se usa la
siguiente sintaxis:
$fila[nombre_campo]// por ser un array asociativo
$fila[i] // i=ndice del campo desde 0
Ejemplo:
for ($i=0; $i<$nfilas; $i++)
{
$fila = mysql_fetch_array ($consulta);
echo Ttulo: . $fila[titulo];
echo Fecha: . $fila[fecha];
}
Acceso a bases de datos MySQL
Cerrar la conexin con el servidor de bases de datos:
mysql_close()
Sintaxis:
mysql_close ($conexion);
Ejemplo
mysql_close ($conexion);
Ejercicios
Ejercicio 1: consulta de noticias
Ejercicio simple de acceso a una tabla de una base de datos.
Ilustra cmo conectar con una base de datos, enviar una
consulta, recuperar los resultados y mostrarlos en pantalla.
Pasos previos:
1. Crear la base de datos lindavista
2. Crear la tabla noticias en la base de datos lindavista
3. Crear el usuario cursophp (sin contrasea)
4. Dar al usuario cursophp permiso SELECT sobre la tabla noticias
de la base de datos lindavista
Ejercicios
Ejercicio 2: encuesta
Ilustra cmo actualizar una tabla y cmo generar grficos
simples
Pasos previos:
1. Crear la tabla votos en la base de datos lindavista
2. Dar al usuario cursophp permisos SELECT y UPDATE sobre
la tabla votos de la base de datos lindavista
Ejercicios
Ejercicio 3: insercin de noticias
Se crear un formulario para insertar las noticias en la base de
datos
Pasos previos:
1. Crear el usuario cursophp-ad (contrasea: php.hph)
2. Dar al usuario cursophp-ad permisos SELECT e INSERT
sobre la tabla noticias de la base de datos lindavista
Consulta avanzada de tablas
Objetivo:
mostrar los resultados de la consulta divididos en bloques de
un nmero determinado de elementos (por ejemplo, de 5 en
5)
Requisitos:
Recuperar un nmero limitado de elementos de la tabla
Implementar un mecanismo de navegacin que permita
avanzar al siguiente o volver al anterior bloque de elementos
Consulta avanzada de tablas
Para recuperar un nmero fijo de elementos de una tabla se
utiliza la opcin LIMIT de la orden SELECT. As, por ejemplo,
SELECT * from noticias LIMIT 0, 5
recupera los 5 primeros elementos de la tabla. Y en general,
SELECT * from noticias LIMIT $comienzo, $num
recupera $num elementos a partir de la posicin $comienzo
Consulta avanzada de tablas
La variable $num tendr un valor constante (en este caso 5),
mientras que la variable $comienzo se incrementar o
decrementar en 5 unidades al pasar a la pgina siguiente o
anterior
Para ello se pasar la variable como parmetro en el enlace
asociado al botn correspondiente
Por ejemplo, el cdigo para el botn siguiente ser:
"<A HREF='$PHP_SELF?comienzo=" . ($comienzo + $num) .
"'>Siguiente</A>
Habr que comprobar previamente que el nuevo valor de
comienzo es vlido, es decir, que se encuentra dentro de los
lmites de la tabla devuelta por la consulta
Consulta avanzada de tablas
Ejercicio 4: consulta de noticias con paginado de
resultados
Ejercicio que ilustra cmo mostrar los resultados de una
consulta paginados de n en n elementos y con botones para
avanzar a la pgina siguiente o retroceder a la pgina anterior
Consulta avanzada de tablas
Objetivo:
Mostrar los resultados de una consulta de manera que se
puedan filtrar en funcin del valor de una determinada
columna de la tabla
Requisitos:
Recuperar de una tabla los elementos que cumplan una
determinada condicin
Permitir seleccionar un valor de entre los valores posibles de
una columna
Consulta avanzada de tablas
Para recuperar los elementos de una tabla que cumplen una
condicin se utiliza la opcin WHERE de la orden SELECT. Por
ejemplo,
SELECT * from noticias WHERE categoria=ofertas
recupera las noticias cuya categora tiene el valor ofertas. Y
en general,
SELECT * from noticias WHERE categoria =$categoria
recupera las noticias cuya categora tiene el valor dado por la
variable $categoria
La variable $categoria se obtendr de un elemento SELECT
Consulta avanzada de tablas
Ejercicio 5: consulta de noticias con filtrado de resultados
Ejercicio que ilustra cmo mostrar los resultados de una
consulta filtrados en funcin del valor de una columna de tipo
enumerado con actualizacin manual al pulsar un botn
Consulta avanzada de tablas
Objetivo:
Modificar el ejercicio anterior para que los resultados se
actualicen de forma automtica al seleccionar un nuevo valor
para la columna
Requisitos:
Obtener automticamente los valores de una columna de tipo
enumerado a partir de la tabla
Utilizar cdigo JavaScript para detectar un cambio en la opcin
seleccionada de un elemento de tipo SELECT
Consulta avanzada de tablas
Funcin JavaScript que actualiza una pgina en funcin de la
opcin seleccionada en el elemento SELECT de nombre
categoria del formulario de nombre selecciona:
<SCRIPT LANGUAGE='JavaScript'>
<!--
function actualizaPagina ()
{
i = document.forms.selecciona.categoria.selectedIndex;
categoria =
document.forms.selecciona.categoria.options[i].value;
window.location = muestra_noticias.php?categoria=' +
categoria;
}
// -->
</SCRIPT>
Consulta avanzada de tablas
Para ejecutar la funcin JavaScript es preciso asociarla al
elemento SELECT a travs del evento ONCHANGE, que se
activa cuando se modifica la opcin seleccionada:
<SELECT NAME='categoria' ONCHANGE='actualizaPagina()'>
Consulta avanzada de tablas
Es conveniente que la opcin seleccionada aparezca marcada
por defecto al actualizar la pgina
Para ello es preciso generar las opciones del elemento
SELECT de forma automtica
De esta manera se puede comparar cada una de las opciones
con el valor proveniente del formulario y colocar el atributo
SELECTED a la que corresponda
Consulta avanzada de tablas
En el formulario del ejercicio anterior los valores de los campos
de tipo enumerado (ENUM) estn escritos directamente en el
propio cdigo. As, para la categora de noticia se tiene:
<SELECT NAME=categoria">
<OPTION VALUE=promociones">promociones
<OPTION VALUE=ofertas" SELECTED>ofertas
<OPTION VALUE=costas">costas
</SELECT>
Este hecho no es muy deseable ya que si se modifican los
valores de la categora en la tabla hay que modificar tambin el
cdigo del formulario
Consulta avanzada de tablas
Lo ideal es tomar los valores automticamente de la tabla en
lugar de escribirlos a mano en el cdigo. Para ello se utiliza la
siguiente instruccin SQL:
SHOW columns FROM noticias LIKE categoria
que devuelve una tabla con las propiedades del campo
categoria. El elemento [1] de esta tabla contiene lo siguiente:
enum(promociones",ofertas",costas")
A partir de esta informacin podemos obtener los valores del
tipo enumerado y generar las opciones del elemento SELECT.
Slo queda marcar con SELECTED la opcin que estaba
seleccionada en caso de haberse enviado el formulario
Consulta avanzada de tablas
Ejercicio 6: consulta de noticias con filtrado de resultados
Ejercicio que ilustra cmo mostrar los resultados de una
consulta filtrados en funcin del valor de una columna de tipo
enumerado con actualizacin automtica a travs de JavaScript
Curso de PHP
Tema 5: Sesiones
Tema 5: Sesiones
1. Introduccin
2. Manejo de sesiones
3. Autenticacin de usuarios
Introduccin
A veces es necesario mantener el estado de una conexin entre
distintas pginas o entre distintas visitas a un mismo sitio
Ejemplos: aplicaciones personalizadas, carrito de la compra,
control de acceso
Las sesiones permiten disponer de unas variables con valores
persistentes durante toda la conexin del usuario. Estas
variables pueden almacenarse en el cliente mediante cookies o
en el servidor
PHP dispone de una biblioteca de funciones para la gestin de
sesiones
Manejo de sesiones
Funciones de PHP para el manejo de sesiones:
session_start ()
inicializa una sesin y le asigna un identificador de sesin nico.
Si la sesin ya est iniciada, carga todas las variables de sesin
session_register (variable)
registra una variable de sesin
session_unregister (variable)
elimina una variable de sesin
session_is_registered (variable)
comprueba si una variable est registrada. Devuelve true en
caso afirmativo y false en caso contrario
session_destroy ()
cierra una sesin
Manejo de sesiones
El manejo de las sesiones se realiza de la siguiente forma:
Todas las pginas deben realizar una llamada a session_start()
para cargar las variables de la sesin
Esta llamada debe estar colocada antes de cualquier cdigo
HTML
Conviene llamar a session_destroy() para cerrar la sesin
Manejo de sesiones
Ejercicio 1: ejemplo simple de sesiones
Ilustra cmo registrar variables, acceder a ellas y
posteriormente eliminarlas
Autenticacin de usuarios
Una cuestin frecuente en un sitio web es controlar el
acceso de los usuarios a una zona determinada del mismo
La autenticacin de usuarios puede realizarse en el propio
servidor web. As, en Apache los ficheros .htaccess permiten
limitar el acceso a un determinado recurso del servidor
Una alternativa ms compleja pero ms flexible es utilizar
PHP junto con una base de datos para controlar el acceso
de los usuarios. Para ello se utilizan las sesiones
Autenticacin de usuarios
Ejercicio 2: autenticacin de usuarios
Para nuestro sistema de gestin de noticias se va a restringir el
acceso a la operacin de insercin a unos usuarios
identificados por un nombre y una contrasea
La informacin de los usuarios autorizados se almacenar en
una tabla de la base de datos
Las contraseas de los usuarios se almacenarn en forma
encriptada
Esquema:
Autenticacin de usuarios
login
men
mostrar
formulario
mostrar
error
insertar
noticia
logout
consultar
noticias
Autenticacin de usuarios
inicio
enviado formulario
iniciar sesin
datos correctos
sesin iniciada
men
mostrar error mostrar formulario
insertar noticia logout consultar noticias
s
s
s
no
no
no error
Curso de PHP
Tema 6: Seguridad
Tema 6: Seguridad
1. Introduccin
2. Variables globales
3. Nombres de ficheros
4. Subida de ficheros
5. Bibliotecas
6. Formularios
Introduccin
Primera recomendacin:
Disponer siempre de versiones actualizadas de Apache y PHP
Aspectos de PHP que pueden dar lugar a vulnerabilidades:
Variables globales
Nombres de ficheros
Subida de ficheros
Bibliotecas
Datos enviados desde formularios
Variables globales
Cuando register_globals est activado en el fichero php.ini,
PHP crea automticamente variables globales a partir de los
datos de los formularios y de las cookies
Esto puede dar lugar a problemas como en el ejemplo
siguiente:
<?PHP
if (comprueba_privilegios())
$superuser = true;
...
?>
Variables globales
Una llamada a este script de la forma
pagina.php?superuser=1
permitira obtener privilegios de superusuario
Para resolver este problema existen tres soluciones:
Deshabilitar register_globals en el fichero php.ini
Inicializar las variables
Establecer el orden de las variables en PHP
Variables globales
Deshabilitar register_globals en el fichero php.ini
La directiva register_globals del fichero php.ini establece si se
admite o no la creacin automtica de variables globales
A partir de PHP 4.2.0 el valor por defecto de esta directiva es off,
que es el valor recomendable
Variables globales
Inicializar las variables
El problema anterior se soluciona dando un valor inicial a la
variable $superuser:
<?PHP
$superuser = false;
if (comprueba_privilegios())
$superuser = true;
...
?>
Variables globales
Inicializar las variables
Es recomendable inicializar todas las variables antes de usarlas.
Se puede usar la directiva error_reporting=E_ALL en php.ini para
que se muestre un aviso cuando se use una variable que no haya
sido previamente inicializada
En un entorno de produccin debe evitarse la aparicin de
mensajes de aviso o error. Para ello se utilizan las siguientes
directivas en php.ini:
display_errors = off
log_errors = on
error_log = /var/log/php_errors.log
Los errores irn al fichero especificado en lugar de mostrarse en la
pantalla
Variables globales
Establecer el orden de las variables en PHP
PHP crea automticamente variables globales a partir del entorno
(E), las cookies (C), la informacin del servidor (S) y los
parmetros GET (G) y POST (P)
La directiva variables_order controla el orden de estas variables. El
valor por defecto es EGPCS
Permitir la creacin de variables globales desde parmetros GET y
POST y desde cookies es potencialmente peligroso. Un posible
valor para variables_order que evita esto es ES
En tal caso para acceder a los parmetros de los formularios y a
las cookies se deben utilizar los arrays globales $_REQUEST,
$_GET, $_POST y $_COOKIES
Variables globales
Establecer el orden de las variables en PHP
Si se modifican las directivas register_globals y/o variables_order
es preciso revisar los scripts existentes para adaptarlos a las
nuevas circunstancias
Una forma puede ser la siguiente:
$edad = $_REQUEST[edad];
...
Nombres de ficheros
Es relativamente fcil construir un nombre de fichero que se
refiera a algo distinto a lo que se pretende
Sea el siguiente cdigo:
include (/usr/local/lib/bienvenida/$username);
Este cdigo pretende mostrar un mensaje de bienvenida
personalizado para el usuario. Aparentemente no es peligroso,
pero qu ocurrira si el usuario introduce como nombre la
cadena ../../../../etc/passwd?
Se mostrara el fichero de passwords del sistema
Nombres de ficheros
Adems hay que tener en cuenta que las funciones de manejo
de ficheros como include() o require() admiten nombres de
ficheros remotos, lo que podra provocar la ejecucin de
cdigo maligno cargado de otro servidor. Sea, por ejemplo, el
cdigo
include ($libdir . /conecta.php);
Si un atacante modifica el valor de la variable $libdir a,
pongamos por caso, http://atacante/, y coloca en la raz del
mismo un fichero de nombre conecta.php, su cdigo sera
ejecutado
Se puede desactivar la funcionalidad de acceso a ficheros
remotos con la siguiente directiva en php.ini:
allow_url_fopen = off
Nombres de ficheros
Para chequear nombres de ficheros se utilizan las funciones
realpath() y basename(). La primera convierte direcciones
relativas en absolutas y la segunda toma una ruta y devuelve la
parte correspondiente al nombre del fichero. Ejemplo:
$file = $_POST[username];
$file2 = basename (realpath($file));
if ($file2 != $file)
die ($file no es un username vlido);
include (/usr/local/lib/bienvenida/$file);
Nombres de ficheros
Otra defensa contra los nombres de ficheros incorrectos es la
directiva de php.ini open_basedir:
open_basedir = /alguna/ruta
PHP limitar las operaciones sobre ficheros al directorio
especificado y sus subdirectorios:
include (/alguna/ruta/lib.inc); // permitido
include (/otra/ruta/lib.inc); // da error
Subida de ficheros
La subida de ficheros permite a un usuario enviar cualquier
fichero al servidor, lo cual encierra un gran peligro ya que un
atacante puede subir un cdigo maligno y luego ejecutarlo,
causando ms dao que cuando se incluye el cdigo desde un
servidor remoto
Como recomendacin general, debe evitarse utilizar el nombre
enviado por el navegador (podra ser, por ejemplo,
/etc/passwd). Es conveniente generar un nombre nico para el
fichero subido
Subida de ficheros
Otro peligro es el tamao de los ficheros. Aunque se limite el
tamao mximo en el formulario, los ficheros se reciben
automticamente y luego se comprueba su tamao
Es posible que un usuario intente provocar un ataque de
denegacin de servicio enviando varios ficheros de gran
tamao a la vez y llenando el sistema de ficheros utilizado por
PHP para almacenarlos
Para evitar esto se puede utilizar la directiva post_max_size de
php.ini. El valor por defecto suele ser ms elevado de lo
necesario
Subida de ficheros
Sea ahora el siguiente cdigo:
if (file_exists($file)) // chequea la existencia en
// el sistema local
include ($file);
Esto evitara la inclusin de un fichero remoto aunque el
atacante controlase la variable $file
Sin embargo, el atacante podra crear su propio formulario
usando el nombre file para el campo de tipo fichero y al enviarlo
colocara en el servidor un fichero cuyo cdigo sera ejecutado
Bibliotecas
Es conveniente almacenar los ficheros de biblioteca fuera de la
raz de la web para evitar que puedan ser accedidos por su
URL
En tal caso debe hacerse saber a PHP la ubicacin de los
ficheros indicando la ruta completa en los include() y require() o
bien mediante la directiva include_path en php.ini
include_path = .:/usr/local/php:/usr/local/lib/myapp
Esto es particularmente importante cuando en el cdigo de la
biblioteca aparecen passwords, como es el caso de las
funciones de conexin con bases de datos
Formularios
Es recomendable validar todos los datos provenientes de
formularios para asegurarse de que los valores recibidos son
los esperados
En general, cualquier informacin proveniente del exterior debe
contemplarse como posiblemente contaminada y debe ser
verificada antes de ser utilizada
Sea el siguiente ejemplo:
print (Nombre: . $nombre);
print (Comentario: . $comentario);
Formularios
Si el autor del comentario introdujo algn cdigo HTML en el
texto del mismo, el cdigo ser interpretado y sus efectos
podran ser graves
Para evitar esto se puede utilizar la funcin htmlspecialchars(),
que impide que se interpreten los caracteres especiales de
HTML (<, >, &)
El cdigo quedara de la siguiente manera:
print (Nombre: . $nombre);
print (Comentario: . htmlspecialchars($comentario));
Resumen
De todo lo anterior podemos concluir las dos recomendaciones
siguientes:
Configurar adecuadamente PHP a travs del fichero php.ini
Seguir unas buenas prcticas en la programacin
Hay que tener en cuenta que cualquier cambio en la
configuracin de PHP afectar a los scripts de todos los
usuarios y posiblemente a algunas herramientas, lo cual debe
ser tenido en cuenta y estudiarse sus consecuencias antes de
proceder a realizarlos

Das könnte Ihnen auch gefallen