El hombre nunca sabe de lo que es capaz hasta que lo intenta. Charles Dickens

Generar prefijos CSS3 con PHP

Los navegadores actuales soportan las propiedades CSS3 con prefijos específicos para cada tipo de navegador, hasta que la propiedad sea aprobada y finalizada por el W3C. Eso significa mucha repetición a la hora de escribir código. Pongamos como ejemplo la siguiente declaración:

#caja{
	-moz-border-radius: 5px;
	-o-border-radius: 5px;
        -ms-border-radius: 5px;
	border-radius: 5px;
}

Más código significa mayores probabilidades de cometer errores y produce hojas de estilos que son más largas y más difícil de mantener. En lugar de escribir el prefijo específico del tipo de navegador y los valores una y otra vez, podemos utilizar PHP para generarlo por nosotros.

Podemos utilizar una función PHP para producir el código CSS3. La función tendrá que saber dos cosas: el nombre de base de la propiedad (por ejemplo, border-radius) y el valor asociado a ella ("5px"). Por lo tanto, deberíamos escribir:

<?php
header('Content-type: text/css');

function css3_write ($property, $value) {
	$css3 = "-webkit-".$property.": ".$value.";\n"
	." -moz-".$property.": ".$value.";\n"
	." -o-".$property.": ".$value.";\n"
	." -ms-".$property.": ".$value.";\n"
	." ".$property.": ".$value.";\n";
	echo $css3;
} ?>

La primera línea es para indicar el tipo de contenido del archivo php. Obviamente a la hora de invocar nuestra hoja de estilos lo haremos llamando el archivo php:

<link rel='stylesheet' type='text/css' href='css/estilos.php' />

En la función css3_write queremos producir la correspondiente declaración de CSS para todos los navegadores. La propiedad base se incluye al final, como fallback. Construiremos la declaración utilizando una serie de concatenaciones y utilizando \n (nueva línea) para hacer que la función escriba un CSS más legible.

Para producir nuestro CSS3 tan sólo tenemos que llamar a la función con la propiedad CSS3 y el valor para dicha propiedad. Por ejemplo:

#caja {
	border: 1px solid black;
	background: #fff;
    <?php css3_write("border-radius", "5px"); ?>
	width: 50%;
    <?php css3_write("box-shadow", "5px 5px 2px rgba(0, 0, 0, 0.5)"); ?>
}

Lo que generará el siguiente código:

#caja {
	border: 1px solid black;
	background: #fff;
	-webkit-border-radius: 5px;
	-moz-border-radius: 5px;
	-o-border-radius: 5px;
	-ms-border-radius: 5px;
	border-radius: 5px; width: 50%;
	width: 50%;
	-webkit-box-shadow: 5px 5px 2px rgba(0, 0, 0, 0.5);
	-moz-box-shadow: 5px 5px 2px rgba(0, 0, 0, 0.5);
	-o-box-shadow: 5px 5px 2px rgba(0, 0, 0, 0.5);
	-ms-box-shadow: 5px 5px 2px rgba(0, 0, 0, 0.5);
	box-shadow: 5px 5px 2px rgba(0, 0, 0, 0.5);
}

Este método es una alternativa al uso de compiladores como Less o Sass. Para obtener más información acerca de cómo crear CSS con PHP podéis consultar: Controlar CSS con PHP y Comprimir varios CSS en uno con PHP.

Convertir un color de formato hexadecimal a RGB con PHP

A veces puede resultar útil convertir un color en formato hexadecimal, como por ejemplo #336699, a un formato RGB, como por ejemplo (51,102,153).

En esta entrada se muestra una función que realiza esta conversión en PHP.

