Curso Mysql2 Gabriel Eslava
Curso Mysql2 Gabriel Eslava
Tlahuac
C UR SO
DE
PROGRAMACIÓN EN PHP
2018
1
Curso de Programación en PHP Tec. Tlahuac
Pero a diferencia de Java o JavaScript que se ejecutan en el navegador, PHP se ejecuta en el servidor, por
eso nos permite acceder a los recursos que tenga el servidor como por ejemplo podría ser una base de datos. El
programa PHP es ejecutado en el servidor y el resultado enviado al navegador. El resultado es normalmente una
página HTML pero igualmente podría ser una pagina WML.
Al ser PHP un lenguaje que se ejecuta en el servidor no es necesario que su navegador lo soporte, es
independiente del navegador, sin embargo para que las páginas PHP funcionen, el servidor donde están alojadas
debe soportar PHP.
2
Curso de Programación en PHP Tec. Tlahuac
La ventaja que tiene PHP sobre otros lenguajes de programación que se ejecutan en el servidor (como
podrían ser los script CGI Perl), es que nos permite intercalar las sentencias PHP en las páginas HTML, es un
concepto algo complicado de entender si no se ha visto nunca como funciona unas paginas PHP o ASP.
Vamos a ver un ejemplo sencillo para comprenderlo mejor. En azul está el código HTML y en rojo el
código PHP. Seguiremos este criterio durante todo el manual.
<body>
<?php
echo "Parte de PHP<br>";
for($i=0;$i<10;$i++)
{
echo "Linea ".$i."<br>";
}
?>
</body>
</html>
El código PHP ejecutado tiene dos partes: la primera imprime "Parte de PHP" y la segunda es un bucle que se
ejecuta 10 veces de 0 a 9, por cada vez que se ejecuta se escribe una línea, la variable $i contiene el número de
línea que se está escribiendo.:
Parte de PHP
Linea 0
Linea 1
Linea 2
Linea 3
Linea 4
Linea 5
Linea 6
Linea 7
Linea 8
Linea 9
3
Curso de Programación en PHP Tec. Tlahuac
2.2.- Variables
Una variable es un contenedor de información, en el que podemos meter números enteros, números
decimales, carácteres, etc. El contenido de las variables se puede leer y se puede cambiar durante la ejecución de
una página PHP.
En PHP todas las variables comienzan con el símbolo del dólar $ y no es necesario definir una variable antes
de usarla. Tampoco tienen tipos, es decir que una misma variable puede contener un número y luego puede
contener carácteres.
En este ejemplo hemos definido tres variables, $a, $b y $c y con la instrucción echo hemos impreso el
valor que contenían, insertando un salto de línea entre ellas.
1
3.34
Hola Mundo
Existen 2 tipos de variables, las variables locales que solo pueden ser usadas dentro de funciones y las
variables globales que tienen su ámbito de uso fuera de las funciones, podemos acceder a una variable global
desde una función con la instrucción global nombre_variable;
4
Curso de Programación en PHP Tec. Tlahuac
2.3.- Aritméticos
Los operadores de PHP son muy parecidos a los de C y JavaScript, si usted conoce estos lenguajes le
resultaran familiares y fáciles de reconocer.
Estos son los operadores que se pueden aplicar a las variables y constantes numéricas.
11
5
24
2.6666666666667
9
2
5
Curso de Programación en PHP Tec. Tlahuac
2.4.- Comparación
Los operadores de comparación son usados para comparar valores y así poder tomar decisiones.
== Igual $a == $b $a es igual $b
$a es igual $b
=== Idéntico $a === $b
y ambos son del mismo tipo
!= Distinto $a != $b $a es distinto $b
1
1
1
6
Curso de Programación en PHP Tec. Tlahuac
2.5.- Lógicos
Los operadores lógicos son usados para evaluar varias comparaciones, combinando los posibles valores de
estas.
&& Y (7>2) && (2<4) Devuelve verdadero cuando ambas condiciones son verdaderas.
and Y (7>2) and (2<4) Devuelve verdadero cuando ambas condiciones son verdaderas.
|| O (7>2) || (2<4) Devuelve verdadero cuando al menos una de las dos es verdadera.
or O (7>2) or (2<4) Devuelve verdadero cuando al menos una de las dos es verdadera.
7
Curso de Programación en PHP Tec. Tlahuac
2.6.- Condicionales
Las sentencias condicionales nos permiten ejecutar o no unas ciertas instrucciones dependiendo del resultado
de evaluar una condición. Las más frecuentes son la instrucción if y la instrucción switch.
<?php
if (condición)
{
Sentencias a ejecutar cuando la
condición es cierta.
}
else
{
Sentencias a ejecutar cuando la
condición es falsa.
}
?>
La sentencia if ejecuta una serie de instrucciones u otras dependiendo de la condición que le pongamos.
Probablemente sea la instrucción más importante en cualquier lenguaje de programación.
a no es menor que b
En este ejemplo la condición no es verdadera por lo que se ejecuta la parte de código correspondiente al
else.
8
Curso de Programación en PHP Tec. Tlahuac
switch($posicion) {
case "arriba": // Bloque 1
echo "La variable contiene";
echo " el valor arriba";
break;
case "abajo": // Bloque 2
echo "La variable contiene";
echo " el valor abajo";
break;
default: // Bloque 3
echo "La variable contiene otro valor";
echo " distinto de arriba y abajo";
}
?>
</body>
</html>
Con la sentencia switch podemos ejecutar unas u otras instrucciones dependiendo del valor de una
variable, en el ejemplo anterior, dependiendo del valor de la variable $posicion se ejecuta el bloque 1 cuando
el valor es "arriba", el bloque 2 cuando el valor es "abajo" y el bloque 3 si no es ninguno de los valores anteriores.
Este tipo de condicionales se ocupa muy frecuentemente para distinguir entre navegadores y luego ejecutar
código especial para cada uno, i.e.: código para Netscape Communicator y código para Microsoft Internet Explorer.
9
Curso de Programación en PHP Tec. Tlahuac
2.7.- Bucles
Los bucles nos permiten iterar conjuntos de instrucciones, es decir repetir la ejecución de un conjunto de
instrucciones mientras se cumpla una condición.
Sentencia while
<?php
while (condición)
{
intrucciones a ejecutar.
}
?>
Mientras la condición sea cierta se reiterará la ejecución de las instrucciones que están dentro del while.
Inicio
El valor de i es 0
El valor de i es 1
El valor de i es 2
El valor de i es 3
El valor de i es 4
El valor de i es 5
El valor de i es 6
El valor de i es 7
El valor de i es 8
El valor de i es 9
Final
10
Curso de Programación en PHP Tec. Tlahuac
Sentencia for
<?php
for (inicial ; condición ; ejecutar en iteración)
{
intrucciones a ejecutar.
}
?>
Inicio
El valor de i es 0
El valor de i es 1
El valor de i es 2
El valor de i es 3
El valor de i es 4
El valor de i es 5
El valor de i es 6
El valor de i es 7
El valor de i es 8
El valor de i es 9
Final
La instrucción for es la instrucción de bucles más completa. En una sola instrucción nos permite controlar
todo el funcionamiento del bucle.
El primer parámetro del for, es ejecutado la primera vez y sirve para inicializar la variable del bucle, el
segundo parámetro indica la condición que se debe cumplir para que el bucle siga ejecutándose y el tercer
parámetro es una instrucción que se ejecuta al final de cada iteración y sirve para modificar el valor de la variable
de iteración.
11
Curso de Programación en PHP Tec. Tlahuac
2.8.- Salida
Hasta ahora hemos usado la instrucción echo para realizar salida a pantalla, esta instrucción es bastante
limitada ya que no nos permite formatear la salida. En esta página veremos la instrucción printf que nos da
mucha más potencia.
La cadena de formateo indica cómo se han de representar las valores que posteriormente le indicaremos. La
principal ventaja es que además de poder formatear los valores de salida, nos permite intercalar texto entre ellos.
La cadena de formato puede incluir una seria de caracteres especiales que indican como formatear las
variables que se incluyen en la instrucción.
%s Cadena de carácteres.
%c Carácter ASCII.
12
Curso de Programación en PHP Tec. Tlahuac
13
Curso de Programación en PHP Tec. Tlahuac
Dado el uso del lenguaje PHP el tratamiento de cadenas es muy importante, existen bastantes funciones para
el manejo de cadenas, a continuación explicaremos las más usadas.
$resultado=sprintf("8x5 = %d <br>",8*5);
echo $resultado,"<br>";
?>
</body>
</html>
5
Esto
es
una
prueba
8x5 = 40
una
Iguales
14
Curso de Programación en PHP Tec. Tlahuac
El PHP ofrece la posibilidad de agrupar un conjunto de valores para almacenarlos juntos y referenciarlos por
un índice.
<?
print "Mi_array es $mi_array<BR>";
print "Mi_array[5] es $mi_array[5]<BR>";
$mi_array[5] = "Posición 6ta";
print "Mi_array[5] es $mi_array[5]<BR>";
print "Mi_array es $mi_array<BR>";
?>
Mi array es
Mi_array[5] es
Mi_array[5] es Posición 6ta
Mi_array es Array
Los índices puedes ser del tipo numérico (entero) o una cadena de forma indistinta.
$comida["Mallorca"] = "Sopas";
$comida["Valencia"] = "Paella";
$comida["Madrid"] = "Cocido";
15
Curso de Programación en PHP Tec. Tlahuac
2.12.- Constantes
is_bool(arg)
Retorna verdadero si arg es del tipo Boolean (TRUE o FALSE) y falso si no lo es.
is_string(arg)
Retorna verdadero si arg es un string.
is_array(arg)
Retorna verdadero si arg es un array.
is_object(arg)
Retorna verdadero si arg es un objeto.
16
Curso de Programación en PHP Tec. Tlahuac
2.14.- Funciones
El uso de funciones nos da la capacidad de agrupar varias instrucciones bajo un solo nombre y poder
llamarlas a estas varias veces desde diferentes sitios, ahorrándonos la necesidad de escribirlas de nuevo.
<?php
function Nombre(parametro1, parametro2...)
{
instrucción1;
instrucción2;
instrucción3;
instrucción4;
return valor_de_retorno;
}
?>
Opcionalmente podemos pasarle parámetros a las funciones que se trataran como variable locales y así
mismo podemos devolver un resultado con la instrucción return valor; Esto produce la terminación de la función
retornando un valor.
echo media_aritmetica(4,6),"<br>";
echo media_aritmetica(3242,524543),"<br>";
?>
</body>
</html>
5
263892.5
17
Curso de Programación en PHP Tec. Tlahuac
3.1.- Librerías
El uso de librerías es tremendamente útil, nos permiten agrupar varias funciones y variables en un mismo
fichero, de manera que luego podemos incluir esta librería en distintas páginas y disponer de esas funciones
fácilmente.
<?php
function CabeceraPagina()
{
?>
<FONT SIZE="+1">Esta cabecera estará en todas sus páginas.</FONT><BR>
<hr>
<?
}
function PiePagina()
{
?>
<hr>
<FONT SIZE="-1">Este es el pie de página.</FONT><BR>
Autor: John Doe
<?
}
?>
Ahora vamos a crear 2 páginas que usan la librería definida anteriormente para conseguir que las dos
paginas tengan la misma cabecera y pie de pagina.
Página 1
<BR><BR><BR><BR><BR>
fin<BR><BR>
18
Curso de Programación en PHP Tec. Tlahuac
Página 1
más cosas...
fin
Ejemplo 2:
<!-- Manual de PHP -->
<html>
<head>
<title>Ejemplo de PHP</title>
</head>
<body>
<?php include("libreria01.phtml") ?>
<?php CabeceraPagina(); ?>
completamente distinta
19
Curso de Programación en PHP Tec. Tlahuac
En este ejemplo vamos a usar el PHP y la capacidad de definir librerías para conseguir que todas nuestras
páginas tengan el mismo formato de página, incluyendo las partes comunes en librerías. Así mismo modificando la
librería modificaríamos tambien todas las páginas de una manera muy rápida.
libpagina.phtml
<?php
function CabeceraPagina()
{
?> <FONT SIZE="+1">Esta cabecera estará en todas sus
páginas.</FONT><BR>
<hr>
<? }
function PiePagina()
{
?> <hr>
<FONT SIZE="-1">Este es el pie de página.</FONT><BR>
Autor: John Doe
<? }
function Indice()
{
?> <A HREF="ejem06a.phtml">Pagina 1</A><BR>
<A HREF="ejem06a2.phtml">Pagina 2</A><BR>
<? } ?>
ejem06a.phtml
20
Curso de Programación en PHP Eslava
ejem06a2.phtml
fin<BR><BR>
</TD>
</TR>
</TABLE>
<?php PiePagina(); ?>
</body>
</html>
Página 1
Pagina 1
Contenido blalbl blalb alb
Pagina 2
más cosas...
fin
Con este ejemplo damos solución al problema de los enlaces externos y de forma que la web externa queda
en la parte inferior del frame y así no se sale de nuestra web.
ejem06b.html
<!-- Manual de PHP -->
<html>
<head>
<title>Ejemplo de PHP</title>
</head>
<body>
<A HREF="ejem06b2.phtml?dire=http://www.php.net”>www.php.net</A><BR><BR>
<A HREF="ejem06b2.phtml?dire=http://www.abc.com">www.abc.com</A>
</body>
</html>
www.php.net
www.abc.com
ejem06b2.phtml
22
Curso de Programación en PHP Eslava
A partir de la versión de PHP 4.2.0 el valor por defecto de la directiva register_globals es off. El por qué de
este cambio viene motivado por un aumento del nivel de seguridad en la configuración del PHP por defecto. Pero
esto puede provocar que nuestras páginas dejen de funcionar.
La directiva register_globals cuando esta activada (estado que estaba por defecto antes de la versión 4.2.0
de PHP), provoca que automáticamente se generen variables globales para cookies y valores enviados por get y
post entre otros.
Por ejemplo:
Por razones de seguridad este comportamiento automático se ha cambiado, estableciendo el valor por
defecto de register_globals a off.
Este cambio puede producir que nuestras antiguas páginas dejen de funcionar, ante esto tenemos dos
opciones:
Debemos buscar todas aquellas variables que son definidas automáticamente, variables del servidor, que
provienen de get o post, cookies, files, variables de entorno o sesión.
Reemplazar esas variables por las referencias adecuadas en cada caso, en PHP se han definido unos arrays
diferentes con valores, dependiendo del lugar de procedencia. Así tenemos los arrays $_SERVER, $_GET,
$_POST, $_COOKIE, $_FILES, $_ENV, $REQUEST y $_SESSION.
23
Curso de Programación en PHP Eslava
El lenguaje PHP nos proporciona una manera sencilla de manejar formularios, permitiéndonos de esta
manera procesar la información que el usuario ha introducido.
Al diseñar un formulario debemos indicar la página PHP que procesará el formulario, así como en método por
el que se le pasará la información a la página.
Al pulsar el botón Enviar el contenido de cuadro de texto es enviado a la página que indicamos en el atributo
ACTION de la etiqueta FORM.
PHP crea una variable por cada elemento del FORM, esta variable creada tiene el mismo nombre que el
cuadro de texto de la página anterior y el valor que hayamos introducido. En este ejemplo se ha creado una
variable llamada $nombre con el valor que haya introducido el navegante.
24
Curso de Programación en PHP Eslava
25
Curso de Programación en PHP Eslava
En la página anterior hemos comentado que los datos de un formulario se envía mediante el método indicado
en el atributo METHOD de la etiqueta FORM, los dos métodos posibles son GET y POST.
La diferencia entre estos dos métodos radica en la forma de enviar los datos a la página, mientras que el
método GET envía los datos usando la URL, el método POST los envía por la entrada estándar STDIO.
26
Curso de Programación en PHP Eslava
27
Curso de Programación en PHP Eslava
procesa2.phtml
El resultado final es el mismo, solo que con el método GET podemos ver los parámetros pasados ya que
están codificados en la URL.
28
Curso de Programación en PHP Eslava
PHP nos ofrece la posibilidad de enviar emails de una manera sencilla y fácil, para ello el lenguaje nos
proporciona la instrucción mail( )
<?php
mail(destinatario, tema, texto del mensaje);
?>
Existe una sintaxis extendida de la instrucción mail( ) que nos permite añadir información adicional a la
cabecera del mensaje.
<?php
mail(destinatario, tema, texto del mensaje, información adicional de cabecera);
?>
29
Curso de Programación en PHP Eslava
email.phtml
30
Curso de Programación en PHP Eslava
Para la realización de este curso sobre PHP con acceso a base de datos hemos elegido la base de datos
MySQL por ser gratuita y por ser también la mas empleada en entornos UNIX, para lo cual el servidor donde
tenemos alojadas las páginas nos tiene que proporcionar herramientas para crearla o acceso al Telnet para que la
creemos por nosotros mismos.
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 descripción de las tablas contienen
la estructura de la información que almacenaremos en ellas. Para lo cual usaremos en lenguaje de consultas SQL
común 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 unívocamente 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.
Para crear la tabla puede usar la herramienta de administración de MySQL de su servidor web o puede
escribir un fichero de texto con el contenido de la sentencia SQL equivalente y luego decirle al motor de base de
datos que la ejecute con la siguiente instrucción:
prueba.sql
31
Curso de Programación en PHP Eslava
Una vez que tenemos creada la base de datos en nuestro servidor, el siguiente paso es conectarnos a la
misma desde una página PHP. Para ello PHP nos proporciona una serie de instrucciones para acceder a bases de
datos MySQL.
$link=Conectarse();
echo "Conexión con la base de datos conseguida.<br>";
Al ejecutar la instrucción mysql_connect creamos un vínculo entre la base de datos y la pagina PHP, este
vínculo será usado posteriormente en las consultas que hagamos a la base de datos.
Finalmente, una vez que hemos terminado de usar el vínculo con la base de datos, lo liberaremos con la
instrucción mysql_close para que la conexión no quede ocupada.
Es necesario consultar con su administrador web para ver las variables por omisión (by defualt) que se tienen
fijadas en el archivo “php.ini” en relación a las bases de datos, como por ejemplo la habilitación o prohibición de
usar conexiones persistentes (mysql_pconnect).
32
Curso de Programación en PHP Eslava
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 programación hemos separado la función de conexión en una librería a parte, de tal manera
que la incluiremos en todas las páginas que accedan a la base de datos.
conex.phtml
ejem07c.phtml
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>
33
Curso de Programación en PHP Eslava
34
Curso de Programación en PHP Eslava
Hasta ahora nos hemos conectado a una base de datos y hemos hecho consultas a la misma, ahora
presentaremos como introducir nuevo registros en la base de datos.
ejem07d.phtml
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>
35
Curso de Programación en PHP Eslava
procesar.phtml
<?php
include("conex.phtml");
$link=Conectarse();
mysql_query("insert into prueba (Nombre,Apellidos) values
('$nombre','$apellidos')",$link);
header("Location: ejem07d.phtml");
?>
La primera página PHP ejem07d.phtml es un formulario que nos permite introducir nombre y apellido
para añadirlo 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 añadirá los datos a la tabla.
La segunda página procesar.phtml se conecta a la base de datos y añade un nuevo registro con la
instrucción insert del lenguaje de base de datos SQL. Una vez el registro se ha añadido se vuelve a cargar la
página ejem07d.phtml
36
Curso de Programación en PHP Eslava
Y finalmente, para cerrar el ciclo, nos queda el borrado de registros. El borrado de registros el uno de los
procesos más sencillos.
Para indicar que elemento vamos a borrar hemos usado un enlace a la página borra.phtml pasándole el
ID_Prueba de cada registro, de esta manera la página borra.phtml sabe que elemento de la tabla ha de
borrar.
ejem07e.phtml
<?php
include("conex.phtml");
$link=Conectarse();
$result=mysql_query("select * from prueba",$link);
?>
<TABLE BORDER=1 CELLSPACING=1 CELLPADDING=1>
<TR><TD> <B>Nombre</B></TD>
<TD> <B>Apellidos</B> </TD>
<TD> <B>Borrar</B> </TD></TR>
<?php
while($row = mysql_fetch_array($result)) {
printf("<tr><td> %s</td><td> %s </td><td><a
href=\"borra.phtml?id=%d\">Borra</a></td></tr>",
$row["Nombre"],$row["Apellidos"],$row["ID_Prueba"]);
}
mysql_free_result($result);
mysql_close($link);
?>
</table>
</body>
</html>
37
Curso de Programación en PHP Eslava
borra.phtml
<?php
include("conex.phtml");
$link=Conectarse();
mysql_query("delete from prueba where ID_Prueba = $id",$link);
header("Location: ejem07e.phtml");
?>
La página borra.phtml se conecta a la base de datos y borra el registro indicado en la variable $id que
ha sido pasado desde la página ejem07e.phtml. Una vez el registro se ha borrado se vuelve a cargar la página
ejem07e.phtml
38
Curso de Programación en PHP Eslava
En esta sección se explica cómo se puede restringir el acceso a las páginas, para que solo las personas
autorizadas puedan acceder a ciertas partes del sitio web.
Atención: Si tiene activado “register globals = on” en su php.ini (que es ON por omisión en PHP 4.3.x en
adelante), entonces deberá cambiar la variable $PHP_AUTH_USER por $_SERVER[´PHP_AUTH_USER´].
Para conseguir la autentificación en las páginas usaremos el sistema de autentificación del protocolo HTTP,
este sistema se basa en las variables globales $_SERVER[´PHP_AUTH_USER´]y
$_SERVER[´PHP_AUTH_PW´]..
Para que el navegador nos muestre la ventana de petición de nombre de usuario y contraseña basta con
enviar la siguiente cabecera (HEADER):
Esto provoca que se muestre la ventana de nombre de usuario y contraseña y los datos introducidos se
asignen a las variables $_SERVER[´PHP_AUTH_USER´] y $_SERVER[´PHP_AUTH_PW´].
A partir de aquí realizaremos las comprobaciones necesarias para asegurarnos que los datos introducidos son
los correctos (usuarios que deberían tener acceso a la información).
39
Curso de Programación en PHP Eslava
40
Curso de Programación en PHP Eslava
En la anterior página todo el mundo que tenía acceso a la parte restringida entraba con el mismo nombre de
usuario y contraseña, esto evidentemente no es una buena solución, es mejor que cada persona tenga un nombre
de usuario y contraseña, ya que de esta forma podemos inhabilitar a un usuario sin ver comprometida la seguridad
de nuestro sitio.
En esta página veremos la forma de realizar esto, teniendo un fichero separado con los nombres de usuario y
las contraseñas válidas. Dicho fichero podría tener el siguiente formato: nombre_de_usuario:contraseña.
Por ejemplo:
Joe:1235
passwords.txt:
Pedro:qwer
Noe:Gty45e
kermit:rwe4v
if (!$validado) { //si no coincidió con ningún usuario del archivo, entonces ....
header('WWW-Authenticate: Basic realm="Acceso restringido"');
header('HTTP/1.0 401 Unauthorized');
echo 'Authorization Required.';
exit;
}
?>
<!-- Manual de PHP -->
<html>
<head>
<title>Ejemplo de PHP</title>
</head>
<body>
Ha conseguido el acceso a la <B>zona restringida</B> con el usuario
<?php echo $_SERVER[´PHP_AUTH_USER´] ?>.
</body>
41
Curso de Programación en PHP Eslava
<?php
$filename = '/path/to/file.txt';
$fp = fopen( $filename, 'r' );
$file_contents = fread( $fp, filesize( $filename ) );
fclose( $fp );
$auth = true;
break;
}
}
}
if ( ! $auth ) {
} else {
?>
42
Curso de Programación en PHP Eslava
joe:WvzodahMR9USk
jane:g3RYjX5evEvdM
julie:YzASzTGEo2VMA
<?php
$filename = '/path/to/.htpasswd';
$fp = fopen( $filename, 'r' );
$file_contents = fread( $fp, filesize( $filename ) );
fclose( $fp );
if ( $username == "$PHP_AUTH_USER" ) {
if ( $password == "$enc_pw" ) {
// Si se encuentra una coincidencia, entonces el usuario es autenticado
// Detener la búsqueda.
$auth = true;
break;
}
}
}
}
if ( ! $auth ) {
?>
43
Curso de Programación en PHP Eslava
Una coincidencia para el nombre de usuario y su clave correspondiente se puede obtener con la
siguiente sentencia SQL:
SELECT *
FROM users
WHERE username='$_SERVER[´PHP_AUTH_USER´]' and password='$_SERVER[´PHP_AUTH_PW´]'
<?php
$auth = false; // Asume que el usuario no está autentificado aún...
// Generar la consulta
$sql = "SELECT * FROM users WHERE username = '$_SERVER[´PHP_AUTH_USER´]' AND
password = '$_SERVER[´PHP_AUTH_PW´]'";
if ( $num != 0 ) {
// Si se encuentra una coincidencia, entonces el usuario es autenticado.
$auth = true;
}
}
if ( ! $auth ) {
header( 'WWW-Authenticate: Basic realm="Private"' );
header( 'HTTP/1.0 401 Unauthorized' );
echo 'Authorization Required.';
exit;
} else {
echo '<P> Ud. esta autenticado!</P>';
}
?>
44
Curso de Programación en PHP Eslava
El término sesión en PHP, session en inglés, se aplica a esta secuencia de navegación, para ello crearemos un
identificador único que asignamos a cada una de estas sesiones de navegación. A este identificador de sesión se le
denomina, comúnmente, como la sesión.
Y para que no perdamos el hilo de la navegación del usuario deberemos asociar esta sesión a todas las URLs
y acciones de formulario. Podemos también crear un cookie que incluya el identificador de sesión, 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 teoría pura y es aplicable a cualquier lenguaje de programación C, Perl, etc. Los
que programamos en PHP4 tenemos la suerte de que toda la gestión de sesiones la hace el mismo PHP.
Por lo tanto lo comentado a partir de aquí es solo aplicable a PHP4. Si aún desarrollas PHP3, tendrás que
crear tus propias librerías de gestión de sesiones o recurrir a alguna de las existentes, como la de PHPLIB.
45
Curso de Programación en PHP Eslava
Para utilizar sesiones en PHP lo primero es inicializarlas. Podemos hacerlo explícitamente, mediante la función
session_start(), o al registrar una variable en una sesión mediante
session_register('miVariable'). En ambos casos se crea una nueva sesión, si no existe, o se retoma
la sesión actual. Veamos un sencillo ejemplo:
session_start();
echo "He inicializado la sesión";
?>
Esta es la forma más básica, si el usuario tiene los cookies activados, PHP habrá insertado de forma
automática la sesión y ésta será pasada de una página a otra sin hacer nada más. Desde un punto de vista práctico
la sesión es operativa, pero no vemos nada. Podemos obtener la sesión en cualquier momento mediante la función
session_id(). Inserta en las sucesivas páginas la siguiente línea para ver si la sesión está disponible:
session_start();
echo 'La sesión actual es: '.session_id();
?>
En este caso session_start() comprueba en los cookies que existe una sesión y continua con ella,
session_id() devuelve el identificador actual.
46
Curso de Programación en PHP Eslava
session_register('contador');
echo '<a href="'.$PHP_SELF.'?'.$SID.'">Contador vale: '.++$contador.'</a>';
?>
Como se dijo anteriormente la sesión se crea o recoge mediante session_start(), o también cuando se
registra una variable de sesión mediante session_register().
Si no has utilizado nunca las sesiones, el concepto de variable de sesión, puede resultar un poco abstracto.
Básicamente es una variable, como cualquiera de las que gestiona PHP4, pero que reside en un espacio específico
en el servidor, junto con el identificador de sesión, y que pertenece únicamente a un usuario.
En nuestro ejemplo anterior, registramos la variable $contador en la primera línea del script. En la
segunda línea, entre otras cosas, cada vez que recarguemos la página o hagamos click sobre el enlace, el valor de
$contador se incrementará en 1.
En esta línea hacemos uso de la variable reservada $PHP_SELF, que hace referencia al propio script en
ejecución y una constante propia de PHP4, $SID, que contiene el nombre de la sesión y el identificador de la
misma.
47
Curso de Programación en PHP Eslava
La asignación del nombre de sesión debe realizarse antes que ninguna otra función con sesiones, antes
que session_start() o session_register().
Error común
Uno de los errores más comunes cuando se utilizan sesiones es dejar líneas en blanco antes de la
inicialización de PHP o enviar alguna salida a la pantalla. Para probarlo crea una línea en blanco o con cualquier
cosa antes de <?php.
Warning: Cannot send session cookie - headers already sent by (output started
at /home/session.php:2) in /home/session.php on line 4
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 línea en blanco. Como medida práctica, no dejes
espacios ni antes del inicio del script, ni después de la finalización.
Si después de todo lo comentado aún no entiendes para que sirven las sesiones, veamos un ejemplo
práctico. Imagina que quisieras crear un sistema de cesta de la compra...
48
Curso de Programación en PHP Eslava
Si después de todo lo comentado aún no entiendes para que sirven las sesiones, veamos un ejemplo
práctico. Imagina que quisieras crear un sistema de cesta de la compra, en su forma básica podría ser algo así:
49
Curso de Programación en PHP Eslava
Una breve explicación. En la línea 4 comprobamos si el usuario ha pasado algún artículo, desde el formulario.
En la 5 si el array itemsEnCesta no existe, lo creamos con el nuevo producto y la cantidad indicada. Si el array
existe recorremos su contenido, entre las líneas 8 y 13, y si encontramos un artículo igual, añadimos la cantidad en
la línea 10. Si no lo encontramos, es un nuevo artículo, por lo tanto, añadimos el nuevo producto con la
correspondiente cantidad a itemsEnCesta en la línea 14.
Y a continuación imprimimos el formulario y los resultados, si los hubiera, a partir de la línea 18, donde
empieza el HTML.
Estas son las funcionalidades básicas de las sesiones, espero que te halla resultado ilustrativo y no olvides
consultar el resto de funciones asociadas al uso de sesiones en el manual de PHP.
50
Curso de Programación en PHP Eslava
Con las cookies, pequeñas porciones de información se quedan registradas en el navegador permitiendo
identificar a este a través de diferentes páginas de un mismo sitio e incluso durante visitas entre distintos días.
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 envía estas cookies al servidor permitiendo así la
identificación del cliente en el servidor.
Funcionamiento
El navegador las envía, permitiendo la identificación del usuario por parte del servidor.
El manejo de cookies en PHP se realiza mediante el uso de la función setcookie, esta función esta
disponible a partir de la versión 3 de PHP.
int setcookie (string Nombre [, string Valor [, int Expire [, string Path
[, string Dominio [, int Secure]]]]])
Setcookie() define una cookie que es enviada junto con el resto de la información 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 restricción de las cookies no
de PHP.
51
Curso de Programación en PHP Eslava
Nombre. Nombre de la cookie. Si creamos una cookie solamente con el nombre, en el cliente se eliminara
la cookie que exista con ese nombre. También podemos reemplazar cualquier argumento con una cadena
vacía ("").
Value. Valor que almacenará la cookie en el cliente.
Expire. El argumento expire es un argumento entero que indica la hora en que se eliminara la cookie en
el formato de hora que devuelven las funciones UNIX time() y mktime(). Normalmente se usa time() +
N. segundos de duración, para especificar la duración de una cookie.
Path. Subdirectorio en donde tiene valor la cookie.
Dominio. Dominio en donde tiene valor la cookie. Si ponemos como dominio www.domain.com la
cookie no se transmite para domain.com, mientras que si ponemos domain.com la cookie se
transmite tanto para domain.com como para www.domain.com
Secure. El argumento secure indica que la cookie solo se transmitirá a través de una conexión segura
HTTPS.
Ejemplo
En este ejemplo establecemos una cookie de nombre usuario que contiene el valor Luis, que dura 1
hora (3600 segundos) válida para todo el dominio php.net
52
Curso de Programación en PHP Eslava
En este ejemplo vamos a ver como establecer una cookie y cómo se recupera el valor establecido. Para ello
pediremos al usuario que introduzca su nombre, que guardaremos en una cookie.
Primero pedimos al usuario que introduzca el valor de su nombre, usamos un formulario que procesará la
página procesar_cookie.phtml.
53
Curso de Programación en PHP Eslava
Se establece la cookie ejemusuario con el valor introducido anteriormente, y cuya duración es una hora.
En este ejemplo vemos lo fácil que es recuperar el valor de la cookie establecida anteriormente.
<html>
<head>
<title>Ejemplo de PHP</title>
</head>
<body>
<H1>Ejemplo de uso de cookie</H1>
54
Curso de Programación en PHP Eslava
PHP tiene varias funciones que permiten realizar consultas a un servidor LDAP. Para ver si su PHP posee
soporte para LDAP, debe ejecutar la función “phpinfo()” y observar si existe un recuadro LDAP.
A continuación se muestra un código PHP que se conecta al servidor LDAP y muestra el directorio completo.
55
Curso de Programación en PHP Eslava
leer_ldap.php
<html>
<head>
</head>
<body>
<?php
// start searching
// specify both the start location and the search criteria
// in this case, start at the top and return all entries
$result =ldap_search($conn,"dc=my-domain,dc=com", "(cn=*)") or die ("Error in search
query");
?>
</body>
</html>
RESULTADO:
56
Curso de Programación en PHP Eslava
buscar_ldap.html
<html>
<head>
<title>Search</title>
</head>
<body>
<form action="search.php" method="POST">
<input type="text" name="name" length="30">
<input type="submit" name="submit" value = "Search">
</form>
</body>
</html>
search.php
<html>
<head>
</head>
<body>
<?php
// start searching
// specify both the start location and the search criteria
// in this case, start at the top and return all entries
$result =ldap_search($conn,"dc=my-domain,dc=com", $query) or die ("Error in search
query");
?>
</body>
</html>
57
Curso de Programación en PHP Eslava
buscar2.html
<html>
<head>
<title>Search</title>
</head>
<body>
<form action="search2.php" method="POST">
First name
<br>
<input type="text" name="cn" length="30"><br>
Last name
<br>
<input type="text" name="sn" length="30"><br>
Email address
<br>
<input type="text" name="email" length="30"><br>
<input type="submit" name="submit"
value="Search">
</form>
</body>
</html>
<html><head></head><body>
<?php
search2.php
// specify the LDAP server to connect to
$conn = ldap_connect("localhost") or die("Could not connect to server");
// start searching
// specify both the start location and the search criteria
// in this case, start at the top and return all entries
$result =ldap_search($conn,"dc=my-domain,dc=com", $query) or die("Error in
search query");
58
Curso de Programación en PHP Eslava
El siguiente código nos sirve para listar los usuarios en el directorio LDAP......
<html>
<head>
</head>
<body>
<table width="450" cellpadding="5" cellspacing="5" border="1">
<?php
// specify the LDAP server to connect to
$conn = ldap_connect("localhost") or die("Could not connect to server");
</table>
<p>
<a href="add.html">Add new entry</a> // AGREGAR
</body>
</html>
59
Curso de Programación en PHP Eslava
add.html
<html>
<head>
<title>Add Entry</title>
</head>
<body>
<form method="POST" action="add.php">
<table border="0" cellpadding="0" cellspacing="10" width="500" >
<tr>
<td width="50%" align="right">First name</td>
<td width="50%"><input type="text" name="cn" size="20"></td>
</tr>
<tr>
<td width="50%" align="right">Last name</td>
<td width="50%"><input type="text" name="sn" size="20"></td>
</tr>
<tr>
<td width="50%" align="right">E-mail address</td>
<td width="50%"><input type="text" name="mail" size="20"></td>
</tr>
<tr>
<td width="100%" colspan="2" align="center">
<input type="submit" value="Submit" name="Submit">
<input type="reset" value="Reset" name="Reset">
</td>
</tr>
</table>
</form>
</body>
</html>
60
Curso de Programación en PHP Eslava
add.php
<html>
<head>
</head>
<body>
<?php
// configure privileged user
$root_dn = "cn=root, dc=my-domain, dc=com";
$root_pw = "secret";
// prepare data
$info["cn"] = $_POST['cn'];
$info["sn"] = $_POST['sn'];
$info["mail"] = $_POST['mail'];
$info["objectClass"] = "inetOrgPerson";
Resultado:
61
Curso de Programación en PHP Eslava
El siguiente código nos sirve para Editar un usuario del directorio LDAP......
edit.php
<html>
<head>
</head>
<body>
<?php
// all done? clean up
ldap_close($conn);
?>
</table>
</body>
</html>
62
Curso de Programación en PHP Eslava
modify.php
<html>
<head>
</head>
<body>
<?php
// prepare data
$info["cn"] = $_POST['cn'];
$info["sn"] = $_POST['sn'];
$info["mail"] = $_POST['mail'];
$info["objectClass"] = "inetOrgPerson";
// prepare DN
$dn = "mail=" . $_POST['mail'] . ", dc=my-domain, dc=com";
?>
</body>
</html>
Resultado:
63
Curso de Programación en PHP Eslava
El siguiente código nos sirve para Borrar un usuario del directorio LDAP......
delete.php
<html>
<head>
</head>
<body>
<?php
?>
</body>
</html>
Resultado:
64
Curso de Programación en PHP Eslava
En los anteriores códigos se utilizó la función ldap_errno() que retorna un número en caso de que
exista un error. Este número no nos indica mucha información. Para ello, se utiliza la función
ldap_err2str() que retorna un MENSAJE asociado a dicho número.
<html>
<head>
</head>
<body>
<?php
// specify the LDAP server to connect to
$conn = ldap_connect("www.somewhere.com") or die("Could not connect to server");
Resultado:
Equivalentemente se puede usar el siguiente código que utiliza la función ldap_error que retorna el
último mensaje de error generado.
<html>
<head>
</head>
<body>
<?php
?>
</body>
</html>
65
Curso de Programación en PHP Eslava
Esta aplicación se puede agregar a una pagina web que ya exista y permite al usuario ver un
calendario simple, pudiendo navegar con los meses y años usando las flechas de “>>” y “<<”.
cal.php
<?
$_PHP_LINK = $PHP_SELF;
if (!isset($Day)) {
$month = date ("n");
$year = date ("Y");
$Day = time();
}
else {
$month = date ("n", $Day);
$year = date ("Y", $Day);
}
<html>
<style type="text/css">
<!-- a:hover { color: #FF0000; text-decoration: none}
a:link { text-decoration: none}
a:visited { text-decoration: none}
.small_letter { font-size: xx-small; color: #FFFFFF} -->
</style>
<title>Pequeno Calendario</title>
<body>
<table border="0" cellspacing="0" cellpadding="0">
<tr bgcolor="#3366CC">
<td bgcolor="#3366CC"> </td>
<?
<td align=center class="small_letter" valign="top">
$NextMonth = mktime (0,0,0, date("n", $Day) + 1, date("j",$Day), date ("Y", $Day));
$PreviousMonth = mktime(0,0,0 , date("n",$Day)-1, date("j",$Day), date ("Y", $Day));
print("<a href=\"$_PHP_LINK?Day=$PreviousMonth\">$fontb << $fonte</a> ".$meses[date ("n",
$Day)]. " <a href=\"$_PHP_LINK?Day=$NextMonth\"> $fontb >>$fonte</a>");
69