Archive for the ‘php’ Category

Email m�sivo en PHP con PHPMailer

Miércoles, Diciembre 2nd, 2009

Me pareci� interesante hacer este Tip para aquellos que quieran mandar mails de manera sencilla y r�pida con la librer�a PHPMailer. La gran mayor�a de personas que programan en PHP, utilizan la funci�n mail() para realizar env�os, ya sean simples o complejos. Pero algunos servidores tienen bloqueada la funci�n mail() de php por cuestiones de seguridad.

PHP Mailer es una librer�a escrita en php para env�o de mails desde una web utilizando una cuenta v�lida de correo de un servidor de mails. Algunas de las funciones que trae son:

  • Env�os a varios remitentes, con CC, CCO, etc.
  • Soporta 8bits, base64 y binarios
  • Autenticaci�n por SMTP
  • Env�os con HTML
  • Env�os de email con adjuntos
  • Inclusi�n de im�genes en el correo

Instalaci�n de PHPMailer

Descarga PHPMailer desde la web oficial en Worxware. Una vez descargada la librer�a, copia los archivos class.phpmailer.php y class.smtp.php al servidor. Crea un archivo php, por ejemplo: �Enviar.php�
En el que escribiremos los siguiente:

Código :

<?php
require("class.phpmailer.php"); //Importamos la funci�n PHP class.phpmailer 

$mail = new PHPMailer(); 

Luego tenemos que iniciar la validaci�n por SMTP:
$mail->IsSMTP();
$mail->SMTPAuth = true; // True para que verifique autentificaci�n de la cuenta o de lo contrario False
$mail->Username = "remitente@dominio.com"; // Cuenta de e-mail
$mail->Password = "************"; // Password 

$mail->Host = "localhost";
$mail->From = "remitente@dominio.com";
$mail->FromName = "Nombre a mostrar del Remitente";
$mail->Subject = "Asunto";
$mail->AddAddress("destinatario@dominio.com","Nombre a mostrar del Destinatario"); 

$mail->WordWrap = 50; 

$body  = "Hola, este es un�";
$body .= "<font color='red'> mensaje de prueba</font>"; 

$mail->Body = $body; 

$mail->Send(); 

// Notificamos al usuario del estado del mensaje 

if(!$mail->Send()){
   echo "No se pudo enviar el Mensaje.";
}else{
   echo "Mensaje enviado";
} 

?>

Sube el archivo �Enviar.php� al servidor en la misma ubicaci�n que los archivos class.phpmailer.php y class.smtp.php.

Notas:

PHPMailer tiene la posibilidad de enviar archivos adjuntos. Los mismos se pueden agregar de la siguiente forma:

Código :

$mail->AddAttachment("imagenes/img.jpg", "nombre_a_mostrar.jpg");

El primer par�metro la ruta del archivo. El segundo, es el nombre del archivo a mostrar.
Tambi�n tenemos la posibilidad de agregar cuentas con CC o CCO, con las siguientes l�neas:

Código :

$mail->AddCC("cuenta@dominio.com");
$mail->AddBCC("cuenta@dominio.com");

Para indicar si el mensaje contiene HTML:

Código :

$mail->IsHTML(true); // El correo se env�a como HTML

Espero que les sea muy �til, cualquier duda escriban en los comentarios o al foro.

Saludos. NicSonic.

Enviar comentario


Instalacin de CodeKa, sistema web de facturacin

Miércoles, Diciembre 2nd, 2009

Codeka es un sistema de facturacin programado en php. Este sistema es capaz de crear nuevos clientes, aadir artculos, vender, posee tesorera, proveedores y dems secciones bastante utiles para cualquier negocio.

CodeKa, software open source para facturar en linea

La instalacin de CodeKa es lo que yo llamara un tanto antigua, ya que no tiene archivo de instalacin (tpico install.php), si no que hay que instalarlo mediante un SQL que te trae y editar el archivo de configuracin.

Instalacin de la Base de Datos

Aunque antigua la instalacin, no es nada complicada, sera posible hacerla con los ojos cerrados. Lo nico que hay que hacer es ir a tu phpMyAdmin e importar el archivo .sql llamado basededatos.sql.

Si se subi bien, habr creado todas las tablas, una vez echo este paso, pasamos al siguiente.

Configuracin de CodeKa

Simplemente hay que editar el archivo config.php y poner los datos que te indican:

Código :

<?php

$Usuario="usuario";
$Password="contrasea";

$Servidor="servidor"; 

$BaseDeDatos="nombre de la base de datos";

?>

No se ni para que diablos pongo el ejemplo arriba, si es que mas claro no puede estar, verdad?

Darle permisos de escritura

Y como ultimo paso hay que darle permisos CHMod 777 al CodeKa.

Como veris, mas sencillo imposible, y encima, un buen soft.

Saludos

Enviar comentario

Monitor de servidor en PHP

Miércoles, Diciembre 2nd, 2009

Hace unos das me surgi la necesidad de monitorear el estado de un servidor (si esta UP o DOWN) y recibir notificaciones via e-mail cuando se cayera. Prob un par de servicios gratuitos, pero slo realizaban comprobaciones cada 30 minutos, por ejemplo.

Entonces se me ocurri hacerlo por m mismo, y consegu realizarlo utilizando un servidor de hosting gratuito como 00webhost, realizando comprobaciones cada 5 minutos y notificando las cadas via e-mail al instante.

Cdigo de PHP para monitoreo de servidores

Debemos crear una cuenta de usuario gratuita en 00webhost.com. No es necesario que registremos un dominio .com personalizado, simplemente utilizamos un subdominio de los que nos proveen. Una vez creada la cuenta, vamos a generar un archivo PHP llamado monitor.php que se encargue de verificar el estado del sitio y envie un e-mail de notificacion si esta caido.

Código :

<?php

   require_once ('Libmail.class.php');

   // Function to check response time
   function pingDomain($domain){
      $starttime = microtime(true);
      $file      = fsockopen ($domain, 80, $errno, $errstr, 10);
      $stoptime  = microtime(true);
      $status    = 0;

      if (!$file) $status = -1;  // Site is down
      else {
         fclose($file);
         $status = ($stoptime - $starttime) * 1000;
         $status = floor($status);
      }
      return $status;
   }

   // notificamos via email
   if (pingDomain('www.cordobalquila.com.ar') < 0) {
      $m= new Mail;
      $m->From("mailDesde@mail.com.ar");
      $m->To("mailPara@mail.com");
      $m->Subject("El sitio www.cordobalquila.com.ar esta caido");

      $message= "El sitio esta caido";
      $m->Body($message);
      $m->Send();
   }
?>

Cron Jobs en tu servidor web

La parte mas importante, planificar la tarea para que el servidor realice esta comprobacion cada cierto perodo de tiempo. Lo positivo es que 00webhost nos permite planificar tareas hasta en intervalos de 5 minutos, que es lo que considero bastante apropiado.

Desde nuestro panel de administracin de la cuenta, vamos a la opcin Cron Jobs y asignamos intervalos de 5 minutos a la ejecucin del comando:

Código :

php -f RUTA_DEL_ARCHIVO/monitor.php

Listo, eso es todo! Ahora bien, podemos jugar un poco con este modelo para comprobar el estado de mltiples sitio, guardar stats en una base de datos, etc, etc, etc. Cdigo fuente completo y listo con instrucciones detalladas en mi blog.

Enviar comentario

Paginar vector de resultados con PHP

Domingo, Noviembre 2nd, 2008

Hace un tiempo me surgió el problema de paginar un vector (Array) de resultados de una búsqueda, por lo que busqué la forma de crear una función que me permitiera listar los items correspondientes, pasandole por parámetros el vector en cuestión, el límite de resultados a mostrar y la página solicitada.

He aquí mi solución (es una base, que necesita ser pulida, eso les dejo a ustedes Guiño )

paginar.php

Código :