function hex2rgb($hex){
	$hex = ereg_replace("#", "", $hex);
        $color = array();

        if(strlen($hex) == 3) {
        $color['r'] = hexdec(substr($hex, 0, 1) . $r);
        $color['g'] = hexdec(substr($hex, 1, 1) . $g);
        $color['b'] = hexdec(substr($hex, 2, 1) . $b);
        }
        else if(strlen($hex) == 6) {
        $color['r'] = hexdec(substr($hex, 0, 2));
        $color['g'] = hexdec(substr($hex, 2, 2));
        $color['b'] = hexdec(substr($hex, 4, 2));
        }

        return $color;
}

Ejemplo de uso:

$color = hex2rgb('336699');
echo "R:". $color['r']."
";
echo "G:". $color['g']."
";
echo "B:". $color['b']."
";

Lo que nos devolvería:

R:51
G:102
B:153

Crear un fichero CSV utilizando PHP/MYSQL

Como complemento al post "Generar archivo CSV desde una array de PHP", en este caso vamos a ver como crear una exportación a un fichero CSV de una tabla MySQL

<?php
$db_host = 'localhost';
$db_usuario = 'root';
$db_password = ";
$db_basedatos = 'mytestdatabase';
$db_tabla = 'clientes';
$$nombre_fichero = 'clientes.csv';
$dblink = mysql_connect($db_host, $db_usuario, $db_password) or die("No puede conectar " . mysql_error());
mysql_select_db($db_basedatos) or die("No puede conectar.");
$result = mysql_query("SHOW COLUMNS FROM ".$db_tabla."");
$i = 0;
if (mysql_num_rows($result) > 0) {
	while ($row = mysql_fetch_assoc($result)) {
		$salida_cvs .= $row['Field'].",";
		$i++;
	}
}
$salida_cvs .= "\n";
$values = mysql_query("SELECT * FROM ".$db_tabla."");
while ($rowr = mysql_fetch_row($values)) {
	for ($j=0;$j<$i;$j++) {
		$salida_cvs .= $rowr[$j].", ";
	}
	$salida_cvs .= "\n";
}

header("Content-type: application/vnd.ms-excel");
header("Content-disposition: csv" . date("Y-m-d") . ".csv");
header( "Content-disposition: filename=".$nombre_fichero.".csv");
print $salida_cvs;
exit;
?>

Generar archivo CSV desde una array de PHP

Sencilla pero muy útil función PHP para generar un archivo .csv a partir de una array. La función acepta 3 parámetros: los datos, el delimitador del csv (el valor predeterminado es una coma) y el encapsulador del csv (el valor por defecto es una comilla doble).

function generateCsv($data, $delimiter = ',', $enclosure = '"') {
       $handle = fopen('php://temp', 'r+');
       foreach ($data as $line) {
               fputcsv($handle, $line, $delimiter, $enclosure);
       }
       rewind($handle);
       while (!feof($handle)) {
               $contents .= fread($handle, 8192);
       }
       fclose($handle);
       return $contents;
}

Visto en CatsWhoCode » »

Cookies en PHP

Las cookies son pequeños fragmentos de información almacenados por el navegador en el equipo del suauario. La información almacenada en la cookie se utiliza para identificar un usuario y esta información se envía al servidor con cada solicitud realizada, para que el servidor pueda hacer uso de ella. Las cookies pueden almacenar una gran variedad de datos, como tu nombre, la fecha de tu última visita, tu carrito de la compra, etc. Las cookies almacenados por un sitio web no pueden ser accesibles por otros sitios web, lo que hace que las cookies sean relativamente seguras para almacenar información personal. Aún así, no es nada aconsejable utilizar cookies para almacenar información confidencial, como contraseñas, datos de tarjetas de crédito, etc.

No hay ninguna cookie cuando el navegador se conecta por primera vez a un servidor en particular. Cuando la solicitud se realiza al script PHP del servidor, éste hace una llamada a la función setcookie(). Esta provoca un encabezado HTTP Set-Cookie que será enviado en la respuesta y que contiene el nombre y el valor de la cookie para establecerse.

