W3 Total Cache – Cookie is Rejected (solución)

Bien, recientemente estamos haciendo pruebas con W3 Total Cache para reducir la carga de nuestro servidor y poder servir páginas web más rapidamente, pero por algún motivo nos salía este error de cache (mirando el código fuente desde el navegador) si habíamos realizado un comentario (o teniamos una cookie creada previamente), el problema es que WordPress asigna por defecto una cookie a nuestro navegador de una duración de un año si hemos realizado algún comentario en cuestión (30000000 segundos), y entonces el usuario no se le puede servir con la cache de W3 Toal Cache, dónde la única solúcion posible es que él mismo usuario borre la cache y las cookies de su propio navegador, o tener que esperar hasta que la cookie caduque. Un año de espera es un castigo considerable en este caso para W3 Total Cache y para nosotros!.

La solución consite en crear un pequeño filtro para que la cookie tenga menor tiempo de caducidad, y así se podrá continuar utilizando la cache después de este periodo.

En vuestro theme de wordpress en el fichero functions.php

function set_comment_cookie_lifetime($lifetime) {
        // numero en segundos, elejir a gusto este valor (5 minutos por ejemplo)
return 300;
}
add_filter('comment_cookie_lifetime', 'set_comment_cookie_lifetime');

En caso de querer que caduque de inmediato poner el valor en negativo (fecha anterior)

return -30000000;

Al estar la cookie con un valor en negativo, el propio navegador se encargará de no utilizarla y eliminarla.

Espero que os sirva si teneís este problema.

iconv_strlen() [function.iconv-strlen]: Wrong charset, conversion from `ISO-8859-1′ to `UCS-4LE’ is not allowed in

Esto puede ser debdio a que hay problemas con las librerias /usr/lib/gconv o similar, especialmente si estás en un entorno chroot y no tienes dichas librerias o no funcionan correctamente por X motivo.

La solución es utilizar UTF-8 por defecto editanto el php.ini y problema resuelto. También estás opciones són recomendables si queremos trabajar en entornos con UTF-8.

De manera global en el php.ini

iconv.internal_encoding = UTF-8
iconv.input_encoding = UTF-8
iconv.internal_encoding = UTF-8

Desde el aplicativo o lugar dónde quieras modificar los valores por defecto.

ini_set('iconv.input_encoding', 'UTF-8');
ini_set('iconv.output_encoding', 'UTF-8');
ini_set('iconv.internal_encoding', 'UTF-8');

Opcionalmente también podemos indicar a PHP que utilice el juego de carácteres UTF-8 por defecto.

default_charset = "UTF-8"

Quitar el BOM de un fichero con codificación UTF-8

Mirando la compatibilidad de xhtml con el validador de w3, salía un warning avisando de que teníamos los ficheros codificados con BOM de nuestro theme, y que era mejor no tenerlo por compatibilidad con otros navegadores, así que había dos soluciones, abrir fichero a fichero uno por uno y guardarlos sin BOM con notepad++ o un editor similar, o hacer un script que lo automatice por nosotros, así que utilizamos la segunda opción :D

http://validator.w3.org

Byte-Order Mark found in UTF-8 File.

The Unicode Byte-Order Mark (BOM) in UTF-8 encoded files is known to cause problems for some text editors and older browsers. You may want to consider avoiding its use until it is better supported.

Primero, creamos un script en perl que será el encargado de eliminar el BOM.

$ editor quitarbom.pl
#!/usr/bin/perl
@file=<>;
$file[0] =~ s/^\xEF\xBB\xBF//;
print(@file)

Y en el directorio de nuestro theme dónde tenemos todos los ficheros con extensión php, lanzamos un bucle for desde linea de comandos (unix-like).


$ cd /nuestrodirectoriodeltheme
$ for f in *.php; do bomkill.pl < $f > sinbom.php; rm -f $f; mv sinbom.php $f; done

Y desapareció el BOM y el warning del w3 de todos los ficheros con extensión php.

Listado de tiendas online opensource

Victor, de helektron.com, se ha currado un listado de tiendas online y opersource a tu entera disposición para descargarlas y usarlas en tus propios proyectos.

