Trabajo con sesiones en PHP

En nuestro artículo de hoy nos vamos a centrar en como trabajar con las sesiones en PHP, este artículo es parte de nuestro curso profesional de PHP6 y MYSQL

Cuando queremos utilizar variables de sesión en una página tenemos que iniciar la sesión con la siguiente función:

session_start ()

Inicia una sesión para el usuario o continúa la sesión que pudiera tener abierta en otras páginas. Al hacer session_start() PHP internamente recibe el identificador de sesión almacenado en la cookie o el que se envíe a través de la URL. Si no existe tal identificador se sesión, simplemente lo crea.

Nota: Si en el php.ini se ha definido la variable session.auto_start = 1 se inicializa automáticamente la sesión en cada página que visita un usuario, sin que se tenga que hacer el session_start()

La sesión se tiene que inicializar antes de escribir cualquier texto en la página. Esto es importante y de no hacerlo así corremos el riesgo de recibir un error.

Una vez iniciada la sesión podemos utilizar variables de sesión a través de $_SESSION, que es un array asociativo, donde se accede a cada variable a partir de su nombre, de este modo:

 

$_SESSION[“nombre_de_variable”]

 

 

Ejemplo de código para definir una variable de sesión:

<?
session_start();
?>
<html>
<head>
<title>Generar variable de sesión</title>
</head>
<body>
<?
$_SESSION[“mivariabledesesion”] = “Hola este es el valor de la variable de sesión”;
?>
</body>
</html>

 

Con lo visto, vamos a proponer el ejemplo clásico de utilización de una sesión: un contador. Este contador deberá aumentar de una unidad cada vez que recargamos la página o apretamos al enlace:

<?
session_register(‘contador’);
?>
<HTML>
<HEAD>
<TITLE>contador.php</TITLE>
</HEAD>
<BODY>
<?
If (isset($contador)==0)
{$contador=0;}
++$contador;
echo “<a href=”contador.php”>Has recargado esta página $contador veces</a>”;
?>
</BODY>
</HTML>

 

La condición if tiene en cuenta la posibilidad de que la variable $contador no haya sido todavía inicializada. La función isset se encarga de dar un valor cero cuando una variable no ha sido inicializada.

Otras funciones útiles para la gestión de sesiones son:

Función Descripción
Session_id()       Nos devuelve el identificador de la sesión
Session_destroy()       Da por abandonada la sesión eliminando

variables e identificador.

Session_unregister(‘variable’)       Abandona una variable sesión

 




Limit de MySQL en SQL, solución.

En MySQL, cuando queremos limitar el rango de registros devueltos por una sentencia SELECT tenemos la opción de utilizar LIMIT:

Select FROM tabla LIMIT 10,5

Esta sentencia nos permite devolver 5 registros a partir del décimo. El ejemplo sería aplicable por ejemplo a un listado paginado con 5 registros por página y estuviésemos mostrando la tercera de ellas.

El problema es que SQL no tiene la opción de usar LIMIT. En ocasiones podemos solventarlo rápidamente utilizando TOP, con el que podemos devolver un cierto número de registros, pero solo desde el primero de la sentencia. La solución para esto se puede ver en el siguiente código:


SELECT FROM SELECT *, ROW_NUMBER() OVER (ORDER BY id) AS row FROM tabla ) ASalias WHERE row > 10 AND row <= 14

ROW_NUMBER() nos devuelve el número de línea de la consulta empezando por 1. Con este número de secuencia renombrado como row, ya podemos decirle con un simple where que nos lo limite en un cierto intervalo. Ciertamente es una solución en SQL un tanto enrevesada frente a la sencillez del LIMIT ofrecido por MySQL.



GROUP BY, ¿para qué sirve Agrupar Datos en una Tabla Mysql?

La sentencia group by sirve para agrupar datos, según un determinado criterio, y aplicar operaciones sobre los elementos del conjunto conformado.
La definición resulta un poco confusa, por lo tanto veamos la utilidad que tiene la consulta group by a través de un ejemplo práctico.
Supongamos que ahora nos interesa saber la cantidad de servicios que brinda una determinada empresa. Retomando la definición teórica que vimos al inicio, la solución a esta consigna podríamos pensarla de la siguiente manera:
Conformaremos un grupo (agrupar datos) por cada empresa (criterio) y dentro de cada grupo contabilizaremos (operación) la cantidad de servicios que ofrece.
Nuestra consulta mysql quedaría así:
select Empresas.Nombre,Servicios.Servicio,count(*) as CantidadServicios
    from Empresas
        inner join Servicios on Empresas.Id=Servicios.IdEmpresa
            group by IdEmpresa


Observemos que en la línea número 4 especificamos la consulta group by. Es muy importante respetar el orden de las sentencias mysql (select, from, inner join, group by, etc). Por ejemplo, si haríamos el group by antes del inner join no funcionaria como deseamos.

En el group by especificamos “IdEmpresa”. Este vendría a ser el criterio por el cual deseamos agrupar las filas; en nuestro caso deseamos agrupar todas las filas que correspondan a la misma empresa.
Una vez que tenemos armados los grupos, contabilizamos las filas que contiene cada uno. Esto lo hacemos en la línea 1 de nuestra consulta mysql mediante count(*) y volcamos el resultado del conteo dentro del campo “CantidadServicios”.
Cada grupo representará una fila en el resultado final de nuestra consulta mysql group by. Y como hemos aprendido previamente podemos utilizar la sentencia  mysql_fetch_array para imprimir en pantalla los resultados de una consulta msyql.
Finalmente el código fuente php completo quedaría de la siguiente manera:
// Conexión a base de datos Mysql
$conexion=mysql_connect('localhost','Tu-Usuario-Mysql','Contraseña-de-tu-Usuario-Mysql');
mysql_select_db('Nombre-de-tu-Base-de-datos-Mysql',$conexion);
//  Consulta Mysql donde aplicamos GROUP BY
$consulta_mysql="select Empresas.Nombre,Servicios.Servicio,count(*) as CantidadServicios
                    from Empresas
                        inner join Servicios on Empresas.Id=Servicios.IdEmpresa
                            group by IdEmpresa";
$resultado_consulta_mysql=mysql_query($consulta_mysql,$conexion);
// Imprimimos en pantalla los resultados de nuestra consulta mysql
while($fila=mysql_fetch_array($resultado_consulta_mysql)){
 echo "La empresa ".$fila['Nombre']." ofrece ".$fila['CantidadServicios']." a sus clientes.
";
}

En este caso nos interesaba “contar” la cantidad de filas que conformaban cada grupo. Pero también se pueden efectuar otras operaciones.

Una operación muy utilizada es sum y sirve para efectuar sumatorias de valores contenidos en un grupo, la operación sum del group by nos servirá para calcular el importe total por ejemplo de la compra en el carrito del cliente (estaríamos haciendo una sumatoria de los importes de cada ítem).