PHP proporciona acceso a las cookies a través de una función denominada setcookie() y la array superglobal $_COOKIE. setcookie() almacena datos en las cookies, y $_COOKIE recupera los valores de las cookies.

La función setcookie() se utiliza para establecer un valor y, opcionalmente, la fecha de caducidad de una cookie. La sintaxis de la función es:

setcookie(nombre, valor, expira, path, dominio, seguro, httponly)
  • nombre: Obligatorio. Especifica el nombre de la cookie.
  • valor: Obligatorio. Especifica el valor de la cookie.
  • valor: Obligatorio. Especifica cuando expira la cookie.
    time()+3600*24*30 establecerá que la cookie expira en 30 días. Si no se establece este parámetro, la cookie expirará al final de la sesión (cuando se cierra el navegador).
  • path: Opcional. Especifica la ruta del servidor de la cookie.
    Si se establece "/", la cookie estará disponible en todo el dominio. Si se establece a "/test/", la cookie sólo estará disponible en el directorio "test" y todos los subdirectorios de "test". El valor predeterminado es el directorio en el que se ha establecido la cookie.
  • dominio: Opcional. Especifica el nombre de dominio de la cookie.
    Para hacer la cookie disponible en todos los subdominios de ejemplo.com, deberás establecer este parametro a ".ejemplo.com". Estableciendolo a "www.ejemplo.com" hará que la cookie sólo esté disponible en el subdominio www.
  • seguro: Opcional. Especifica si la cookie sólo debe ser transmitida a través de una conexión HTTPS segura. TRUE indica que la cookie sólo se establecerá si existe una conexión segura. El valor predeterminado es FALSE.
  • httponly: Opcional. Cuando es TRUE la cookie será accesible sólo a través del protocolo HTTP. Esto significa que la cookie no será accesible por lenguajes de scripting, como JavaScript.

Veamos un ejemplo de como establecer una cookie en PHP:

<?php
$mi_cookie = "my first cookie";
$expira = time() + (60 * 60 * 8);

// Establece una cookie que expira en 8 horas
setcookie("PrimeraCookie", $mi_cookie, $expira);
?>

La cookie caducará en 8 horas (segundos x minutos x horas a partir de la hora actual). Pero ¿qué pasa si deseas que tu cookie se elimine inmediatamente o una vez que la información sea obtenida por el navegador? Puedes establecer la fecha de caducidad a un tiempo en el pasado. Por ejemplo, puedes establecer $expira como time()-3600.

Las cookies por defecto se establecen sólo para el directorio actual y sus descendientes. El cuarto parámetro path restringe el acceso a las cookies para una ruta en el servidor. Por ejemplo, si la cookie se establece en el directorio de "/test/" , luego estará disponible sólo para scripts alojados en el directorio de "test" y sus subdirectorios. Si deseas que la cookie se establezca para el directorio raíz, "/"  debe utilizarse como parámetro de path, como en este ejemplo:

<?php setcookie("PrimeraCookie", $mi_cookie, $expira, "/");?>

El quinto parámetro domain restringe el acceso a las cookies para un dominio determinado. Por ejemplo, si deseas una cookie que sea accedible desde dos subdominios distintos como "www.webintenta.com" y "tutoriales.webintenta.com" debes establecer el parámetro domain como .webintenta.com. Haciendo esto lograremos que la cookie está disponible para ambos subdominios.

<:?php setcookie("PrimeraCookie", $mi_cookie, $expira, "/", ".webintenta.com");?>

Las cookies se envían al navegador mediante campos de encabezado en el protocolo HTTP. Debido a esto, it†™ s necesario establecer cookies antes de enviar una sola línea de código HTML o cualquier otra salida al usuario. Las cookies no se establecerá si se envía cualquier salida. En este caso, la función setcookie() devolverá false y PHP producirá un mensaje de error.

Recuperar y actualizar las cookies

