Subscribe: ZonaPHP
http://www.zonaphp.com/feed/
Added By: Feedage Forager Feedage Grade B rated
Language: Spanish
Tags:
archivo  este  esto  info  localhost  manera  mucho  mysql  más  podemos  realizar  servidor web  servidor  string  user  web 
Rate this Feed
Rate this feedRate this feedRate this feedRate this feedRate this feed
Rate this feed 1 starRate this feed 2 starRate this feed 3 starRate this feed 4 starRate this feed 5 star

Comments (0)

Feed Details and Statistics Feed Statistics
Preview: ZonaPHP

ZonaPHP





Updated: 2015-09-27T23:38:16.000Z

 



PHP 7: Algunas novedades del lenguaje

2015-09-27T23:38:16.000Z

Sin importar si eres un desarrollador PHP con años de experiencia o simplemente administras un par de sitios basados en Wordpress, lo cierto es que todos estamos pendientes de PHP 7 y su versión final que será publicada en Noviembre de 2015. Los cambios que existen en el lenguaje son tantos que merecen varios artículos, pero no quería dejar de comentar algunos de los que más me llamaron la atención. Nos salteamos PHP 6 directo a PHP 7Más de uno se preguntará que pasó con la versión 6 de PHP. Despistados hay en todas partes. Pero es cierto, la versión actual de PHP, al menos la rama estable, es 5.6. Y la siguiente será directamente la 7. Lo que sucedió en este caso, es que ya había existido un intento anterior de convertir absolutamente todo el código de PHP a UNICODE, y este proyecto se llamó PHP 6, aunque finalmente no prosperó. Así que para evitar que la gente se confundiera el “nuevo“ PHP 6 con el “viejo“ PHP 6, es que decidieron ir directamente con el nombre PHP 7. Es mucho (mucho) más rápidoPero mucho más rápido. El nuevo motor de PHP 7, llamado PHPNG (si, por Next Generation, quién pensó que habría fans de Star Trek por allí), posee una performance comparable incluso con HHVM. Esto se debe a las mejoras en el uso de memorias del Zend Engine, así como a la introducción de un compilador justo-a-tiempo (JIT) en vez de realizar la compilación antes de ejecutar el código. Esto significa, por supuesto, que una actualización a PHP 7, sin cambiar el código (y asumiendo que es automáticamente compatible), provocará que las páginas se generen el doble de rápido en promedio. Esto es una buena noticia incluso para los que tienen varios servidores configurados para servir sus aplicaciones web, ya que podrán incluso ahorrar dinero al necesitar menos hardware. Podemos declarar los tipos de las variables.Al menos, podemos hacerlo mucho mejor que antes. Actualmente, al recibir un parámetro, podemos indicar si es de una clase específica, interfaz, callable o array. A estos valores, ahora se agregan int, bool, float y string. 123456789101112 Además, esto no funciona solamente para los parámetros que recibimos. Ahora podemos indicar el tipo de valor que retornaremos en una función o en el método de una clase. Siguiendo el ejemplo anterior: 123456789 Los tipos que podemos indicar como un posible valor de retorno, son los anteriormente mencionados string, int, bool, float, array, callable, self (para métodos de una clase sólamente), parent (para métodos también), Closure, el nombre de una clase o el de una interfaz. Ahora todo es una ExcepciónDe más está decir que PHP no ofrecía uno de los mejores mecanismos para trabajar con los Errores Fatales. Ante algunos de estos errores, los métodos que definíamos para atraparlos no funcionaban, o los bloques finally (ejecutados luego de un try/catch) tampoco eran invocados. Pero ya no más dado que PHPNG, el nuevo Zend Engine, convierte los errores fatales en Excepciones, que podemos manejar y controlar fácilmente desde el código. Para mantener la compatibilidad se ideó una nueva jerarquía de Excepciones, con la nueva Excepción principal llamada \BaseException. BaseException (abstract) +- EngineException +- ParseException +- Exception +- ErrorException +- RuntimeException +- otras... +- otras... Mi favorito: Null Coalesce OperatorPara lo último, el cambio que ya quería que se produciera, el ifsetor por excelencia con el que contamos en otros lenguajes, llega a PHP. 123[...]



Aprende a usar el servidor web interno de PHP

2015-07-19T23:13:43.000Z

