Archive for the ‘php’ Category

Encuestas en AS2 y PHP

Sábado, Abril 17th, 2010

A pedido Diego Oscar Romero hago este tip en donde vamos a ver como crear encuestas en AS2 utilizando PHP. Se puede votar una sola vez por número IP, y muestra los resultados en barras de porcentaje.

Parte 1


Parte 2


Parte 3


Descargar archivos del tutorial

Enviar comentario

CodeIgniter - Interaccion dinamica con otros sitios web

Jueves, Abril 15th, 2010

CodeIgniter es un liviano framework para php , que cuenta con bastantes librerías/clases/helpers y opciones muy útiles que nos ahorra mucho tiempo a la hora de empezar a programar.

Lamentablemente CodeIgniter no cuenta con ninguna herramienta para la “extracción” y manipulación de strings útiles, como en este caso usando “Xclass” , una librería que programe para esta tarea.

Cual tarea?
en ocasiones necesitaremos de alguna manera “interactuar” con otra pagina que no nos facilita ninguna api ni herramienta para hacerlo.. pues en este caso supongamos necesitemos extraer las “ultimas noticias” o las “estadisticas del mundial”,”el clima”,”últimos comentarios de una persona”..

Xclass nos facilita la tarea , solo ingresando 3 parámetros:

  • La url de la pagina a solicitar la informacion.
  • La cadena desde donde se iniciara a extraer.
  • La cadena donde se terminara de extraer.

(A parte de webs , Xclass también sirve para cadenas comunes a las que necesitemos extraer una sección)

Instalando Xclass en CodeIgniter

http://xerotutos.vacau.com/Xclass.zip

Para instalar una librería en CodeIgniter , solo necesitamos descargar Xclass.php , ir a la carpeta en donde esta corriendo CodeIgniter->system->application->libraries y pegar Xclass.php.

Siguiendo esto ya “instalamos” Xclass y esta lista para usarse en CodeIgniter.

Usaremos mi perfil de Cristalab , extraeremos mi numero de post,tips,clablevel….

Crearemos un controlador “Xero.php” en la carpeta system->application->controlles con lo siguiente:

Código :

 <?php
class Xero extends Controller{
function Xero()
{
parent::Controller();
}
function index()
{
$this->load->library("xclass");
echo $this->xclass->xas('http://www.cristalab.com/usuario/88793-xer0s','<div class=”profile-info”>','<div class=”pie”></div>');
}
}
?>

Simplemente es un controlador normal , llamamos a la libreria “Xclass” luego a la funcion con 3 parametros:

Código :

$this->load->library("xclass");
$this->xclass->xas("$target","$primera_cadena","$segunda_cadena");

El primer parámetro es la url, el segundo es la primera aparición donde empezaremos a extraer el código y el tercer parámetro indica hasta donde seguirá extrayendo.

La parte que nos interesa:

Código :

<div class=”profile-info“>
<p>
<big><strong>Xer0s</strong> es <em>Usuario</em> de Cristalab</big><br />
<a href=”http://xerotutos.vacau.com” target=”_userwww“>http://xerotutos.vacau.com</a><br />
<span>Con <strong class=”relevante“>63</strong> de
<strong><acronym title=”Nivel de participaci&oacute;n en la comunidad. Lo obtienes posteando, con tutoriales, tips, etc.“>clabLevel</acronym></strong></span><br />
Desde el 05 Ene 2010 </p>
<p></p>
</div>
<ul id=”user-stats“>
<li class=”mssages-q“><a href=”http://foros.cristalab.com/search.php?search_author=Xer0s“>21 mensajes</a></li>
<li>0 tutoriales</li>
<li>0 ejemplos</li>
<li>1 tips</li>
<li>0 art&iacute;culos</li>
</ul>
<div class=”pie“></div>

(Extraído del ”Código fuente”)

Mi perfil:(primer parámetro)
http://www.cristalab.com/usuario/88793-xer0s

El segundo parámetro:

<divclass=”profile-info“>

El tercer Parámetro:

<div class=”pie“></div>