function paginar($v, $l, $p) {

Primero que nada definimos la función junto con las variables que se han de pasar como parámetro, ahora bien, necesitamos saber cuales son las condiciones de inicio de nuestro paginador, tales como la cantidad de páginas a mostrar, en función de la longitud del vector y del límite de items a desplegar:

Código :

// DEFINIMOS LA CANTIDAD DE PÁGINAS
$paginas = ceil(count($v) / $l);

Ahora bien, si queremos mostrar cada item del vector $v necesitaremos recorrerlo con un bucle, pero… ¿desde dónde empezaríamos a mostrar y hasta dónde? Para ello necesitamos definir las condiciones de nuestro bucle recorredor como sigue:

Código :

// CONDICION DE INICIO
$inicio = ($p-1)*$l;
      
// CONDICION DE FINAL
$final = $p*$l;

Y ya estamos listos para empezar a recorrer el vector mostrando cada resultado dentro de un div de id="item" dentro del div de resultados. Debemos tener en cuenta que, si no existiera el item i-ésimo dentro del vector $v tenemos que dejar de listar items:

Código :

// MOSTRAMOS LOS ITEMS RESPECTIVOS
      echo '<div id="resultados">';
      for ($i=$inicio; $i<$final; $i++) {
         if (isset($v[$i]))
            echo "<div id="item">$i.- $v[$i]</div>";
         else
            break;
      }
      echo '</div>';

Listo, tenemos los resultados correspondientes a la página $p, pero necesitaríamos mostrar el total de páginas a modo de menú de hipervínculos para poder navegar entre los ítems. Para ello comprobaremos si nos encontramos en la primera pagina para no mostrar "Página anterior" o en la última para no mostrar "Página siguiente", además de no crear un vínculo a la misma página:

Código :

// LISTAMOS LAS PÁGINAS
      echo '<div id="paginas">';
      if ($p>1)
         echo "<a href="index.php?p=" . ($p-1) . "">P&aacute;gina Anterior</a>&nbsp;-&nbsp;";
      
      for ($i=1; $i<=$paginas; $i++) {
         if ($i == $p)
            echo "<strong>$i</strong>&nbsp;";
         else
            echo "<a href="index.php?p=$i">$i</a>&nbsp;";
      }
      
      if ($p<$paginas)
         echo "&nbsp;-&nbsp;<a href="index.php?p=" . ($p+1) . "">P&aacute;gina Siguiente&nbsp;</a>";
      echo '</div>';
return;
   }

Eso sería todo, para llamar a la función simplemente realizamos:

index.php

Código :

<?php
   $vector = array("hola", "chau", "hola", "chau", "hola", "chau", "hola", "chau", "hola", "chau", "hola", "chau", "hola", "chau", "hola", "chau", "hola", "chau", "hola", "chau", "hola", "chau", "hola", "chau", "hola", "chau", "hola", "chau" );
   
   require ("paginar.php");
   
   if (isset($_GET[p]))
      $p = $_GET[p];
   else
      $p=1;
      
   paginar($vector, 10, $p);
?>

Espero que les sirva de base para un desarrollo más complejo, saludos!

Pueden ver el ejemplo funcionando en http://www.reweb.com.ar/labs/paginarVector/

Enviar comentario

Crear una clase para conectar a base de datos con PHP

Miércoles, Octubre 29th, 2008

Cuando un programador web comienza con PHP, una de las tareas más habituales es la de realizar conexiones y querys a la base de datos. Normalmente, muchísima gente utiliza funciones php para conectarse a una base de datos directamente en el código como puede ser mysql_connect (para conectarse a una base de datos MySQL) o pg_connect (para conectarse a una base de datos Postgress).

Esta forma de trabajar implica un problema muy serio si nuestro proyecto va orientado a una intranet, en la cual, de la noche a la mañana pueden tener la necesidad de cambiar la base de datos por otra diferente (por ejemplo, que una intranet crezca mucho y necesiten cambiar a una base de datos Oracle por funcionalidades específicas).

Si se da este caso podríamos tener un problema muy grave; deberíamos revisar todo el código que hemos escrito en busca de esas funciones específicas y adaptarlas a la nueva base de datos.

Para solventar este problema (crear una capa que nos abstraiga de que base de datos estemos utilizando) y además crear posibles funcionalidades nuevas, vamos a crear una clase muy sencilla la cual nos permita conectarnos a la base de datos. Esta clase la vamos a crear siguiendo el patrón de diseño Singleton. Los patrones de diseño son soluciones a problemas típicos de programación que se repiten contínuamente. El patrón Singleton nos ayuda a crear una clase la cual, si intentamos llamarla dos veces, realmente sólo es una instancia. En vez intentar crear el objeto, lo que haremos es instanciarlo. Esto nos permite conectarnos a la base de datos en cualquier punto del código (dentro de funciones, dentro de objectos,…) sin necesidad de crear más conexiones o tener que pasarla por parámetro (en el caso de querer que una función determinada que tengamos creada utilice una conexión existente y no cree otra nueva).