Recuperar el valor de las las cookies es bastante sencillo en PHP. La matriz global $_COOKIE se utiliza para recuperar el valor de la cookie para solicitudes de páginas posteriores. Por ejemplo, si deseas mostrar el número de veces que un usuario ha visitado tu sitio web:

<?php
$visitas = 1;
if (isset($_COOKIE["visitas"])) {
	    $visitas = intval($_COOKIE["visitas"]);
}
setcookie("visitas", $visitas + 1, time() + (60 * 60 * 24 * 30));
echo "Has visitado está página $visitas veces.";
?>

Una cookie se borra automáticamente por el navegador una vez se sobrepasa la fecha de caducidad. Por lo tanto, establecer el parámetro de caducidad de la función setcookie() en algún momento del pasado elimina la cookie. En el siguiente ejemplo, el parámetro value se establece a null y el parámetro de expiración se establece un un tiempo pasado.

<?php
$expira = time() - 60;
setcookie("PrimeraCookie", $mi_cookie, $expira, "/", ".webintenta.com");
?>

A continuación se detalla una pequeña referencia con los números y la cantidad de tiempo que significan; lo que puede ser de utilidad para establecer la caducidad de las cookies:

  • Un minuto: 60
  • Diez minutos: 600
  • Media hora: 1800
  • Una hora: 3600
  • Un día: 86400
  • Una semana: 604800
  • Dos semanas: 1209600
  • Un mes (30 días): 2592000
  • Un año (365 días): 31536000

Hay casos en que un usuario desactiva o tiene desactivadas las cookies en el navegador por razones de privacidad. Por lo tanto, antes de usar cookies, se recomienda siempre realizar una primera prueba para comprobar si el usuario tiene las cookies habilitadas o no, en el navegador. Puedes hacerlo estableciendo una cookie y luego redirigir a un siguiente página y comprobar si la cookie se recibió. Si no es así, mostrar un mensaje al usuario sugiriendo que habilitar las cookies.

Deshabilitar las cookies en un sitio que requiere cookies puede afectar a la funcionalidad del sitio. En est caso, tenemos que encontrar otras maneras para mantener dicha funcionalidad.

Cuando usamos cookies, existen unas cuantas cosas que debemos tener en cuenta:

  • Un dominio puede definir multitud de cookies con diferentes nombres, pero los navegadores limitan el número de cookies por dominio (el número varía entre navegadores, pero generalmente es alrededor de 20).
  • El tamaño máximo de cualquier cookie es de 4 KB.
  • Aunque tú puedes establecer una caducidad para la cookie, en usuario puede eliminar cookies en cualquier momento.
  • Las cookies sólo se acceden a travñes del navegador que las ha establecido. Es decir, Firefox e IE no las comparten.Un usuario puede desactivar las cookies en su navegador.
  • Las cookies se deben establecer antes de que cualquier otra salida sea enviada desde el PHP o de lo contrario recibirás un error.

El siguiente código, extraido de php.net muestra, en un ejemplo completo, el uso de las cookies con PHP. En este ejemplo, ofrecemos a un usuario la posibilidad de elegir los colores del texto y el fondo de la página a través de un formulario. Una vez se han elegido los colores, éstos se guardan en sendas cookies por el período de una hora. Así que si el usuario visita de nuevo la página dentro de ese lapso de tiempo, el aspecto de la web será el definido por el usuario, y leído de las cookies.

<?php
// comprobar si el formulario ha sido enviado
if (isset($_POST['submitted'])){
		$newbgColor=$_POST['bgColor'];
		$newtxtColor=$_POST['txtColor'];
		// establecer las cookies
		setcookie("bgColor",$newbgColor,time()+3600);
		setcookie("txtColor",$newtxtColor,time()+3600);
}