Dando como resultado: http://localhost/index.php/xero/

Así de simple ha sido extraer esa información , solo usando el parámetro que extraemos viendo el html que deseamos extraer. También es aconsejable leer sobre expresiones regulares.

Enviar comentario

JpGraph - Parte II: Tu Primera Gráfica Estadística

Jueves, Abril 15th, 2010

En la entrega anterior vimos como Instalar esta librería en nuestro servidor de pruebas o en nuestro sitio web y no morir en el intento, esta vez comenzaremos a hacer uso de lo que instalamos esa vez creando nuestra primera gráfica.

AVISO:
Para mayor comodidad de ahora en adelante asumiremos que trabajamos en un entorno de hosting donde no tendremos acceso al directorio PHP y por tanto hemos guardado nuestra librería en el directorio "jpgraph"

Los Datos a Emplearse

Dado que para generar gráficas estadísticas necesitamos datos, para efectos de ejemplo usaremos los datos estadísticos de manchas solares, datos ya disponibles para uso público. Los datos utilizados aquí se toma de SIDC (El Solar Influencias Centro de Análisis de Datos) en Bélgica . En este ejemplo vamos a utilizar el resumen de datos históricos que muestra el número total de manchas solares por año desde 1700.

Preparación de la Data

Lo primero para nuestra gráfica y para nuestro script de PHP es recopilar la data a emplearse, dado que JpGraph no es muy exigente con el origen de los datos, esta tarea sera relativamente fácil y deberemos preocuparnos únicamente que los datos sean número enteros o de coma flotante.
Para generar una gráfica de datos, el origen de los mismos puede ser:

  • Datos escritos directamente en el script. Esta método se recomienda únicamente si la data es realmente estática.
  • Datos almacenados en un archivo de texto plano.(Usaremos esta forma para este ejemplo)
  • Datos almacenados en archivos binarios.
  • Datos cuyo origen es una base de datos.
  • Datos enviados al script por intermedio de la URI pasando los parámetros POST o GET

Lo común en todos los casos es que el desarrollador tenga acceso al menos de lectura a la fuente de los datos, en este caso un archivo de texto plano con dos columnas de datos la primera referida al año ( con un ".5" añadido a propósito para indicar el promedio del mismo) y la segunda indicando el número de manchas solares para el año correspondiente. Para efectos de muestra visualizaremos las 10 primeras lineas:

Código :

1700.5 5.0
1701.5 11.0
1702.5 16.0
1703.5 23.0
1704.5 36.0
1705.5 58.0
1706.5 29.0
1707.5 20.0
1708.5 10.0
1709.5 8.0

Suponiendo que estos datos están almacenados en un archivo de nombre "yearssn.txt" y que dicho archivo se encuentra en el mismo directorio que nuestro script a realizar, este debera obtener al final dos matrices de datos, una para cada columna:

Código :

<?php
function readsunspotdata($aFile, &$aYears, &$aSunspots) {
$lines = @file($aFile,FILE_IGNORE_NEW_LINES|FILE_SKIP_EMPTY_LINES);
if( $lines === false ) {
throw new JpGraphException('Can not read sunspot data file.');
};
foreach( $lines as $line => $datarow ) {
$split = preg_split('/[s]+/',$datarow);
$aYears[] = substr(trim($split[0]),0,4);
$aSunspots[] = trim($split[1]);
};
};

$year = array();
$ydata = array();
readsunspotdata('yearssn.txt',$year,$ydata);
?>

En este script lo que hemos hecho es leer el archivo de texto y dividir la data en 2 matrices las cuales usaremos ahora para poder crear nuestra gráfica, también se ha incluido un excepción en el caso que la data a obtenerse no este disponible en este primer ejercicio no hemos ahondado en el manejo de errores y se ha colocado este solo ha manera de ejemplo, más adelante se tratará el tema en detalle.
Ahora disponemos de dos matrices, $year y $ydata.

TIP:
Otra forma de manejar archivos externos es trabajando con archivos de valores separados por comas (.CSV) para los cuales PHP tiene métodos específicos para su lectura ReadFileData:: FromCSV ().

