Abril 10th, 2010

Optimizando nuestro código PHP

1 – Inicializa las variables antes de utilizarlas. Estás, se inicializan solas, pero con un coste de tiempo.

2 – Debes estar en constante aprendizaje, cada vez el lenguage PHP se hace más fuerte, y salen nuevas características interesantes sobre este..

3 – Incrementar una variable en el método de una clase es lo mas rápido, que incrementar una variable global.

4 – Incrementar una variable global a un fichero puede llegar a ser hasta dos veces más lento que en un entorno local.

5 – Incrementar una variable local en un método es lo más rápido. Casi lo mismo que llamar a una variable local en una función.

6 – Incrementar una variable indefinida puede ser hasta 9 ó 10 veces más lento que una ya declarada.

7 – Declarar una variable global, a pesar de que no la llegues a utilizar en ninguna función hace más lento tu script, PHP tiene que chequear si la variable existe.

8 – Llamar a una función a una función con un parametro puede tomar aproximadamente el mismo tiempo que de 7 a 8 operaciones con variables locales, y esa misma llamada a un método supondrían unas 15 operaciones. Aún así, es más rapido que usar variables globales.

9 – Si necesitas saber el timestamp (tiempo de ejecución) de acceso a un script, considera utilizar la variable $_SERVER['REQUEST_TIME'] en lugar de time(), es mucho más rapido.

10 – $row['id'] es hasta 7 veces más rápido que el mecanismo $row[id].

11 – $localvar++ es hasta 15 veces más rápido que function inc(){ $localvar++; }, debido a que debe acceder a la función.

12 – Los scripts PHP se compilan/interpretan cada vez que son ejecutados, a no ser se guarde el código objeto en un cache. Las herramientas de compilación de PHP pueden incrementan el rendimiento hasta un 100%.

Febrero 20th, 2010

Validar ccc con PHP

Identificación de una cuenta corriente o libreta de ahorros
En España las cuentas corrientes y las libretas de ahorros tienen una identidad única que se compone de 20 dígitos, el denominado Código Cuenta Cliente. Este código identifica a la entidad bancaria, sucursal y cuenta de forma única de tal modo que actúa como dirección de la cuenta para la realización de cualquier operación financiera.

Esquema del código de identificación de una cuenta bancaria

esquema ccc

Proceso de cálculo de los dígitos de control
a) Dígito de control de la entidad y sucursal

Posicion Factor Datos Operación Resultado
Unidad: 6 8 6x8 48
Decena: 3 3 3x3 9
Centena: 7 3 7x3 21
Unidad de millar: 9 0 9x0 0
Decena de millar: 10 7 10x7 70
Centena de millar: 5 7 5x7 35
Unidad de millón: 8 0 8x0 0
Decena de millón: 4 2 4x2 8
Suma 191

Cálculos:

191/11 = 17; Resto = 191-(17x11) = 4; Dígito = 11-4 = 7

- Si el resultado es 11, el dígito buscado es 0

- Si el resultado es 10, el dígito buscado es 1

b) Dígito de control de la cuenta

Posicion Factor Datos Operación Resultado
Unidad: 6 1 6x1 6
Decena: 3 2 3x2 6
Centena: 7 3 7x3 21
Unidad de millar: 9 4 9x4 36
Decena de millar: 10 5 10x5 50
Centena de millar: 5 2 5x2 10
Unidad de millón: 8 0 8x0 0
Decena de millón: 4 0 4x0 0
Centena de millón: 2 1 2x1 2
Unidad de millar de millón: 1 3 1x3 3
Suma 134

Cálculos:

134/11 = 12; Resto = 191-(12x11) = 2; Dígito = 11-2 = 9

- Si el resultado es 11, el dígito buscado es 0

- Si el resultado es 10, el dígito buscado es 1
A continuación, implementaremos el algoritmo en php

PHP:
  1. function ccc_valido($ccc)
  2. {
  3.  
  4. //$ccc sería el 20770338793100254321
  5. $valido = true;
  6.  
  7. ///////////////////////////////////////////////////
  8. //    Dígito de control de la entidad y sucursal:
  9. //Se multiplica cada dígito por su factor de peso
  10. ///////////////////////////////////////////////////
  11. $suma = 0;
  12. $suma += $ccc[0] * 4;
  13. $suma += $ccc[1] * 8;
  14. $suma += $ccc[2] * 5;
  15. $suma += $ccc[3] * 10;
  16. $suma += $ccc[4] * 9;
  17. $suma += $ccc[5] * 7;
  18. $suma += $ccc[6] * 3;
  19. $suma += $ccc[7] * 6;
  20.  
  21. $division = floor($suma/11);
  22. $resto    = $suma - ($division  * 11);
  23. $primer_digito_control = 11 - $resto;
  24. if($primer_digito_control == 11)
  25. $primer_digito_control = 0;
  26.  
  27. if($primer_digito_control == 10)
  28. $primer_digito_control = 1;
  29.  
  30. if($primer_digito_control != $ccc[8])
  31. $valido = false;
  32.  
  33. ///////////////////////////////////////////////////
  34. //            Dígito de control de la cuenta:
  35. ///////////////////////////////////////////////////
  36. $suma = 0;
  37. $suma += $ccc[10] * 1;
  38. $suma += $ccc[11] * 2;
  39. $suma += $ccc[12] * 4;
  40. $suma += $ccc[13] * 8;
  41. $suma += $ccc[14] * 5;
  42. $suma += $ccc[15] * 10;
  43. $suma += $ccc[16] * 9;
  44. $suma += $ccc[17] * 7;
  45. $suma += $ccc[18] * 3;
  46. $suma += $ccc[19] * 6;
  47.  
  48. $division = floor($suma/11);
  49. $resto = $suma-($division  * 11);
  50. $segundo_digito_control = 11- $resto;
  51.  
  52. if($segundo_digito_control == 11)
  53. $segundo_digito_control = 0;
  54. if($segundo_digito_control == 10)
  55. $segundo_digito_control = 1;
  56.  
  57. if($segundo_digito_control != $ccc[9])
  58. $valido = false;
  59.  
  60. return $valido;
  61.  
  62. }