La estructura de la clase sería la siguiente:

Código :

<?php

/* Clase encargada de gestionar las conexiones a la base de datos */
Class Db{

   private $servidor='localhost';
   private $usuario='user';
   private $password='test';
   private $base_datos='testDB';
   private $link;
   private $stmt;
   private $array;

   static $_instance;

   /*La función construct es privada para evitar que el objeto pueda ser creado mediante new*/
   private function __construct(){
      $this->conectar();
   }

   /*Evitamos el clonaje del objeto. Patrón Singleton*/
   private function __clone(){ }

   /*Función encargada de crear, si es necesario, el objeto. Esta es la función que debemos llamar desde fuera de la clase para instanciar el objeto, y así, poder utilizar sus métodos*/
   public static function getInstance(){
      if (!(self::$_instance instanceof self)){
         self::$_instance=new self();
      }
      return self::$_instance;
   }

   /*Realiza la conexión a la base de datos.*/
   private function conectar(){
      $this->link=mysql_connect($this->servidor, $this->usuario, $this->password);
      mysql_select_db($this->base_datos,$this->link);
      @mysql_query("SET NAMES 'utf8'");
   }

   /*Método para ejecutar una sentencia sql*/
   public function ejecutar($sql){
      $this->stmt=mysql_query($sql,$this->link);
      return $this->stmt;
   }

   /*Método para obtener una fila de resultados de la sentencia sql*/
   public function obtener_fila($stmt,$fila){
      if ($fila==0){
         $this->array=mysql_fetch_array($stmt);
      }else{
         mysql_data_seek($stmt,$fila);
         $this->array=mysql_fetch_array($stmt);
      }
      return $this->array;
   }

   //Devuelve el último id del insert introducido
   public function lastID(){
      return mysql_insert_id($this->link);
   }

}
?>

En esta clase, cómo podemos observar, existen varios métodos para conectar, obtener resultados de una query así como el último id que se ha creado mediante un Insert en un campo clave autoincremental.

Ahora veamos como utilizar esta clase:

Código :

<?php

/*Incluimos el fichero de la clase*/
require 'Db.class.php';

/*Creamos la instancia del objeto. Ya estamos conectados*/
$bd=Db::getInstance();

/*Creamos una query sencilla*/
$sql='SELECT NOMBRE FROM CLIENTES';

/*Ejecutamos la query*/
$stmt=$bd->ejecutar($sql);

/*Realizamos un bucle para ir obteniendo los resultados*/
while ($x=$bd->obtener_fila($stmt,0)){
   echo $x['NOMBRE'].'<br />';
}

?>

Muy sencillo y práctico.

Esta clase es muy (MUY) mejorable. Por ejemplo, en el siguiente tip veremos como utilizar un fichero de configuración que será utilizado por una clase llamada Conf, la cual será utilizada a su vez por esta clase que acabamos de crear. Además, introducir control de errores de conexión, niveles de seguridad para utilizar diferentes perfiles según el ámbito de la conexión,…

Esta clase va dirigida a aquellas personas que todavía no utilizan un Framework y siguen trabajando directamente sobre PHP.

Enviar comentario

Listar resultados de una búsqueda con PHP + MySQL para AJAX

Lunes, Octubre 27th, 2008

Bueno, la idea es realizar un PHP que nos devuelva un XML con resultados de una búsqueda pasada por parámetros POST y lo envíe como text/xml para poder ser recogido de forma fácil mediante JavaScript con el objeto XMLHttpRequest.

Supongamos ahora que tenemos una tabla llamada STOCK en donde almacenamos los registros referidos a cada producto que comercializa la empresa de Manolo. Los principales campos son ID, CÓDIGO DE PRODUCTO, DESCRIPCION, URLIMG (url de la imagen). Vamos a enviarle a nuestro buscador.php la variable buscar por POST para que la recoja en el caso que corresponda y realice la búsqueda.

Veamos un poco de código:

buscador.php

Código :

<?php
   header("Content-type: text/xml");

Antes que nada definiremos el formato de salida como text/xml para que se interprete el contenido como un archivo XML. Esto lo hacemos mediante la función header() que envía una cabecera.

Código :

require (“conexión.php”);

Aquí el archivo con los datos de la conexión a la base de datos, ojo! es muy recomendable que el archivo NO se encuentre en una carpeta pública.

Código :