Desde la versión 5.4 de PHP, contamos con una nueva herramienta en nuestro arsenal: un Servidor Web interno en PHP, que nos permite realizar pruebas de una manera sencilla, sin la necesidad de tener un servidor web (ya sea NginX o Apache) corriendo de manera separada. En este artículo voy a intentar explicar brevemente cómo funciona este servidor web, que opciones tenemos para configurarlo, y finalmente, les mostraré un ejemplo sobre como podemos crear un pequeño proyecto. Comencemos por lo básicoEl servidor Web se ejecuta desde línea de comandos, ya sea en una consola (Mac/Linux) o desde PowerShell (Windows). Para verificar que ciertamente tenemos una versión igual o superior a 5.4, deberíamos ejecutar php -v y comprobar esto. Primero, creemos un archivo info.php que ejecute una llamada a phpinfo() y guardémoslo en un directorio vacío. info.php1 A continuación, ya podemos ejecutar el servidor web, que de la manera más básica, se inicia de esta manera 1$ php -S localhost:8000 Esto iniciará el servidor web, utilizando como raíz el directorio en el que nos encontramos actualmente, y publicando el servicio en la dirección localhost y en el puerto 8000. 1php -S localhost:8000 PHP 5.5.20 Development Server started at Thu Jul 16 23:13:59 2015 Listening on http://localhost:8000 Document root is /var/www/phpservertest Press Ctrl-C to quit. Efectivamente, si abrimos un navegador web, y nos dirigimos a http://localhost:8000/info.php podemos acceder a la información de phpinfo() y comprobar que todo está funcionando correctamente. Opciones de la línea de comandos.Como ya vimos, la opción -S es la que realiza toda la magia y lanza el servidor web, pero hay ciertas opciones que nos permiten modificar este comportamiento. Si ejecutamos el servidor con la opción -t, podríamos indicarle otro directorio como el directorio raiz del servidor, efectivamente pudiendo soportar cualquier directorio en nuestro disco rígido. 1php -S localhost:8000 -t ./public_html PHP 5.5.20 Development Server started at Thu Jul 16 23:25:15 2015 Listening on http://localhost:8000 Document root is /var/www/phpservertest/public_html Press Ctrl-C to quit. Una opción útil en este caso, que no es propia del servidor web sino que existe hace mucho tiempo en el intérprete de PHP, es -c que nos permite indicar un archivo de configuración distinto al default. Así, si tuviéramos dentro de nuestra aplicación, un archivo temporal de configuración, podríamos crear un ambiente de testing con distinta configuración a un ambiente de producción: 1php -S localhost:8000 -c etc/dev.ini Por último, el servidor web acepta como parámetro un archivo.php, pero al contrario de lo que pensaríamos, no lo ejecuta directamente como el archivo raiz de la aplicación. Este archivo.php es considerado como un Router, que se ejecutará automáticamente antes de cada petición que realicemos hacia cualquier recurso. Si este archivo retorna false entonces el servidor web procesará ese archivo normalmente. Si este archivo retorna cualquier otra cosa que no sea false entonces ese contenido será lo que el servidor responde, independientemente del recurso que se intente acceder via web. Volviendo al ejemplo anterior donde mostrábamos el resultado del archivo info.php si accedíamos mediante un navegador a http://localhost:8000/info.php, veamos que sucede si creamos un archivo router.php que se ejecute antes de cada petición. router.php12345678 Ya no podemos acceder a la información dentro de info.php. De esta manera, podemos controlar brevemente que tipos de archivos se pueden ejecutar en nuestro servidor web de desarrollo, o podemos realizar otros tipos de lógica, como indicar que parte de un sitio se cargará si intentamos acceder a distintas urls. Este trabajo generalmente se llevaría[...]



Mostrar los resultados de MySQL de manera vertical

2015-07-06T23:29:06.000Z

Cuando tenemos que acceder remotamente a un servidor y realizar algunas consultas a MySQL, algunas veces esta información es difícil de leer. Esto se debe al formato por defecto que MySQL utiliza en sus resultados a través de la consola: 12345678910111213141516171819mysql> select * from wp_users WHERE ID=2;+----+------------+------------------------------------+---------------+-------------------------+------------------------------+---------------------+----------------------+-------------+--------------+| ID | user_login | user_pass | user_nicename | user_email | user_url | user_registered | user_activation_key | user_status | display_name |+----+------------+------------------------------------+---------------+-------------------------+------------------------------+---------------------+----------------------+-------------+--------------+| 2 | webstudio | $P3B/Wr1SUfT7g3SgLZ5vy4AS6.tLrwCr1 | webstudio | direccion.de@gmail.com | http://www.web-studio.com.ar | 2006-05-03 22:27:07 | EuotpywqoDBeD1fElw0b | 0 | Pablo |+----+------------+------------------------------------+---------------+-------------------------+------------------------------+---------------------+----------------------+-------------+--------------+1 row in set (0.06 sec)mysql> Pero si el mismo comando, lo ejecutamos finalizandolo con \G en vez del ; habitual, los resultados se vuelven mucho más legibles: 123456789101112131415mysql> select * from wp_users WHERE ID=2\G*************************** 1. row *************************** ID: 2 user_login: webstudio user_pass: $P3B/Wr1SUfT7g3SgLZ5vy4AS6.tLrwCr1 user_nicename: webstudio user_email: direccion.de@gmail.com user_url: http://www.web-studio.com.ar user_registered: 2006-05-03 22:27:07user_activation_key: EuotpywqoDBeD1fElw0b user_status: 0 display_name: Pablo1 row in set (0.06 sec)mysql> Espero que el Tip les sea de utilidad. [...]

Cuando tenemos que acceder remotamente a un servidor y realizar algunas consultas a MySQL, algunas veces esta información es difícil de l




Generando y descargando archivos enormes con PHP

2015-07-06T23:09:00.000Z

Si bien hace un tiempo escribí sobre como Forzar la descarga de un archivo con PHP, lo cierto es que esto solamente funciona con archivos relativamente pequeños, de no más de 2 Megabytes de tamaño. Archivos más grandes (alrededor de cientos de Megabytes) se verían truncados o vacíos, simplemente porque PHP posee un espacio limitado para hacer output buffering.

Entonces, si quisiéramos extender el ejemplo anterior, pero teniendo en cuenta tamaños de archivo mucho más grandes, deberíamos realizar algo así:

1
2
3
4
5
6
7
8
9
$filename = 'archivo-xml-muy-grande.xml';

header('Content-type: text/xml');
header('Content-length: ' . filesize($filename));
header('Content-Disposition: attachment; filename="'.$filename.'"');

ob_end_flush();
readfile($filename);
exit;

Si bien hace un tiempo escribí sobre como Ver commits locales que aún no fueron pusheados

2015-07-06T22:33:53.000Z

No pocas veces pasa que estamos trabajando en algo, realizamos ciertos commits en nuestro repositorio local, y luego de que algo nos distrajo momentáneamente, ya no recordamos qué era eso que habíamos commiteado, pero aún no pusheado al servidor. Si pedimos un git status entonces esto no nos da demasiada información:

1
# On branch origin/master
# Your branch is ahead of 'origin/master' by 1 commit.
#   (use "git push" to publish your local commits)

DIOS! En qué estaba trajando?!

Afortundamente, gracias a git log podemos sacarnos la duda, indicando que queremos ver sólo la diferencia entre nuestro HEAD y el branch remoto origin/master

1
git log origin/master..HEAD

commit 782b5cc03b3e0961c5fa3ec88e3f8a89665b494d
Author: Pablo Rigazzi 
Date:   Sep 17 00:29:32 2013 +0200
    Unfinished version of User Class

Problema resuelto!

No pocas veces pasa que estamos trabajando en algo, realizamos ciertos commits en nuestro repositorio local, y luego de que algo




Crear una tabla reusando la estructura de otra tabla

2015-07-06T22:57:18.000Z

A pesar de los años, el lenguaje SQL y nuestro viejo y querido motor MySQL nos siguen sorprendiendo. Prueba de ello lo que descubrí de casualidad y no dudé en Twittear.

Esto creará una tabla nueva, pero sin los datos de la tabla anterior. Si queremos además, copiar los datos entre las tablas, podemos realizar luego:

1
INSERT INTO nueva_tabla SELECT * FROM vieja_tabla;

A pesar de los años, el lenguaje SQL y nuestro viejo y querido motor MySQL nos siguen sorprendiendo. Prueba de ello lo que descubrí de ca




Volver al branch anterior de git en un suspiro

2015-07-06T22:08:29.000Z

Si hubiera sabido esto, me hubiera ahorrado al menos algunos meses de tipeo.

Resulta que si uno está trabajando entre dos branches distintos de git, en vez de utilizar el nombre completo del branch…

1
git checkout feature/make-something-better
git checkout master
git checkout feature/make-something-better

Podríamos haber tipeado simplemente…

1
git checkout feature/make-something-better
git checkout master
git checkout -

De seguir realizando checkouts entre estos dos branchs, solamente deberíamos utilizar el caracter - para alternar entre esos dos.

Si hubiera sabido esto, me hubiera ahorrado al menos algunos meses de tipeo.

Resulta que si uno está trabajando entre dos branches




Forzar la descarga de un archivo con PHP

2015-07-06T22:35:23.000Z

Ya conocemos la historia. Gracias al poder de PHP generamos contenido que debería ser descargable por el usuario, pero el navegador en vez de ofrecer la descarga de un archivo, muestra el contenido dentro de la ventana donde estamos trabajando.

Por suerte, podemos indicarle muy fácilmente que queremos que este contenido sea tratado como un archivo, y que se ofrezca como una descarga. Si necesitáramos descargar el contenido como xml, entonces deberíamos enviar los headers correctos:

1
2
header('Content-type: text/xml');
header('Content-Disposition: attachment; filename="NombreDelArchivo.xml"');

Y listo. Esto también funciona con otros tipos de contenido, como application/pdf (para archivos PDF), o application/msword (para archivos Word).

Ya conocemos la historia. Gracias al poder de PHP generamos contenido que debería ser descargable por el usuario, pero el navegador en ve




Determinar rápidamente si es el último día del mes

2015-07-06T22:35:09.000Z

Seguramente en algún momento han tenido que escribir un cron job que realize alguna tarea distinta solo el último día del mes. Con este pequeño script, no puede ser más sencillo.

1
2
3
4
5

if (gmdate('t') == gmdate('d')) {
echo 'Hurra! Es el último día del mes!';
}
?>

Esto funciona maravillosamente, ya que gmtdate('d') retorna el día actual, y gmtdate('t') retorna el último día del mes actual. Si son iguales, voilá!

Seguramente en algún momento han tenido que escribir un cron job que realize alguna tarea distinta solo el último día del mes. C




Parsear archivos CSV con fgetcsv

2015-07-06T22:34:54.000Z

Resulta que hace poco, debido a un pequeño proceso que debíamos correr para importar ciertos valores, encontré dentro de la librería PHP la función fgetcsv() que me vino al pelo, justo cuando estaba por ponerme a implementar mi propia solución.

Funciona exactamente igual que fgets() solo que realiza un rápido parseo de la línea recientemente leída antes de devolverla a PHP. Su modo de uso es realmente simple. Si contáramos con un archivo separado por comas de este tipo:

1, Pablo, Web Developer, Rotterdam
2, Tom, UX Designer, Amsterdam
3, Roberto, Team Lead, Rotterdam
4, Francisco, Papa, Ciudad de El Vaticano

Entonces para leerlo y procesarlo solo necesaríamos el siguiente código:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