Nuestro primer gráfico básico

Para este ejemplo básico usaremos un gráfico de lineas, el código a continuación se centra en la generación del gráfico, pero el código anterior deberá de ser incluido previamente para que funcione todo el conjunto.
Para la generación de cualquier gráfico con esta librería, tenemos necesariamente que incluir al menos 02 archivos, "jpgraph.php" y el archivo que se refiera al gráfico en especifico que vamos a utilizar en este caso en concreto "jpgraph_line.php" ya que la inclusión de estos archivos es vital para el funcionamiento del script, recomendamos el uso de require_once(’jpgraph/jpgraph.php); se recomienda esta práctica para la inclusión de todas las clases que usemos en el futuro.

Código :

<?php
// Ancho y Alto del gráfico
$width = 600; $height = 200;

// Creamos una instancia de Graph
$graph = new Graph($width,$height);

// Especificamos la Escala que desamos usar,
// int = Escala de enteros para el eje X
// int = Escala de enteros para el eje Y
$graph->SetScale('intint');

// Establecemos el titulo para graph
$graph->title->Set('Sunspot example');

// Establecemos los títulos para el eje X
$graph->xaxis->title->Set('(year from 1701)');

// Establecemos los títulos para el eje Y
$graph->yaxis->title->Set('(# sunspots)');

// Creamos el Dibujo del Gráfico de Lineas
$lineplot=new LinePlot($ydata);

// Añadimos el dibujo a nuestra gráfica
$graph->Add($lineplot);

// Mostramos la gráfica
$graph->Stroke();
?>

El resultado del script de arriba es la imagen que vemos a continuación, para mayor detalle observese los comentarios.

Hasta aquí el día de hoy, la próxima vez concluiremos este ejemplo añadiendo algunas modificaciones a la gráfica que hemos creado hoy, añadiremos un etiquetas al eje X, cambiaremos los colores del área delimitada por la linea e incluso estableceremos la transparencia (canal alpha) para dicho relleno, crearemos un gráfico de barras con la misma data y limitaremos el número de barras a mostrar.

Enviar comentario

JpGraph - Parte I: Intro e Instalación

Martes, Abril 13th, 2010

Muchas veces en un proyecto de desarrollo Web, ya sea para una página o para una aplicación, requerimos la creación de una o más gráficas (lineas, áreas, barras, pie, anillo, radar) para representar visualmente datos que de otra forma sería complicado de visualizar, para este tipo de situaciones existe la librería JpGraph desarrollada para cubrir esta funcionalidades y otras que veremos más adelante.

¿Qué es JpGraph?

JpGraph es una poderosa librería desarrollada para PHP4 y PHP5 cuyo propósito es simplificar la creación del trazado de gráficas dinámicas en 2D, JpGraph ademas se puede usar por si misma o como parte integrada de un proyecto mayor.

Prerequisitos

  • Cualquier Sistema Operativo de 32bits capaz de operar PHP5.
  • PHP5, versión 5.1.0 o superior (puede funcionar con versiones anteriores pero no esta soportado oficialmente).
  • Tener la librería GD 2.x de PHP activada. Normalmente viene incluida con la distribución PHP5. Recomendamos el uso de la versión de GD incluida en PHP5 y no instalarlo por separado.
  • Estar familiarizado y tener habilidades básicas en PHP.
  • Tener entendimiento de los conceptos de Objetos y de Programación Orientada a Objetos.
  • Entendimiento total de los conceptos básicos de clase, método, instancias de clase
ATENCIÓN

Se conoce de problemas generados al ejecutar la biblioteca en sistemas operativos de 64 bits por lo cual esta biblioteca no es oficialmente compatible con dichos sistemas

Instalación

¡¡¡ADVERTENCIA!!!

La guía de instalación para la librería esta orientada para uso en conjunto con WAMP en lo referente a servidor local o de pruebas, también se incluirá datos para usar la librería en entorno de Hosting.
Para el caso de Servidor de pruebas WAMP supondremos que el mismo esta instalado en el Disco C:\ y por tanto la ruta de acceso es

