NubeBlog | Web Hosting en la Nube

Archivos de Tags: php

Concrete5 supera a Joomla y WordPress

Los diseñadores web han usado por mucho tiempo Joomla y WordPress para desarrollar websites para sus clientes, pero un nuevo jugador está ganando terreno, Concrete5.

Los programadores web utilizan Joomla y WordPress como base para diseñar el website, ya que el usuario final, el cliente, no tiene nociones de como administrar o actualizar el contenido si fuera puro código HTML o PHP. Joomla y WordPress tienen interfases más amigables para actualizar texto, imágenes y administrar muchas otras funciones de manera gráfica e intuitiva. Sin embargo, cuando el website requiere de secciones muy específicas, se necesita programar en php. Es aquí donde los programadores web tienen un dolor de cabeza muy grande al utilizar Joomla o WordPress, ya están muy lejos de ser amigables a la hora de personalizar su código.

El diseñador web elige la plataforma adecuada dependiendo de las necesidades del cliente, si es un portal para crear una comunidad, probablemente elegirá Joomla. Si es un blog o se desea mucha facilidad de uso, elegirá Wordpress.

Hoy en día Concrete5 está ganando terreno sobre estas dos plataformas. Si pensaba que WordPress es sencillo, Concrete5 lo es todavía más. A diferencia de los otros, que están pensados de desarrollador a desarrollador, olvidando al usuario final, o viceversa… Concrete5 es amigable para el programador, el diseñador, y para el usuario final.

Para el diseñador, puede echar a volar su imaginación y diseñar lo que sea, y cualquier plantilla de Internet se puede convertir a plantilla de Concrete5, en menos de 5 minutos.

Para el desarrollador, Concrete5 destaca mucho sobre otros sistemas. Basta con tomar la plantilla de diseño del diseñador, agregar un par de líneas de código, y listo, la plantilla se vuelve editable vía web con cualquier navegador. Otra gran fortaleza es que se puede combinar PHP en cualquier página de Concrete5 sin interferir con el funcionamiento base de Concrete5, lo cual es muy difícil de hacer en la mayoría de los CMS. Si por alguna razón debes modificar un poco el código fuente de Concrete5, no hay problema puedes realizar una copia y modificarla, el software usará tu copia, y la innovación consiste en que al momento de actualizar la versión del software, respeta todos los cambios que hayas hecho en el código fuente, y no se sobrescribe como pasa en otros sistemas, lo cual era muy tedioso. Otra de las grandes bondades para el desarrollador, es que viene con todo y una API o framework integrada. Es decir que trae sus propias librerías para que puedas usarlas y realizar muchas cosas de manera programática rápidamente, tales como leer información de usuarios, agregar páginas, escalar imágenes, etc. Y por si esto fuera poco, Concrete5 es muy eficiente, siendo más rápido incluso que WordPress salido de la caja, ya que viene con un sistema de caché de manera predeterminada.

Para el usuario final, ya no es necesario entrar a una sección de administración para editar el contenido de cada página, sino que simplemente se navega a la página que se desea editar, clic en el botón de Editar, y el contenido de la página puede ser editado ahí mismo, moverse de lugar, y hacer muchas cosas más como insertar videos, un formulario, una encuesta, comentarios, galería de imágenes, etc. Esto hace que actualizar la información del sitio sea muy intuitivo, fácil y rápido para el cliente.

Aquí se muestra una de las características más fuertes de Concrete5, que es la edición en línea directamente en la página.

Concrete5 tiene otras fortalezas, tal como un gestor multimedia integrado, registro de usuarios complementado con un sistema de permisos muy completo, la estructura de navegación es muy fácil de crear, y se pueden instalar plugins directamente desde su panel de administración. Una desventaja que cabe destacar es que solo hay unos cuantos cientos de plugins. Sin embargo, utilizando su framework, y la habilidad de utilizar php en todas sus páginas, lo hace una opción bastante viable para crear websites muy completos, bastante personalizados, y lo mejor de todo, es open source. Así que si eres un diseñador o programador web y sufres con las restricciones de programación y complejidad de Joomla y WordPress, entonces Concrete5 es para ti.

Si deseas utilizar Concrete5, lo puedes autoinstalar con un clic desde nuestro panel de control, o pregunta a nuestro staff para su instalación. Si eres diseñador web, contacta a nuestro staff, tenemos ofertas especiales para ti.

Cómo migrar tus aplicaciones de PHP4 a PHP5

En la versión 5 se han mejorado significativamente las capacidades de PHP. Pero muchos desarrolladores todavía no pueden hacer uso de sus bondades por el poco soporte que aún existe para esta versión. Zend nos anuncia que dejará de dar soporte a la versión 4 dentro de muy poco tiempo y con esto nos obliga a migrar hacia la última versión estable del lenguaje, PHP 5.

PHP 4, descanse en paz

Aproximadamente hace 3 años fue liberado PHP 5. En estos tres años ha demostrado tener muchas mejoras con respecto a PHP 4.

PHP 5 es rápido, estable y productivo por lo que los desarrolladores del lenguaje dejarán de entregarnos nuevas versiones de PHP 4, que terminará en la 4.4 y fue descontinuado el último día del año 2007; sin embargo se mantendrán publicando actualizaciones críticas de seguridad para éste hasta agosto del 2008.

Es por esto que los desarrolladores nos recomiendan emplear lo que queda de año para migrar nuestras aplicaciones hechas en PHP 4 hacia la versión 5 y precisamente ese es el objetivo de este artículo, ayudar en el proceso de migración con algunos consejos y soluciones.

¿De dónde obtengo PHP 5?

La última versión estable se puede descargar en el sitio oficial, donde encontraremos disponible el código fuente listo para compilar y el binario para realizar nuestra instalación sobre Windows. También se puede instalar fácilmente desde el gestor de paquetes que utilicemos en nuestra distribución de Linux.

Para las distribuciones basadas en Debian es recomendable utilizar apt-get o aptitude y para las basadas en paquetes de instalación RPM pueden bajarse la última versión utilizando el buscador de paquetes.

¿Qué ha cambiado en PHP 5?

Antes de migrar cualquiera de nuestras aplicaciones es necesario conocer los cambios que han ocurrido en PHP 5 con respecto a versiones anteriores y de esta forma realizar los preparativos necesarios para que la migración sea exitosa.

Esta versión de PHP tiene integrado el Motor Zend 2, con lo que ha mejorado significativamente el rendimiento y en general todas las capacidades de PHP 5; ya que éste fue hecho especialmente para ser más rápido que el anterior.

Además, los desarrolladores han tenido en cuenta la migración, por lo que han tomado las precauciones necesarias para que un código bien escrito con PHP 4, sea perfectamente comprendido por el motor de PHP 5, y de esta forma hacernos este proceso más fácil, así como una nueva directiva para habilitar la compatibilidad con la versión anterior que ha sido agregada al archivo de configuración y de la que hablaremos más adelante.

La mayoría del código PHP 4 que existe actualmente debe correr sin problemas en el motor PHP 5. Pero siempre es recomendable conocer algunos cambios incompatibles con versiones anteriores y probar el código antes de la migración en los entornos de producción.

Cambios en CGI y CLI

El entorno CLI ha sufrido algunas modificaciones, al igual que los nombres del archivo CGI. En PHP 5 el archivo CGI es php-cgi.exe (anteriormente php.exe) y la versión CLI está ubicada en el directorio principal (anteriormente se encontraba en cli/php.exe).

También se introdujo un nuevo módulo, el php-win.exe que es similar a la versión CLI, excepto que php-win.exe no genera ninguna salida, por lo que no provee una consola. Mostrando un comportamiento similar al de php-gtk.

La versión CLI siempre define las variables globales $argv y $argc, sin importar las directivas establecidas en php.ini. Incluso teniendo el parámetro register_argc_argv en off no tendrá efecto en la versión CLI.

Si está usando PHP en modo CGI, será necesario realizar los cambios correspondientes en su servidor web. En Apache deberá modificar el archivo de configuración como se muestra a continuación:

# cambie esta línea:
Action application/x-httpd-php "/php/php.exe"
# por esta:
Action application/x-httpd-php "/php/php-cgi.exe"

En el servidor web de Windows: IIS deberá configurar los CGI como se detalla bajo el subtítulo “Configuración de Internet Information Services” en el artículo Cómo publicar páginas PHP en Internet Information Services publicado en esta web.

Modificaciones en los archivos de configuración

No solo los CGI y CLI tuvieron modificaciones, también los módulos ISAPI de esta versión cambiaron sus nombres de php4xxxx a php5xxxx, por lo que será necesario realizar cambios en algunos archivos de configuración del servidor web. En Apache deberá realizar las modificaciones como se muestra en el recuadro siguiente:

# cambie esta línea:
LoadModule php4_module /php/sapi/php4apache2.dll
# por esta:
LoadModule php5_module /php/php5apache2.dll

Nuevas funciones

En esta versión de PHP se han agregado algunas nuevas funciones para: operaciones con matrices, procesamiento de datos utilizando InterBase, conversión de juegos de caracteres con iconv, manipulación de stream, trabajo con fecha y hora, cadenas y otras varias. También es importante destacar que la extensión Tidy, para manipulación de documentos HTML, ha cambiado su API completamente.

Directivas en el archivo de configuración

Se han agregado al archivo de configuración php.ini nuevas directivas que se describen a continuación:

  • mail.force_extra_parameters: Obliga a que se agreguen los parámetros especificados como parámetros extra al ejecutable de sendmail. Estos parámetros siempre reemplazan el valor del quinto parámetro de mail(), incluso en modo seguro.
  • register_long_arrays: Habilita/deshabilita el registro de las largas variables obsoletas $HTTP_*_VARS.
  • session.hash_function: Selecciona una función de resumen criptográfico (MD5 o SHA-1).
  • session.hash_bits_per_character: Define cuántos bits deben almacenarse en cada caracter cuando se convierten datos binarios de hash a algo más legible (de 4 a 6).
  • zend.ze1_compatibility_mode: Habilita el modo de compatibilidad con el Motor Zend 1 (PHP 4).

Nuevo modelo de objetos

En versiones previas de PHP, los objetos eran manejados como tipos primitivos, por ejemplo enteros y cadenas. En la versión 5 el manejo de objetos en PHP ha sido re-escrito por completo, permitiendo una mejora en rendimiento y muchas características nuevas.

La desventaja de este método era que semánticamente el objeto completo era copiado cuando una variable era asignada, o pasada como parámetro a un método. En el nuevo enfoque, los objetos son referenciados por gestor, y no por valor. Puede pensarse en el gestor como un identificador de objeto.

Los desarrolladores del lenguaje han tenido en cuenta que muchos programadores de PHP no son conscientes siquiera de los detalles que implican las copias en el modelo antiguo de objetos y, por lo tanto, han implementado la versión 5 de tal forma que la mayoría de las aplicaciones funcionarán sin problemas, o con muy pocas modificaciones.

Trabajo con bases de datos