//En caso de que el usuario venga por primera vez
//y las cookies no estén fijadas
if ((!isset($_COOKIE['bgColor']) ) && (!isset($_COOKIE['txtColor']))){
	$bgColor = "Black";
	$txtColor="White";
}else{
	#Si las cookies están fijadas las utilizamos
	$bgColor = $_COOKIE['bgColor'];
	$txtColor = $_COOKIE['txtColor'];
}
?>
<!-- HTML -->
<html>
<body bgcolor="<?php echo $bgColor ?>" text="<?php echo $txtColor ?>">
<form action= "<?php echo $_SERVER['PHP_SELF']; ?>" method ="POST">
<p>Color del Body:</p>
<select name=bgColor>
	<option value ="Red">Rojo</option>
	<option value ="Green">Verde</option>
	<option value ="Blue">Azul</option>
	<option value ="Yellow">Amarillo</option>
	<option value ="Black">Negro</option>
	<option value ="Brown">Marrón</option>
	<option value ="White">Blanco</option>
</select>
<p>Color del texto:</p>
<select name=txtColor>
		<option value ="Red">Rojo</option>
		<option value ="Green">Verde</option>
		<option value ="Blue">Azul</option>
		<option value ="Yellow">Amarillo</option>
		<option value ="Black">Negro</option>
		<option value ="Brown">Marrón</option>
		<option value ="White">Blanco</option>
</select>
<input type ="hidden" name="submitted" value="true"></br>
<input type="submit" value="remind">
</form>
</body>
</html>

También se puede crear una array de cookies mediante su definición en el nombre de la cookie. Esto tiene el efecto de establecer tantas cookies como elementos del array, pero cuando la cookie es recibida por el script, todas las cookies se colocan en un array con el nombre de la cookie:

<?php
// define las cookies
setcookie("cookie[three]", "cookiethree");
setcookie("cookie[two]", "cookietwo");
setcookie("cookie[one]", "cookieone");
// Después de volver a cargar la página, muestra
if (isset($_COOKIE['cookie'])) {
	foreach ($_COOKIE['cookie'] as $name => $value) {
		echo "$name : $value <br />\n";
	}
}
?>

Lo que da como resultado

three : cookiethree
two : cookietwo
one : cookieone
Aumentar la seguridad de las cookies

Algunos de los consejos que a continuación se ofrecen ya se han comentado de algún modo anteriormente o son fácilmente deducibles a partir de lo anteriormente explicado pero siempre es conveniente realizar un repaso y ofrecer una visión lo más clarificadora posible de cómo aumentar la seguridad de nuestra aplicación en el uso de cookies.

Habilitar la cookie únicamente a tu aplicación
El parámetro path especifica en qué rutas del sitio la cookie estará disponible. El valor predeterminado es "/", lo que significa que cada solicitud realizada obtendrá la cookie, mientras que "/foros/" limitaría la cookie sólo a esa ruta. Esta ruta se basa en la URL real que utiliza el navegador, antes de cualquier uso de mod_rewrite u otra asignación de URL.

No compartir con subdominios
El parámetro domain te permite especificar si deseas o no enviar la cookie a subdominios. Estableciendo "www.ejemplo.com" significa que únicamente en ese dominio serán accesibles las cookies, mientras que ".ejemplo.comâ" también hará que sean accesibles desde cualquier subdominio (foros.ejemplo.com, blog.ejemplo.com).

Requiere una conezión segura
Utilizando el parámetro seguro puedes indicar al navegador (u otros clientes http) que sólo se enviarán las cookies sobre conexiones SSL. Esto significa que la cookie no estará disponible para cualquier parte del sitio que no sea segura.

Proteger contra los ataques XSS
El parámetro httponly se usa para indicar que el navegador no debe permitir javascript para acceder al contenido de la cookie. Esto es principalmente una defensa contra el "cross site scripting", ya que evitará los hackers puedan recuperar y utilizar la sesión a través de dicho ataque. Este parámetro no da una garantía plena. Como mecanismo de defensa del lado del cliente se basa en el soporte que pueda ofrecer el navegador. Existen navegadores que no son compatibles con este parámetro.