C:\WAMP\

y el root del localhost se ubica en

C:\WAMP\WWW\

asi mismo el interprete PHP se ubica en

C:\WAMP\BIN\PHP\PHP5.3.0 (para la última version de WAMP)

  • Descargue la librería JpGraph versión gratuita.
  • Dado que el archivo es un .tar.gz deberá descomprimirla primero, para aquellos poco familiarizados con este formato utilicen una versión reciente de WinRAR para descomprimirlo. Se generará un directorio jpgraph-3.x (x es el número de subversión) dentro del mismo encontrará una carpeta con el nombre "src" copie el contenido de esta carpeta en el directorio de PHP
    C:\WAMP\BIN\PHP\PHP5.3.0\JPGRAPH\ (De ser necesario cree la subcarpeta "JPGRAPH")
  • Verifique que la extensión GD este activada en su archivo php.ini (puede revisarlo con phpinfo() desde la pagina principal de su servidor WAMP)
  • OPCIONAL: Verifique dentro del archivo jpg-config.inc.php que las rutas especificadas corresponden con las de su servidor (en la mayoría de casos no deberá efectuar ningún cambio) Para la ruta de TTF recuerde que en vez de especificar C:\WINDOWS\FONTS deberá especificar C:\\WINDOWS\\FONTS esto debido a que la contra barra "\" sirve como carácter de escape en PHP.
  • OPCIONAL: Verifique si tiene memoria suficiente asi como tiempo de ejecución en su archivo php.ini. Es recomendable tener un mínimo de 32Mb (memory_limit = 32M) de memoria para PHP para gráficas básicas y un mínimo de tiempo de ejecución de 30 segundos (max_execution_time = 30) al menos.
  • Especifique dentro de php.ini la inclusión de la ruta del directorio que contiene a JpGraph (include_path="C:\WAMP\BIN\PHP\PHP5.3.0\")
  • En caso usar la librería en un servidor de paga o gratuito en el cual no tendrá acceso al archivo php.ini ni podrá grabar la librería en el directorio de PHP, copie los archivos especificados dentro de un directorio de nombre JPGRAPH y haga una llamada include_once o require_once (’jpgraph/jpgraph.php’) en cada archivo en que requiera usar la librería.

Siguiendo estos pasos ya debería de ser capaz de generar gráficas dentro de sus proyectos utilizando la librería JpGraph, para comprobar esto, copie el archivo "C:\WAMP\BIN\PHP\PHP5.3.0\JPGRAPH\EXAMPLES\EXAMPLE0.PHP" dentro del root de sus servidor de prueba y ejecútelo desde cualquier navegador, deberá de observar el siguiente gráfico

Hasta aquí esta parte, la próxima entrega generaremos nuestro primer gráfico con JpGraph y veremos otras funcionalidades.

Enviar comentario

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


Instalación de CodeKa, sistema web de facturación

Miércoles, Diciembre 2nd, 2009

Codeka es un sistema de facturación programado en php. Este sistema es capaz de crear nuevos clientes, añadir artículos, vender, posee tesorería, proveedores y demás secciones bastante utiles para cualquier negocio.

CodeKa, software open source para facturar en linea

La instalación de CodeKa es lo que yo llamaría un tanto antigua, ya que no tiene archivo de instalación (típico install.php), si no que hay que instalarlo mediante un SQL que te trae y editar el archivo de configuración.

Instalación de la Base de Datos

Aunque antigua la instalación, no es nada complicada, sería 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.

Configuración de CodeKa

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

Código :

<?php

$Usuario="usuario";
$Password="contraseña";

$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 veréis, mas sencillo imposible, y encima, un buen soft.

Saludos

Enviar comentario

Monitor de servidor en PHP

Miércoles, Diciembre 2nd, 2009

Hace unos días 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 sólo 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 caídas via e-mail al instante.

Código 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 período 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 administración de la cuenta, vamos a la opción Cron Jobs y asignamos intervalos de 5 minutos a la ejecución 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 múltiples sitio, guardar stats en una base de datos, etc, etc, etc. Código 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