$counter = 1;
if (($handle = fopen('fgetcsv.csv', 'r')) !== false)
{
while (($datos = fgetcsv($handle, 1000))) {
echo sprintf(
"Se encontraron %d campos dentro de la fila %d\n",
count($datos),
$counter++
);

foreach ($datos as $dato) {
echo $dato . "\n";
}
}
fclose($handle);
}

Resulta que hace poco, debido a un pequeño proceso que debíamos correr para importar ciertos valores, encontré dentro de la librería PHP




PHP Freelance

2015-06-21T21:57:36.000Z

En caso de que estés buscando un proyecto nuevo en el que trabajar, o te interese comenzar a trabajar como Freelance en PHP, entonces te dejo aquí una lista de sitios donde buscar trabajo como programador PHP

Elance.com
Freelancers.net
Freelancer.com
Jobvertise.com
Mojolin.com
Indeed.com
Monster.com
Guru.com
Devbistro.com
Theitjobboard.com
Projectlance.com
Upwork.com

Es probable que al ingresar en alguno de los sitios, no parezcan tener relación con PHP. Tan solo utiliza sus buscadores con la palabra ‘PHP’ y aparecerán los avisos.

En caso de que estés buscando un proyecto nuevo en el que trabajar, o te interese comenzar a trabajar como Freelance en PHP, entonces te




Generadores de Documentación

2015-06-21T22:46:42.000Z