Julio 2nd, 2008

CodeIgniter, Framework PHP

Framework php

CodeIgniter es un gran framework para PHP creado para ofrecer un alto rendimiento, además este framework es bastante ligero y muy sencillo de configurar.

A la larga lista de frameworks para PHP, y que ha conseguido que php vuelva a ser el lenguage de programación web por excelencia (recordemos que lo utilizan todas las grandes compañías online) dejando en la cuneta a otros grandes lenguages como ruby y su framework rails; este framework podría pasar por una alternativa mas, pero si la aplicación que desarrollamos requiere de una plataforma que no decante mucho nuestra estructura y que necesite un alto CodeIgniter debería ser tu elección.

Cumple perfectamente el fin de cualquier framework, una estructura bien definida que da soporte a nuestro proyecto web y que ayude a que este nuevo proyecto sea organizado y desarrollado.

La documentación de CodeIgniter es muy buena y esto nos facilita en gran medida aprender a utilzarlo, sólo echando un simple vistazo a los videotutoriales de su página sabremos como podemos empezar a utilizarlo.

Link | Codelgniter

Mayo 29th, 2008

Ajax en php

Hoy en día resulta algo feo ver una página que no utiliza ajax, además que a los usuarios no nos gusta mucho ver como nuestras páginas vuelven a cargar a la hora de enviar un formulario, subir una imagen etc, etc.

La manera más sencilla de empezar a utilizar ajax, es con la clase xajax, que nos trae un cumulo de funciones que simplifican nuestra tarea. Está bastante bien implementada, y no le falta de nada. A continuación explicaré por qué resulta tan sencillo:
<?php include './xajax/xajax_core/xajax.inc.php';$xajax = new xajax();$rqstAdd =& $xajax->register(XAJAX_FUNCTION, 'doAdd');

$rqstReset =& $xajax->register(XAJAX_FUNCTION, 'doReset');

// set the parameters$rqstAdd->setParameter(0, XAJAX_JS_VALUE, 39);

$rqstAdd->setParameter(1, XAJAX_JS_VALUE, 571);

$xajax->processRequest();

function doAdd($a, $b)
{

$response = new xajaxResponse();

$response->assign('answer', 'innerHTML', $a + $b);

$response->assign('reset', 'style.display', 'block');

return $response;

}

function doReset()

{

$response = new xajaxResponse();

$response->clear('answer', 'innerHTML');

$response->assign('reset', 'style.display', 'none');

return $response;

}

?>
Las funciones doreset y do add son las que proximamente podremos llamar desde cualquier parte de la pagina, sin necesidad de volver a cargarla!
<form action="#" method="post">
<input type="button" onclick="<?php $rqstAdd->printScript(); ?>" id="btnAdd" value="Click Me" />
<input type="button" onclick="<?php $rqstReset->printScript(); ?>" id="btnReset" value="Reset" />
<p id="answer"></p>
</form>


ahí esta el truco,  llamamos a las funciones en javascritp pero gracias a el objeto XmlHttpRequest, podemos interactuar con los ficheros php.

Link  | xajaxproject

Mayo 2nd, 2008

Plugin ruby on rails

Hobo Imagen

Los frameworks que han salido tanto para ruby como para php, permite simplificar mucho las funciones que antes se programaban a mano, haciéndose ahora de manera automática. Dentro de las comunidades tanto php como ruby on rails, hay multitud de extensiones y scripts que permiten hacernos la vida más sencilla.
Hobo es un plugin para Ruby on Rails que añadirá velocidad turbo a el proceso de construcción de una aplicación web. Su características principales son:

  • Plantillas que permiten definir tags personalizados.
  • Tags predefinidos y listos para usar AJAX.
  • Soporte de AJAX.
  • Soporte de temas.

A todo el que quiera realizar aplicaciones web en ruby on rails le recomiendo echarle un ojo.

Link | HOBO

Marzo 9th, 2008