PHP 5 sufrió cambios significativos con relación a la manipulación de bases de datos con MySQL. Los programadores de Zend decidieron no incluir las bibliotecas de cliente en esta versión porque la mayoría de los sistemas actuales ya vienen con esta librería instalada, además, versiones múltiples de ésta en el mismo sistema pueden presentar problemas realmente grandes.

Otro motivo importante para este cambio fue que MySQL utiliza licencia GPL mientras que PHP está bajo una licencia BSD/Apache y este último tipo de licencia no puede distribuir proyectos realizados en el primero. En los siguientes párrafos mostramos la forma de configurar su PHP 5 para trabajar con bases de datos MySQL.

¿Por qué no funciona MySQL en PHP 5?

MySQL está perfectamente soportado en la versión 5 de PHP, el único cambio es que no se encuentra habilitado por defecto.

Para habilitar MySQL en Linux se deberá compilar el código estableciendo en la línea configure la opción --whith-mysql[=DIRECTORIO]; donde DIRECTORIO es la ruta de nuestra instalación de MySQL, por ejemplo: --with-mysql=/usr

Para habilitar MySQL en Windows sólo es necesario editar el archivo php.ini y habilitar el recurso DLL php_mysql.dll que en la versión anterior no existía porque este soporte estaba incorporado en los binarios del motor. También debemos asegurarnos que el archivo libmysql.dll se encuentra en la carpeta de archivos del sistema. Por defecto esta carpeta es: c:\windows\system32\.

Lecturas recomendadas

Fuente: www.maestrosdelweb.com

Registro y reconocimiento de usuarios con PHP

En esta oportunidad crearemos un sistema de registro de usuarios utilizando a PHP.

¿En que consiste? y ¿para que sirve? muy sencillo, en algunas webs como
por ejemplo esta, queremos interactuar con los usuarios, deseamos que estos
puedan enviar scripts al sistema para ayudar a crecer la coleccion de scripts
que disponemos, pero deseamos llevar un control sobre los autores de los scripts
asi que no cualquiera puede enviar scripts, para hacerlo tienes que registrarte
y hacer el respectivo “ingreso” para que el sistema te reconosca
y te deje enviar scripts, archivos y articulos como este, de otra manera no
puedes hacer ninguna de estas acciones.

¿Pero como se logra esto?, se hace teniendo en una base de datos una tabla de usuarios(Podria
hacerse con archivos, aunque seria un poco inseguro) y por medio de archivos
PHP y manejo de sesiones(session) o por “cukis”(cookies).

En este articulo explicare como crear un sistema de registro y reconocimiento de usuarios teniendo
una tabla en una base de datos MySql y por medio de “cukis”(COOKIES)
para nuestra web de una manera sencilla.

A la hora de crear un sistema de registro de usuarios siempre pensamos en lo mismo:

registro + login
+ reconocimiento

Queremos que los usuarios se registren dejando sus datos y puedan acceder a algunas zonas
de la pagina y sea reconocido por nuestra pagina(por ejemplo “bienvenido
jlmm” o “bienvenido visitante” en caso de no estar ingresado
(o registrado) en el sistema).

Muchos piensan en crear un sistema de usuarios por que les parece “bonito”, pero hay
pocos que realmente lo necesitan(lo digo por experiencia con dichas personas),
y cuando les haces las dos preguntas:

1- ¿que beneficios tienen los usuarios registrados con respecto a los demas?

2- ¿que zonas de tu web quieres que sean de acceso restringido y PORQUE?

La mayoria no es capaz de responder la primera pregunta, y es que antes de aventurarnos a crear
un sistema de usuarios para nuestra web debemos de pensar si realmente vale
la pena, ya que las tematicas de la web y sus contenidos no siempre son adecuados
para tener un sistema de registro de usuarios.

Para ello respondemos las 2 preguntas, en el caso de misCODIGOS.com serian:

1- ¿que beneficios tienen los usuarios registrados con respecto a los demas?

R://Posibilidad de enviar scripts, articulos y archivos al sistema, al igual
que disponibilidad de un panel de control entre otros.

2- ¿que zonas de tu web quieres que sean de acceso restringido y PORQUE?

R://Quiero que solo los usuarios que esten registrados puedan enviar scripts/articulos/archivos,
ya que asi puedo llevar un mejor cotrol sobre los mismos y prevenir el envio
indiscriminado de scripts/articulos/archivos al sistema por parte de los usuarios.

Ya tenemos nuestras razones para crear nuestro sistema de registro de usuarios, claro que pueden
haber muchas razones dependiendo del tipo de web, podrian ser por ejemplo para
que solo usuarios registrados puedan bajar software/musica/videos/etc, para
restringir el acceso a ciertas zonas de la web “obligando” al usuario
a registrarse para poder “ver” dicha zona, etc…

Siempre teniendo en cuenta que las razones sean validas y que no molesten al usuario,
ya que en mi caso hace algunos meses me encontre con una web de “scripts”
la cual para poder ver los “scripts” tenias que registrarte, obviamente
lo que hice fue salir de esa web y olvidarla (por ello no les puedo dar la direccion),
tenemos que tener muy en cuenta que zonas restringir a usuarios registrados
ya que el usuario en general prefiere la comodidad y en este caso que les comento
de webs con recursos y scripts para webmasters hay muchas (pero ninguna como
esta :-P ) y hay que buscar siempre la comodidad de los usuarios.

Ahora a lo que vinimos, crearemos nuestro sistema de registro de usuario, lo primero que debemos pensar
es que datos debera introducir el usuario para registrarse, como siempre deberan
de haber aunque sea dos campos basicos:

  • nick
  • password

Lo mas común para identificar a los usuarios es por medio de nick/password,
aunque también podria ser email/password, para este articulo utilizare
el primero(nick/password).

Ya sabemos que nuestra tabla de “usuarios” tendra esos dos campos:

CREATE TABLE usuarios (
      id bigint(7) NOT NULL auto_increment,
      nick char(100) NOT NULL,
      password char(100) NOT NULL,
      KEY id (id))

¿Pero
son suficientes?, tambien seria bueno tener el email de los usuarios en caso
de querer enviar informacion a los usuarios registrados y tener el nombre de
dichos usuarios para personalizar dichos emails o mensajes que le demos al usuario
en la pagina(ejemplo “hola jorge luis”), entonces nuestra tabla creceria
un poco:

CREATE TABLE usuarios (
      id bigint(7) NOT NULL auto_increment,
      nick char(100) NOT NULL,
      password char(100) NOT NULL,
      nombre char(255) default NULL,
      email char(100) default NULL,
      KEY id (id))

Listo, ya tenemos la estructura de nuestra tabla de usuarios, es pequeña y sencilla
pero para efectos prácticos y de aprendizaje es perfecta (eso depende
de ti, según lo que desees saber de tus usuarios).

Ahora viene lo sencillo,
crear el sistema de registro de usuarios, un formulario y una aplicacion que
agregue al nuevo usuario a la base de datos, para ello crearemos un formulario
del tipo:

FORM ACTION="registrar.php" METHOD="post">
      Nick : <INPUT TYPE="text" NAME="nick" SIZE=20 MAXLENGTH=20>
      <BR>
      Email: <INPUT TYPE="text" NAME="email" SIZE=28 MAXLENGTH=100>
      <BR>
      Password: <INPUT TYPE="password" NAME="password"
      SIZE=28 MAXLENGTH=20>
      <BR>
      Nombre: <INPUT TYPE="text" NAME="nombre" SIZE=28
      MAXLENGTH=255>
      <BR>
      <INPUT TYPE="submit" VALUE="Registrar">
      </FORM>

Y ahora necesitamos una aplicacion que lo procese (registrar.php), por motivos
practicos haremos algo sencillo sin demasiadas comprobaciones (dependera de
ti mejorarlo si quieres algo mas personalizado), primero el codigo luego la
explicacion:

<?php
//AQUI CONEXION O include() DE ARCHIVO DE CONEXION CON BASE DE DATOS.
function quitar($mensaje)
{
$mensaje = str_replace("<","<",$mensaje);
$mensaje = str_replace(">",">",$mensaje);
$mensaje = str_replace("\'","'",$mensaje);
$mensaje = str_replace('\"',""",$mensaje);
$mensaje = str_replace("\\\\","\",$mensaje);
return $mensaje;
}

if(trim($HTTP_POST_VARS["nick"]) != "" && trim($HTTP_POST_VARS["email"]) != "")
{
$sql = "SELECT id FROM usuarios WHERE nick='".quitar($HTTP_POST_VARS["nick"])."'";
$result = mysql_query($sql);
if($row = mysql_fetch_array($result))
{
echo "Error, nick escogido por otro usuario";
}
else
{
$sql = "INSERT INTO usuarios (nick,password,nombre,email) VALUES (";
$sql .= "'".quitar($HTTP_POST_VARS["nick"])."'";
$sql .= ",'".quitar($HTTP_POST_VARS["password"])."'";
$sql .= ",'".quitar($HTTP_POST_VARS["nombre"])."'";
$sql .= ",'".quitar($HTTP_POST_VARS["email"])."'";
$sql .= ")";
mysql_query($sql);
echo "Registro exitoso!";
}
mysql_free_result($result);
}
else
{
echo "Debe llenar como minimo los campos de email y password";
}
mysql_close();
?>

Al principio no he echo conexion con la base de datos pero he puesto el comentario “//AQUI CONEXION O include() DE ARCHIVO DE CONEXION CON BASE DE DATOS.”, ya que la conexion depende de ti, si no sabes como hacer una conexion te aconsejo
buscarte un manual antes de estar queriendo hacer un sistema como este.

Vemos que he declarado una funcion, llamada quitar($mensaje), la cual recibe el parametro “mensaje”,
esta funcion se encargara de deshabilitar el codigo html(“<” y
“>”) al reemplazarlos por su respectivo codigo(“<”
y “>”), ademas de reemplazar el apostrofe(‘) y las comillas dobles(“)
por sus respectivos codigos HTML, esto para no tener conflictos con la instruccion
sql, y al final retorna la cadena con las nuevas modificaciones en caso de haberlas:

function quitar($mensaje)
      {
      $mensaje = str_replace("<","<",$mensaje);
      $mensaje = str_replace(">",">",$mensaje);
      $mensaje = str_replace("\'","'",$mensaje);
      $mensaje = str_replace('\"',""",$mensaje);
      $mensaje = str_replace("\\\\","\",$mensaje);
      return $mensaje;
      }

Ahora
comprobaremos que los campos de nick y password que seran los “requeridos”
como minimo para completar el registro no esten vacios, para ello utilizamos
la funcion “trim()” la cual quita los espacios al comienzo y al final
de la cadena, por lo que en caso de ser una cadena vacia o con solo espacios
en blanco retornara “”, en caso de ser valido continuamos con el registro,
de lo contrario retornamos un mensaje de error:

if(trim($HTTP_POST_VARS["nick"]) != ""
      && trim($HTTP_POST_VARS["password"]) != "")

Ahora suponiendo que las cadenas estaban correctas comprobaremos que el nick seleccionado
por el usuario no exista en la base de datos, para ello hacemos una instruccion
sql para pedirle a la base de datos que nos retorne la fila donde el nick sea
igual al nick introducido con el usuario(quitandole el apostrofe, html y demas
con la funcion quitar()):

$sql = "SELECT id FROM usuarios WHERE nick='".quitar($HTTP_POST_VARS["nick"]."'";
      $result = mysql_query($sql);

En caso de existir dicho nick, osea que nos devuelve una fila:

if($row = mysql_fetch_array($result))

Mostraremos un mensaje de error al usuario informandole del “incidente”, de lo
contrario continuaremos con el proceso de registro.

Ahora
lo que hacemos es simplemente una instruccion sql donde insertamos en la tabla
usuarios el nick, password, nombre y email introducidos por el usuario en el
formulario, a todos estos les quitamos el html, apostrofe y demas haciendo uso
de nuestra instruccion “quitar()”, y mostramos un mensaje de “exito” al usuario:

$sql = "INSERT INTO usuarios (nick,password,nombre,email)
      VALUES (";
      $sql .= "'".quitar($HTTP_POST_VARS["nick"])."'";
      $sql .= ",'".quitar($HTTP_POST_VARS["password"])."'";
      $sql .= ",'".quitar($HTTP_POST_VARS["nombre"])."'";
      $sql .= ",'".quitar($HTTP_POST_VARS["email"])."'";
      $sql .= ")";
      mysql_query($sql);
      echo "Registro exitoso!";

Nota:Por efectos practicos hemos echo esto muy sencillo, podrian agregar más
comprobaciones como la del email o manejo de errores mysql.

Tambien podria hacerse más seguro mediante el uso de la funcion de encriptacion
md5() para el password, aunque se esta haciendo lo mas sencillo posible ya que
la finalidad de este articulo es la de enseñar como reconocer a los usuarios,
de ustedes dependen estos “detalles” a la hora de “depurar” este codigo.

Bien, listo ya tenemos la aplicacion de registro, ¿pero y ahora que?, que hago
con todos esos usuarios, ahora necesitamos que los usuarios ingresen y sean
“reconocidos” y como lo dije lo haremos por medio de cookies.

Crearemos un formulario HTML para que los usuarios introduscan su nick y password al igual que deberemos
de realizar una aplicacion ingresar.php que sera la encargada de procesar si
el usuario es valido y darle “ingreso” al sistema por medio de una
cookie.

Es recomendable tener este archivo en la carpeta raiz de nuestra web, el formulario html seria algo
asi:

<FORM ACTION="ingresar.php" METHOD="post">
      Nick : <INPUT TYPE="text" NAME="nick" SIZE=20 MAXLENGTH=20>
      <BR>
      Password: <INPUT TYPE="password" NAME="password"
      SIZE=28 MAXLENGTH=20>
      <BR>
      <INPUT TYPE="submit" VALUE="Ingresar">
      </FORM>

Y
ahora el codigo de nuestra aplicacion ingresar.php, luego la explicacion:

<?php 

//AQUI CONEXION O include() DE ARCHIVO DE CONEXION CON BASE DE DATOS.

function quitar($mensaje)
{
$mensaje = str_replace("<","<",$mensaje);
$mensaje = str_replace(">",">",$mensaje);
$mensaje = str_replace("\'","'",$mensaje);
$mensaje = str_replace('\"',""",$mensaje);
$mensaje = str_replace("\\\\","\",$mensaje);
return $mensaje;
}

if(trim($HTTP_POST_VARS["nick"]) != "" && trim($HTTP_POST_VARS["password"]) != "")
{
$nickN = quitar($HTTP_POST_VARS["nick"]);
$passN = quitar($HTTP_POST_VARS["password"]);

$result = mysql_query("SELECT password FROM usuarios WHERE nick='$nickN'");
if($row = mysql_fetch_array($result))
{
if($row["password"] == $passN)
{
//90 dias dura la cookie
setcookie("usNick",$nickN,time()+7776000);
setcookie("usPass",$passN,time()+7776000);
?>
Ingreso exitoso, ahora sera dirigido a la pagina principal.
<SCRIPT LANGUAGE="javascript">
location.href="index.php";
</SCRIPT>
<?
}
else
{
echo "Password incorrecto";
}
}
else
{
echo "Usuario no existente en la base de datos";
}
mysql_free_result($result);
}
else
{
echo "Debe especificar un nick y password";
}
mysql_close();
?>

Bien, arriba ya explique que debes de realizar la conexion y explique el funcionamiento
de la funcion quitar($mensaje), asi que saltemos hasta el primer “if”.

Lo primero que hacemos es comprobar que los campos de “nick” y “password” para
que no esten vacios, ya sabemos para que sirve trim() asi que no lo repetire:

if(trim($HTTP_POST_VARS["nick"]) != ""
      && trim($HTTP_POST_VARS["password"]) != "")

Asi que continuamos suponiendo que todo este bien, ahora lo que hacemos es quitarle
el html, apostrofe comillas y demas al nick y password enviados por el usuario
para su comprobacion con la base de datos, para ello utilizamos la funcion quitar($mensaje)
que explicamos antes, y guardamos las nuevas cadenas en dos nuevas variables:

nickN = quitar($HTTP_POST_VARS["nick"]);
      $passN = quitar($HTTP_POST_VARS["password"]);

Ahora ejecutamos una instruccion sql, en la cual le pedimos a la base de datos que
de la tabla usuarios nos devuelva la fila cuyo nick corresponda por el enviado
por el usuario:

$result = mysql_query("SELECT password FROM usuarios
      WHERE nick='$nickN'");

Si devuelve una columna quiere decir que el nick SI existe en la base de datos,
de lo contrario devolvemos un mensaje de error:

if($row = mysql_fetch_array($result))
      {
      ...
      }
      else
      {
      echo "Usuario no existente en la base de datos";
      }

Ahora continuamos con el proceso suponiendo que el usuario exista en la base de datos
ahora debemos comprobar que el password sea correcto, para ello hacemos una
simple comparacion, si es correcto continuamos de lo contrario mostramos el
mensaje de password incorrecto:

if($row["password"] == $passN)
      {
      ...
      }
      else
      {
      echo "Password incorrecto";
      }

Ahora suponiendo que el password es correcto continuamos y lo proximo a hacer es establecer
las cookies de nick y password (Las cuales nombramos “usNick”/”usPass” y contienen el nick y password respectivamente) en la maquina del usuario, informamos
que se ha realizado correctamente el login y lo enviamos a la pagina principal,
una vez mas recalco que estamos haciendo esto lo mas sencillo posible, de ti
depende personalizar y mejorar los mensajes :

setcookie("usNick",$nickN,time()+7776000);
      setcookie("usPass",$passN,time()+7776000);
      ?>
      <SCRIPT LANGUAGE="javascript">
      alert("Ingreso exitoso");
      location.href="index.php";
      </SCRIPT>
      <?

Listo, el usuario ya tiene las cookies en su sistema, ¿pero ahora que?, como
hacemos para comprobar en las paginas que queramos si el login es correcto,
osea que el usuario posee las cookies y son validas?.

Para ello crearemos un ultimo archivo, lo llamaremos login.php, este se encargara de leer las cookies
y decirnos si el usuario es un usuario registrado y que ha echo el respectivo “ingreso” al sistema, el contenido de dicho archivo seria el siguiente:

<?php
      $loginCorrecto = false;
      $idUsuarioL;
      $nickUsuarioL;
      $emailUsuarioL;
      $nombreUsuarioL; 

if(isset($HTTP_COOKIE_VARS["usNick"]) && isset($HTTP_COOKIE_VARS["usPass"]))
{
$result = mysql_query("SELECT * FROM usuarios WHERE nick='".$HTTP_COOKIE_VARS["usNick"]."' AND password='".$HTTP_COOKIE_VARS["usPass"]."'");

if($row = mysql_fetch_array($result))
{
setcookie("usNick",$HTTP_COOKIE_VARS["usNick"],time()+7776000);
setcookie("usPass",$HTTP_COOKIE_VARS["usPass"],time()+7776000);
$loginCorrecto = true;
$idUsuarioL = $row["id"];
$nickUsuarioL = $row["nick"];
$emailUsuarioL = $row["email"];
$nombreUsuarioL = $row["nombre"];
}
else
{
//Destruimos las cookies.
setcookie("usNick","x",time()-3600);
setcookie("usPass","x",time()-3600);
}
mysql_free_result($result);
}
?>

Lo primero que hacemos es declarar unas variables que utilizaremos para guardar
los datos del usuario en caso de tener las cookies en su sistema y de estas
ser correctas:

$loginCorrecto = false;
      $idUsuarioL;
      $nickUsuarioL;
      $emailUsuarioL;
      $nombreUsuarioL;

Hay una variable boleana que tenemos que mirar de cerca y es la de $loginCorrecto
ya que esta sera la que utilizaremos para comprobar el login en nuestros archivos,
mas adelante veremos como.

Seguidamente lo que hacemos es comprobar que las cookies existan, si no existen pues no hay problema
simplemente no hay “ingreso” :

if(isset($HTTP_COOKIE_VARS["usNick"]) &&
      isset($HTTP_COOKIE_VARS["usPass"]))

Ahora lo que hacemos es una sentencia sql, en la cual le pedimos a la base de datos
que nos devuelva la fila donde el nick y password correspondan al nick y password
guardado en las cookies:

$result = mysql_query("SELECT * FROM usuarios WHERE
      nick='".$HTTP_COOKIE_VARS["usNick"]."' AND password='".$HTTP_COOKIE_VARS["usPass"]."'");

Si ese nick y password corresponden a una fila en la base de datos esto quiere
decir que son correctos de lo contrario la informacion de las cookies esta mal
y debemos destruirlas:

if($row = mysql_fetch_array($result))
      {
      ...
      }
      else
      {
      //Destruimos las cookies.
      setcookie("usNick","x",time()-3600);
      setcookie("usPass","x",time()-3600);
      }

Si la informacion es correcta procedemos con el ingreso, establecemos de nuevo
las cookies con lo que se actualiza el tiempo de destruccion a otros noventa
dias apartir de ahora:

setcookie("usNick",$HTTP_COOKIE_VARS["usNick"],time()+7776000);
      setcookie("usPass",$HTTP_COOKIE_VARS["usPass"],time()+7776000);

Seguido de esto establecemos la variable $loginCorrecto a “true”, y las otras
variables las llenamos con la informacion del usuario:

$loginCorrecto = true;
      $idUsuarioL = $row["id"];
      $nickUsuarioL = $row["nick"];
      $emailUsuarioL = $row["email"];
      $nombreUsuarioL = $row["nombre"];

Listo ya tenemos nuestro archivo “login.php”, ahora ¿como lo utilizamos?,
bien supongamos que queremos en nuestro “index.php” darle la bienvenida
al usuario en caso de estar ingresado en el sistema deseamos saludarlo por su
nick o nombre en caso contrario lo saludaremos como visitante, para ello tendriamos
que incluir el archivo “login.php” al comienzo de nuestro archivo
“index.php” asi:

Nota:Antes de incluir el “login.php” debe recordar realizar la conexion con la base de datos,
de lo contrario obtendra errores.

<?php
      //AQUI CONEXION O include() DE ARCHIVO DE CONEXION CON BASE DE DATOS.
include("login.php");
...

Con eso el “login.php” se encargara de realizar las acciones que vimos
arriba, ahora en nuestro “index.php” donde queramos saludar al visitante
ponemos lo siguiente:

... if($loginCorrecto)
{
echo "Estas identificado en el sistema como ".$nickUsuarioL;
}
else
{
echo "Bienvenido visitante, el sistema no te ha reconocido";
}
...

Como ven, hicimos uso de la variable $loginCorrecto la cual sera “true”
en caso de que el usuario fuera reconocido por el sistema, de lo contrario sera
“false”.

Y asi podemos usarlo en muchas areas, supongamos que tenemos una seccion donde solo pueden accesar
los usuarios registrados, la llamaremos “restringida.php”, entonces lo que hariamos para prevenir que usuarios no registrados vean el contenido seria algo asi:

<?php
      //AQUI CONEXION O include() DE ARCHIVO DE CONEXION CON BASE DE DATOS. 

include("login.php");

if($loginCorrecto)
{
echo "Aqui el contenido solo para usuarios registrados";
}
else
{
echo "El sistema no lo ha identificado, solo los usuarios registrados tienen acceso a esta area";
}
?>

Eso es todo, espero haya quedado claro. PD: Sobre el proceso de “logout”
o “salir” no lo explico ya que es algo muy sencillo, simplemente se
“borran” las cookies.

Fuente: www.maestrosdelweb.com

Ruby on Rails vs PHP: una falsa comparación

Una nueva tecnología para el desarrollo de sitios Web emerge pero… ¿para destronar a PHP? Este artículo trata principalmente de presentar una visión con respecto a un tema que necesitan ser debatido.

El mundo del desarrollo Web está un tanto convulsionado. Indudablemente algo esta cambiando, y muy fuertemente, en la concepción de los mismos. AJAX, XHTML y Web 2.0, Firefox o Internet Explorer; XML, XSLT, SGML.

La W3C con sus cada vez mas numerosos estándares; Web Services, Metodologías Ágiles y Frameworks por doquier; PHP, JSP, ASP… y entre todo, 3 palabras que asoman con fuerza: Ruby On Rails (RoR).

Mucho se ha hablado, y se esta hablando de esta nueva tecnología, sobre todos de sus bondades a la hora de encarar proyectos Web. Este artículo se trata principalmente de una opinión, de mi opinión respecto a un tema de esos que necesitan ser debatidos. Comencemos.

La verdadera medida de Ruby On Rails

Primer punto, fundamental por cierto: Ruby On Rails es la conjunción de dos componentes. Por un lado tenemos Ruby (un lenguaje de programación orientado a objetos), y por el otro lado tenemos Rails (un Framework más para dicho lenguaje, como Nitro/Og o RubyEventMachine), que implementa los patrones de diseño MVC y ActiveRecord, entre sus principales características.

Parecería ser que la polémica de moda es: ¿PHP o Ruby On Rails?

Analizando distintas opiniones sobre el tema concluí con que parecería ser, no está del todo claro este punto.

No podemos comparar un lenguaje de programación con un framework para un lenguaje de programación

¿Por qué se genera esta falsa comparación?

La respuesta parecería estar en la misma empresa desarrolladora de Rails. 37signals se encarga de venderlo como la solución a los complicados, extensos y tediosos proyectos utilizando tecnología J2EE.

De solo recordar la ya famosa foto publicitaria “RoR VS. J2EE” (debajo) entendemos claramente a lo que 37signals apunta. Entonces, acomodando los tantos: Por la misma razón que no es válida la comparación RoR vs. PHP, no es valida la comparación RoR vs. J2EE (aunque tiene un mayor sentido).

En este caso, habría que hilar un poco mas fino en J2EE, tomando lo que concierne estrictamente a desarrollos Web (Servlets, JSP, Struts, etc.).

De todas formas, le doy más crédito a esta comparación debido a que J2EE engloba muchas tecnologías: el lenguaje Java junto a otros componentes (Struts e Hibernate entre ellos, buenos puntos de comparación para el MVC y el ActiveRecord de RoR).

La necesidad de un Framework de facto para PHP

Justamente la principal causa del error de comparación de PHP con Ruby On Rails es que al último se lo ve casi como a la misma cosa, favorecido por una baja popularidad de Ruby y una gran explosión de Rails.

Por el contrario, la situación de PHP es muy distinta. La propia naturaleza de PHP como un lenguaje extremadamente liberal, no lo ata con ninguna tecnología extra. Sin embargo, la mejora del modelo de OOP en PHP5 trajo aparejado un número importante de Frameworks (Cake, PRADO, Symfony, etc.) que se van agregando al lote del Zend Framework, aunque a decir verdad, ninguno logra imponerse fuertemente sobre el resto.

El claro objetivo del Zend Framework es desembarcar para quedarse en el mundo Enterprise, y poco a poco se va perfilando como el Framework de referencia.

Dada esta situación, correctas comparaciones podrían ser:

  • PHP On Zend Framework vs. Ruby On Rails
  • PHP on Cake vs. Ruby On Rails
  • PHP on Symfony vs. Ruby On Rails… etc.

Por otro lado, el concepto de Rails como Framework MVC + ActiveRecord, ideal para el desarrollo ágil de sitios Web 2.0 (palabras de los autores), no es la panacea universal ni la solución definitiva, y encontramos soluciones similares en otros lenguajes:

  • Cake (PHP). Anteriormente citado
  • Django (Python)
  • Trails (Java)
  • entre otros…

Que funcionan tan bien o inclusive mejor que RoR, dependiendo del sistema con el que estamos lidiando.

La batalla publicitaria

La realidad es que 37signals en su campaña publicitaria no sale a atacar agresivamente a PHP, como si lo hace con J2EE. Evidentemente, no lo tiene como competidor, o no deja entreverlo según lo que pude apreciar personalmente.

Por el lado de PHP, Andi Gutmans tampoco considera a RoR como un competidor directo, aunque hace una, a mi entender, muy interesante apreciación: “Sentimos que PHP con Zend Framework es superior a RoR, y mientras otras personas lo vean de otra forma en cuanto a sus funcionalidades, definitivamente significa que Ruby estuvo siendo mejor publicitado.

El diseño ingenioso del sitio de RoR y el marketing viral usado por 37signals le dio a RoR un mejor boca a boca que a PHP. Afortunadamente, esto ayuda a elevar la imagen de Zend y a incitar aun mas el uso de su Framework.”

En este momento de la lectura, podemos estar de acuerdo con lo leído, o simplemente pensar que es una opinión muy parcializada. Como habrás podido observar, no hemos hecho más que simplemente “filosofar” un poco sobre si corresponde tal o cual comparación. Es el momento de evaluar otros puntos.

Flexibilidad vs. Organización

Muchos desarrolladores caen en la trampa de decir que mientras RoR es más organizado y fuertemente estructurado a la vez de rígido, PHP es más flexible a la vez de desordenado.

Se podría decir que esto es cierto si estuviésemos comparando lo mismo, pero a la vista de los argumentos anteriormente expuestos, esta comparación es inválida.

Tanto Ruby como PHP son lenguajes de scripting con propósito similar. La principal diferencia son sus enfoques, siendo Ruby de naturaleza OOP, mientras PHP es de corte más estructurado. La organización que le dota Rails a Ruby bien se la puede entregar cualquier Framework a PHP, como ser algunos de los citados anteriormente.

Performance

Definitivamente, una debilidad de Ruby poco conocida (o poco publicitada), es su baja performance en velocidades de ejecución.

Los benchmarks en diversos equipos y con distintas rutinas señalan a Ruby como un lenguaje lento, en comparación con PHP4, y más lento aun en comparación a PHP5. Como contrapartida, posee una excelente gestión de memoria, superior a las 2 versiones de PHP en el mercado actual.

Popularidad y Cantidad de Sitios

Si Ruby On Rails es la mejor solución para el desarrollo de sitios Web 2.0, como nos intenta vender 37signals, lo mínimo que le deberíamos pedir son ejemplos. Y cuando digo ejemplos no digo el ya famoso “Construya un blog en 15 minutos”, sino algo mas enterprise.

La realidad al día de hoy es que los pocos ejemplos de sitios Web utilizando RoR son mayoritariamente de la misma empresa que lo fomenta.

Repasemos algunos sitios Web 2.0:

Repasemos algunos sitios construidos utilizando RoR:

Por otro lado, el ranking TIOBE TOP 20, que mide popularidad de lenguajes de programación, indica un claro ascenso para Ruby On Rails, pero se encuentra actualmente muy por debajo de PHP, y aun por debajo de Python y Perl.

¿Los programadores de PHP están interesados en migrar a Ruby On Rails?

Para contestar esta pregunta tendríamos que plantearnos:

  • ¿Qué nos puede dar RuBy On Rails que no nos puede dar PHP?
  • ¿Se justifica elegir un lenguaje de programación solo por una herramienta que nos proporciona?
  • ¿Se justifica elegir Ruby solo porque tiene Rails?

La respuesta creo que esta en cada uno de nosotros. Dependerá de muchos factores, de las experiencias adquiridas y del grado de satisfacción que se tenga usando PHP.

En mi experiencia personal, viniendo de varios años programando en PHP y probando Ruby On Rails, he tenido una grata impresión, sobre todo en lo referente al startup del desarrollo y en la velocidad que se puede alcanzar desarrollando módulos tediosos, como generalmente son los ABM`s, entre otros.

De todas formas, en general estas mismas tareas pueden ser agilizadas también a través de PHP, usando algún Framework de este estilo, o simplemente para los desarrolladores más experimentados poniendo en práctica las “best practices”, o los principios básicos del diseño de sistemas, antecesores a cualquier Framework.

Respecto de la sintaxis de Ruby, esta claro que al ser un lenguaje influenciado por Perl, Smalltalk, Python y Eiffel, poco tiene que ver con la sintaxis que utiliza PHP, totalmente influenciado por C.

Evidentemente, hay muchos nuevos desarrolladores que se sienten atraídos por esta nueva tecnología y sus bondades. Si eres uno de ellos, y si RoR satisface las necesidades de tu proyecto y maximiza tu productividad, ¡excelente elección!

Fuente: www.maestrosdelweb.com

Paginación en Flash en ASP o PHP

En el siguiente artículo encontrarás como hacer una paginación en flash dividido en tres partes: Creación del diseño de los registros en flash, Creación del ASP y PHP y Desarrollo del código en ActionScript.

Para este ejemplo utilizaré la versión 8 de Macromedia Flash, el primer paso que haremos será abrir el programa.

Creación del diseño de registro:

Creamos un nuevo documento y hacemos el siguiente diseño de cómo se verán nuestros registros.

flash

Como verán paginaremos de 5 en 5 y necesitamos hacer 5 campos de nombre, edad y sexo de la siguiente manera:

  • nombre1, nombre2, nombre3, nombre4, nombre5
  • edad1, edad2, edad3, edad4, edad5
  • sexo1, sexo2, sexo3, sexo4, sexo5

Haremos 2 botones “Siguiente” y “Anterior”, dos campos más Dynamic Text uno con el nombre página y otro con el nombre pag_total. Luego, salvamos nuestro proyecto, en este ejemplo se llamará: paginacion5.fla

Creación del ASP

Ahora abramos un “bloc de notas” y pongamos el siguiente código, en el ejemplo guardaré con el nombre de paginacion5.asp.

 <%
response.Write("&nombre1=Antonio&nombre2=Araceli&nombre3=Alan&nombre4=Alberto&nombre5=
Ana")
response.Write("&nombre6=Brisa&nombre7=Brenda&nombre8=Belen&nombre9=Beto&nombre10=Bar
bara")
response.Write("&nombre11=Carolina&nombre12=Cesar&nombre13=Carlos&nombre14=Cristina&nom
bre15=Carmen")
response.Write("&nombre16=Daniel&nombre17=Denia&nombre18=Daniela&nombre19=Dolores&&no
mbre20=Dana")
response.Write("&nombre21=Estefani&nombre22=Elena") 

response.Write("&edad1=15&edad2=16&edad3=13&edad4=11&edad5=16")
response.Write("&edad6=28&edad7=25&edad8=23&edad9=28&edad10=29")
response.Write("&edad11=31&edad12=38&edad13=33&edad14=39&edad15=35")
response.Write("&edad16=47&edad17=45&edad18=43&edad19=49&edad20=41")
response.Write("&edad21=56&edad22=54") 

'H = Hombre y M = Mujer
response.Write("&sexo1=H&sexo2=M&sexo3=H&sexo4=H&sexo5=M")
response.Write("&sexo6=M&sexo7=M&sexo8=M&sexo9=H&sexo10=M")
response.Write("&sexo11=M&sexo12=H&sexo13=H&sexo14=M&sexo15=M")
response.Write("&sexo16=H&sexo17=M&sexo18=M&sexo19=M&sexo20=M")
response.Write("&sexo21=M&sexo22=M") 

response.Write("&registros=22")
%> 

<<

Creación del PHP

El ejemplo tendrá por nombre paginacion5.php

<? 

echo"&nombre1=Antonio&nombre2=Araceli&nombre3=Alan&nombre4=Alberto&nombre5=Ana";
echo"&nombre6=Brisa&nombre7=Brenda&nombre8=Belen&nombre9=Beto&nombre10=Barbara";
echo"&nombre11=Carolina&nombre12=Cesar&nombre13=Carlos&nombre14=Cristina&nombre15=Car
men";
echo"&nombre16=Daniel&nombre17=Denia&nombre18=Daniela&nombre19=Dolores&&nombre20=D
ana";
echo"&nombre21=Estefani&nombre22=Elena"; 

echo"&edad1=15&edad2=16&edad3=13&edad4=11&edad5=16";
echo"&edad6=28&edad7=25&edad8=23&edad9=28&edad10=29";
echo"&edad11=31&edad12=38&edad13=33&edad14=39&edad15=35";
echo"&edad16=47&edad17=45&edad18=43&edad19=49&edad20=41";
echo"&edad21=56&edad22=54"; 

//H = Hombre y M = Mujer
echo"&sexo1=H&sexo2=M&sexo3=H&sexo4=H&sexo5=M";
echo"&sexo6=M&sexo7=M&sexo8=M&sexo9=H&sexo10=M";
echo"&sexo11=M&sexo12=H&sexo13=H&sexo14=M&sexo15=M";
echo"&sexo16=H&sexo17=M&sexo18=M&sexo19=M&sexo20=M";
echo"&sexo21=M&sexo22=M"; 

echo"&registros=22"; 

?>

Desarrollo del código en ActionScript

Retomamos nuestro flash para agregar el código e ingresar los registros de 5 en 5. Seleccionamos el primer KeyFrame y nos vamos a las actions o acciones. Y de inicio pondremos un stop(); para que no tengamos problemas.

Flash

El siguiente código nos permitirá llamar el archivo ASP o PHP:

//Cargo la variable new
var SendData:LoadVars = new LoadVars();
//Llamo el archivo (asp o php) en este caso será asp
SendData.load("paginacion5.asp");
//asigno 5 variables para los registros y estas variables nos ayudaran mucho en la paginación
 var num1:Number = 1;
 var num2:Number = 2;
 var num3:Number = 3;
 var num4:Number = 4;
 var num5:Number = 5
//Función para primera muestra de registros
SendData.onLoad = function (success){
if (success) {
 //Muestro los primeros registros recordemos que mostraremos de 5 en 5.
 //Aquí se muestran los nombres
 nombre1 = this["nombre"+num1].toString();
 nombre2 = this["nombre"+num2].toString();
 nombre3 = this["nombre"+num3].toString();
 nombre4 = this["nombre"+num4].toString();
 nombre5 = this["nombre"+num5].toString();
 //Aquí se muestran las edades
 edad1 = this["edad"+num1].toString();
 edad2 = this["edad"+num2].toString();
 edad3 = this["edad"+num3].toString();
edad4 = this["edad"+num4].toString();
 edad5 = this["edad"+num5].toString();
 //Aquí se muestra el sexo
 sexo1 = this["sexo"+num1].toString();
 sexo2 = this["sexo"+num2].toString();
 sexo3 = this["sexo"+num3].toString();
 sexo4 = this["sexo"+num4].toString();
 sexo5 = this["sexo"+num5].toString();
 //Cargo también el número de registros
 registros = this.registros;

Hasta este punto nuestro flash llama los primeros 5 registros del archivo. Ahora, haremos que nos de también el número de las páginas obtenidas.

/*Para sacar el número de páginas obtenidas divido los registros obtenidos entre el número de registros que muestra la paginación que en este caso son 5*/
 var registro2:Number = registros / 5;
/*Obtenemos con otra variable el resultado para mostrarlo en nuestro Dynamic Text y como podría ser que en esta operación el número obtenido no sea redondo con la funcion Math.ceil la  redondeo*/
 pag_total.text = Math.ceil(registro2);
 }
}

Hasta aquí obtendremos los primeros 5 registros y las página, compilemos nuestro .fla y hagamos una prueba. Estos archivos hay que correrlos en un servidor, yo le instale el IIS a mi Windows XP si no contamos con esto no podremos ver el resultado.

En el Dynamic Text con el nombre página hay que ponerle por default un 1 porque sabemos que siempre empezará de la página 1. A continuación veamos como se visualizan los primeros 5 registros.

Flash

Con este resultado prosigamos con el código que llevarán los botones “Siguiente” y “Anterior”. Para ello, seleccionamos el botón “Anterior” y en las actions agregamos el siguiente código:

on (press)
{
 botones(2)
}

Ahora seleccionemos el botón “Siguiente” y pongamos el código:

on (press)
{
 botones(1)
}

flash

En los dos botones, mandamos a llamar a una función que estará en el mismo keyframe, en donde hemos jalado los primeros 5 registros. Pero cada botón, manda una variable distinta para distinguir el botón oprimido.

Función botones()

function botones(valorbtn)
{
 //Valido si el botón “Siguiente” fue oprimido y si es así ejecuto lo siguiente
 if (valorbtn == 1)
 {
  //Primero validamos si el número de página no ha rebasado el número de páginas obtenidas
  if (pagina.text < pag_total.text)
  {
   //Si el número de páginas no ha sido rebasada ejecutamos lo siguiente
   //La variable pag_act toma el valor en ese momento de pagina.text
   var pag_act:Number = Number(pagina.text);
   //creamos la variable nu que será el resultado de la variable pag_act * 5
   var nu:Number = pag_act * 5;
   //Mandamos a llamar a la funcción más 5 y le mandamos la variable nu
   mas5(nu)
   //Le damos un nuevo valor a pagina.text sumándole 1
   pagina.text = pag_act + 1;
  }
 //Valido si el botón “Anterior” fue oprimido y si es así ejecuto lo siguiente
 } else if (valorbtn == 2)
 {
   //Aquí hacemos una validación antes para ver si la variable pagina es mayor a 1 si
es así se ejecuta
  if (pagina.text > 1)
  {
   //La variable pag_act toma el valor en ese momento de pagina.text
   var pag_act:Number = Number(pagina.text);
   /*creamos la variable nu2 que será el resultado de pag_actual * 5 - 10 esto nos
ayudará a descontarle 5 registros a nuestra paginación*/
   var nu2:Number = (pag_act * 5) - 10;
   //Mandamos a llamar a la función menos5 y le mandamos la variable nu2
   menos5(nu2)
   //Le damos un nuevo valor a pagina.text descontandole 1
   pagina.text = pag_act - 1;
  }
 }
}

Analicemos qué hace esta función, en primera instancia verifica si hará un procedimiento del botón siguiente o del botón anterior. Si se ha oprimido “Siguiente”, primero se validara que existan más páginas. Esto lo hacemos comparando la página actual contra el número de páginas totales.

Después si pasa la comprobación, tomamos el número de la página actual y lo multiplicamos por 5 (el 5 es por que estamos paginando de 5 en 5) ese resultado se lo mandaremos a una función llamada mas5.

Si se ha oprimido “Anterior”, primero se validará que aun podamos regresar una página anterior y eso lo haremos comprobando que la página actual sea mayor a 1, bien y si pasa esa comprobación tomamos el número de la página actual, lo multiplicamos por 5 y le restamos 10 que es el doble de la paginación. El resultado se lo mandaremos a una función llamada menos5.

función mas5()

function mas5(nu)
{
 /* Aquí creamos 5 variables las cuales tomaran cada una el registro que deben de mostrar,
 Vemos que num_mas1 es igual a la variable num1 + variable nu que se nos ha mandado de la
función botones, y así sucesivamente las otras 4 */
 var num_mas1:Number = num1 + nu;
 var num_mas2:Number = num2 + nu;
 var num_mas3:Number = num3 + nu;
var num_mas4:Number = num4 + nu;
var num_mas5:Number = num5 + nu;
 //Mostramos los siguientes registros
//Mostramos los siguientes nombres
 nombre1 = SendData["nombre"+num_mas1].toString();
 nombre2 = SendData["nombre"+num_mas2].toString();
 nombre3 = SendData["nombre"+num_mas3].toString();
nombre4 = SendData["nombre"+num_mas4].toString();
nombre5 = SendData["nombre"+num_mas5].toString();
//Mostramos las siguientes edades
 edad1 = SendData["edad"+num_mas1].toString();
 edad2 = SendData["edad"+num_mas2].toString();
 edad3 = SendData["edad"+num_mas3].toString();
edad4 = SendData["edad"+num_mas4].toString();
edad5 = SendData["edad"+num_mas5].toString();
//Mostramos los siguientes sexos
 sexo1 = SendData["sexo"+num_mas1].toString();
 sexo2 = SendData["sexo"+num_mas2].toString();
 sexo3 = SendData["sexo"+num_mas3].toString();
sexo4 = SendData["sexo"+num_mas4].toString();
sexo5 = SendData["sexo"+num_mas5].toString();
}

Analicemos un poco esta función realmente es interesante lo que hace, como vemos creamos una variable num_mas1 que es igual a la suma de num1, si recordamos num1 vale 1 se declaro en la carga de los primeros 5 registros y se le suma con la variable nu si también recordamos esta variable nos viene cuando se le ha dado clic al botón “siguiente”.

Analicemos que número nos manda nu al primer clic que se da. Recordemos que nu es la suma de pag_act * 5 si en ese momento pagina actual es = 1 entonces esta quedaría de la siguiente manera nu = 1 * 5 y el resultado es 5, así que ya sabemos que en el primer clic nu valdrá 5.

Entonces en nuestra función mas5 sabemos que:

var num_mas1:Number = num1 + nu;

Es igual a:

var num_mas1:Number = 1 + 5;

Entonces esto nos dará como resultado un 6, entonces nombre1 ahora cargará nombre6 y así sucesivamente con los demás nombres, edades y sexos.

nombre1 = SendData["nombre"+num_mas1].toString();
nombre1 = SendData["nombre6"].toString();

Ya entendiendo esto veamos que hace nuestro flash cuando compilamos este código ya en el keyframe.

flash

Como vemos ya esta funcionando perfectamente nuestro botón “Siguiente” y si nosotros estando en la página 5 de 5 le volvemos a dar siguiente no hará nada ya que nuestra validación:

if (pagina.text < pag_total.text)

Si la página actual no es menor a el total de páginas entonces no se ejecutara de nuevo el código.

Función menos5()

function menos5(nu2)
{
 /* Aqui creamos 5 variables las cuales tomaran cada una el registro que deben de mostrar,
 Vemos que num_menos1 es igual a la variable num1 + variable nu2 que se nos ha mandado de la
función botones, y asi sucesivamente las otras 4 */
 var num_menos1:Number = num1 + nu2;
 var num_menos2:Number = num2 + nu2;
 var num_menos3:Number = num3 + nu2;
var num_menos4:Number = num4 + nu2;
var num_menos5:Number = num5 + nu2;
 //Aquí mostramos los 5 registros anteriores
 nombre1 = SendData["nombre"+num_menos1].toString();
 nombre2 = SendData["nombre"+num_menos2].toString();
 nombre3 = SendData["nombre"+num_menos3].toString();
nombre4 = SendData["nombre"+num_menos4].toString();
nombre5 = SendData["nombre"+num_menos5].toString();
//Aquí mostramos las edades anteriores
 edad1 = SendData["edad"+num_menos1].toString();
 edad2 = SendData["edad"+num_menos2].toString();
 edad3 = SendData["edad"+num_menos3].toString();
edad4 = SendData["edad"+num_menos4].toString();
edad5 = SendData["edad"+num_menos5].toString();
//Aquí mostramos los sexos anteriores
 sexo1 = SendData["sexo"+num_menos1].toString();
 sexo2 = SendData["sexo"+num_menos2].toString();
 sexo3 = SendData["sexo"+num_menos3].toString();
sexo4 = SendData["sexo"+num_menos4].toString();
sexo5 = SendData["sexo"+num_menos5].toString();
}

Analicemos también un poco esta función realmente es tan interesante como la anterior, tomemos el primer ejemplo:

var num_menos1:Number = num1 + nu2;

Veamos que significa num1 y nu2, como se dijo en la función pasada num1 se declaro al principio y su valor es 1 y nu2 en la multiplicación de página actual por 5 menos 10.

var nu2:Number = (pag_act * 5) - 10;

Bueno imaginemos que ya se le ha dado un clic a “Siguiente” y estamos en la página 2 entonces esto quedaría de la siguiente manera:

nombre1 = SendData["nombre"+num_menos1].toString();
nombre1 = SendData["nombre1”].toString();

Así, se retrocederá 5 registros por cada campo y resulta lo mismo para edad y sexo. Ahora notese que si página actual no es mayor a 1, ya no nos permite ir más atrás esto recordemos que lo hace:

if (pagina.text > 1)

Metamos esta función a nuestro keyframe y veamos que nos hace. Como podrán ver si se acabaron los registros nos muestra un terrible “Undefined”, como podemos evitar
esto.

A nuestra función mas5() pongámosle lo siguiente:

/*Si algún campo es nulo que no tenga información le decimos que lo deje en blanco
 y así evitamos un mensaje de error del flash*/
 if (nombre1 == undefined)
 {
  nombre1 = "";
 }
 if (nombre2 == undefined)
 {
  nombre2 = "";
 }
 if (nombre3 == undefined)
 {
  nombre3 = "";
 }
 if (nombre4 == undefined)
 {
  nombre4 = "";
 }
 if (nombre5 == undefined)
 {
 nombre5 = "";
 }
 if (edad1 == undefined)
 {
  edad1 = "";
 }
 if (edad2 == undefined)
 {
  edad2 = "";
 }
 if (edad3 == undefined)
 {
  edad3 = "";
 }
 if (edad4 == undefined)
 {
  edad4 = "";
 }
 if (edad5 == undefined)
 {
  edad5 = "";
 }
 if (sexo1 == undefined)
 {
  sexo1 = "";
 }
 if (sexo2 == undefined)
 {
  sexo2 = "";
 }
 if (sexo3 == undefined)
 {
  sexo3 = "";
 }
 if (sexo4 == undefined)
 {
  sexo4 = "";
 }
 if (sexo5 == undefined)
 {
  sexo5 = "";
 }

Con esto evitan que salga ese terrible “Undefined”. Bueno como verán hemos terminado con todo realmente ya tenemos una buena aplicación en Flash para paginar, mucho del código aquí expuesto se puede mejorar y se puede hacer más corto, pero yo evite meterme con cosas como los for ya que mi intención es que cualquier persona que valla empezando en flash le pueda entender y no sea difícil al comprenderlo, ya de penderá mucho de cada uno de ustedes que le pueda ir reduciendo o mejorando.

Creo que por ahí se nos olvidaba poner en pantalla el número de registros obtenidos, y eso es realmente fácil, agreguemos un Dynamic Text más llamado registros y se verán cuantos registros son en total.

flash

Quiero finalmente agradecer a forosdelweb.com por todo lo que he podido aprender y a mi compañeros SinguerInc que me ayudo a resolver dudas que tenía sobre unas variables y con ello se ha logrado hacer este ejemplo.

Fuente: www.maestrosdelweb.com

Instalando Apache, Mysql y PHP de forma fácil

Gracias a aplicaciones como WAMP, EasyPHP, MAMP o XAMP, podemos instalar y configurar Apache, Mysql y PHP de forma fácil en nuestras computadoras.

Conozco a muchos desarrolladores que aún programan o configura aplicaciones prefabricadas realizando los cambios en su computadora para luego subir los archivos vía FTP y refrescar.  Sin duda no es un método eficiente por el tiempo que se pierde. Todo desarrollador web debería contar con un servidor web instalado de forma local.

Si la fórmula a trabajar es Apache, Mysql y PHP, existe forma de configurarlo en nuestro sistema operativo, aunque el proceso puede ser un poco artesanal como podemos leer en el excelente artículo de Apache + PHP + MySql + PhpMyAdmin como módulo de Apache.

Para los que buscamos una forma más rápida de arrancar con nuestro servidor, existen aplicaciones que ya incluyen estos paquetes y con un sencillo instalador nos dejan todo listo para trabajar en un par de minutos:

La mejor opción para Windows: WAMP Server

WAMP ServerWAMP es la abreviación de Windows, Apache, Mysql y PHP y es un proyecto desarrollado por franceses.  Este paquete instala la versión 1.3 de Apache, PHP5, MySQL, PhpMyAdmin y SQLitemanager en tu computadora.  Además ofrece una aplicación para manejar los servicios que se instala como un “tray icon”.

Una de las ventajas de este paquete es la ofrecer la versión de PHP5 en el instalador y sus constantes actualizaciones.  La instalación es bastante sencilla y destaca que los servicios de apache y de mysql se instalarán en Windows bajo los nombres de wampapache y wampmysqld para no interferir con otras instalaciones previas de estos servidores.

EasyPHP

EasyPHPOtro paquete para Windows que tiene la ventaja de contar con un sitio en nuestro idioma es EasyPHP.  Nos ofrece Apache, Mysql, PHP y varias herramientas para desarrollar como es el caso de PhpMyAdmin. Al descargarlo, asegúrense de descargar las páginas locales en español para poder entender su funcionamiento en nuestro idioma.

Incluye un “tray icon” para manejar los diferentes servicios y configuración.

Trabajando con el OS X de Apple: MAMP

MAMPTrabajar con el sistema operativo Mac OS no debería ser inconveniente para poder contar con un servidor local.   MAMP es un paquete fácil de instalar que configurará todas estas aplicaciones en nuestra computadora. La abreviación de MAMP proviene de: Macintosh, Apache, Mysql y PHP.

Es un paquete gratuito publicado bajo licencia GNU.  Su objetivo es el de proveer un entorno de desarrollo bajo el Mac OS y sus creadores no recomiendan usarlo como servidor web en Internet.

El detalle más importante que hay que tener en cuenta para los que utilicen MAMP es que cambia los puertos estándar de Apache y MySQL, por lo que habrá que hacer algunas modificaciones a la configuración de nuestros archivos php para que puedan conectarse a la base de datos.  En mi experiencia recomiendo configurar el puerto estándar de Mysql que es el 3306 y dejar el puerto 8888 que utiliza MAMP en la configuración, por lo que será cuestión de costumbre utilizar el path http://localhost:8888 para acceder al servidor local.

Linux, Windows, MacOS y Solaris: XAMPP

XAMPPDe la mano de Apache Friends, un proyecto sin fines de lucro que busca promover el uso del servidor web de apache encontramos a XAMPP.

Este proyecto penso inicialmente en el sistema operativo Linux. Hoy en día cuenta con distribuciones para diferentes sistemas operativos. XAMPP ha sido probado exitosamente en las distribuciones de Ubuntu, SuSE, RedHat, Mandrake and Debian.  También tienen una versión que trabaja con Windows, otra para MacOSX y Solaris.

Incluye además PEAR, Perl, ProFTPD, phpMyAdmin, OpenSSL, GD, Freetype2, libjpeg, libpng, gdbm, zlib, expat, Sablotron, libxml, Ming, Webalizer, pdf class, ncurses, mod_perl, FreeTDS, gettext, mcrypt, mhash, eAccelerator, SQLite and IMAP C-Client.

Además de estos proyectos también podemos mencionar al Ibserver (aunque lleva bastante tiempo sin actualizaciones) y al Uniform Server.  Si conoces alguna otra aplicación que valga la pena revisar, no dudes en dejarnos unas líneas en los comentarios.

Luego de instalar cualquiera de estos paquetes, hay que ir configurando su editor de desarrollo hacia http://localhost para asegurarse que sus aplicaciones funcionen sin problemas antes de llevarlas a su servidor de producción.

Fuente: www.maestrosdelweb.com

Trabajando con la API de Twitter desde PHP

Desde su lanzamiento a mediados de 2006, Twitter ha crecido muchísimo siendo el sitio de microblogging más popular. Mucha gente está desarrollando Aplicaciones y Mashups gracias a la API de Twittter, acá te damos una guía para que tú también puedas hacerlo.

twitterUno de los mayores éxitos de Twitter ha sido proporcionar una API funcional desde sus inicios, esto permite que otras personas extiendan las características que Twitter ofrece.

Desarrollen aplicaciones para enviar y compartir nuestros tweets sin estar obligados a utilizar el sitio oficial. Resulta interesante como han surgido diferentes proyectos que nos permiten apreciar y analizar los datos del servicio en diferentes formas. Todo gracias a que Twitter pensó en grande y esta compartiendo sus datos vía la API.

Detalles generales de la API

Para trabajar con la API de Twitter, contamos con la documentación oficial, acá están descritos todos los métodos que podemos utilizar. La API de Twitter está desarrollada en base al estilo arquitectural REST (Representational State Transfer).

Que a diferencia del XML-RPC es un diseño carente de estados y todos los métodos están disponibles en una única URL. Con excepción de algunos métodos públicos, todos los demás requieren de las credenciales de un usuario registrado, donde la autenticación se hace por medio de HTTP. En un futuro cercano Twitter espera ofrecer soporte al esquema OAuth.

La llamada a los métodos se hace por medio de peticiones HTTP GET o POST, según sea el caso. Para los métodos que devolverán datos podemos pedirlos en formato XML, JSON, RSS o ATOM. Cuando realizamos llamadas a los métodos debemos revisar el HTTP Status Code que nos devuelva el servidor de Twitter, si recibimos un código diferente de 200 sabremos que algo ha salido mal y el significado del código dependerá del método que estemos llamado.

Un punto muy importante que debemos tener en claro al trabajar con la API de Twitter, es que tenemos un límite de 70 peticiones por cada hora, por cada usuario (no por aplicación/IP). Los métodos públicos y los que requieren una petición POST no cuentan en este límite.

Esta restricción puede llegar a ser una de las mayores complicaciones cuando desarrollas con la API, hay que procurar optimizar las llamadas para no quedarnos fuera rápidamente. Si realmente necesitas hacer más peticiones, considera usar Jabber.

Enviando peticiones a la API

Para enviar las peticiones a la API de Twitter usaremos la extensión cURL. Para procesar los datos, usaremos XML, aprovechando que en PHP5 contamos con SimpleXML por defecto.

Primero veamos como hacer una petición GET usando cURL:

function getrequest($url,$user,$password)
{
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_VERBOSE, 0); // no imprimir nada
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_USERPWD, "$user:$password"); // autenticación
    curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1);
    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 5); // para no esperar indefinidamente
    curl_setopt($ch, CURLOPT_GET, 1);

    $result = curl_exec($ch);

    $http_status = curl_getinfo($ch, CURLINFO_HTTP_CODE);

    curl_close($ch);

    if( $http_status != "200" ) {
        return null;
    }

    return $result;
}

cRUL se encargará de hacer la petición vía HTTP, nosotros sólo debemos preocuparnos del resultado de esta, que es el valor de $http_status, si es diferente de 200 sabemos que algo ha salido mal. Dependiendo de como diseñemos nuestra aplicación, sería recomendable guardar el valor de $http_status para mostrar un mensaje de error más acorde a las circunstancias. Si queremos saber los últimos 20 estados en el friend_timeline de nuestro usuario, definimos una función para ello:

function getfriendtime() {
    $result = getrequest( 'http://twitter.com/statuses/friends_timeline.xml', $user, $password );
    if ( !$result )
       return false;

    $replies = simplexml_load_string( $result );
    return $replies;
}

Como en la petición indicamos que la respuesta fuera un XML, con ayuda de la funcion simplexml_load_string() obtenemos un objeto (en este caso $replies) que represente este XML. Este objeto será un array de hasta viente elementos, donde cada uno contendrá esta información:

object(SimpleXMLElement)#6 (8) {
    ["created_at"]=> string(30) "Tue Apr 08 21:18:14 +0000 2008"
    ["id"]=> string(9) "785335201"
    ["text"]=> string(33) "@prigazzi ah ok, 95% tablefull :D "
    ["source"]=> string(3) "web"
    ["truncated"]=> string(5) "false"
    ["in_reply_to"]=> string(136) "@j_aroche por ahora, estructura general, header, footer, etc, totalmente tableless. El resto, sigue con las tablas que trae de fábrica."
    ["in_reply_to_user_id"]=> string(8) "10312222"
    ["user"]=> object(SimpleXMLElement)#26 (8) {
      ["id"]=> string(6) "849211"
      ["name"]=> string(13) "Javier Aroche"
      ["screen_name"]=> string(8) "j_aroche"
      ["location"]=> string(9) "Guatemala"
      ["description"]=> string(29) "Software Developer since 2002"
      ["profile_image_url"]=> string(85) "http://s3.amazonaws.com/twitter_production/profile_images/52346493/ie7logo_normal.jpg"
      ["url"]=> string(24) "http://javieraroche.com/"
      ["protected"]=> string(5) "false"
    }
}

Como vemos cada tweet incluye toda la información necesaria que podamos necesitar, hasta información del usuario evitándonos tener que hacer peticiones adicionales.

La mayoría de peticiones a la API de Twitter se manejan de forma muy similar, lo único que cambiará es la estructura del XML (como al pedir la lista de followers) o incluso solo tienes que saber cuál fue el valor de $http_status sin tener que interpretar el XML resultante (como al crear un favorito o agregar un nuevo amigo).

Solo hay dos peticiones, un nuevo estado y enviar un mensaje directo, que se manejarán un tanto diferente ya que requieren hacer un POST. Por ejemplo para actualizar el estado de nuestro usuario sería:

function postupdate($username,$password,$message){

    $args= 'status='.urlencode($message);

    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, 'http://twitter.com/statuses/update.xml');
    curl_setopt($ch, CURLOPT_VERBOSE, 0);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_VERBOSE, 0); // no imprimir nada
    curl_setopt($ch, CURLOPT_USERPWD, "$username:$password");
    curl_setopt($ch, CURLOPT_POSTFIELDS, $args);
    curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1);
    curl_setopt($ch, CURLOPT_POST, 1);

    $result = curl_exec($ch);
    $http_status = curl_getinfo($ch, CURLINFO_HTTP_CODE);

    curl_close($ch);

    if( $http_status != "200" ) {
        return false;
    }

    return true;
}

Es importante que antes de enviar el mensaje lo codifiquemos con urlencode() para no tener problemas si este lleva una URL. Incluso puedes agregar un filtro en el mensaje que detecte urls y la acorte utilizando un servicio adicional.

Siempre es bueno aprender como funciona la API, pero también puedes optar por usar alguna librería/clase para la API de Twitter que te ahorre tiempo de desarrollo.

Trabajar con la API no es complicado, lo que hace falta es tener una idea sobre la cual puedas aprovechar la comunidad detrás de Twitter. Cada día salen interesantes herramientas, tal vez tu tengas la siguiente.

Fuente: www.maestrosdelweb.com

Cómo publicar páginas PHP en Internet Information Services

Normalmente las páginas PHP son procesadas por servidores Apache, pero qué pasa si no tenemos los recursos necesarios para instalarlo o sólo contamos con una computadora y en ella instalado el servidor web de Windows, IIS. A continuación, se describirán una serie de pasos útiles para realizar esta configuración.

En nuestro ejemplo utilizamos un servidor Windows 2003 con IIS 6.0 previamente instalado, que se configurará para ejecutar páginas desarrolladas con PHP5.

Instalación de las librerías PHP

Antes que nada debemos bajar la última versión de PHP para Windows, disponible para descargar en la página oficinal. Descargado el archivo lo ejecutamos para iniciar. En el proceso es importante destacar la configuración de algunas ventanas de la manera siguiente:

La primera y segunda ventana de la instalación contienen la bienvenida y los términos legales, respectivamente, por lo que no son de relevancia para nuestro objetivo; podremos pasarlas sin preocupación. A partir de la tercera comenzaremos a puntualizar.

Debemos seleccionar la complejidad del desarrollo de la instalación. Seleccionemos “Standard” y hagamos clic en el botón “Next” para continuar.

Paso 1

Será necesario configurar durante la instalación nuestro servidor de correo saliente, SMTP y la dirección de correo electrónico del administrador del sitio. Esta configuración se almacena en el archivo “php.ini” que está ubicado en la carpeta “C:\Windows\” y que podremos modificar cuando queramos.

Paso2

Lo siguiente será seleccionar el servidor web que estamos utilizando. Como mencionaba al inicio, en nuestro ejemplo utilizamos Internet Information Services 6.0.

Paso3

Al finalizar la instalación es probable que aparezcan algunos mensajes de Windows Script Host que debemos aceptar sin preocupación alguna.

Seguridad en directorios

Estando instaladas las librerías será necesario configurar la seguridad NT de algunos archivos para que el IIS los pueda manipular y mostrar nuestras páginas.

Dentro de la carpeta “\PHP”, o donde se ha instalado PHP para Windows, debemos permitirle el acceso al usuario “IUSR_” de la siguiente forma:

  • Lectura y escritura en las carpetas: “\PHP\sessiondata\” y “\PHP\uploadtemp\
  • Lectura y ejecución en los archivos: “\PHP\php-cgi.exe” y “\PHP\php5ts.dll
  • Lectura en el archivo “C:\Windows\php.ini

Es válido aclarar que el usuario “IUSR_” lo crea Windows al instalar el IIS y se utiliza para ponerle un nombre a las peticiones anónimas que se hacen al servidor web. Sustituya <NombreDeSuPC> por el nombre de su ordenador en la red y obtendrá el nombre completo del usuario anónimo de su equipo.

Este paso sólo es necesario si nuestra partición de sistema o donde instalamos PHP está formateada con el sistema de archivos NTFS. En caso contrario lo omitimos y vamos al siguiente epígrafe.

Configuración de Internet Information Services

Ya estamos a punto de ver nuestras páginas PHP mostrándose en IIS, sólo nos falta configurarlo para que utilice el CGI correspondiente.

Para esto abriremos la consola de administración de IIS ubicada en Herramientas Administrativas dentro del Panel de Control de Windows, y una vez abierta hagamos clic derecho en la carpeta “Extensiones de Servicio Web” y del menú contextual seleccionemos la opción “Agregar nueva extensión de Servicio Web”, como se muestra en la imagen:

Paso4

Aparecerá una ventana para agregar la nueva extensión. En el nombre de la extensión podemos escribir cualquiera que la identifique, por ejemplo PHP. Luego, haciendo clic en el botón “Agregar” seleccionemos el archivo “php-cgi.exe” que está ubicado en la carpeta donde instalamos las librerías de PHP (por defecto C:\PHP\). Marquemos la opción “Establecer el estado de extensión a Permitido” para indicarle a IIS que active este CGI para su uso.

Paso5

Después de realizar estos pasos nuestro IIS está apto para procesar archivos PHP. Algo muy importante a puntualizar es que debemos agregar a las páginas predeterminadas de nuestro sitio Web el elemento “index.php”.

Para evitar que el IIS nos devuelva un error cuando intentemos acceder a nuestros sitios PHP sin escribir una página específica, por ejemplo http://www.miempresa.com/ . Esto se configura en la solapa Documentos de las propiedades de nuestro sitio web, como se muestra en la imagen que aparece a continuación.

Paso6

Con IIS configurado para procesar páginas PHP podremos publicar sitios completos desarrollados en este lenguaje. Utilizando como complemento el artículo “ODBC y PHP en 7 pasos” será posible leer/guardar los datos de nuestra aplicación web en servidores Microsoft SQL Server hasta sencillas bases de datos de Microsoft Access.

Por otro lado, si tenemos la posibilidad de utilizar un servidor MySQL nuestro Internet Information Services estará apto para soportar algunos CMS como Joomla o Drupal.

Lecturas recomendadas

Fuente: www.maestrosdelweb.com

Rotador de Banners en PHP

El presente documento guiará paso a paso la construcción de un sistema rotador de banners en PHP y MySQL.

Antes de empezar vamos a definir las características que debe tener nuestro sistema rotador:

  • Mostrará un banner aleatorio al cargar una página.
  • Mantendrá un récord de impresiones y clics.
  • Presentara un texto alternativo para cuando el banner no pueda ser cargado (parámetro “alt” de la etiqueta “img”).

Ya definidas las características vamos a desarrollar nuestro sistema. Lo primero que tendríamos que diseñar es la tabla en la base de datos.

Necesitamos almacenar algunos datos como por ejemplo: nombre del banner, url, url de la imagen, cantidad de clics e impresiones. Básicamente nuestra tabla luciría así:

Rotador de Imagenes

Para mayor facilidad pueden ejecutar este código para crear su tabla en MySQL.

CREATE TABLE banner (
   banner_id INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
  nombre VARCHAR(20) NULL,
  url VARCHAR(100) NULL,
  url_imagen  VARCHAR(100) NULL,
   impresiones INTEGER UNSIGNED NULL DEFAULT 0,
  clics  INTEGER UNSIGNED NULL DEFAULT 0,
  PRIMARY  KEY(banner_id)
);

Una vez creada nuestra tabla crearemos el script que se encargará de mostrar los banners de manera aleatoria.

<?php

//  Conecta con el servidor mysql
  $link = mysql_connect('servidor-bd',  'usuario-bd', 'contraseña-bd');
  if(!$link) {

    // Si no  conecta, muestra un error y termina la ejecucion
    die('No  se pudo conectar con la base de datos:' . mysql_error());
 }

// Selecciona la base de datos que contiene la  tabla banner
  if(!mysql_select_db('nombre-base-de-datos',  $link))
  {

    // Si no  se puede seleccionar muestra error y termina ejecucion
     die('Error seleccionando base de datos: ' . mysql_error());
  }

// Toma un banner aleatorio de la base de datos
  $sql = "SELECT banner_id, nombre, url,  url_imagen FROM banner ORDER BY RAND() LIMIT 1";
  $res = mysql_query($sql);
list($banner_id, $nombre, $url, $url_imagen) =  mysql_fetch_array($res);

// Muestra el banner
  echo "<a href=\"banner-clic.php?banner_id=".$banner_id."\">\n";
  echo "<img  src=\"".$url_imagen."\" width=\"468\"  height=\"60\" ";
  echo "border=\"0\"  alt=\"".$nombre."\"></a>\n";

// Actualiza la cantidad de impresiones del  banner
  $sql = "UPDATE banner SET impresiones=impresiones+1  WHERE banner_id=".$banner_id." LIMIT 1";
  mysql_query($sql);
?>

Ahora creamos un script que se encargará de contar los clics de los banners:

<?php

// Archivo 'banner-clic.php'

// Conecta con el servidor mysql
  $link = mysql_connect('servidor-bd',  'usuario-bd', 'contraseña-bd');
  if(!$link) {

    // Si no  conecta, muestra un error y termina la ejecucion
    die('No  se pudo conectar con la base de datos:' . mysql_error());
  }

// Selecciona la base de datos que contiene la  tabla banner
  if(!mysql_select_db('nombre-base-de-datos',  $link))
  {

    // Si no  se puede seleccionar muestra error y termina ejecucion
     die('Error seleccionando base de datos: ' . mysql_error());
  }

// Revisa si se paso el parametro correcto
  if(!isset($_GET['banner_id']) || !eregi('^[0-9]+$',  $_GET['banner_id']))
  {
    die('Ha  seguido un enlace incorrecto');
  }
$banner_id = $_GET['banner_id'];
$sql = "SELECT url FROM banner WHERE  banner_id=" . $banner_id;
  $res = mysql_query($sql);
if(mysql_num_rows($res) == 0)
  {

    // Si el  banner no existe muestra el error y termina ejecucion
     die('Este banner no existe');
  }
  else
  {
     list($url) = mysql_fetch_array($res);

  //  Actualiza la cantidad de clics
    $sql =  "UPDATE banner SET clics=clics+1 WHERE banner_id=".$banner_id."  LIMIT 1";
    mysql_query($sql);

  //  Redirecciona el navegador
     header('Location: ' . $url);
    die();
  }
?>

Fuente: www.maestrosdelweb.com

Cómo optimizar tus aplicaciones PHP

La optimización de aplicaciones PHP nos ayuda a desarrollar aplicaciones rápidas, pero que a la vez cuenten con calidad y eficiencia. Nuestros usuarios necesitan de aplicaciones que resuelvan los problemas en el menor tiempo posible.

Los sitios web necesitan ser rápidos, sin tomar en cuenta el tamaño del mismo. Es por ello que el principal objetivo al desarrollar una aplicación está en su optimización. En este artículo expondremos varios aspectos a tomar en cuenta para optimizar nuestras aplicaciones PHP.

Debemos tener en cuenta que si realizamos un buen diseño de nuestra ingeniería de software, nos ayudaría a escribir código con bajo costo. Llamamos bajo costo cuando nuestro código se ejecute rápidamente o este consuma menos recurso.

¿Qué es la Optimización de aplicaciones?

Cuando hablamos de optimizar nos referimos a que nuestras aplicaciones tengan un bajo costo, o sea, que se ejecuten con mayor rapidez pero que a la vez tenga calidad y eficiencia. El objetivo de optimizar las aplicaciones PHP es minimizar el código resolviendo el mismo problema.

¿Que necesitamos Optimizar?

  • Tamaño de nuestra aplicación
  • Consumo de memoria
  • La velocidad en que se ejecuta

A continuación veremos varias recomendaciones a seguir para lograr una mayor optimización de nuestras aplicaciones PHP:

  • Inicialmente se debe estudiar a fondo el lenguaje de programación PHP, debemos conocer correctamente sus funciones, para seleccionar la adecuada.
  • No utilizar variables Globales, ya que PHP tiene que comprobar si existen, es mejor no declararla de ese tipo si no es necesaria.
  • No mostrar código HTML dentro de código PHP.

Es mas rápido usar:

<strong><? echo “Maestros del Web”; ?></strong>
      en lugar de...
<? echo “<strong>Maestros del Web</strong>”; ?>

PHP debe también interpretar el código HTML que se ha introducido entre sus etiquetas. Tomemos en cuenta lo siguiente:

  • No declarar variables que no se van a utilizar. Estarían ocupando un espacio en memoria innecesario.
  • La función “requiere_once” es bastante lenta.
  • Es muy útil declarar como estáticas las variables que lo requieran.
  • Minimizar el tamaño de nuestro código. Es conveniente analizar profundamente la mejor forma de escribir el código sin utilizar vías muy complejas y que hacen muy extenso nuestro código.
  • Disminuir los accesos al disco. Se debe cargar a memoria la información y luego acceder al disco duro, esto tiene menos costo ya que se disminuyen el número de accesos al disco.
  • Los ciclos (también llamados como bucles) pueden provocar un alto consumo de nuestro CPU, haciendo lenta nuestra aplicación.
  • Es más rápido calcular el tamaño del arreglo antes del ciclo, sino cada vez que se ejecute el ciclo nuestra aplicación tendrá que calcular su tamaño.

Es mejor usar:

$entrada = array ("Azul", "Rojo", "Blanco", "Negro", "Amarillo");
    $cantidad = count($entrada);
    for ($i = 0; $i < $cantidad; $i++){
        echo $entrada[$i];
    }
en vez de ...
     $entrada = array ("Azul", "Rojo", "Blanco", "Negro", "Amarillo");
    for ($i = 0; $i < count($entrada); $i++){
        echo $entrada[$i];
    }

Otras cuestiones que debes tomar en cuenta son:

  • No suprimir errores con @, es muy lento.
  • La función rand es más lenta que mt_rand.
  • La función srand es más lenta que mt_srand.
  • La función getrandmax es más lenta que mt_getrandmax.
  • Utiliza pocos accesos a la base de datos. Al realizar una consulta selecciona solo los campos que necesites. No utilices “SELECT * FROM tabla” si no lo necesitas, utiliza “SELECT campo, campo FROM tabla”.
  • La programación orientada a pbjetos (POO) es muy útil, y mucho más cuando nuestra aplicación cuenta con gran cantidad de códigos, la POO nos permite obtener un mayor aprovechamiento reutilizando nuestro código.
  • Comprueba el tiempo que demora tu aplicación en cargar.
  • Realiza validaciones de formularios mediante javascript. No valides con PHP después de realizar un POST. El usuario tendría que esperar que se cargue nuevamente la web para que le valide el formulario.

Las aplicaciones PHP en general son rápidas. Pero es muy importante Optimizar nuestra aplicación utilizando las recomendaciones anteriores. PHP cuenta con un manual muy bueno, amplio, que nos muestra todas sus funciones.

El tema de la optimización de las aplicaciones PHP es extenso y este artículo solo da algunos datos que te orientarán en la aplicación. Por ello te recomiendo que realices otras lecturas sobre la temática.

Otras Lecturas

Lecturas recomendadas

Fuente: www.maestrosdelweb.com

afiliados