$condicion = "";
$resultados = 0;

Definimos las variables en juego, $condicion se refiere a la las especificaciones del SELECT de la búsqueda, luego:

Código :

if (isset($_POST['buscar'])) {

      $cadena = htmlentities($_POST['buscar']);
      $cadena = str_replace(" ", "%", $cadena);
      
      $condicion .= " WHERE DESCRIP LIKE '%$cadena%'";
   }

Con htmlentities() prevenimos la inclusión de caracteres no deseados en la consulta. Es importante realizar un control sobre los parámetros pasados para evitar problemas de inyección SQL. Luego reemplazamos los espacios por comodines “%” para especificar que las palabras separadas deben aparecer juntas en los resultados de la búsqueda.

Código :

// REALIZAMOS LA CONSULTA SEGUN LOS PARAMETROS OBTENIDOS   
   $consulta = "SELECT * FROM STOCK$condicion ";
   if (!($res = mysql_query($consulta)))
      echo $consulta;

Así procedemos a realizar la consulta y obtener los resultados, en caso de que la consulta falle devolvemos el código SQL (es importante reemplazar esto por un mensaje de error pertinente).

Y, finalmente, creamos el documento XML mediante el objeto DOMDocument() y funciones como $objeto->appendChild(), $objeto->createElement(), $objeto->setAttribute() que sirven para agregar nodos, crear nodos y setear atributos de un nodo respectivamente, dentro del archivo XML:

Código :

// OBTENEMOS LA CANTIDAD DE RESULTADOS
   $resultados = mysql_num_rows($res);
   
   /** CREAMOS EL DOM DE NUESTRO XML
     * CON LA SIGUIENTE ESTRUCTURA:
      *
     * <productos n=$resultados>
     *       <producto>
     *         <codigo>codigo</codigo>
     *         <descripcion>descripcion</descripcion>
     *          <urlimg>urlimg</urlimg>
     *       </producto>
     *      ...
     * </productos>
     */
   $dom = new DOMDocument('1.0', 'UTF-8');
   $productos =$dom->appendChild($dom->createElement("productos"));
   $productos->setAttribute("n", $resultados);
   
   for ($i=0; $i<mysql_num_rows($res); $i++) {
   
      // DEFINIMOS LAS VARIABLES DE DATOS
      $txtCodigo = utf8_encode(mysql_result($res, $i, 'CODIGO'));
      $txtDescripcion = utf8_encode(mysql_result($res, $i, 'DESCRIP'));
      $txtUrlimg = utf8_encode(mysql_result($res, $i, 'urlimg'));
      
      // ANEXAMOS LOS NODOS
      $producto = $productos->appendChild($dom->createElement('producto'));
      $producto->setAttribute('id', $txtCodigo);
      
      $codigo = $producto->appendChild($dom->createElement('codigo'));
      $codigo->appendChild($dom->createTextNode($txtCodigo));
      
      $descripcion = $producto->appendChild($dom->createElement('descripcion'));
      $descripcion->appendChild($dom->createTextNode($txtDescripcion));
      
      $urlimg = $producto->appendChild($dom->createElement('urlimg'));
      $urlimg->appendChild($dom->createTextNode($txtUrlimg));
   }

Y, por último, devolvemos el resultado como un XML de la siguiente forma:

Código :

// UNA VEZ CREADO EL XML LO VOLCAMOS EN LA PANTALLA
   $dom->formatOutput = true;
   echo $dom->saveXML();
      
   mysql_close();
?>

Eso es todo, es bastante simple y provee un punto de partida para facilitar el trabajo con el lenguaje de servidor en AJAX y realizar un nexo entre los registros de una base de datos con la aplicación correspondiente, espero haya servido, saludos!

Enviar comentario

Listar archivos de un directorio web con PHP y XML

Lunes, Octubre 27th, 2008

Este es un sencillo script de PHP que nos permite generar un archivo XML con el listado de todos los archivos y carpetas que esten contenidos dentro del directorio en el que hemos situado el archivo PHP.

Esto nos puede resultar útil para realizar galerías fotográficas en las que queremos acceder a todas las imágenes de un directorio y queremos poder subir o borrar archivos. El archivo XML siempre estará actualizado a los ficheros del servidor.

El archivo PHP es el siguiente. Lo llamaremos list.php y lo subiremos al servidor dentro de la carpeta que nos interese listar.