Login de usuarios en php

Creamos la tabla usuarios

CREATE TABLE `usuarios` (
`id` int(4) NOT NULL auto_increment,
`username` varchar(60) NOT NULL default '',
`password` varchar(60) NOT NULL default '',
PRIMARY KEY (`id`)
) TYPE=MyISAM AUTO_INCREMENT=2 ;

//insertamos un valor como prueba
INSERT INTO `members` VALUES (1, 'juanra', '123456');

Ahora el fichero de checklogin

<?php
$host="localhost"; // El nombre del host, usualmente localhost
$username=""; // Nombre de usuario mysql
$password=""; // contraseña mysql
$db_name="test"; // base de datos que usaremso
$tbl_name="usuarios"; // nombre de la tabla


//Conectamos con el servidor y seleccionamos la base de datos
mysql_connect("$host", "$username", "$password")or die("cannot connect");
mysql_select_db("$db_name")or die("cannot select DB");

//Cogemos los datos que nos llegan desde el formulario ( lo tendremos que crear)
$minombre=$_POST['minombre'];
$contraseña=$_POST['contraseña'];

// Unas pequeñas medidas de seguridad para proteger las bases de datos de posibles inyecciones
$minombre = stripslashes($minombre);
$contraseña = stripslashes($contraseña);
$minombre = mysql_real_escape_string($minombre);
$contraseña = mysql_real_escape_string($contraseña);


$sql="SELECT * FROM $tbl_name WHERE username='$minombre' and password='$contraseña'";
$result=mysql_query($sql);

// Contamos el numero de filas
$count=mysql_num_rows($result);
//Si el resultado marcado es $minombre y $contraseña,debería haber solo una fila
if($count==1){

//Registramos usuario y redireccionamos a exito.php
session_register("minombre");
session_register("contraseña");
header("location:exito.php");
}
else {
echo "Nombre de usuario equivocado o contraseña";
}
?>

El exito.php...

<?//si llegamos aquí, todo fue bien
session_start();
if(!session_is_registered(myusername)){
header("location:principal.php");
}
?>

Por último el formulario

//a gusto del consumidor :)

Marzo 6th, 2008

Crear un captcha

Es habitual que se nos cuele mucho spam por formularios, y es que los spamers, suelen crear aplicaciones para enviar miles y miles de correos por formularios vulnerables, que envían copia del e-mail al autor, por ejemplo. Voy a iniciar un pequeño tutorial para crear un captcha, para "obligar a los usuarios a demostrar que son humanos".

Primera Parte
<?php
session_start();

//Creamos una cadena aleatoria de caracteres
$md5 = md5(microtime() * mktime());

//Reducimos a 5 los caracteres
$string = substr($md5,0,5);
?>

Crear una imagen de fondo

<?php

//creamos un fondo de imagen y lo subimos, luego con la funcion imagecreatefrompng, la pasamos al captcha
$captcha = imagecreatefrompng("./imagencaptcha.png");

//podemos configurar los colores para las lineas
$black = imagecolorallocate($captcha, 0, 0, 0);
$line = imagecolorallocate($captcha,233,239,239);


//y para evitar las arañas le añadimos las lineas
imageline($captcha,0,0,39,29,$line);
imageline($captcha,40,0,64,29,$line);
?>

Insertamos el texto en la imagen

<?php
//insertamos la cadena creada aleatoriamente en la imagen
imagestring($captcha, 5, 20, 10, $string, $black);

//como no, encriptamos y almacenamos el valor de la cadena en una variabe sesion
$_SESSION['key'] = md5($string);


//devolvemos la imagen para crearla
header("Content-type: image/png");
imagepng($captcha);
?>

Comprobamos el valor que ingresa el usuario

<?php
session_start();

if(md5($_POST['code']) != $_SESSION['key']){
//lo enviamos a la página de error
echo "header('Location: error.php');";
}else{
//lo enviamos a donde queríamos ha puesto bien el captcha
echo "header('Location: buena.php');";
}


?>

La parte de la creación del formulario en este caso, es la más básica.

Febrero 25th, 2008

Chat en php

Con estos pequeños scripts en php, podrás montar un chat en tu web en poco tiempo. Solo tienes que insertarlo en tu web e ir indicando tu base de datos, dominio y contraseñas. Puedes borrar los enlaces, es completamente libre, pero siempre es de agradecer que no los eliminen y contribuyan a mejorar el pagerank de la web.

Descargar | chat

Noviembre 7th, 2007

Ruby on Rails Vs PHP

Hoy en el trabajo me plantee un comparación Ruby on Rails Vs PHP. Buscando por internet, llegué a una conclusión, no podemos comparar un lenguaje de programación con un framework y un lenguaje de programación. 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. Por eso, las comparaciones serían PHP On Zend Framework vs. Ruby On Rails o PHP on Cake vs. Ruby On Rails, por ejemplo.

Andi Gutmans, tampoco considera que se pueda hacer la comparación, pero dice algo interesante al respecto “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 más el uso de su Framework.”

Fuente de apoyo |Maestros del Web