| Subcribe via RSS

Instalar el módulo mod_rewrite en Ubuntu

Abril 6th, 2007 | 5 Comments | Posted in apache, php

Si necesitas usar el módulo mod_rewrite de Apache para usar basta con hacer:

sudo a2enmod rewrite

Editar el fichero /etc/apache2/sites-enabled/000-default y cambiar: ‘AllowOverride None’ por ‘AllowOverride All’ en el apartado correspondiente al directorio www.

y luego reiniciar Apache:

sudo /etc/init.d/apache2 force-reload

El módulo mod_rewrite se suele usar para convertir las URL de una web en “amigables” para los navegadores. Por ejemplo para convertir:

index.php?page=main&section=cursos&num=3

a algo como:

main/cursos/3

Esta segunda es más fácil de recordar para los humanos y a los buscadores les gusta más.

Trasladar un foro PHPBB a otro dominio sin perder Page-Rank

Abril 2nd, 2007 | 1 Comment | Posted in php, posicionamiento

Hace un par de días escribí un artículo sobre cómo redireccionar páginas con PHP. Ahora voy a explicar un caso más concreto. Trasladar un foro PHPBB (versión 2.0.x) a otro dominio y no perder Page-Rank. Para evitar la pérdida del pagerank es necesario hacer redirecciones del tipo 301.

En principio bastaría con redireccionar tres ficheros:

index.php
viewforum.php
viewtopic.php

Para ello hay que hacer las siguientes modificaciones:

En viewforum.php:

header( "HTTP/1.1 301 Moved Permanently" ); 
header("Location: http://www.nuevadireccion.com/foros/viewforum.php?f=" . $forum_id);

Evidentemente este código hay que añadirlo una vez se ha tomado el valor de $forum_id.

En viewtopic.php:

header( "HTTP/1.1 301 Moved Permanently" ); 
header("Location: http://www.nuevadireccion.com/foros/viewtopic.php?t=" . $topic_id);

Y en este caso hay que poner estas dos líneas después de dar el valor correcto a $topic_id.

En index.php:

header( "HTTP/1.1 301 Moved Permanently" ); 
header("Location: http://www.nuevadireccion.com/foros/");

En el index.php podemos añadir estas dos líneas al principio del fichero (después de ‘‘ evidentemente) ya que no necesitamos ninguna variable.

Tags: , , ,

Redirecciones 301 con PHP

Marzo 29th, 2007 | No Comments » | Posted in apache, php, posicionamiento

En algún post anterior hablé de cómo hacer redirecciones del tipo 301. Estas redirecciones indican que la página se ha movido permanentemente a otro sitio (lo que nos permite conservar el page rank de Google). En aquella ocasión expliqué cómo hacerlo con el fichero.htaccess y en esta ocasión voy a explicarlo cómo hacerlo en PHP.

La idea es bastante sencilla, basta con añadir estas dos líneas a nuestro script:

header( "HTTP/1.1 301 Moved Permanently" );
header("Location: http://www.nuevodominio.com");

La primera línea indica que la página se ha movido a otro sitio y la segunda reenvía al navegador (o buscador) a la nueva dirección. Podemos aprovechar que usamos PHP para redirigir con los parámetros adecuados. Por ejemplo imaginemos el siguiente caso:

Esta página en la web “vieja”:

http://www.viejodominio.com/index.php?mod=inicio&sec=3

Coincide con ésta en la página “nueva”:
http://www.nuevodominio.com/index.php?modulo=inicio&pagina=3

En esta caso bastaría poner al principio del index.php:
header( "HTTP/1.1 301 Moved Permanently" );
header("Location: http://www.nuevodominio.com/index.php?modulo=" . $_GET['mod'] . "&pagina=" . $_GET['sec']);

En la web podrás encontrar ejemplos más complejos como éste (en inglés):

http://www.zend.com/tips/tips.php?id=244&single=1

Sacar los foros PHPBB de un PHP-Nuke

Marzo 15th, 2007 | No Comments » | Posted in el-rincon-del-c, mis-proyectos, php

