Professional Documents
Culture Documents
Procesado de formularios
- Envio y recepcin
- Method GET y POST
- Envio de Email
Seguridad
- Restringir acceso
- Distincin de usuarios
Sesiones (PHP4)
- Qu son?
- Inicializacin
- Un ejemplo
- Error comn
- Carrito compra
Cookies
- Qu son?
- Cmo usarlas
- Ejemplo de uso
1. Procesado de formularios
1.1. Envo y recepcin de datos
El lenguaje PHP nos proporciona una manera sencilla de manejar formularios,
permitindonos de esta manera procesar la informacin que el usuario ha introducido.
Ejecutar codigo
Vemos la ejecucin
acceder a las variables del formulario hay que usar el array de parmetros $_POST[] o
$_GET[] dependiendo del mtodo usado para enviar los parmetros.
En este ejemplo se ha creado una entrada en el array $_GET[] con el ndice 'nombre' y con
el valor que haya introducido el navegante.
Vemos la ejecucin
Ejecutar codigo
Vemos la ejecucin
</FORM>
</body>
</html>
Ejecutar codigo
Vemos la ejecucin
Vemos la ejecucin
el primero la respuesta a 03.php (mtodo GET) y el segundo a 04.php (mtodo POST)
El resultado final es el mismo, solo que con el mtodo GET podemos ver los parmetros
pasados ya que estn codificados en la URL.
<?php
mail(destinatario, tema, texto del mensaje, informacin
adicional de cabecera);
?>
En la informacin de cabecera podremos incluir parmetros adicionales al mensaje como
Reply-To:, From:, Content-type:... que nos permiten tener un mayor control sobre el
mensaje.
Ejecutar codigo
Vemos la ejecucin
Vemos la ejecucin
el primero la respuesta a 06.php (formato texto plano) y el segundo (formato HTML)
Con este comando conseguimos crear la una base de datos en el servidor de bases de datos
de nuestro servidor.
Una vez conseguido esto debemos crear las tablas en la base de datos, la descripcin de las
tablas contienen la estructura de la informacin que almacenaremos en ellas. Para lo cual
usaremos en lenguaje de consultas SQL comn para todas las bases de datos relacionales.
En este ejemplo creamos una tabla llamada prueba con 3 campos: un campo identificador,
que nos servir para identificar unvocamente una fila con el valor de dicho campo, otro
campo con el nombre de una persona y por ltimo un campo con el apellido de la persona.
prueba.sql
CREATE TABLE prueba (
ID_Prueba int(11) NOT NULL auto_increment,
Nombre varchar(100),
Apellidos varchar(100),
PRIMARY KEY (ID_Prueba),
UNIQUE ID_Prueba (ID_Prueba)
);
Ejecutar codigo
Vemos la ejecucin
</body>
</html>
Vemos la ejecucin
Ejecutar codigo
Vemos la ejecucin
if (!$resultado)
{
echo "No se pudo seleccionar la Base de datos: $basededatos";
exit();
}
}
function creatabla($tabla)
{
$sql="create table $tabla (
id_prueba int(11) not null auto_increment,
nombre varchar(100),
apellidos varchar (100),
primary key (id_prueba),
unique id_prueba(id_prueba)
)";
$resultado =mysql_query($sql);
if (!$resultado)
{
echo "No se pudo ejecutar la consulta";
exit();
}
}
// conexin al servidor
// en internet ( en leliadoura.com.es) el servidor es:
mysql.leliadoura.com.es
// a nivel local el servidor es: localhost
$servidor=$_GET['servidor'];
$usuario=$_GET['usuario'];
$contrasenia=$_GET['contrasenia'];
$basededatos=$_GET['basededatos'];
$tabla=$_GET['tabla'];
$enlace=conecta($servidor,$usuario,$contrasenia);
echo "Conectado al Servidor: $servidor <br>";
// seleccin de la base de datos
seleccionabasededatos($basededatos,$enlace);
echo "Seleccionada la Base de datos: $basededatos <br>";
// creacion de la tabla, en la base de datos seleccionada
creatabla($tabla);
echo "Creada la TABLA: $tabla en la Base de datos: $basededatos
<br>";
// cierre de la conexin al servidor
mysql_close($enlace);
?>
</body>
</html>
Vemos la ejecucin
La funcin mysql_query() enva una consulta a la base de datos activa. Se le debe pasar la
consulta y opcionalmente el identificador de enlace asociado al servidor; si no se enva
identificador de enlace, se asume el ltimo abierto. Para las sentencias SQL select, show,
describe o explain retorna un resource(recurso) en caso de xito y FALSE en caso de error.
A continuacin mostramos otro ejemplo de creacin de una tabla en la base de datos.
El cdigo que sigue es similar a 10.php, ya visto anteriormente.
Ejecutar codigo
Vemos la ejecucin
return $link;
}
function creabasededatos($basededatos)
{
$sql="CREATE DATABASE $basededatos";
$resultado =mysql_query($sql);
if (!$resultado)
{
echo "No se pudo crear la Base de datos: $basededatos";
exit();
}
}
function seleccionabasededatos($basededatos,$enlace)
{
$resultado=mysql_select_db($basededatos,$enlace);
if (!$resultado)
{
echo "No se pudo seleccionar la Base de datos: $basededatos";
exit();
}
}
function creatabla($tabla)
{
$sql="create table $tabla (
id_prueba int(11) not null auto_increment,
nombre varchar(100),
apellidos varchar (100),
primary key (id_prueba),
unique id_prueba(id_prueba)
)";
$resultado =mysql_query($sql);
if (!$resultado)
{
echo "No se pudo ejecutar la consulta";
exit();
}
}
?>
mysql.leliadoura.com.es
// a nivel local el servdor es: localhost
$servidor=$_GET['servidor'];
$usuario=$_GET['usuario'];
$contrasenia=$_GET['contrasenia'];
$basededatos=$_GET['basededatos'];
$tabla=$_GET['tabla'];
$enlace=conecta($servidor,$usuario,$contrasenia);
echo "Conectado al Servidor: $servidor <br>";
// seleccin de la base de datos
seleccionabasededatos($basededatos,$enlace);
echo "Seleccionada la Base de datos: $basededatos <br>";
// creacion de la tabla, en la base de datos seleccionada
creatabla($tabla);
echo "Creada la TABLA: $tabla en la Base de datos: $basededatos
<br>";
// cierre de la conexin al servidor
mysql_close($enlace);
?>
</body>
</html>
Vemos la ejecucin
Ejecutar codigo
Vemos la ejecucin
Aqu se incluye mi propio gestor de errores. Esto nos permitir detectar todos los errores
que se puedan producir en tiempo de ejecucin.
En la funcin MiGestorDeErrores() se define mi propio gestor de errores. Para poder
utilizarlo son necesarias dos operaciones:
- definir el nivel de reporte de errores, con la funcin error_reporting()
- establecer mi propio gestor de errores, como gestor de errores, con la funcin
set_error_handler()
muestrainformacion()
damereferencia()
-->
<?php
// Inicializacin de las variables utilizando el mtodo GET
$servidor= isset($_GET['a']) ? $_GET['a'] :"" ;
$usuario= isset($_GET['b']) ? $_GET['b'] :"" ;
$contrasenia= isset($_GET['c']) ? $_GET['c'] :"" ;
$basededatos= isset($_GET['d']) ? $_GET['d'] :"" ;
$tabla= isset($_GET['e']) ? $_GET['e'] :"" ;
/////////////////////////////////////////////////////////////////////////
/
function conecta($servi,$usua,$contrase)
{
global $servidor,$usuario,$contrasenia,$basededatos,$tabla;
if (!($link=mysql_connect($servi,$usua,$contrase)))
{
$servidor="";
$usuario="";
$contrasenia="";
}
return $link;
}
/////////////////////////////////////////////////////////////////////////
/
function muestrainformacion()
{
global $servidor,$usuario,$contrasenia,$basededatos,$tabla;
?>
<table border=1 cellspacing=1 cellpadding=1>
<tr>
<td> Servidor </td>
<td> Usuario </td>
<td> Contrasea </td>
<td> Base de datos </td>
<td> Tabla </td>
</tr>
<?php
printf("<tr><td> %s </td><td> %s </td><td> %s </td><td> %s </td>
<td> %s </td>
</tr>",
$servidor,$usuario,$contrasenia,$basededatos,$tabla);
?>
</table>
<?php
}
/////////////////////////////////////////////////////////////////////////
/
function damereferencia()
{
global $servidor,$usuario,$contrasenia,$basededatos,$tabla;
$cadena="?a=".$servidor."&b=".$usuario."&c="
.$contrasenia."&d=".$basededatos."&e=".$tabla;
return $cadena;
}
?>
Vemos la ejecucin
El resultado es ste:
EL resultado es ste:
Ejecutar codigo
Vemos la ejecucin
Vemos la ejecucin
Si pulsamos en la base de datos alumno, se vuelve al men de la base de datos, pero con
dicha bases de datos seleccionada.
Ejecutar codigo
Vemos la ejecucin
// seleccin de la tabla
$numerodefilas=mysql_num_rows($listadetablas);
$i=0;
while($i<$numerodefilas)
{
$tabla=mysql_tablename($listadetablas,$i);
?>
<a href="15.php<?php echo damereferencia()?>"> <?php echo $tabla
?>
</a><br>
<?php
$i++;
}
$tabla=$tablaprevia;
// liberacin de memoria y cierre de la conexin al servidor
mysql_free_result($listadetablas);
mysql_close($enlace);
?>
</body>
</html>
Vemos la ejecucin
Si pulsamos en la tabla prueba, se vuelve al men de la base de datos, pero con dicha tabla
seleccionada.
echo damereferencia()?>">Conexin al
echo damereferencia()?>">Bases de datos
echo damereferencia()?>">Tablas de la base de
echo damereferencia()?>">Registros de la
tabla</a></P>
...
Ejecutar codigo
Vemos la ejecucin
Vemos la ejecucin
Si la situacin del men de la base de datos es sta (servidor, usuario, contrasea, etc...)
{
?>
<td>
<?php
echo mysql_field_name($resultado,$i);?>
</td>
<?php
$i++;
}
?>
</tr>
<?php
// este bucle muestra cada FILA de la tabla
while ($fila=mysql_fetch_array($resultado,MYSQL_NUM))
{
?>
<tr>
<?php
// este bucle muestra el DATO de cada campo de la fila
$i=0;
while ($i<$numerodecampos)
{
?>
<td>
<?php echo $fila[$i];?>
</td>
<?php
$i++;
}
?>
</tr>
<?php
}
?>
</table>
<?php
}
...
Una vez que nos hemos conectado con el servidor de bases de datos, ya podemos realizar
consultas a las tablas de la base de datos.
Para facilitar la programacin hemos separado la funcin de conexin en una librera a
parte, de tal manera que la incluiremos en todas las pginas que accedan a la base de datos.
Cdigo fuente
<!-- Manual de PHP de WebEstilo.com (conex.phtml)-->
<?php
function Conectarse()
{
if (!($link=mysql_connect("localhost","usuario","Password")))
{
echo "Error conectando a la base de datos.";
exit();
}
if (!mysql_select_db("base_datos",$link))
{
echo "Error seleccionando la base de datos.";
exit();
}
return $link;
}
?>
Cdigo fuente
<!-- Manual de PHP de WebEstilo.com -->
<html>
<head>
<title>Ejemplo de PHP</title>
</head>
<body>
<H1>Ejemplo de uso de bases de datos con PHP y MySQL</H1>
<?php
include("conex.phtml");
$link=Conectarse();
$result=mysql_query("select * from prueba",$link);
?>
<TABLE BORDER=1 CELLSPACING=1 CELLPADDING=1>
<TR><TD> Nombre</TD><TD> Apellidos </TD></TR>
<?php
while($row = mysql_fetch_array($result))
{
printf("<tr><td> %s</td><td> %s </td></tr>",
$row["Nombre"],$row["Apellidos"]);
}
mysql_free_result($result);
mysql_close($link);
?>
</table>
</body>
</html>
Cdigo fuente
<!-- Manual de PHP de WebEstilo.com (ejem07d.phtml) -->
<html>
<head>
<title>Ejemplo de PHP</title>
</head>
<body>
<H1>Ejemplo de uso de bases de datos con PHP y MySQL</H1>
<FORM ACTION="procesar.phtml">
<TABLE>
<TR>
<TD>Nombre:</TD>
<TD><INPUT TYPE="text" NAME="nombre" SIZE="20"
MAXLENGTH="30"></TD>
</TR>
<TR>
<TD>Apellidos:</TD>
<TD><INPUT TYPE="text" NAME="apellidos" SIZE="20"
MAXLENGTH="30"></TD>
</TR>
</TABLE>
<INPUT TYPE="submit" NAME="accion" VALUE="Grabar">
</FORM>
<hr>
<?php
include("conex.phtml");
$link=Conectarse();
$result=mysql_query("select * from prueba",$link);
?>
Cdigo fuente
// Nombre del fichero: procesar.phtml
<?php
include("conex.phtml");
$link=Conectarse();
$nombre=$_GET['nombre'];
$apellidos=$_GET['apellidos'];
mysql_query("insert into prueba (Nombre,Apellidos) values
('$nombre','$apellidos')",$link);
header("Location: ejem07d.phtml");
?>
La primera pgina PHP ejem07d.phtml es un formulario que nos permite introducir nombre
y apellido para aadirlo a la base de datos, seguido de una consulta que nos muestra el
contenido de la tabla prueba. El formulario llama a la pagina procesar.phtml que aadir los
datos a la tabla.
La segunda pgina procesar.phtml se conecta a la base de datos y aade un nuevo registro
con la instruccin insert del lenguaje de base de datos SQL. Una vez el registro se ha
aadido se vuelve a cargar la pgina ejem07d.phtml
Cdigo fuente
Cdigo fuente
// Nombre del fichero: borra.phtml
<?php
include("conex.phtml");
$link=Conectarse();
$id=$_GET['id'];
mysql_query("delete from prueba where ID_Prueba = $id",$link);
header("Location: ejem07e.phtml");
?>
3. Seguridad
3.1. Restringir acceso
En esta seccin vamos a explicar cmo podemos restringir el acceso a segn qu pginas,
para que solo las personas autorizadas puedan acceder a ciertas partes del nuestro sitio web.
Atencin: El acceso restringido a pginas usando las variables globales
$PHP_AUTH_USER, $PHP_AUTH_PW y $PHP_AUTH_TYPE solo funciona si PHP ha
sido instalado como un mdulo de Apache, si ha sido instalado como un CGI los ejemplos
de sta seccin no funcionarn.
Para conseguir la autentificacin en las pginas usaremos el sistema de autentificacin del
protocolo HTTP, este sistema se basa en las variables globales $PHP_AUTH_USER y
$PHP_AUTH_PW.
1. $PHP_AUTH_USER. Nombre de usuario introducido.
2. $PHP_AUTH_PW. Contrasea introducida.
Para que el navegador nos muestre la ventana de peticin de nombre de usuario y
contrasea basta con enviar la siguiente cabecera:
Cdigo fuente
<?php // Manual de PHP de WebEstilo.com
if (!isset($PHP_AUTH_USER))
{
header('WWW-Authenticate: Basic realm="Acceso restringido"');
header('HTTP/1.0 401 Unauthorized');
echo 'Authorization Required.';
exit;
}
else
{
echo "Ha introducido el nombre de usuario: $PHP_AUTH_USER<br>";
echo "Ha introducido la contrasea: $PHP_AUTH_PW<br>";
}
?>
Esto provoca que se muestre la ventana de nombre de usuario y contrasea y los datos
introducidos se asignen a las variables $PHP_AUTH_USER y $PHP_AUTH_PW.
A partir de aqu realizaremos las comprobaciones necesarias para asegurarnos que los datos
introducidos son los correctos.
En el siguiente ejemplo pediremos autorizacin y comprobaremos si el nombre de usuario
es Joe y la contrasea 123, si es as tendremos acceso al resto de la pgina.
Cdigo fuente
Cdigo fuente
<?php // Manual de PHP de WebEstilo.com
if (!isset($PHP_AUTH_USER))
{
header('WWW-Authenticate: Basic realm="Acceso restringido"');
header('HTTP/1.0 401 Unauthorized');
echo 'Authorization Required.';
exit;
}
$fich = file("passwords.txt");
$i=0; $validado=false;
while ($fich[$i] && !$validado)
{
$campo = explode("|",$fich[$i]);
if (($PHP_AUTH_USER==$campo[0]) && ($PHP_AUTH_PW==chop($campo[1])))
$validado=true;
$i++;
}
if (!$validado)
{
header('WWW-Authenticate: Basic realm="Acceso restringido"');
header('HTTP/1.0 401 Unauthorized');
echo 'Authorization Required.';
exit;
}
?>
<!-- Manual de PHP de WebEstilo.com -->
<html>
<head>
<title>Ejemplo de PHP</title>
</head>
<body>
Ha conseguido el acceso a la <B>zona restringida</B> con el usuario
<?php echo $PHP_AUTH_USER?>.
</body>
</html>
4. Sesiones
4.1. Qu son las sesiones?
Si existe una consulta repetida en las listas de PHP, es la relativa al uso de las sesiones. El
uso de sesiones es un mtodo ampliamente extendido en cualquier aplicacin de cierta
entidad. Bsicamente una sesin es la secuencia de pginas que un usuario visita en un sitio
web. Desde que entra en nuestro sitio, hasta que lo abandona.
El trmino sesin en PHP, session en ingls, se aplica a esta secuencia de navegacin, para
ello crearemos un identificador nico que asignamos a cada una de estas sesiones de
navegacin. A este identificador de sesin se le denomina, comnmente, como la sesin.
El proceso en cualquier lenguaje de programacin podra ser algo as:
Existe una sesin?
Si existe la retomamos
Si no existe creamos una nueva
Generar un identificador nico
Y para que no perdamos el hilo de la navegacin del usuario deberemos asociar esta sesin
a todas las URLs y acciones de formulario. Podemos tambin crear un cookie que incluya
el identificador de sesin, pero es conveniente recordar que la disponibilidad o no de las
cookies depende del usuario, y no es conveniente fiarse de lo que un usuario pueda o no
tener habilitado.
Lo contado hasta ahora es teora pura y es aplicable a cualquier lenguaje de programacin
C, Perl, etc. Los que programamos en PHP4 tenemos la suerte de que toda la gestin de
sesiones la hace el mismo PHP.
Por lo tanto lo comentado a partir de aqu es solo aplicable a PHP4. Si an desarrollas
PHP3, tendrs que crear tus propias libreras de gestin de sesiones o recurrir a alguna de
las existentes, como la de PHPLIB .
Cdigo fuente
<?php // Manual de PHP de WebEstilo.com
session_start();
echo "He inicializado la sesin";
?>
Esta es la forma ms bsica, si el usuario tiene los cookies activados, PHP habr insertado
de forma automtica la sesin y sta ser pasada de una pgina a otra sin hacer nada ms.
Desde un punto de vista prctico la sesin es operativa, pero no vemos nada. Podemos
obtener la sesin en cualquier momento mediante la funcin session_id(). Inserta en las
sucesivas pginas la siguiente lnea para ver si la sesin est disponible:
Cdigo fuente
<?php // Manual de PHP de WebEstilo.com
session_start();
echo 'La sesin actual es: '.session_id();
?>
En este caso session_start() comprueba en los cookies que existe una sesin y continua con
ella, session_id() devuelve el identificador actual.
Cdigo fuente
<?php // Manual de PHP de WebEstilo.com
session_register('contador');
echo '<a href="'.$PHP_SELF.'?'.$SID.'">Contador vale:
'.++$_SESSION['contador']. '</a>';
?>
Cdigo fuente
<?php // Manual de PHP de WebEstilo.com
session_name('misesion');
session_register('contador');
echo '<a href="'.$PHP_SELF.'?'.SID.'">Contador vale:
'.++$_SESSION['contador'].'</a><br>';
echo 'Ahora el nombre es '.session_name().' y la sesin
'.$misesion.'<br>';
?>
La asignacin del nombre de sesin debe realizarse antes que ninguna otra funcin con
sesiones, antes que session_start() o session_register().
PHP est informando de que no puede activar los cookies en el navegador del usuario,
porque las cabeceras ya han sido enviadas. Simplemente por la existencia de una lnea en
blanco. Como medida prctica, no dejes espacios ni antes del inicio del script, ni despus de
la finalizacin.
Te ahorrar muchos disgustos.
Si despus de todo lo comentado an no entiendes para que sirven las sesiones, veamos un
ejemplo prctico. Imagina que quisieras crear un sistema de cesta de la compra...
Cdigo fuente
<?php // Manual de PHP de WebEstilo.com
session_start();
session_register('itemsEnCesta');
$item=$_POST['item'];
$cantidad=$_POST['cantidad'];
$itemsEnCesta=$_SESSION['itemsEnCesta'];
if ($item)
{
if (!isset($itemsEnCesta))
{
$itemsEnCesta[$item]=$cantidad;
}
else
{
foreach($itemsEnCesta as $k => $v)
{
if ($item==$k)
{
$itemsEnCesta[$k]+=$cantidad;
$encontrado=1;
}
}
if (!$encontrado)
$itemsEnCesta[$item]=$cantidad;
}
}
$_SESSION['itemsEnCesta']=$itemsEnCesta;
?>
<html>
<body>
<tt>
<form action="<?=$PHP_SELF."?".$SID?>" method="post">
Dime el producto <input type="text" name="item" size="20"><br>
Cuantas unidades <input type="text" name="cantidad"
size="20"><br>
<input type="submit" value="Aadir a la cesta"><br>
</form>
<php?
if (isset($itemsEnCesta))
{
echo'El contenido de la cesta de la compra es:<br>';
foreach($itemsEnCesta as $k => $v)
{
echo 'Artculo: '.$k.' ud: '.$v.'<br>';
}
}
?>
</tt>
</body>
</html>
5. Cookies
5.1. Qu son las cookies?
La principal utilidad de las cookies (galletas) es la de solventar el problema de la falta de
estado en la navegacin a travs de las paginas web.
Con las cookies, pequeas porciones de informacin se quedan registradas en el navegador
permitiendo identificar a este a travs de diferentes pginas de un mismo sitio e incluso
durante visitas entre distintos das.
Realmente las cookies no son mas que cadenas de texto que son enviadas desde el servidor
al cliente (navegador) y almacenadas en este, luego el navegador enva estas cookies al
servidor permitiendo as la identificacin del cliente en el servidor.
Funcionamiento
La cookie es enviada al navegador desde el servidor y si este la acepta permanece en l.
El navegador las enva, permitiendo la identificacin del usuario por parte del servidor.
A continuacin vamos a ver como usar las cookies para nuestro beneficio.
Setcookie() define una cookie que es enviada junto con el resto de la informacin de la
cabecera(header). Las cookies deben ser enviadas antes de cualquier tag de html, por lo
tanto deberemos realizar la llamada a estas funciones antes de cualquier tag <HTML> o
<HEAD>. Esta es una restriccin de las cookies no de PHP.
Todos los argumentos excepto el nombre son opcionales.
Ejemplo
setcookie("usuario", "Luis", time()+3600,"/","webestilo.com");
En este ejemplo establecemos una cookie de nombre usuario que contiene el valor Luis,
que dura 1 hora (3600 segundos) vlida para todo el dominio webestilo.com
Cdigo fuente
Cdigo fuente
<?php // Manual de PHP de WebEstilo.com
setcookie("ejemusuario", $_GET['nombre'], time()+3600,"/","");
?>
<html>
<head>
<title>Ejemplo de PHP</title>
</head>
<body>
<H1>Ejemplo de uso de cookie</H1>
Se ha establecido una cookie de nombre <b>ejemusuario</b> con el
valor: <b><? print $_GET['nombre']; ?></b> que ser vlida durante 1
hora.
</body>
</html>
Cdigo fuente
<!-- Manual de PHP de WebEstilo.com -->
<html>
<head>
<title>Ejemplo de PHP</title>
</head>
<body>
<H1>Ejemplo de uso de cookie</H1>