Por motivos laborales, me vi en la necesidad de documentar grandes cantidades de código últimamente, un proyecto muy grande con muchos objetos ubicados en distintos directorios. Además, sumado al hecho de que es muy probable que se agreguen más programadores, la necesidad de tener una documentación del código ya no era por el mero hecho de la mala memoria propia, sino que se tornaba realmente necesario para que puedan ponerse al día rápidamente. Así que buscando en Google, caí rápidamente en dos proyectos, creados en PHP, para generar documentación en base al código. Uno llamado PHPDocumentor y el otro PHPDoc (el que diga que los programadores no tienen imaginación a la hora de poner nombres, que sepa que se equivoca). El primero, parece que se erigió como el standard en la generación de documentación, mientras que el segundo, era una opción interesante a la hora de encontrar un reemplazo. Lo que no esperaba era encontrarme con un leve problema: Ninguno de los dos funcionó en mi máquina de desarrollo, ni bien instalados. Muy extraño, porque recuerdo haberlos utilizado en el pasado, pero esta vez, no hubo caso. Les edité el código fuente, cambié extensiones y constantes. Nada. Así es como caí en las dos soluciones que estoy utilizando actualmente y con las cuales, tengo resuelto el tema de la documentación en el mediano plazo. El primero de ellos, es un proyecto llamado Doxygen, muy conocido en el ámbito de Java y C++, pero que me sorprendió gratamente al ver que también funcionaba con PHP. Mucha gente lo utiliza (por ejemplo, la gente de KDE) y ya veo por qué: crea la documentación separada en lista y jerarquía de clases, por archivos, módulos o estructuras de datos. Además ofrece la posibilidad de generar archivos HTML, CHM, RTF, PDF, LaTeX, PostScript o man pages. PHPXref.comEsto parecería ser suficiente, si no fuera porque encontré otro generador, llamado PHPxRef, con una característica muy interesante: linkea toda llamada de un método, función, variable o constante, hacia el lugar del código donde está definido (aunque sea en otro archivo). Complementa a la perfección a Doxygen y como éste, son aplicaciones que se instalan en la PC (si usan windows, aunque también están disponibles para linux) y pueden utilizarse sin problemas, y sin tener PHP instalado. Si quieren ver un ejemplo de PHPxRef, pueden acceder a PHPxRef.com, donde hay una lista de documentación generada de algunas aplicaciones Open Source conocidas. ¿Pero como se documenta el código?Esto merecería ser parte de un artículo aparte, lo cuál esto no pretende ser, pero básicamente, un standar en la documentación de código, es utilizar la sintáxis JavaDoc o PHPDoc (básicamente, lo mismo, pero con otro nombre). Si tuviéramos una clase definida en un archivo, la sintáxis PHPDoc sería: 1234567891011/** * MiClase * @uses OtraClase, Logger * @package Framework * @version $id$ * @author Pablo Rigazzi * * Description: Esta es una clase de ejemplo, solo para asegurarnos que todos entiendan como va la cosa. */class MiClase extends OtraClase {} Así, como verán, el comentario en vez de comenzar como usualmente lo hace, con /*. lo hace con un doble asterisco: /**. Esta sutil diferencia, permite que un programa pueda leer los comentarios cercanos a las declaraciones de clases o métodos, y agregar el contenido a la documentación. Así como ven palabras clave especiales (@uses, @author, @version, @package, etc), hay muchas otras para indicar, por ejemplo, los tipos de parámetros que recibe una función (@param) o el valor que la misma devuelve (@return). Para los más curiosos, les dejo una explicación sobre Como documentar código. [...] Por motivos laborales, me vi en la necesidad de documentar gra[...]



Crear un sistema de Rating con CSS, PHP y MySQL

2015-06-28T17:06:22.000Z

(image) Supongo que todos, en mayor o menor medida, nos hemos cruzado ultimamente con un sistema de rating o votación simple, que permite valorar un recurso de manera sencilla. Es algo muy “web 2.0”, tan de moda últimamente. La gente de Komodomedia publicó un tutorial explicando como lograr este efecto, utilizando CSS y una imagen, y el resultado es muy profesional.

Y a modo de complemento, en otro sitio, fue publicado una simple explicación para setear un script en PHP utilizando MySQL para guardar los datos de la votación, y así luego poder mostrar los resultados utilizando el mismo ejemplo anterior. El código, hay que admitirlo, no es ninguna maravilla, pero logra el truco.

(image) Supongo que todos, en mayo




Creando Webs Modulares

2015-06-17T19:33:22.000Z

Después de embeber código PHP entre el HTML por un tiempo, cualquier principiante que esté en planes de dejar de serlo, ve cierto patrón que se repite y piensa… ¿No habrá otra manera mejor, más ordenada de hacer esto?. Pues si, si la hay. Y en este artículo aprenderemos una de estas maneras. Lo habitualCuando aprendemos nuestros primeros pasos con PHP, cualquier tutorial o manual que leemos, nos enseña y vanagloria las bondades de poder incluir el código PHP directamente entre el HTML. Entonces, es muy habitual ver ejemplos del tipo: 123 Y como la mente y el alma de un principiante de cualquier tema, está preparada para aprender todo lo que pueda, en el menor tiempo que pueda, toma este tipo de ejemplos como “verdades universales” y comenzamos a ver código PHP embebido entre el HTML por TODOS lados. Pero no hay que preocuparse, esto no es necesariamente malo, y todos lo hicimos en menor o mayor medida al comenzar. Es un paso necesario que hay que aprender a superar. :D Luego de un tiempo, y después de haber leido un poco más, aprendemos que todas las partes comunes de código que son repetitivas, pueden residir en archivos separados y ser “Incluidas” en nuestro código con tan solo el uso de una función: 123456Aqui va el contenido del sitio web propiamente dicho. Recordar que es terriblemente MALO y PERJUDICIAL para la salud de su sitio, utilizar archivos externos con extensión ".inc" Entonces, ese es el momento en que include() se convierte en nuestro mejor amigo y descubrimos, fascinados, como podemos lograr una verdadera mejora en el mantenimiento de nuestros sitios, al tener que modificar 1 solo archivo y que este cambio, se vea reflejado en TODAS las páginas que incluyan ese archivo. Hemos, señoras y señores, alcanzado el Nirvana. Pero, lamento decepcionarlos, ningún estado de felicidad suprema es permanente. Luego de un tiempo, y a medida que seguimos utilizando este método, de repente nos vamos dando cuenta que algo simplemente no cuadra. Si bien el anterior método del include() nos salvó en su debido momento, nos vamos dando cuenta que para crear una nueva página, es necesario repetir muchas veces los include() que llaman a las partes comunes de nuestro sitio. Esto sin contar que si, por arte de magia o capricho de un jefe/cliente, la cabecera de nuestro sitio pasa de ser header.php a cabecera.php, deberiamos modificar uno a uno todos los archivos que hagan un llamado a “header.php” y hacer el reemplazo. Es en este punto, donde cientos de programadores, todos los años se hacen la misma pregunta: ¿No habrá una manera mejor de hacer esto? Una Mejor ManeraY si. Siempre existe una mejor manera de hacer las cosas. Y este caso no es la excepción. Después de mucho pensar, y de mirar constantemente el código, una y mil veces, uno termina siempre preguntándose : ¿Y si hiciéramos las cosas al revés? ¿Qué pasaría si en vez de incluir todas las partes comunes de nuestro sitio (Header/Footer/etc), solamente incluyéramos el contenido? Pero que buena pregunta! Veamos que sucedería. La primera cuestión que nos llega a la mente, es que sería necesario indicarle a nuestro archivo.php, qué página queremos cargar. Veamos como podemos hacer esto : 123456789101112 De esta manera, si l[...]



Optimizando las URLs para la búsqueda

2015-06-21T22:32:30.000Z

Cuando tenemos un sitio con material que queremos compartir y que este disponible, nos interesa que sea indexado por los motores de búsqueda. En este artículo se discuten varias maneras con las cuales se puede lograr que nuestras URLs sean fácilmente indexables. IntroducciónA menudo cuando realizamos nuestros sitios o aplicaciones web, nos encontramos con que nuestras urls son de la manera: http://misitio.com/articulo.php?id=10&pagina;=2 Esto es totalmente normal y no debería ser ningún problema, pero resulta que este tipo de url no es indexable (agregada a la base de datos) por los motores de búsqueda de la web, por lo que se nos presenta el inconveniente de que si en nuestro sitio se escriben artículos o noticias las cuales queremos que sean “conocidas”, esta clase de urls no nos ayuda demasiado. Por esto, habrán notado que muchos sitios, trabajan con urls del tipo: http://otrositio.com/articulo/10/2 En si, es exactamente lo mismo, es decir el 10 indica el artículo y el 2 el número de página. La gran diferencia es que esta clase de urls son totalmente indexables por los motores de búsqueda, lo que ayuda mucho a la difusión de nuestros artículos y/o noticias.Para lograr esto, y así facilitar la indexación de nuestras páginas, Apache nos provee de herramientas con las cuales se pueden utilizar varios métodos, en este artículo analizaremos 3 de ellos, estos son: Motor de re-escritura de Apache Configuración de Apache mediante Files o Location Utilizando el error 404 de documento no encontrado. Presentados los contendientes, veamos cuales son sus características. Conociendo el mod_rewrite de Apache 1.3.xEl primer método que veremos será utilizando el este es usando el Motor de Re-escritura de URLs de Apache (mod_rewrite), que es uno de los métodos más sencillos de aplicar. Antes de utilizar esta poderosa herramienta, primero conoceremos algunos de sus parámetros de configuración para sacarle más provecho.Por lo general este modulo viene cargado en Apache, pero sino, lo pueden activar desde el httpd.conf de sus apaches descomentando la línea: LoadModule rewrite_module modules/mod_rewrite.so Una vez que tenemos instalado este modulo, veamos algunas de las directivas de configuración con las que cuenta: RewriteEngine on | offCon esta directiva lo que hacemos es activar o desactivar el motor de re-escritura. Sus únicas posibilidades son on (activo) u off (desactivo) Expresiones regularesEl mod_rewrite soporta expresiones regulares las cuales responde a la siguiente especificación: Texto: .Cualquier carácter [caracteres]Clase de caracteres: Algún carácter dentro de caracteres [^caracteres]Clase de caracteres: Ningún carácter dentro de caracteres texto1|texto2Alternativa: texto1 or texto2 Cuantificadores: ?0 o 1 ocurrencia del texto precedente *0 o más ocurrencias del texto precedente. + 1 o más ocurrencias de el texto precedente. Grupos: (texto)Grupo de texto. Sirve para agrupar texto o para utilizarlo como referencia luego. Inicio y Fin: ^Principio de línea. $Fin de línea. Caracteres de escape (no ser considerados especiales): \carEscapa el carácter car. Por ejemplo, “.“ se considera el punto en sí, no cualquier carácter. De mismo modo \n representa el salto de línea, etc. Además, existen las referencias a expresiones entre paréntesis previas (back-references), y las referencias a variables de entorno. Para las primeras se utiliza $N, donde N es el numero (en orden) de la expresión entre paréntesis en la expresión regular previa, es decir, si tenemos: Hola (.*). Que tal $1. $1 hace referencia a la expresión matcheada en el primer grupo de paréntesis. En cuanto [...]



Crear un foro en PHP y Mysql [revisado]

2015-06-16T22:42:22.000Z

En esta segunda versión del tutorial original, crearemos un foro desde cero aprendiendo a separar la programación del diseño, y modularizando nuestra aplicación para que sea simple de configurar y de adaptar. La EstructuraPrimero y antes que nada, para aquellos que no deseen tipear todo el contenido del artículo en sus editores de texto, les dejo un link al código del foro para que descarguen y puedan revisar mientras leen el artículo. A continuación debemos preparar la tabla en la base de datos que contendrá todos los temas de nuestro foro. Lo que esta tabla tendrá, es la información de nuestros mensajes, el autor del mismo, y otros datos que servirán para identificar a que Tema pertenece un mensaje. Pero mejor, veamos la estructura propuesta: 1234567891011CREATE TABLE `foro` (`id` int(7) NOT NULL auto_increment,`autor` varchar(200) NOT NULL default '',`titulo` varchar(200) NOT NULL default '',`mensaje` text NOT NULL,`fecha` datetime NOT NULL default '0000-00-00 00:00:00',`respuestas` int(11) NOT NULL default '0',`identificador` int(7) NOT NULL default '0',`ult_respuesta` datetime default NULL,KEY `id` (`id`)) TYPE=MyISAM; Veamos en detalle que campos tendrá nuestra tabla de Foros: id : Será e identificador principal de la tabla. Sirve para diferenciar cada uno de los mensajes. autor : el autor del mensaje. titulo : el titulo que tendrá el mensaje. Si este mensaje es el iniciador de un tema, será el que mostrará en el home del Foro. mensaje : El mensaje en si mismo. fecha : un campo DATETIME que indicará en que fecha se ha publicado este mensaje. respuestas : Si este mensaje es el iniciador de un tema, aqui se acumularán la cantidad de respuestas que reciba. identificador : este campo guarda el valor del id del mensaje que se está respondiendo. Si el mensaje es iniciador de un tema, entonces este campo valdrá cero. ult_respuesta : si el mensaje es iniciador de tema, aqui se actualizará valor de acuerdo con la fecha de la última respuesta que haya recibido. Sirve para poder mantener un orden en los foros. La sentencia SQL anterior, pueden guardarla en un archivo.sql y correrla en su base de datos desde phpMyAdmin, o si lo prefieren, pueden ingresarla linea por linea en un cliente de texto de mySQL ( como el mySQL monitor). Una vez que hayan creado la tabla en su base de datos, entonces podemos avanzar al siguiente paso. Antes de ponernos a programar cualquier parte del foro, vamos a encargarnos de hacer un pequeño script que realice una tarea que vamos a repetir mucho, y que es conectarnos a la base de datos. Este script lo incluiremos en cada página en la que tengamos que acceder a la base de datos: configuracion.php123456789 Cómo vemos, no hay gran ciencia en este script, tan solo unas variables conteniendo la configuración de nuestra base de datos, y el código mínimo y necesario para conectarnos y guardar el recurso de conexión en una variable $con que luego utilizaremos cuando hagamos nuestras consultas. Los TemplatesAntes de dar un paso más en la explicación, quiero hacerles unos comentarios respecto al “simple” sistemita de templates que utilizaremos en el foro. Primero, para aquellos que no sepan que es un Template, les recomiendo que lean los artículos NokTemplates, fácil, rápida y en castellano y Smarty, instalación e introducción en nuestra sección de Templates, por lo menos para que tomen una idea de que son y para que sirven. Ahora, mi idea al utilizar templates, fue la[...]



¿Qué esperar de PHP5?

2015-06-22T23:25:47.000Z

Finalmente, aqui tenemos uno de los tutoriales sobre las nuevas características de PHP5, más detallados que hay. Todo lo que hay que saber, sobre esta nueva versión de nuestro lenguaje de programación preferido. IntroducciónMuy pocas veces se vió tanta espectativa ante el lanzamiento de una nueva versión del PHP. Y no es para menos, ya que las nuevas características que incluirá PHP5 serán cruciales para que los desarrolladores y los Ingenieros en Sistemas comiencen a tomar mucho más en serio al lenguaje, y que sea más aceptado para desarrollos medianos a grandes, ofreciendo la posibilidad de escribir mejor código y mucho más claro. En este artículo explicaré las mejoras más notables de la nueva versión de nuestro lenguaje favorito. Las características que propician a la Programación Orientada a Objetos (POO) bajo PHP, han sido extensamente revisadas y mejoradas, más que nada oyendo las necesidades que los desarrolladores clamaban como fundamentales. Objetos por referencia, Clases Abstractas, Interfases, variables y funciones privadas y protegidas, son sólo algunas de ellas, que harán que nuestro lenguaje preferido, sea aún mucho más poderoso y flexible que antes. Este tutorial pretende ser una introducción lo más completa posible a los principales cambios que nos encontraremos, a la hora de programar en PHP y como estos cambios pueden (o no) afectar a nuestras aplicaciones existentes. Se debe tener en cuenta que muchos de los ejemplos que veremos, deben ser catalogados como “experimentales“ y es posible que algunos no sean incluidos del todo en el nuevo motor del PHP, el Zend Scripting Engine 2.0. Igualmente, trataremos de ir actualizando este documento hasta que PHP5 salga a la calle, de manera que siempre cuente con los últimos detalles. También, supongo ciertos conocimientos por parte del usuario, en cuánto a programación en general y POO en particular. Si Uds. mismos quieren practicar y probar los ejemplos que veremos, necesitan un servidor Apache corriendo e instalar alguno de los Snaps de la versión de desarrollo del PHP 5, que la pueden conseguir en http://snaps.php.net. Hay versiones tanto para sistemas *nix o para Windows. Ahora, que comience la fiesta. Nuevo Modelo de ObjetosDefinitivamente, el principal cambio que más ha resonado desde que se conoce que se está desarrollando PHP5, sin dudas es el cambio en el manejo de los objetos. En la actualidad, en PHP4, los objetos son tratados igual que otros tipos de datos básicos, como los enteros o los arreglos. O sea, cuando los programadores realizan operaciones sobre los objetos, como asignación de variables o cuando son pasados como parámetros a funciones, todo el objeto es copiado. Lamentablemente, este comportamiento (que fue más que nada heredado del PHP3 hacia el PHP4 , limita en gran medida el Modelo de Objetos, llevando generalmente a prácticas extras (como el paso o el instanciamiento de objetos manualmente por referencia). 1234567891011121314151617181920212223242526nombre = $nombre; }}function cambiaNombre($bebida, $nombre){ $bebida->nombre($nombre);}// Evitamos una doble copia de objeto$bebida = &new Marca;$bebida->nombre('Coca-Cola');var_dump($bebida->nombre);cambiaNombre($bebida, 'Pepsi');echo "{$bebida->nombre} la opción de la nueva Generación\n";/* Esto imprime en pantalla : Coca-Cola la opción de la nueva Generación */?> Aqui vemos como el objeto que es “operado“ dentro de la función cambiaNombre(), no es más qu[...]