Código :

<?php
   $dir = "./";
   
   echo "<XML encoding='UTF-8' standalone='yes' version='1.0'>n";
   echo "  <folder>n";
   
   if (is_dir($dir))
   {
       if ($gd = opendir($dir))
      {
           while (($archivo = readdir($gd)) !== false)
         {
            if ($archivo != "." & $archivo != ".." & $archivo != "list.php")
            {
               if (is_dir($archivo))
               {
                     echo "    <folder>$archivo</folder>n";
               }
               else
               {
                     echo "    <file>$archivo</file>n";
               }
            }
           }
           closedir($gd);
       }
   }
   
   echo "  </folder>n";
   echo "</XML>n";
?>

El script lo único que hace es recorrer todos los elementos de la carpeta en la que está situado y a base de "echos" formatea el XML.

Si visualizamos este archivo desde el navegador y miramos el código resultante este sería un archivo XML de este estilo:

Código :

<XML encoding='UTF-8' standalone='yes' version='1.0'>
  <folder>
    <file>img_001.jpg</file>
    <file>img_002.jpg</file>
    <file>img_003.jpg</file>
    <file>img_004.jpg</file>
    <file>img_005.jpg</file>
    <folder>thumbs</folder>
    <folder>hires</folder>
  </folder>
</XML>

De esta manera si quisiésemos, por ejemplo, listar el contenido de imágenes disponibles de este directorio dentro de un componente List de Flash haríamos lo siguiente:

Código :

import fl.data.DataProvider;

var _URLLoader = new URLLoader();
var _URLRequest = new URLRequest();

_URLRequest.url = "/img/list.php";
_URLLoader.load(_URLRequest);
_URLLoader.addEventListener(Event.COMPLETE, onListComplete);

function onListComplete(e:Event):void
{
   var xml:XML = new XML(e.target.data);
   var xmlList:XMLList = xml.folder.file;
   var dataProvider = new DataProvider();
   for each (var item in xmlList)
   {
      dataProvider.addItem({label:item});
   }
   listado.dataProvider = dataProvider;
}

Cargamos el archivo PHP como si de un XML se tratase, y de ahí lo convertimos en el dataProvider del componente.

Enviar comentario

Cómo obtener el total de días en un mes en PHP

Miércoles, Octubre 1st, 2008

Les paso una sencilla función para saber cuantos días tiene un mes. Ya existe una función nativa de php para eso, pero requiere tener instalada la extensión de calendario (no todos los servidores compilan php con esa extensión). Si no tienes la extensión, obtenemos el total de meses, con una función que se me ocurrió el otro día y es muy simple.

Código :

function getMonthDays($Month, $Year)
{
   //Si la extensión que mencioné está instalada, usamos esa.
   if( is_callable("cal_days_in_month"))
   {
      return cal_days_in_month(CAL_GREGORIAN, $Month, $Year);
   }
   else
   {
      //Lo hacemos a mi manera.
      return date("d",mktime(0,0,0,$Month+1,0,$Year));
   }
}
//Obtenemos la cantidad de días que tiene septiembre del 2008
echo getMonthDays(9, 2008);

Simplemente hay que pasarle como parámetro el mes y el año, es todo.

Enviar comentario

Conectarse a 2 bases de datos con PHP alternativamente

Miércoles, Octubre 1st, 2008

Cuando tenemos una página enlazada a la base de datos del servidor, pero queremos hacer pruebas en nuestro servidor remoto, nos encontramos con el problema de cambiar los datos de conexión, ya sea en tu archivo de conexión si lo tuvieras (muy recomendable) o cambiar los datos en cada pagina que llame al dicho archivo por otro que contenga los datos de tu servido local, es decir el problema se presenta como algo así:

Tienes esta linea para conectarte a tu servidor remoto

Código :

require_once('Connections/conexion_remota.php'); 

El cual esta llamando a un archivo con mas o menos el siguiente esquema

Código :

<?php
$hostname='tu.servidor.remoto';
$username='usuario_remoto';
$password='password_remoto';
$dbname='base_de_datos'; 

$base = mysql_connect($hostname,$username, $password) OR DIE ('No puedo conectarme a la base de datos! Inténtelo nuevamente.');
?>

Si quisieras conectarte a otra base en vez de esta como ya lo dije arriba o bien cambias la linea del include para llamar a otro archivo quedando algo como