Después de varios ataques al PHP-Nuke de la web de El Rincón del C me decidí a usar un gestor de contenidos creado a medida y escrito desde cero (manías que tiene uno). Uno de los problemas a los que me enfrenté fue recuperar la información los foros, que usaban una versión de PHPBB integrada en PHP-Nuke. Quería seguir usando PHPBB así que no me ha quedado más remedio que separar el PHPBB del PHP-Nuke. He seguido estos pasos (sacados más o menos de aquí):

  1. Instalar desde cero unos foros PHPBB con la última versión 2.x (la 3.0 está en fase beta en el momento de escribir este post).
  2. Borrar las tablas: Auth-access, Topics, Categories, Forums, Users, Posts, Posts_text.
  3. Desde la base de datos “vieja” exportar estas tablas y volcarlas a la nueva instalación (ojo con los prefijos de las tablas). Exportar la estructura y los datos.

Hay gente que dice tener problemas con las contraseñas, pero parace que en este caso no ha habido ninguno.

Sí que he tenido algunos problemas por la estructura de la base de datos. Por ejemplo en la tabla phpbb_users faltaban dos campos: ‘user_login_tries’, ‘user_last_login_try’. Esto lo he solucionado añadíendolos a mano:

alter table phpbb_users add  `user_login_tries` smallint(5) unsigned NOT NULL default '0'
alter table phpbb_users add   `user_last_login_try` int(11) NOT NULL default '0'

También he encontrado un problema con las fechas de registro que tenían este formato:

Nov 10, 2000

y estaba almacenado en un campo con tipo varchar en lugar de estar en formato timestamp (y almacenado en un campo tipo int).

Para solucionar esto he creado un script llamado index2.php:

$sql = "select user_id, user_regdate from phpbb_users where 1";
$usuarios_query = $bd->Execute($sql);
while (!$usuarios_query->EOF)
{
	$fechaOriginal = $usuarios_query->fields['user_regdate'];
	$mesTexto = substr($fechaOriginal, 0, 3);
	$dia = substr($fechaOriginal, 4, 2);
	$agno = substr($fechaOriginal, 8, 4);
	switch($mesTexto)
	{
		case 'Jan': $mes = 1;break;
		case 'Feb': $mes = 2;break;
		case 'Mar': $mes = 3;break;
		case 'Apr': $mes = 4;break;
		case 'May': $mes = 5;break;
		case 'Jun': $mes = 6;break;
		case 'Jul': $mes = 7;break;
		case 'Aug': $mes = 8;break;
		case 'Sep': $mes = 9;break;
		case 'Oct': $mes = 10;break;
		case 'Nov': $mes = 11;break;
		case 'Dec': $mes = 12;break;
	}
	$fechaModificadaTimestamp = mktime(0, 0,0, $mes, $dia, $agno);
	$fechaModificada = date("d m Y", $fechaModificadaTimestamp);
	echo "
$fechaOriginal -> $dia $mes $agno -> $fechaModificada"; $actualizaSql = "update phpbb_users set user_regdate='" . $fechaModificadaTimestamp . "' where user_id='" . $usuarios_query->fields['user_id'] . "'"; $bd->Execute($actualizaSql); $usuarios_query->moveNext(); }

Ojo, que este script usa un API de fabricación propia, habría que hacerle alguna modificación para que funcionara sin necesidad de usar ningún API. ¿Alguien se anima?

Después de esto ya sólo queda cambiar el tipo del campo de varchar a int.

Tags: , , ,

PHPList - un excelente gestor de boletines

Marzo 5th, 2007 | 3 Comments | Posted in herramientas-para-tu-web, php, software-libre

Dada la importancia que tienen los boletines de correo para fidelizar clientes y conseguir ventas llevaba tiempo buscando una herramienta que permitiera una adecuada gestión de los mismos. Esa herramienta es PHPList.

Empecé haciendo pruebas en mis propios proyectos y quedé asombrado de sus capacidades. Después empecé a instalarlo para algunos clientes con resultados también sumamente positivos.

Algunos de los puntos fuertes de PHPList:

  • Si el envío de los correos falla (por limitaciones del servidor) se puede retomar el envío donde falló. De esta forma todos los clientes recibirán su email y nadie lo recibrá por duplicado.
  • Se puede llevar un control de rebotes de forma que los correos no válidos se eliminan de la lista. Para poder usar esta característica hace falta tener soporte IMAP en el servidor.
  • Control de clicks: una opción que dicen que aún está en fase experimental pero funciona muy bien. Permite hacer un seguimiento de los clicks que se hacen y por tanto de la efectividad del boletín. Lo único malo es que no podemos conocer en cuál de los enlaces se ha pinchado.
  • Personalización de los emails con el nombre de usuario (y otros campos que se pueden añadir).
  • Los usuarios pueden darse de baja directamente al recibir el mensaje siguiendo uno de los enlaces que se añaden automáticamente.
  • Se pueden enviar los mensajes como texto y como email.
  • Existe la posibilidad de enviar adjuntos.

Estas son sólo unas pocas de las múltiples características que se incluyen en PHPList. Más información, en inglés, aquí.

Tags: , , ,

Añadir soporte GD a Apache en Ubuntu

Marzo 2nd, 2007 | 4 Comments | Posted in apache, php, ubuntu

Vale, esta me ha costado un poco. Tenía que configurar un servidor Apache para que tuviese soprote GD para PHP y después de muchas vueltas lo he encontrado:

sudo apt-get install php5-gd

Después sólo queda reiniciar el servidor Apache:

sudo /etc/init.d/apache2 restart
Tags: , , , , ,

Reiniciar Apache en Ubuntu

Marzo 2nd, 2007 | 2 Comments | Posted in apache, php, ubuntu

Por si alguien tiene dudas de cómo se hace lo indico aquí (me lo han preguntado varios):

Reiniciar Apache:

sudo /etc/init.d/apache2 restart

Parar/Arrancar:

sudo /etc/init.d/apache2 stop
sudo /etc/init.d/apache2 start
Tags: , ,

Code Igniter - framework PHP

Febrero 27th, 2007 | 2 Comments | Posted in php, programacion

Code Igniter es un framework para PHP que he probado recientemente para un par de proyectos y me ha enamorado.

Está pensado para ofrecer un alto rendimiento, ser ligero y fácilmente instalable (puede usarse en un alojamiento compartido y no es necesario tener acceso a la línea de comando). Además, gracias a la documentación y los foros (en inglés ambos), el aprendizaje es muy rápido y en un par de horas se puede empezar a trabajar con él. Por supuesto, será necesario más tiempo para conocer su funcionamiento completo, pero enseguida pueden empezar a hacerse cosas muy interesantes.

Viene con varias librerías para gestionar el acceso a datos, sesiones de usuarios, formularios, la seguridad, etc… Además la comunidad de usuarios ha creado una serie de plugins, clases y librerías para extenderlo que lo hacer aún más interesante.

Si estás buscando un framework para PHP te recomiendo que pruebes Code Igniter.

Code Igniter

Tags: , , ,

Introducción a PHPMailer

Diciembre 3rd, 2006 | 6 Comments | Posted in herramientas-para-tu-web, php

Dado que muchos lo estáis pidiendo me he animado a escribir una pequeña introducción a PHPMailer. Lo primero es descargarnos el archivo con la última versión y descomprimirlo en el directorio de nuestro proyecto, por ejemplo en el directorio phpmailer. Para poder usar PHPMailer basta añadir:

include("phpmailer/class.phpmailer.php");

con la ruta adecuada a PHPMailer.

En este ejemplo, modificación del que aparece en la “web oficial”, se puede ver lo fácil que es usar PHPMailer:

SetLanguage('es','phpmailer/language/'))
{
	echo '

No se ha podido cargar el fichero de idioma adecuado.

';
}

// Introducimos la información del remitente del mensaje
$mail->From     = "remitente@email.com";
$mail->FromName = "Remitente";
$mail->AddReplyTo("info@site.com","Information");
// y los destinatarios del mensaje. Podemos especificar más de un destinatario
$mail->AddAddress("paco@correo.com","Paco Martínez Soria");
$mail->AddAddress("klaatu@correo.com");  // Como se puede ver aquí el nombre del destinatario es opcional
$mail->AddCC("otrodestinatario@correo.com"); // También podemos enviar con copia de carbón
$mail->AddBCC("destiantaariooculto@correo.com"); // y copia de carbón oculta