NokTemplate. Fácil, rápida y en castellano.

2015-06-27T13:00:04.000Z

En esta serie de artículos, trataré de explicarles como utilizar plantillas o templates en sus aplicaciónes por medio de la clase NokTemplate. El uso de plantillas es una técnica bastante utilizada por los desarrolladores de grandes y complejas aplicaciónes, pero no por esto tiene que ser utilizada en aplicaciónes complejas, sino que me parece una buena práctica para hacer nuestras aplicaciónes más profesionales. En esta oportunidad empezaremos viendo las bases y fundamentos de esta técnica, para esto y durante toda la serie nos basaremos en un motor de Templates que es relativamente nuevo, fácil de usar y está en castellano. Cabe destacar que yo soy (N.del E.: Pablo Winiarczyk) el creador de esta clase y que trataré de ser lo más objetivo posible. ¿Cuál es la idea?La idea de trabajar con templates o plantillas es de separar la aplicación (codigo php, jsp, o sino tienen otra asp) del diseño gráfico (HTML, CSS, Javascript, etc.), para que luego si en un futuro es necesario cambiar el diseño del sitio, no sea necesario cambiar la aplicación. Lo mismo pasa, si se cambia algo en la aplicación, de esta manera no tendremos de preocuparnos por el diseño del html sino que solamente de que el codigo funcione. Esto es bastante relativo y depende de como se trabajo en un principio, ya que hay casos en los que si o si es necesario cambiar la aplicación, porque no se plantearon bien las cosas desde un principio. Las plantillas, como la palabra lo dice son plantillas, o sea archivos de código HTML que contienen el “molde” de un sitio, ya sea el cuerpo, encabezado, pie, etc. Estas plantillas pueden ser editadas por cualquier editor HTML, y en general estan a cargo del equipo de diseño gráfico (siempre y cuando estemos hablando de un equipo de desarrollo sino, nosotros hacemos ambas cosas). En estas plantillas se definen “variables” propias del template que luego serán manejadas desde la aplicación. Por otro lado esta el codigo de la aplicación que aparte de hacer las consultas a bases de datos y todo lo que la aplicación involucra, maneja la interface por medio del motor de templates sin preocuparse del diseño o html. Todo muy bonito, pero que gano y que pierdo con esta técnica?. Bueno, como en la vida no se puede ganar siempre, tenemos algunos pros y algunas contras: Ventajas: Independencia entre la aplicación y la interface. Lo recomendado en todo tipo de software. Puedes rediseñar tu sitio sin tener cambiar practicamente nada de tu código. Las actualizaciones a tu sitio seran mas faciles de realizar. Solamente cambias el contenido y no el diseño. El mantenimiento del código es más facil y rápido. No tienes que preocuparte por el Html. Desventajas: Puede que programar utilizando Templates se torne un poco más pesado. Pero lo Vale. El tiempo de procesamiento del Template puede hacer caer el rendimiento de tu sitio. La utilización de un sistema de cache puede solventar la perdida de rendimiento. Como ven no es tanto. Conociendo a NokTemplate 1.2Bueno, algunas de las caracteristicas de la Clase que utilizaremos en este articulo son: Modo Debug. Lo que posibilita la optimización de tu script. Sistema de Cache temporal en archivo Externo. Lo que incrementa considerablemente la velocidad de procesamiento. Velocidad de interpolación. Utiliza expresiones regulares compatibles con Perl, mucho mas veloces que las Posix. Fue desarrollada para PHP 4.x. Lo que la hace superior sobre su par FastTemplate que fue desarrollada para PHP 3. Es compatible con FastTemplate. Utiliza la misma lógica. Soporta definición de bloqu[...]