Se trata en su mayoría de tiendas basadas en PHP y MySQL, así que difícilmente tendrás problemas en lo que a hosting se refiere.

  1. PrestaShop (PHP / MySQL).
  2. Magento (PHP / MySQL).
  3. osCommerce (PHP / MySQL)
  4. dashCommerce (ASP.NET y MSSQL 2005)
  5. Ubercart (Drupal)
  6. WordPress E-commerce Plugin (WordPress)
  7. VirtueMart (Joomla y Mambo).
  8. OXID eSales (PHP / MySQL)
  9. Freeway (PHP / MySQL)
  10. simpleCart(JS) (Javascript)
  11. Digistore (PHP / MySQL)
  12. OpenCart (PHP / MySQL)
  13. zenCart (PHP / MySQL)

Vamos, que quien no tiene una tienda online es porque no quiere, no crees? :D

Fuente | http://helektron.com

Introducción a PDO: PHP Data Objects

PDO es una librería de acceso a bases de datos para PHP.
La necesidad de una librería como PDO nace de la gran cantidad de bases de datos soportadas por PHP. Cada una de estas bases de datos necesita de su propia API para hacer tareas generalmente comunes al resto. Esto provoca que nuestro código no sea fácil portar de una base de datos a otra y ayuda (con la colaboración de muchas otras cosas) a complicarnos la vida.

Para solucionar este problema en PHP existen múltiples librerías ofrecidas por terceros. ADODB, PEAR DB y MDB2 son algunas de las más populares.

Aunque la mayoría de estas librerías son mucho mas maduras que PDO y en algunos aspectos ofrecen muchas más funcionalidades, PDO tiene ciertas ventajas que no podemos obviar.

Para empezar: la velocidad. PDO esta compilado en C/C++, por los que ofrece mayor rapidez de ejecución que sus competidoras (de código interpretado). Por otra parte: viene incorporado en PHP5 (es la solución “oficial” y en continua evolución) y desde PHP 5.1 viene “enabled” por defecto. De esta manera no tienes que importar ni cargar código de terceros cuando quieres usarlo.

No hay que olvidar que PDO está completamente orientado a objetos, lo que facilita su uso frente al engorro de las decenas de diferentes funciones de las API de cada sistema de bases de datos.

PDO actualmente soporta: Microsoft SQL Server, Firebird, IBM Informix, MySQL, Oracle, ODBC, PostgreSQL, SQLite.

Conexión a la base de datos

Una buena manera de ver la idea que hay detrás de una librería como PDO es mostrar por un lado como se realiza una conexión con la API de MySQL y PostgreSQL y por otro lado la versión con PDO.

MySQL:

[code language=’php’]
$conexion = mysql_connect($host, $usuario, $password);
mysql_select_db($db, $conexion);
[/code]

PostgreSQL:

$conexion =pg_connect(“host=$host dbname=$db user=$usuario password=$password”);

Como podemos ver, a pesar de usar dos funciones diferentes para realizar la conexión, la forma de hacerlo es prácticamente la misma.

Ahora, con PDO.

Para MySQL:

$conexion = new PDO(“mysql:host=$host; dbname=$db”, $usuario, $password);

Para PostgreSQL:

$conexion = new PDO(“pgsql:host=$host; dbname=$db”, $usuario, $password);

Solo el nombre del driver de la base de datos que usemos cambia.

Ahora, a modo de ejemplo, veamos como se haría una simple consulta SELECT con PDO.

$conexion = new PDO(“mysql:host=$host; dbname=$db”, $usuario, $password);
//queda claro que las variables necesarias para el DSN están convenientemente informadas.
//$host=localhost, $db = basedatos, …


$sql = “SELECT * FROM tabla ORDER by id”;
$query = $conexion->query($sql);
while( $row = $query->fetch(PDO::FETCH_ASSOC) )
{
print_r($row);
}

Espero profundizar mas en diferentes aspectos de PDO como excepciones, sentencias preparadas y manipulación de rowsets entre otros en los próximos post.

¡Hasta pronto!