Código :

#require_once('Connections/conexion_remota.php');
require_once('Connections/conexion_local.php'); 

Con la consiguiente creación del archivo de conexión local, sin embargo existe otra manera de evitar todo este engorroso procedimiento. Cada vez que deseamos conectarnos a la base local, en vez de la remota, podemos usar este código. Lean los comentarios:

Código :

<?php
$hostname='tu.servidor.remoto';
$username='tu_usuario_remoto';
$password='tu_password_remoto'; 

$hostname2='localhost'; //puede ser reemplazado por el nombre de tu servidor local si fuera otro nombre
$username2='tu_usuario_local';
$password2='tu_password_local'; 

$dbname='tu_base_de_datos';
#Para efectos del ejemplo supondremos que es la misma base de datos en ambas bases de datos tanto la remota como la local 

$conex_remota = @mysql_connect($hostname,$username, $password);
#notese el @ antes del comando mysql_connect para evitar que arroje mensaje de error de PHP 

if (!($conex_remota)) {
    $conex_local = @mysql_connect($hostname2,$username2, $password2) OR DIE ('No puedo conectarme a la base de datos local! Intentelo nuevamente.');
}
mysql_select_db($dbname);
?>

Espero les sirva este pequeño aporte. Con algunas pequeñas modificaciones podría servir para conectarse a una segunda base de datos remota, en vez de la local, en caso la base principal no pueda ser accesible.

Enviar comentario

Clase para renombrar varios archivos mediante PHP

Lunes, Septiembre 15th, 2008

Me gusta que los nombres de los archivos que descargo sean correctos y sea fácil, buscarlos. Esto significa que los nombres deben tener el numero de capitulo, la serie/anime en cuestión y el nombre del capítulo.

El problema, es que a veces se consiguen con nombres de archivos que parecen el resultado de alguna función random, por lo que tenemos una ardua labor de renombrar cada uno de los archivos a mano.

Así que hice un pequeño script en PHP para facilitarme la vida:

Código :

<?php
class files
{
   private $total;
   private $archivos;
   private $serie;
   private $nombre;
   private $ext;
   private $report;
   private $sep;
   
   function __construct() {
      $directorio = getcwd();
      $me = $_SERVER['SCRIPT_NAME'];
      $me = basename($me);

      $this->report = '';
      
      $dire = opendir($directorio);
      
      if ($dire)
      {
         while($nombre_archivo = readdir($dire))
         {
            if ((is_file($nombre_archivo)) && ($nombre_archivo != $me))
            {
               $this->archivos[] = $nombre_archivo;
            }
         }
      }
      sort($this->archivos);
      $this->total = count($this->archivos);
      $this->ext = substr($this->archivos[0], -3, 3);
   }
   
   public function getTotal()
   {
      return $this->total;
   }
   
   public function getName($value)
   {
      return $this->archivos[$value];
   }

   public function getReport()
   {
      return $this->report;
   }

   public function setSerie($value)
   {
      $this->serie = $value;
   }

   public function setSep($value)
   {
      $this->sep = ' ' . $value . ' ';
   }
   
   public function setExt($value)
   {
      $this->ext = '.' . $value;
   }   

   public function getExt()
   {
      return $this->ext;
   }
   
   public function setName($i, $value, $uppercase)
   {
      if ($value != '') {
         if ($uppercase) {
            $value = ucfirst(strtolower($value));
         }
         $this->nombre[$i] = $this->setCapitulo($i + 1) . $this->sep . $this->serie . $this->sep . $value . $this->ext;
      } else {
         $this->nombre[$i] = $this->archivos[$i];
      }
   }
   
   private function setCapitulo($value)
   {
      if ($value <= 9) {
         return '0' . $value;
      } else {
         return $value;
      }
   }
   
   public function renombrar()
   {
      for ($x=0; $x < $this->total; $x++) {
         rename($this->archivos[$x], $this->nombre[$x]);
         $this->report .= 'Cambie: "' . $this->archivos[$x] . '" por "' . $this->nombre[$x] . '" <br />';   
      }
   }
}

$archi = new files();

