Librería ADOdb Date Time para manejar fechas sin límites

Las funciones de PHP para trabajo con fechas utilizan timestamps y están restringidas a fechas entre 1901 y 2038 en sistemas operativos Unix y a 1970 y 2038 en sistemas operativos Windows, debido al desbordamiento del tipo de dato integer.

ado_date_time

Con ADOdb Date Time eliminamos dichas limitaciones ya que reemplaza las funciones de fecha con variables en coma flotante permitiendo utilizar fechas desde 100 dC hasta +3.000 dC.

Siempre viene bien ir pensando en el futuro :D

Fuente : http://phplens.com/

Recopilatorio 2008 de PHP Senior

El blog de php senior siempre me ha gustado por las conclusiones sacadas directamente de la experiencia de su autor :D

Hace tiempo descubrí un pequeño índice/recopilatorio que sintetiza de alguna forma todo lo que nos falta a los desarrolladores PHP para poder empezar a considerarnos “Seniors”.

Esto es lo que el autor ha aprendido con los años y ha intentado compartir, tratando de lograr conciencia de nuestras carencias y que no podemos quedarnos solo con aprender la sintaxis particular de un lenguaje. Tenemos que romper con el modelo clásico de “programador” (“dominio del lenguaje”) y pasar a “desarrollador” (“dominio del sistema”).

Los artículos fundamentales hasta julio 2008

  1. Los desarrolladores debemos profesionalizarnos
  2. Buenas Prácticas de Desarrollo en PHP
  3. Code Smell – ¿A qué huele tu código?”
  4. Principios de Diseño Orientado a Objetos
  5. Programación Orientada a la Interface
  6. Herencia de clases y el “Principio de Liskov”
  7. Diseño en 3 capas
  8. Separar el código de la capa de presentación
  9. NO es necesaria la herencia múltiple
  10. NO es necesario crear un nuevo framework
  11. Capas de Abstracción
  12. Diferencias entre Lenguajes y Plataformas
  13. Estándares o muerte… para PHP
  14. Cómo traducir de UML a PHP5
  15. Los métodos “getter / setter”
  16. Standard PHP Library
  17. Patrones de Diseño
  18. Patrón Singleton en un entorno web con PHP
  19. Es fundamental contar con namespaces
  20. Migrar definitivamente a PHP5
  21. PHP Coding Standard (draft)
  22. Seven Steps to Better PHP code – part 1
  23. Seven Steps to Better PHP code – part 2

Pueden visitar el recopilatorio directamente desde Guías que debe seguir un ‘PHP Senior’

Fuente : phpsenior.blogspot.com

Transformar direcciones web en enlaces web

La siguiente función php transforma las direcciones web de un texto por enlaces web que se abren en otra ventana.
Es un ejemplo bastante básico que fácilmente se puede adaptar a nuestras necesidades.

A la función se le puede pasar cualquier texto que ella se encarga de transformar los links.

//transforma las direcciones web de un texto que comiencen por http:// en links
function transforma_links($texto){
   if (ereg("[\"|'][[:alpha:]]+://",$texto) == false){
     $texto = ereg_replace('([[:alpha:]]+://[^<>[:space:]]+[[:alnum:]/])', '<a href="\\1" target="\"_new\"">\\1</a>', $texto);
   }
   return($texto);
}

Fuente: http://es.php.net/

Validar urls con php

Me he topado con una función que permite validar urls de diferentes tipos:

https://usuario:contraseña@www.cualquiersitio.com:8080/login.php?do=login&style=%23#pagetop

http://usuario@www.cualquiersitio.com/#pagetop

https://cualquiersitio.com/index.html

ftp://usuario:****@cualquiersitio.com:21/

http://cualquiersitio.com/index.html/


//se le envía una cadena y devuelve true si es uan url válida o false en caso contrario
function url_valida($url){
  static $urlregex = "^(https?|ftp)\:\/\/([a-z0-9+!*(),;?&=\$_.-]+(\:[a-z0-9+!*(),;?&=\$_.-]+)?@)?[a-z0-9+\$_-]+(\.[a-z0-9+\$_-]+)*(\:[0-9]{2,5})?(\/([a-z0-9+\$_-]\.?)+)*\/?(\?[a-z+&\$_.-][a-z0-9;:@/&%=+\$_.-]*)?(#[a-z_.-][a-z0-9+\$_.-]*)?\$";

return eregi($urlregex, $url);

}

Explicación paso a paso:

function url_valida($url){
//TIPO DE CONEXIÓN
$urlregex = "^(https?|ftp)\:\/\/";

//USUARIO Y CONTRASEÑA (opcional)
$urlregex .= "([a-z0-9+!*(),;?&=\$_.-]+(\:[a-z0-9+!*(),;?&=\$_.-]+)?@)?";

//EL NOMBRE DE LA WEB O LA IP
$urlregex .= "[a-z0-9+\$_-]+(\.[a-z0-9+\$_-]+)*"; // http://x = allowed (ejemplo. http://localhost, http://routerlogin)
//$urlregex .= "[a-z0-9+\$_-]+(\.[a-z0-9+\$_-]+)+"; // http://x.x = minimum
//$urlregex .= "([a-z0-9+\$_-]+\.)*[a-z0-9+\$_-]{2,3}"; // http://x.xx(x) = minimum

//PUERTO (opcional)
$urlregex .= "(\:[0-9]{2,5})?";

//RUTA (opcional)
$urlregex .= "(\/([a-z0-9+\$_-]\.?)+)*\/?";

//GET de la ruta (opcional)
$urlregex .= "(\?[a-z+&\$_.-][a-z0-9;:@/&%=+\$_.-]*)?";

//ANCLA de la ruta (opcional)
$urlregex .= "(#[a-z_.-][a-z0-9+\$_.-]*)?\$";

//COMPROBAMOS
return eregi($urlregex, $url);
}

Clase PHP para convertir un array en un objeto

Clase para convertir un array a objeto.
Muchas veces resulta mucho más intuitivo/eficiente manejar objetos que arrays.

/*
  Autor: Roberto Herrero (http://www.indomita.org)
  Asunto: Convertir un array a objeto
*/

  class array_a_objeto{
    //constructor (se le envía el array a convertir)
    function array_a_objeto($array_objecto) {
      reset($array_objecto);
      while (list($key, $value) = each($array_objecto)) {
        $this->$key = tep_db_prepare_input($value);
      }
    }
  }
?>

Pongo un ejemplo :D

//convertir el array de datos POST a objeto
$mi_var = new array_a_objeto($HTTP_POST_VARS);
//ahora en vez de llamar a los datos mediante
echo $HTTP_POST_VARS["campo_texto_1"];
//podemos hacerlo así
echo $mi_var->campo_texto_1;

Crear un select html desde php dinámicamente

Hoy voy a mostrar como generar un listado dinámico del control select, el combo desplegable, mediante PHP a partir de los datos devueltos por una consulta MySql.

Requisitos previos:
* Conocer como crear el conector $link.
Te dejo el tutorial por si te interesa: Tutorial Conexión a MySql desde PHP


//texto encabezado

echo "<h1>Selecciona una fruta</h1>";

//abrimos el select

//(el size indica el ancho del select)

echo '<select name="frutas" size="5">';

//realizamos la conexión

mysql_conecta($link);

//realizamos la consulta

$respuesta=mysql_query("select fruta_id, fruta_nombre from frutas", $link);

//recorremos los datos

while($fila=mysql_fetch_array($respuesta)){

 echo '<option value="'.$fila["fruta_id"].'"> 

      '.$fila["fruta_nombre"].'></option>';

}

//cerramos el select

echo '</select>';

Realizar backup a MySql desde PHP

Voy a explicar como realizar un backup o copia de seguridad de tu base de datos MySql desde PHP.

//servidor MySql
$C_SERVER='tu_servidor';
//base de datos
$C_BASE_DATOS='tu_base_de_datos';
//usuario y contraseña de la base de datos mysql
$C_USUARIO='tu_usuario';
$C_CONTRASENA='tu_contraseña';
//ruta archivo de salida
//(el nombre lo componemos con Y_m_d_H_i_s para que sea diferente en cada backup)
$C_RUTA_ARCHIVO = '/ruta_hasta/backups/backup_'.date("Y_m_d_H_i_s").'.sql';
//si vamos a comprimirlo
$C_COMPRIMIR_MYSQL='true';

//comando
$command = "mysqldump --opt -h ".$C_SERVER." ".$C_BASE_DATOS." -u ".$C_USUARIO." -p".$C_CONTRASENA.
     " -r \"".$C_RUTA_ARCHIVO."\" 2>&1"; 

//ejecutamos
system($command);

//comprimimos
if ($C_COMPRIMIR_MYSQL == 'true') {
 system('bzip2 "'.$C_RUTA_ARCHIVO.'"');
}

*Supongo que el tutorial es aplicable a cualquier tipo de base de datos siempre y cuando tenga una consola y comandos correspondientes, sería cuestión de adaptar el código.

