Web
Como hacer debug de PHP
by P-los on Apr.22, 2010, under Tutoriales, Web
Esta ocasión les presento un tutorial para poder debugguear nuestras aplicaciones PHP de manera local. Para ello necesitaremos tener instalado y configurado Apache con PHP en nuestra computadora. Si no lo tienes aún, la manera más sencilla es mediante WAMP, LAMP o MAMP según nuestro sistema operativo.
Requerimos también Eclipse con PDT (PHP Developer Tools). Lo descargamos, y lo desempacamos en un sitio facil de recordar.
Desde la página de XDebug descargamos la versión más reciente, y que corresponda a nuestra versión de PHP instalada, y según si nuestro equipo es de 32 ó 64 bits. De las variantes, utilizaremos la llamada simplemente VC6, y la guardaremos en la carpeta donde está instalado PHP.
Una vez hecho esto, hay que modificar el archivo php.ini para que se tome en cuenta esta nueva extensión, agregando lo siguiente al final del archivo:
[XDebug]
zend_extension_ts="C:\php\php_xdebug-2.0.4-5.2.8.dll"
xdebug.remote_enable=1
xdebug.remote_host=127.0.0.1
xdebug.remote_port=9000
xdebug.remote_handler=dbgp
xdebug.profiler_enable=1
xdebug.profiler_output_dir="RUTA DE UN DIRECTORIO PARA ARCHIVOS TEMPORALES"
NOTA 1: La ruta de la extensión puede variar según en donde se haya instalado PHP. Para el caso de que estés utilizando WAMP, la ruta será: “C:\wamp\bin\php\php5.3.0\”. Verifica que el nombre del archivo corresponda al que se descargó.
NOTA 2: Para el caso de que se utilice PHP 5.3.0, habrá que cambiar “zend_extension_ts” por “zend_extension”. De lo contrario no funcionará.
Si se tiene instalado Zend Server, hay que deshabilitarlo, ya que entrarán en conflicto si no se hace. Para ello, todas las entradas del mismo archivo php.ini que inicien con “zend.” (sin comillas) hay que convertirlas en comentario agregando un ; al principio:
[Zend]
;zend.install_dir="C:\Program Files\Zend\ZendServer"
;zend.conf_dir="C:\Program Files\Zend\ZendServer\etc\"
;zend.pid_dir="C:\Program Files\Zend\ZendServer\logs"
;zend.temp_dir="C:\Program Files\Zend\ZendServer\tmp"
;zend.log_dir="C:\Program Files\Zend\ZendServer\logs"
;zend.data_dir="C:\Program Files\Zend\ZendServer\data"
;zend.httpd_uid=HTTPD_UID
;zend.httpd_gid=HTTPD_GID
;zend.ini_scandir=cfg
;zend.serial_number=
;zend.user_name=
Ya que esté nuestro archivo listo, lo guardamos y reiniciamos el servidor Apache para que los cambios surtan efecto.
Para verificar que esté todo correcto, veamos la información que hay en nuestro phpinfo, haciendo un archivo .php con lo siguiente:
<?php phpinfo(); ?>
y lo abrimos desde nuestro navegador.
Si al buscar en esta página encontramos los diferentes valores de XDebug, significa que todo va por buen camino.
Ahora configuremos Eclipse.
Abrimos Eclipse, y vamos al menú Window -> Preferences. En el menú de la izquierda, expandimos el apartado de PHP y entramos a Debug. En la parte derecha, la entrada “PHP Debugger” la establecemos en “XDebug”.
Creamos un proyecto con cualquier instrucción de PHP para usarlo como prueba.
Una vez que tengamos algo listo para debugguear, vamos al menú Run -> Debug, y ya estaremos debuggueando nuestro código PHP.
Podemos cambiar la vista del IDE a modo “PHP Debug” para que nos muestre las barras de herramientas y un esquema más apto para esta tarea. Por default, eclipse detendrá la ejecución en la primera línea de php, y se puede cambiar en la ventana de preferencias, en el apartado de php debug que abrimos momentos antes, y quitandole la marca a “Break at first line”.
Todo esto lo he probado en Windows, pero deben ser los mismos principios para aplicarse a mac o linux.
Tomado en parte de: Pablo Viquez Blog
Crystal Reports con DataSet’s en ASP.Net
by P-los on Jan.20, 2010, under Técnicas, Web
Esta ocasión me topé con la necesidad de mostrar un reporte de Crystal Reports en un formulario .aspx de .NET tomando como origen de datos un DataSet. Tras un buen rato de probar con diferentes métodos que me encontré en Google y varios foros que no lograron resolver mis dudas, he aqui una forma sencilla para lograr este cometido.
Lo primero que hay que hacer es crear el DataSet (archivo .xsd). No mostraré aqui como crearlo pues ya hay muchos sitios con esa información, así que supondremos que ya lo tenemos creado.
Ahora crearemos nuestro reporte. Agregamos un nuevo elemento a nuestro proyecto de tipo “Crystal Reports” y en el “Field Explorer” en el nodo “Database Fields” seleccionamos “Database Expert” en el menú contextual:

Dentro del arbol en el cuadro izquierdo se mostrarán los DataSets que tenemos en nuestra solución. Agregamos el (los) DataSet o Tabla que requerimos y aceptamos. Una vez hecho esto, en el “Field Explorer” se mostrarán las tablas y campos que hayamos seleccionado. Arrastramos estos campos a nuestro reporte para diseñarlo segun nuestras necesidades.
Ahora en nuestro archivo .aspx agregamos un CrystalReportViewer para mostrar nuestro reporte.
En la parte de código, la parte medular es la siguiente:
Visual Basic:
' Llenar DataSet ya sea desde una base de datos, un web service, o datos ingresados por el usuario
Dim dsDatos as dsClientes() = ObtenerDatos()
' Creamos el objeto
Dim rpt As New CrystalDecisions.CrystalReports.Engine.ReportDocument()
' Indicamos la ruta del archivo del reporte que requerimos. En este caso suponemos que está en la raiz de nuestro proyecto
rpt.FileName = Server.MapPath("~\rptListadoClientes.rpt")
' Establecemos nuestro DataSet como origen de datos de nuestro reporte
rpt.SetDataSource(dsDatos)
' Indicamos al Report Viewer cual es el reporte que queremos mostrar
CrystalReportViewer1.ReportSource = rpt
C#
// Llenar DataSet ya sea desde una base de datos, un web service, o datos ingresados por el usuario
dsClientes dsDatos = ObtenerDatos();
//Creamos el objeto
CrystalDecisions.CrystalReports.Engine.ReportDocument rpt = New CrystalDecisions.CrystalReports.Engine.ReportDocument();
// Indicamos la ruta del archivo del reporte que requerimos. En este caso suponemos que está en la raiz de nuestro proyecto
rpt.FileName = Server.MapPath("~\rptListadoClientes.rpt");
// Establecemos nuestro DataSet como origen de datos de nuestro reporte
rpt.SetDataSource(dsDatos);
//Indicamos al Report Viewer cual es el reporte que queremos mostrar
CrystalReportViewer1.ReportSource = rpt;
Con esto nuestro reporte se mostrará en la ventana del navegador de internet de nuestro usuario sin la necesidad de que tenga que descargar un archivo PDF o DOC.
Consumir WebServices JSon desde PHP
by P-los on Nov.14, 2009, under Funciones, Técnicas, Web
Hoy gracias a que estuve apoyando a un proyecto de unos amigos, les traigo un simple ejemplo de como consumir WebServices hechos con JSon desde PHP.
Para este ejemplo utilizaremos una búsqueda en Twitter, ya que cumple con estas características.
Primero tenemos que formar una dirección URL con la ubicación de nuestro WebService, que para nuestro caso sería:
$URL="http://search.twitter.com/search.json?q=" . $Busqueda;
donde $Busqueda es el término que vamos a buscar.
Primero vamos a abrir esta dirección como un archivo cualquiera y guardamos su contenido en una variable:
$archivo = fopen ($URL, "r");
$texto = fgets($archivo);
Ahora, aprovechamos una función de PHP 5.2.0 o superior, llamada json_decode() que nos regresa un objeto con el contenido del JSon, cuyas propiedades son los valores entregados por el WebService, y podremos mostrar su contenido:
$json = json_decode($texto);
echo "max_id=".$json->max_id;
echo "next_page=".$json->next_page;
Para este caso particular, Twitter nos entrega un arreglo con los resultados, que facilmente podemos meter en un foreach:
foreach($json->results as $valor)
{
echo "<img src='".$valor->profile_image_url."' style='width:60px;height:60px;' /><br />";
echo "<h1>".$valor->from_user."</h1><br />";
echo $valor->text."<br />";
}
y así de facil tenemos un cliente que muestra los resultados de busqueda en twitter desde PHP.
[VB.Net] Obtener una imagen desde Web
by P-los on May.16, 2009, under Funciones, Web
Ahorita solo por gusto estoy haciendo un scrren saver que obtiene imagenes desde Internet. Para ello, modifiqué un poco una función encontrada aqui para que al darle a la función la dirección URL de la imagen que deseamos, nos regrese un objeto de tipo Image para hacer con ella lo que necesitemos:
Public Function LoadWebImage(ByVal ImageURL As String) As Image
Dim objImage As IO.MemoryStream
Dim objwebClient As System.Net.WebClient
Dim sURL As String = Trim(ImageURL)
Dim img As Image = Nothing
Try
If Not sURL.ToLower().StartsWith("http://") Then sURL = "http://" & sURL
objwebClient = New Net.WebClient()
objImage = New IO.MemoryStream(objwebClient.DownloadData(sURL))
img = Image.FromStream(objImage)
Catch ex As Exception
'Cargar una imagen que indique que no se pudo leer la imagen de Internet
img = new Bitmap("noimage.jpg")
End Try
Return img
End Function
FullCalendar con jQuery
by P-los on Apr.28, 2009, under Web
FullCalendar es un plugin para jQuery que genera un calendario completo con drag & drop. Utiliza AJAX para obtener la información de los eventos de cada mes “on-the-fly” y es facilmente configurable para utilizar tu propio formato de feed (una extensión provista por Google Calendar). Es visualmente personalizable y expone los manejadores para eventos generados por el usuario (como hacer click o drag a un evento).
NOTA: Este post fue traducido tal cual desde http://arshaw.com/fullcalendar/ desde donde se puede encontrar la documentación, ejemplos y ligas de descarga. Hasta el momento no he utilizado este plugin, pero lo publico porque se que en un proyecto próximo muy probablemente haré uso de éste o una herramienta similar.
Función Anti-Sql-Injection
by P-los on Apr.09, 2009, under Funciones, Web
He aquí una función en PHP para prevenir la inyección de código SQL desde los formularios Web:
function limpiar_sql($value){
$value = trim(htmlentities($value)); // Evita introducción código HTML
if (get_magic_quotes_gpc())
$value = stripslashes($value);
$value = mysql_real_escape_string($value);
return $value;
}
Aquí hay una explicación de lo que es esta vulnerabilidad: http://es.wikipedia.org/wiki/SQL_injection
Clase para conectar php con mysql
by P-los on Apr.09, 2009, under Funciones, Web
En estos dias libres de semana santa, me estoy dedicando a realizar un sistema de pre-registro de asistentes a un evento, y por costumbre inicié haciendo desde cero el código de conexion a una base de datos MySql, pero recordé algo:
“La gran mayoría de lo que necesitas, alguien más ya lo hizo”
Así que me puse a buscar un poco, y me encontré con el siguiente bloque de código en WebTutoriales:
Archivo mysql.php:
<?php class MySQL{
private $conexion;
private $total_consultas;
public function MySQL(){
if(!isset($this->conexion)){
$this->conexion = (mysql_connect("Servidor","usuario","password")) or die(mysql_error());
mysql_select_db("nombreBD",$this->conexion) or die(mysql_error());
}
}
public function consulta($consulta){
$this->total_consultas++;
$resultado = mysql_query($consulta,$this->conexion);
if(!$resultado){
echo 'MySQL Error: ' . mysql_error();
exit;
}
return $resultado;
}
public function fetch_array($consulta){
return mysql_fetch_array($consulta);
}
public function num_rows($consulta){
return mysql_num_rows($consulta);
}
public function getTotalConsultas(){
return $this->total_consultas;
}
}?>
Y para hacer uso de ella, el siguiente ejemplo:
include("mysql.php");
$db = new MySQL();
$consulta = $db->consulta("SELECT id FROM mitabla1");
if($db->num_rows($consulta)>0){
while($resultados = $db->fetch_array($consulta)){
echo "ID: ".$resultados['id']."<br />";
}
}
Para hacerlo un poco más flexible, añadí en un archivo de configuración los parámetros de conexión a la base de datos, quedando de la siguiente manera:
archivo de configuración:
$reg_server = "localhost";
$reg_user = "root";
$reg_password = "";
$reg_database = "tests";
Archivo mysql.php (solo cambia esta función, el resto permanece igual):
public function MySQL(){
require_once("reg_params.php");
if(!isset($this->conexion)){
$this->conexion = (mysql_connect($reg_server,$reg_user,$reg_password)) or die(mysql_error());
mysql_select_db($reg_database,$this->conexion) or die(mysql_error());
}
}
Según la pagina original, está hecho para trabajar bajo PHP 5, así que si lo vas a utilizar en una versión anterior de php, posiblemente te encuentres con que habrá algunas correcciones que hacer.
Texto parpadeando en Web
by P-los on Mar.11, 2009, under Web
A petición de un cliente, requerí que en un sitio web determinado texto parpadeara.
Lo primero que busqué, fue como hacerlo por medio de css, y me encontré con la siguiente instrucción:
p{
text-decoration:blink;
}
Al verificar que trabajara, me doy cuenta que no funciona en Internet Explorer, así que despues de buscar un rato más, doy con el siguiente bloque de Javascript que hace la misma función:
function doBlink() {
var blink = document.all.tags("BLINK")
for (var i=0; i<blink.length; i++)
blink[i].style.visibility = blink[i].style.visibility == "" ? "hidden" : ""
}
function startBlink() {
if (document.all)
setInterval("doBlink()",1000)
}
window.onload = startBlink;
Para esta segunda opcion, el texto que deseamos hacer que parpadee hay que encerrarlo en un bloque como el siguiente:
<blink>texto parpadeante</blink>
El problema al utilizar esta segunda opcion, es que causará problemas al realizar la validación de estándares de la W3C.
Si alguien tiene una mejor opción para lograr este cometido, será bienvenida para compartirse con la comunidad.