if ($_POST)
{
   $caps = $_POST['cap'];
   $formats = $_POST['format'];
   $archi->setSerie($_POST['serie']);
   $archi->setSep($_POST['sep']);
   $archi->setExt($_POST['ext']);
   for ($i=0; $i < $archi->getTotal(); $i++) {
      $archi->setName($i, $caps[$i], $formats[$i]);
   }
   $archi->renombrar();
   echo $archi->getReport();
}
else
{

?>
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title>Renombrando archivos</title>
    </head>
    <body>
    </body>
    <form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post" />
    Serie: <input type="text" name="serie" /><br />
    Separador: <input type="text" name="sep" value="-" /><br />
    Extension: <input type="text" name="ext" value="<?php echo $archi->getExt(); ?>" /><br />
    <?php for ($i=0; $i < $archi->getTotal(); $i++) { ?>
    Capitulo <?php echo $i + 1; ?>: <?php echo $archi->getName($i); ?> -> Nombre nuevo: <input type="text" name="cap[<?php echo $i; ?>]" /> Formatear texto <input type="checkbox" value="true" checked="checked" name="format[<?php echo $i; ?>]" /><br />
    <?php } ?>
    <input type="submit" value="Renombrar" />
    </form>
    </html>
<?php
}
?>

A explicar un poco todo ahora.

Para que este script funcione, como mínimo, los archivos deben estar ordenados. No importa cómo, pero por lo general, si los bajamos de Internet, vienen ordenados. Y el script debe estar en la misma carpeta que los archivos a renombrar.
Aclaración: NO hace validación de caracteres, así que si ponen cosas como ¿\: lo más probable es que no realice el cambio de nombre de ese archivo.


El formulario

Cuando ejecutamos por primera vez el script vamos a ver el formulario con los siguientes inputs:

  • El nombre de la serie en cuestión.
  • El separador que queremos usar, por defecto está el guión "-".
  • La extensión de los archivos, por defecto toma la de los archivos.
  • Un listado con los capítulos actuales, y el nuevo nombre que le queremos dar. Este nombre deberá ser el nombre del capítulo.
  • Luego veremos un checkbox que es para darle un formato; esto viene a cuento de que a veces conseguimos una lista con los nombres de capítulos y por ejemplo, un nombre puede ser "La Vaca Que Cruzó la Calle", esto estimados, está MAL ortográficamente hablando (sí, así de obsesivo soy), si el check esta tildado (opción por defecto) convierte esa cadena a "La vaca que cruzó la calle". Si desactivamos el check, el nombre del capitulo será tal cual lo escribimos en el input.

Luego de que escribamos todos los nombres, viene la magia.

Voy a dar un ejemplo del script:

Serie: "Burst angel"
Separador: "-"
Extensión: "avi"
Capitulo 1: "La Batalla del Ángel Caído" Format: true
Capitulo 2: "Joe asesina a Meg" Format: false

El resultado será:
01 - Burst angel - La batalla del ángel caído.avi
02 - Burst angel - Joe asesina a Meg.avi


La clase

El constructor: Lo que hace el constructor es hacer el listado que vimos antes en el formulario, ordena los archivos, los cuenta, y setea algunas variables.
Luego tenemos los setters y getters:

  • setSep: Automáticamente agrega un espacio antes y después del separador.
  • setExt: Automáticamente agrega el punto antes de la extensión.
  • setName: Crea un vector con los nuevos nombres, si está el check activado, formatea el nombre del capítulo. Una validación que tiene, es si no ingresamos nada como nombre, le asignara el mismo nombre que tiene actualmente.
  • setCapitulo: Formatea el numero del capítulo, si es menor a 9, le agrega un cero (se verá 09).

Luego, viene el que hace la otra parte de la magia; renombrar.
Esta función recorre los 2 vectores (uno que contiene el nombre de archivo, y el otro que contiene el nuevo nombre), renombrando los archivos, y generando un reporte diciendo a qué archivo le puse qué nombres.


Uso de la clase.

Luego de que se instancia la case, viene un if. Con ese if sabremos si estamos o no recibiendo variables desde el formulario. Si no las recibimos, veremos el formulario con todo lo explicado anteriormente.
Cuando enviamos todo por el formulario, vamos a setear el nombre de la serie, el separador, la extensión de los archivos y tendremos 2 vectores, uno con el nombre de los capítulos y otro con un true/false para saber si debemos darle un formato. Luego de eso, viene un for para setear el nombre de los archivos, a continuación le decimos que renombre y nos muestre el reporte.

Espero que les sea útil.

Enviar comentario