Programación Orientada a Objetos en PHP

2015-06-27T15:54:34.000Z

Este artículo escrito originalmente por Luis Argerich nos introducirá a la Programación Orientada a Objetos (POO o su versión inglesa: OOP) en PHP. En él veremos la forma de programar menos y mejor usando conceptos de POO junto con algunos trucos de PHP. Programación Orientada a Objetos en PHPAlgunos “puristas” afirmarán que PHP no es un verdadero lenguaje orienteado a objetos, lo que es cierto. PHP es un lenguaje híbrido dónde se pueden utilizar POO y programación estructurada tradicional. Pero para ciertos proyectos grandes, quizas deseemos/necesitemos(?) usar POO “pura” en PHP, declarando Clases y solo utilizando Objetos y Clases para el proyecto. Mientras emergen dia a dia proyectos más y más grandes, el uso de POO puede ayudar, el código POO es fácil de mantener, facíl de comprender y fácil de reusar. Y estos son los principios de la Ingeniería de Software. Aplicar estos conceptos en proyectos basados en la web, es la clave para el éxito de futurios sitios web. Este artículo es una introducción a la Programación Orientada a Objetos en PHP. Intentaremos mostrarles como se puede programar menos y mejor utilizando algunos conceptos de POO y trucos de PHP. Buena Suerte ! Conceptos de programación orientada a objetos: aunque existen diferencias entre distintos autores, puedo decirles que un lenguaje de POO debe poseer: Tipos Abstractos de Datos y ocultamiento de la Información Herencia Polimorfismo El encapsulamiento en PHP se logra utilizando clases: 1234567891011121314151617181920x = $v; } function getX() { return $this->x; }}?> Por supuesto, cada uno puede utilizar la nomenclatura que desee, pero utilizar una estandarizada es útil.Los atributos de los objetos se definen en PHP utilizando la declaración “public” dentro de la clase, estos atributos no tienen tipo hasta que se les asigna un valor. Un atributo puee ser un entero, un arreglo, un arreglo asociativo o incluso otro objeto. Los métodos se definen como funciones dentro de la clase, para acceder a los atributos dentro de los métodos se debe utilizar $this->nombre, de otra manera, se utilizaria una variable local al método. Para crear (instanciar) un nuevo objeto se utiliza el operador new: 1$obj = new Algo; Luego, se pueden acceder a sus métodos asi: 12$obj->setX(5);$valor = $obj->getX(); El método setX() le asigna el valor 5 al atributo x en el objeto obj (no a la clase), entonces getX() devuelve ese valor, 5 en este caso. En realidad también se puede acceder a los atributos del objeto de esta manera: $obj->x = 6; sin embargo esta no es una buena práctica de POO. Yo recomiendo acceder a los atributos definiendo métodos para asignarlos y devolverlos. Serás un buen programador orientado a objetos si considerás los atributos como innacesibles y solo utilizando métodos para acceder a ellos. La Herencia es sencilla de utilizar en PHP con la palabra reservada extend. 12345678910111213141516y = $v; } function getY() { return $this->y; }}?> Objetos de la clase “Otra” ahora poseen todos los atributos[...]