// Establecemos los parámetros del mensaje: ancho y formato.
$mail->WordWrap = 50; // ancho del mensaje
$mail->IsHTML(true); // enviar como HTML

// Añadimos el mensaje: asunto, cuerpo del mensaje en HTML y en formato
// solo texto
$mail->Subject  =  "Asunto del mensaje";
$mail->Body     =  "Este es el mensaje en formato HTML";
$mail->AltBody  =  "Y este es el mensaje de solo texto"; // Para los queno pueden recibir en formato HTML

// Añadimos los adjuntos al mensaje
$mail->AddAttachment("/var/tmp/file.tar.gz"); // podemos añadir un adjunto directamente
$mail->AddAttachment("/tmp/image.jpg", "new.jpg"); // O podemos indicar un nuevo nombre para el adjunto.

if(!$mail->Send())
{
   echo "El mensaje no se ha podido enviar

";
   echo "Error: " . $mail->ErrorInfo;
   exit;
}
echo "El mensaje se ha enviado correctamente";
?>

Este ejemplo no funcionaría si el servidor que usarmos es SMTP. En ese caso tendríamos que añadir estas líneas al principio:


$mail->IsSMTP();                                   // enviar vía SMTP
$mail->Host     = "smtp1.site.com;smtp2.site.com"; // Servidores SMTP
$mail->SMTPAuth = true;     // activar la identificacín SMTP
$mail->Username = "jswan";  // usuario SMTP
$mail->Password = "secret"; // clave SMTP

Otras funciones interesantes:

- ClearAddresses () - Borra todos los destinatarios del campo ‘TO’, es decir, todos los destinatarios que se han añadido con la función AddAddress.

- ClearAllRecipients () - Borra todos los destinatarios TO, CC y BCC.

- ClearAttachments () - Borra los adjuntos.

Existe información más completa, en inglés, con todas las funciones disponibles en:

http://phpmailer.sourceforge.net/docs/

Introducción a Prototype - un toolkit Ajax

Diciembre 2nd, 2006 | 2 Comments | Posted in ajax, php

Realmente Prototype no es sólo un framework para Ajax, es un framework para Javascript. Es bastante sencillo de usar y ligero. Existen otras opciones, como Dojo, pero yo uso habitualmente Prototype principalmente porque lo conozco desde hace más tiempo y por su sencillez (también me convenció que se usa en el proyecto de Ruby on Rails).

Voy a escribir una serie de artículos (tres en principio) para mostrar cómo usar las características Ajax de Prototype.

Lo primero es descargarse es fichero prototype.js de su web (elige la opción “just the .js please”). La instalación es sencilla, símplemente añade el fichero al directorio de tu proyecto. Yo suelo ponerlo en un directorio, por ejemplo en dist/prototype.js. Y con esto ya está listo para usar.

Este ejemplo que he preparado lo único que hace es cargar un fichero del servidor y mostrarlo en la página. Vamos a ver el código y luego lo analizamos:











Cargar texto

Cuando pinchamos en el enlace ‘Cargar texto’ se ejecuta la función cargar(). Esta función crea un objeto Ajax, definido en prototype.js, y hace una llamada. Los parámetros que usa para la llamada son:

  • url - la dirección a la que se conecta.
  • method - el tipo de llamada post o get.
  • parameter - los parámetros que se pasa a la url (en el ejemplo está en blanco).
  • onComplete - la función que se va a ejecutar cuando se finalice la llamada. Es este caso mostrarTexto.

En este ejemplo se hace una llamada a la URL: http://localhost/Readme.txt y se carga el contenido de ese fichero en el objeto originalRequest. Gracias a:

$('textoCargado').innerHTML = originalRequest.responseText;

el contenido del div textoCargado se sustituye por el contenido del fichero Readme.txt.

Nota: la función $() nos facilita acceder a cualquier elemento de la página a través de su ‘id’ (como hace getElementById, pero $() es más completa).

Como se puede apreciar es bastante sencillo usar Ajax gracias a Prototype. En la próxima entrega vamos a ver cómo hacer una llamada conectándonos a una base de datos usando PHP y Prototype.

Más información, en inglés, aquí.