Mantenimiento MySql en PHP aplicable a otras bases de datos

Bueno, una manera bastante sencilla de realizar un mantenimiento de una base de datos MySql básico sería algo así :

* Conocer como crear el conector $link.
Te dejo el tutorial por si te interesa: Tutorial Conexión a MySql desde PHP

//conectamos
mysql_conecta($link);
//listamos tablas
$tablas=mysql_query("SHOW TABLES FROM box",$link);
//recorremos todas las tablas
while($ft=mysql_fetch_array($tablas)){
//optimizamos las tablas
mysql_query("OPTIMIZE TABLE ".$ft[0],$link);
//otras tareas ...
}

Conexión a mysql desde PHP

Bueno, voy a poner algo bastante básico a la hora de interactuar con una base de datos desde php. Lo más común es utilizar MySql junto con PHP.
Para realizar dicha unión es necesario crear una conexión entre PHP y MySql.

A continuación pongo un procedimiento al que enviamos una variable que servirá de intermediaria entre PHP y MySql.

//PARA CONECTAR A LA BASE DE DATOS
function mysql_conecta(&$link){
  //datos de conexión
  //servidor(si es local "localhost")
  $mysql_server='tu_servidor';
  //el usuario
  $mysql_login='tu_usuario';
  //la contraseña
  $mysql_pass='tu_contraseña';
  //el nombre de la base de datos
  $mysql_db='tu_db';    

  //conectamos
  if($link=@mysql_connect($mysql_server, $mysql_login, $mysql_pass)){
      //seleccionamos la base de datos
      @mysql_select_db($mysql_db, $link);
  }else{
      print "
El servidor se encuentra ocupado, disculpen las molestias";
      exit();
 }
}

Una vez que tenemos el “puente” ya podemos ejecutar consultas mediante las funciones que PHP incorpora.
Las funciones más utilizadas son :
mysql_query, sirve para enviar sentencias sql y almacenar los resultados de dichas sentencias.
mysql_fetch_array, sirve para convertir el objeto devuelto por mysql_query en un array en la que las claves son los nombres de los campos.
Existen muchas otras también muy útiles. Ver resto de funciones php-mysql.

Voy a poner un ejemplo de pedir un listado de nombres y apellidos de una base de datos:

//realizamos la conexión
conecta($link);
//pedimos los datos mediante mysql_query enviando una consulta y el conector
$respuesta=mysql_query("select nombre, apellido from tabla_nombres", $link);
//recorremos los datos convirtiéndolos en un array por campos
while($fila=mysql_fetch_array($respuesta)){
  //mostramos
  echo "
Nombre: ".$fila["nombre"]."  Apellido: ".$fila["apellido"];
}

Convertir un switch/nido de ifs en un array

Optimizar un switch o nido de ifs en una array tiene sus ventajas a la hora de optimizar/visualizar el código.

Por ejemplo tanto si tenemos un nido de ifs …

If($tipo_animal==0){
  $nombre="Cangrejo";
}elseif($tipo_animal==1){
  $nombre="Oso";
}elseif($tipo_animal==2){
  $nombre="Lobo";
}elseif($tipo_animal==3){
  $nombre="Ballena";
}elseif($tipo_animal==4){
  $nombre="Caballo";
}else ....

… como si tenemos un switch …

Switch ($tipo_animal)
case 0:
$nombre="Cangrejo";
break;
case 1:
$nombre="Oso";
break;
case 2:
$nombre="Lobo";
break;
case 3:
$nombre="Ballena";
break;
case 4:
$nombre="Caballo";
break;
...

Podemos simplificar el código creando un array:

//crea un array con los nombres, posición 0 tiene Cangrejo, 1 Oso ... etc ... etc ...
$nombre_animal=array('Cangrejo','Oso','Lobo','Ballena','Caballo', '...');
//accediendo así
$nombre=$nombre_animal[$tipo_animal];

Si por el contario nuestra array necesita otro tipo de clave podemos asignársela también como si de una colección se tratase:

//crea un array con los nombres, clave animal1 tiene Cangrejo, animal2 Oso ... etc ... etc ...
$nombre_animal=array('animal1'=>'Cangrejo', 'animal2'=>'Oso', 'animal3'=>'Lobo', 'animal4'=>'Ballena', 'animal5'=>'Caballo', '...');
//accediendo así
$nombre=$nombre_animal[$clave_animal];

PHP tiene un gran surtido de funciones para la utilización de arrays.
Documentación PHP.net