El mundo de la programación se han puesto de moda los FrameWorks, sobre todo desde la aparición de Ruby on Rails, y estos se han ido extendiendo a todos los lenguajes de programación, en PHP ha sido CakePHP el que se ha llevado gran parte de los programadores bajo sus "garras", sincerametne son útiles este tipo de FrameWorks, que integran diversas tareas en un mismo paquete, ahorras tiempo de programación, etc... pero en contra tienes el mayor tiempo de proceso que necesitan las aplicaciones realizadas con estos FrameWorks, yo en mi caso utilizo mi propio FrameWork, que integra diversas clases PHP, una para el acceso a bases de datos, otra bastante conocida llamada Xajax, para manejar Ajax, de una manera bastante simple, así acelero bastante el procesado con respecto a CakePHP, y la programación no me toma mucho más tiempo que Cake, así que mi consejo para los programadores que se dejan llevar por las modas les digo que mejor no utilicen FrameWorks debido al rendimiento.
Estoy a favor de los FrameWorks pero de su uso en ciertas situaciones, no del abuso.
Actualización: Relacionado con el consumo de muchas aplicaciones PHP que se usan hoy en día (he tenido malas experiencias de consumo de CPU y RAM con Wordpress), está este artículo, en donde explican como acelerar las aplicaciones PHP para que consuman mucho menos.
El título es una broma, he encontrado por montón de páginas siempre lo de Mira mamá, sin tablas (ese fue el primero que vi), y pues bueno quiero darle razones a mi madre, o a quien lea esto, para no usar Smarty, ni ningún otro sistema de templates. Smarty es bueno, para que vamos a negarlo, sinceramente de los mejores sistemas de templates que he visto nunca, pero desde hace unos 4 meses los desterré de mi framework para desarrollo de aplicaciones PHP, y me siento mejor, ¿por qué?, por la simple y llana razón de que ahora hago lo que hacía con Smarty pero a mano, y así el código es más limpio y más rápido.
Si abrimos un archivo generado por Smarty veremos que es simple y llano PHP, nada que un programador no sepa hacer, entonces uno piensa, ¿para qué usar un pseudolenguaje pudiendo usar el lenguaje final que usa Smarty (PHP)?, y esto es casi lo mismo para todos los motores de plantillas.
Separar la lógica de la presentación es algo fundamental, aún sigo viendo por ahí algunos desarrollos que mezclan lógica con presentación, se ve que algunos no se enteran de lo fácil que es programar siguiendo el módelo MVC (Modelo-Vista-Controlador), entonces yo no abogo por mezclar la lógica y la presentación, por lo que escribo todo esto es para que el programador utilice un sistema de "no plantillas", es decir que el solito genere un archivo .php con toda la presentación, y al final de la lógica haga un include, que para algo Zend los trajo a PHP, algo tan fácil y sencillo hará que nuestras aplicaciones corran más rápido, ya no tiene que estar ahí Smarty comprobando si la fecha de los archivos es diferente, procesando el .tmpl para convertirlo en PHP, haciendo los includes, etc... con un simple include, tan rápido y tan fácil separamos el diseño de la lógica, y si alguien tiene dudas de como va la cosa, que pregunte aquí en los comentarios.
Por cierto mi último desarrollo, que se llama Pizarra y que puse a descargar por ahí utiliza este pensamiento de "no plantillas".
Lo dicho a probar y si encuentras algo mejor utilizalo.
Algo muy molesto a la hora de programar es tener abierto un editor de textos al lado para ir documentando lo que uno va haciendo, con lo fácil que resulta comentar el código y que esos comentarios sean los que se publiquen como documentación, entonces me dediqué a probar y probar programas que extrajeran los comentarios de mis PHPs y generará la documentación, y pues phpDocumentor, phpDoc (la inspiración a la hora de poner nombres no abunda), Doxygen, probé todos ellos, con mayor o menor fortuna, pero finalmente el que cumple mis expectativas es PHPXref, es rápido, sencillo de configurar, no tiene dependencias, está programado en Perl, por lo que en cualquier sistema *nix no tiene porque dar ningún problema, y el archivo de configuración no supera las 50 líneas, esto es de agradecer, porque cuando abrí el archivo de Doxygen me asusté, nunca veía donde acababa.
Puestos a quejarse, PHPXref sólo te da salida en HTML, mientras que Doxygen te da salida hasta en PDF, pero bueno a mí me gusta mucho PHPXref, y lo estoy utilizando para todos mis desarrollos, y me hace muy sencillo programar, porque a veces me estoy dando cuenta de fallos que cometo, que tal vez de otra forma no sería posible, si alguien quiere ver un resultado de como genera documentación PHPXref puedes ver la nueva documentación de la nueva versión de MTHPortal, espero que resulte bonito, tengo que tocar un poco el CSS para que sea más parecido al diseño de MTHPortal, aún no está del todo bien documentado, pero poco a poco, además si alguien mira el código del CMS verá que apenas llevo un 30% de la versión final lista.
Ese es el nombre del sistema para crear planetas, un planeta para que el que no lo sepa es un lugar donde leer artículos de varios blogs, o cualquier otro lugar que posea RSS y pueda alimentar al planeta, probé todos los posibles que encontré en internet, porque queríamos crear uno en softlibre-es.com, y resultó que ninguno se ajustaba a lo que necesitabamos, así que me puse a programar uno propio, y como todo lo que hacemos en softlibre-es.com pensamos licenciarlo bajo GPL, pues el planeta no iba a ser menos, es muy simple de usar, ocupa muy poco, 217kbs comprimido y 800kbs descomprimido, así que en cualquier servidor puede entrar, y lo puedes bajar desde http://descargas.softlibre-es.com/planeta.v01.tar.gz.
Las instrucciones para instalarlo son muy sencillas, cargar el archivo db.sql en nuestra base de datos, y configurar el archivo planeta.db.php, así de fácil y sencillo, luego hay que ir añadiendo los feeds a la tabla canales de la base de datos, con indicar únicamente la URL del feed, el planeta rellena el resto de campos. Y para actualizar pues debes ir a tudominio.com/actualizar.php y listo.
Cualquier duda pues me dejas por aquí un comentario y ayudo, por cierto MTHPlaneta está en versión alpha, aunque lo he probado por más de dos meses, para verlo corriendo actualmente puedes ir a http://planeta.softlibre-es.com. Por cierto el modificar el diseño es muy sencillo, pero no obstante quien quiera usarlo puede preguntarme dudas.
PD: El blog no está muerto, sólo algo parado por motivos laborales, lo siento.
Desde softlibre-es.com nos hemos embarcado en un proyecto, crear un Planet o planeta de Software libre en español, estamos recibiendo blogs para ir metiendo cada día más contenidos, la dirección es http://planeta.softlibre-es.com, está en fase yo diría alfa, así que puede tener algún error que espero corregir, y cuando los tenga corregidos, liberaré el código bajo GPL, porque este planet lo he programado a manita :D.
Lo que me acabo de encontrar es algo que creo que a más de uno le va a alegrar el día, y es que puedes utilizar Gmail para almacenar las copias de seguridad de tu base de datos de tu página en tu cuenta de Gmail, el sistema es muy sencillo, y muy útil, para ello te puedes dirigir a la página oficial del creador: http://webdeveloper.terapad.com/index.cfm?fa=contentNews.newsDetails&newsID=8082&from=list y bajarte el .zip con el script y ponerlo a funcionar.
Tengo repartidos por ahí varios consejos para mejorar nuestra programación PHP, tanto para optimizarla, como para hacerla más segura, así que como estaban todos muy repartidos pensé que mejor hacer una lista con todos los consejos y aquí está el resultado:
Inicializa las variables antes de utilizarlas
Incrementar una variable global es dos veces mas lento que una variable local
Declarar una variable global realentiza tu script
Usar ip2long() y long2ip() para almacenar direcciones IPs como enteros en lugar de cadenas en la base de datos. Esto reducirá el espacio de almacenamiento en cuatro veces (15 bytes por carácter char(15) contra 4 bytes del entero), además de facilitar el calcular cuanto una dirección entra en un rango, y acelerar las busquedas y ordenaciones.
Validar direcciones de email mediante checkdnsrr(). Es una función de PHP que comprueba si un dominio existe.
Si usas PHP 5 con MySQL 4.1 o superior, deberías utilizar las funciones de mysqli_ en lugar de mysql_, ya que son más rápidas y puedes utilizar hasta sentencias preparadas.
Utilizar PEAR para no tener que programar funciones ya programadas
Prevenir que el sistema proporcione mensajes de error al usuario utilizando la función error_reporting(0), cuando programamos los mensajes de error son útiles, pero el usuario final no debería verlos.
Utilizar gzcompress() y gzuncompress() para almacenar cadenas largas en la base de datos, esto puede ahorrarnos hasta un 90% de espacio
Devolver múltiples valores de una función pasándolos mediante referencia.
Comprender el peligro de utilizar magic_quotes y la inyección SQL
Utilizar Smarty o algún otro motor de plantillas para separar la lógica de la presentación, ahorrarás muchos dolores de cabeza
Sustituir $i++; por ++$i;
Sustituir $i += 1; por ++$i;
Sustituir rand($min,$max); por mt_rand($min,$max);
Utilizar echo en lugar de print como salida de resultados
Sustituir ob_start(); echo '..'; ob_end_flush(); por ob_start(); print '..'; ob_end_flush();
Escribir una cadena con etiquetas HTML o algún otro texto fijo directamente, sin utilizar echo ni print
Sustituir include('output/contain_no_php'); por readfile('output/contain_no_php');
Sustituir echo "$variable cadena "; por echo $variable.'cadena';
Emplear variables en lugar de contantes
Siempre utilizar una función existente en PHP antes de crearla por nosotros mismos
Las operaciones en formato expandido son habitualmente más lentas
Utilizar triple = para los if
En un if siempre que hagamos una comparación de una variable con un valor constante, colocar primero el valor constante que la variable. Ejem: if(10 == $x)
Crea tu propios manejadores de error, utiliza set_error_handler('funcion_que_maneja_errores');
Cada vez que llamas a una página se llama al compilador y se vuelve a procesar, aunque no haya cambiado. Si se cachean los objetos de PHP, la primera vez se compilaría y la siguiente se usaría la compilada. Una herramienta gratuita que nos permite realizarlo es Turck MMCache for PHP
Desactiva el acceso a ficheros remotos, en php.ini: allow_url_fopen = Off
Desactiva también register_globals, en php.ini: register_globals = Off
Restringe a qué ficheros puede acceder PHP, en php.ini: open_basedir = /www/ficheros
Activa el modo seguro en PHP, en php.ini: safe_mode = Off safe_mode_gid = On
Al activar el modo seguro no se pueden ejecutar ficheros binarios, por lo que deberás indicar donde se situan los binarios que si se pueden ejecutar, en php.ini: safe_mode_exec_dir = /www/ejecutables
Tampoco está permitido acceder a variables de entorno en el modo seguro, pero se puede inluir una lista (separada por comas) de prefijos que se permiten para estas variables, en php.ini: safe_mode_allowed_env_vars = PHP_
Evitar la ejecución de la shell, en php.ini: disable_functions = system, exec, shell_exec, passthru, pcntl_exec, putenv, proc_close, proc_get_status, proc_nice, proc_open, proc_terminate, popen, pclose, set_time_limit, ini_alter, virtual, openlog, escapeshellcmd, escapeshellarg, dl, curl_exec, parse_ini_file, show_source
Trata de tener la mayoría de la BD en memoria, usando para ello memcached
Utiliza clases para realizar los accesos a la base de datos, por ejemplo PEAR DB, es más seguro y flexible a la hora de cambiar de unab ase de datos, por ejemplo de MySQL a SQLite
Require es más rapido que require_once, lo mismo pasa con include e include_once
Comprobar que todas las variables, sobre todo las obtenidas mediante $_GET y $_POST son válidas, para ello puedes emplear expresiones regulares
No poner a los archivos importantes nombres simples como config.php, etc... ni en carpetas simples como includes/config.php y cosas así
En las consultas MySQL seleccionar sólo los campos que necesitemos extraer de la base de datos, no todos
Sí sólo quieres extraer una fila utiliza LIMIT 1, para que al encontrarla no siga buscando más
Utiliza mysql_fetch_assoc para extraer los resultados de una variable al realizar una consulta MySQL, ya que al utilizar mysql_fetch_array se extrae la información en un array el doble de largo
Utiliza valores por defectos y NOT NULL en tu base de datos, hará las consultas e inserciones más rápidas
Intenta no concatenar texto cuando no sea necesario
Utiliza la comilla simple (') en vez de la comilla doble (") siempre que no vayas a usar variables dentro, la comilla doble hace que el intérprete analice lo que hay dentro de las comillas, además a la hora de concatenar es más rápido también utilizar comillas simples
Cuando uses echo, separa los strings por comas mejor que con puntos, es más rápido. Esto solo funciona con echo
Indica el valor máximo para tus bucles for fuera del bucle en vez de dentro del bucle, porque si no, se evaluará la expresión en cada pasada del bucle
Libera variables siempre que puedas, sobre todo arrays pesados
Y esto es todo por ahora, espero que sea de gran utilidad a todos los programadores de PHP que andan por aquí.
Hoy es el día del CSS, ya que encontré este artículo muy interesante, y que reproduzco aquí.
Las tablas existían en HTML por una sola razón: para mostrar datos tabulares. Pero luego border="0" hizo posible que los diseñadores pudieran obtener una rejilla para diseñar texto e imágenes. Puesto que es aún uno de los métodos más dominantes para diseñar visualmente sitios web de alta complejidad, el uso de tablas está, de hecho, interfiriendo con la creación de un sitio web mejor, más accesible, flexible y funcional. Descubre de dónde proviene la raíz de los problemas y procura obtener soluciones para crear un diseño sin tablas o de transición.
Te brindaremos una introducción sobre una manera de trabajar que
* hará que tus páginas carguen más rápido
* reducirá tus costos de hosting
* hará que tus rediseños sean más eficientes y económicos
* te ayudará a mantener consistencia visual en todos tus sitios
* te hará obtener mejores resultados con los motores de búsqueda
* hará que tus sitios sean más accesibles para todas las personas interesadas y agentes de usuarios
* y te brindará un margen competitivo (es decir, seguridad laboral) a medida que el mundo se rige cada vas más por Normas Web.
Además, trataremos de qué manera el diseño de páginas con Cascading Style Sheets (CSS) (hojas de estilo en cascada) requiere una forma de pensar un poco diferente de la que sueles tener acerca de tu contenido y de tu marcado.
Al principio, la Internet constituía fundamentalmente un medio de intercambio de información para los académicos, investigadores y el ejército militar. Sin embargo, no le llevó demasiado tiempo a los visionarios darse cuenta de que este nuevo medio era ideal para vender desde nuevos productos y alimento para perros hasta autos usados y cobertura de deportes por medio de transferencia directa.
Sin embargo, como cualquier otro medio que está aún en pañales, los primeros tiempos de la Internet resultaron ser estéticamente “crudos” (y, realmente, no muy tentadores para los consumidores) hasta que David Siegel publicó su libro memorable, el cual ofrecía algunas recomendaciones brillantes para superar las restricciones de los exploradores existentes y especificaciones W3C alrededor del año 1997. (Estamos hablando de Netscape 2 y 3, compañeros).
Estas recomendaciones eran tan brillantes que aún así constituyen el método más frecuente de diseño de páginas Web en la actualidad.
El Problema con el uso de tablas:
* los datos de presentación se mezclan con tu contenido.
o Esto hace que los archivos de tus páginas sean innecesariamente pesados, ya que los usuarios deben bajar estos datos de presentación por cada página que visitan.
o Banda ancha no es gratuita.
* Esto hace que los rediseños de los sitios y contenido existentes requieran mucha mano de obra (y sean muy costosos).
* Además, hace que la consistencia visual de todo un sitio sea extremadamente difícil de alcanzar (y muy costosa).
* Las páginas basadas en tablas son también mucho menos accesibles para los usuarios que padecen incapacidades y para las personas que utilizan teléfonos celulares y PDA para acceder a la Web.
Los exploradores modernos son capaces de presentar las Normas Web mucho mejor, y ya no necesitamos usar estos métodos arcaicos.
En lugar de anidar tablas dentro de tablas y de llenar celdas vacías con espaciadores GIF, podemos utilizar un marcado mucho más simple y CSS para diseñar espectaculares sitios que serán más rápidos para cargar, más fáciles de rediseñar y más accesibles para todos.
Si diseñamos nuestras páginas utilizando un marcado estructural en nuestros documentos HTML y hojas de estilo en cascada (Cascading Style Sheets), podemos mantener el contenido de nuestras páginas separado de la manera en que se presentan.
Este método tiene varias ventajas con respecto al uso de las tablas....
Si eliminas el marcado de presentación de tus páginas, el rediseño de los sitios y contenido existentes requerirá mucho menos trabajo (y costará mucho menos). Para modificar el diseño del sitio, todo lo que necesitas es modificar las hojas de estilo; no es necesario que edites todas las páginas.
Por ejemplo: dale un vistazo a CSS Zen Garden, o a los interruptores de estilo del sitio Eric Meyer. Para obtener más información, consulta Alternative Style de Paul Sowden.
El uso de Normas Web reduce los tamaños de los archivos de tus páginas, ya que los usuarios no necesitan bajar datos de presentación con cada página que visitan. Los exploradores de los usuarios mantienen en memoria las hojas de Estilo que controlan el diseño.
Los archivos más ligeros resultan en descargas más rápidas y costos de hosting más bajos.
El uso de Normas Web, además, hace que resulte extremadamente fácil mantener consistencia visual en todo un sitio. Como las páginas utilizan el mismo documento CSS para su diseño, todas siguen el mismo formato.
Esta característica consolida tu marca comercial y hace que tu sitio sea más utilizable.
El uso de Normas Web hace que tus páginas sean mucho más accesibles para usuarios que padecen incapacidades y para las personas que utilizan teléfonos celulares y PDA para acceder a la Web.
Los visitantes que utilizan lectores de pantalla (así como también aquellos que poseen conexiones lentas) no necesitan acceder a celdas de tablas innumerables ni a espaciadores para llegar al contenido real de nuestras páginas.
En otras palabras, el hecho de separar el contenido de la manera en que se presenta hace que tu contenido sea independiente de dispositivo.
Hablando de accesibilidad, si minimizas tu marcado y utilizas atributos de encabezado de manera adecuada lograrás mejorar tu clasificación en los motores de búsqueda.
Si reduces el porcentaje del código de contenido, utilizas palabras claves en tus atributos de encabezado y reemplazas el encabezado GIF con texto lograrás que tus sitios obtengan mejores resultados en los motores de búsqueda.
Todavía puedes utilizar tablas si lo necesitas, pero no te abuses
Esto le permitirá a los usuarios (y a los jefes) que tercamente continúan usando exploradores versión 4 hasta el último día de sus vidas, una aproximación aceptable a lo que el resto del mundo está apreciando.
Repasando diseños transicionales
Utiliza margen y relleno en lugar de espaciadores GIF y de celdas extra.
Utiliza estilos de vínculo y de @import. Lo primero para versiones anteriores de los exploradores, lo segundo para las últimas versiones de los exploradores.
Ejemplos del mundo real:
* Escuela Montessori de Santa Cruz
* k10k
* Fox Searchlight Pictures
Los exploradores que la mayoría de los usuarios utilizan actualmente cuentan con un buen soporte para CSS. Cada uno de ellos posee sus peculiaridades pero, una vez que te acostumbras, puedes trabajar con todos ellos.
La codificación de CSS es simple Incluso para alguien como yo que cree que la mayoría de los JavaScript se parecen a malas palabras.
if(links[x].length > 0);{
for (y=0; y
Cada regla de CSS tiene un selector y una declaración. La declaración está compuesta de una propiedad y de un valor. Las propiedades deberían asemejarse a 2 palabras unidas con un guión.
Si bien escribir el CSS real es simple, el hecho de utilizar CSS para crear sus diseños requiere de una manera de pensar un poco diferente a la que la mayoría de nosotros probablemente estamos acostumbrados.
En lugar de pensar en algo como “esto va aquí y eso allí” mientras trabajamos en una página o en un diseño, necesitamos pensar acerca de las clases de información de nuestra página y de la estructura de esa información.
Le brindamos al encabezado más importante una etiqueta
, los subtítulos son marcados con etiquetas
, etc. y los párrafos son párrafos.
Esto se conoce como un marcado “estructural” o “semántico”.
En lugar de colocar tu contenido dentro de tablas y de celdas de tablas, envuélvelo en elementos div. Brinda a tus elementos div una identificación (id) o una clase (class) que describa su contenido y/ o función, en lugar de su apariencia.
Evita el marcado de ed and eakfast
Piensa por qué quieres que algo aparezca de cierta forma. ¿qué significa? Tu marcado puede y debería transmitir un significado, incluso para alguien que no puede ver su página. El marcado semántico hace que nuestras páginas sean más accesibles para todos, incluso para los motores de búsqueda.
Cuando colocas alguna palabra o texto en itálica, es porque quiere enfatizarlo (), o porque se trata del título de un libro ()?
Si alguna palabra o texto está en negrita, probablemente debería estar marcado como .
Si deseas realizar un salto de línea, probablemente deberías marcarlo como un elemento del encabezado. Si no se trata de un encabezado, ¿forma parte de una clase que tiene lugar en tu sitio? Si fuera el caso, entonces utiliza CSS en lugar de .
.foo {display:block}
Para obtener más información, consulta Bed and BReakfast markup (B&BR) de Tantek Çelik.
Cosas que funcionan mejor con tablas que con CSS
Existen algunas cosas que no funcionan tan bien con CSS como lo hacen con los diseños de tabla.
Por ejemplo, digamos que tienes una barra de navegación negra y quieres ampliar toda la altura de tu contenido. Con un diseño de tabla, es algo muy fácil: simplemente otórgale un fondo negro a
.
Esto se puede realizar con CSS, pero requiere una forma diferente de pensar.
Si le brindamos a nuestro div de navegación un fondo negro, el negro se extenderá solamente hasta donde termina la navegación. En la mayoría de las páginas, el contenido continúa más allá de la navegación, así que esto no saldría bien.
En cambio, podríamos revestir un GIF negro en nuestro div de contenido y brindarle a este div suficiente relleno; pero si nuestra navegación es mayor que nuestro contenido, esto tampoco funcionará.
Otra forma de tratar de resolverlo es revestir el GIF negro en el fondo de nuestro
, lo cual es correcto a menos que quieras utilizar otra imagen para el fondo de tu .
O, podemos envolver nuestro contenido en un div “wrapper” y revestir la imagen en esa div. Sin embargo, esto implica un agregado intrascendente no semántico para nuestro marcado.
Y, desde ya, el hecho de revestir imágenes de fondo no será un buen resultado si quieres lograr que la amplitud de tu navegación sea fluida.
Como dijimos anteriormente, algunas cosas funcionan mejor con tablas que con CSS. Pero, finalmente, deberás preguntarte si todo el enredo que viene con el uso de las tablas para el diseño en lugar de datos vale la pena.
Migrando de trabajar a los hachazos con las tablas a las Normas Web: el panorama mayor
Antes que nada, necesitas elegir una estrategia de migración. ¿Deseas migrar todo el sitio de una vez o sección por sección?
Identifica las secciones y páginas que más se beneficien de la conversión. Las páginas de inicio, los nuevos anuncios de productos y páginas similares constituyen un lugar natural donde comenzar.
Identifica todos los tipos de contenido / información en tu sitio.
* Información de productos
* Información de precios
* Información de la empresa
* Portfolio (bolsa de trabajo)
* Servicios ofrecidos
* Información del inversor
* Carro de compras
* Foros de usuarios
* etc.
Una vez que hayas comprendido los tipos de contenido en tu sitio, es hora de analizar tus páginas existentes para obtener divisiones lógicas de contenido.
* Navegación principal
* Subnavegación
* Encabezados y pies de página
* Contenido
* Información relacionada
* Otros
Analiza la estructura de tus tablas en busca de tablas anidadas y de celdas vacías usadas para márgenes y espaciadores. (Queremos reemplazarlas con etiquetas div o con una estructura de tablas mucho más simple).
Una vez que hayas analizado la estructura de tus páginas, es hora de mirar por debajo de la capucha proverbial y de analizar tu marcado actual de HTML presentacional, el cual puede ser reemplazado por marcado estructural.
* Por el amor de todo lo sagrado, ¡líbrate de las etiquetas y de los espaciadores GIF!
* Además, bota los marcados y .
* Deshazte del marcado presentacional para tablas (bgcolor, background, etc.).
* Reemplaza la codificación de CSS puramente presentacional (por ejemplo ) por marcado estructural adecuado. ((Tantek Çelik brinda más detalles en su publicación: A Touch of Class).
Reemplaza las etiquetas presentacionales por marcado estructural
Puedes utilizar “encontrar y reemplazar” (y expresiones regulares), pero la manera más simple de realizarlo sería visualizar tu página actual en un explorador, y copiar y pegar el texto en tu editor HTML.
¡Considera la estructura de tu documento! El simple paso de reemplazar etiquetas por no es suficiente.
¿Cuál es el encabezado más importante? Márcalo con una etiqueta
. Marca tus subtítulos con etiquetas
, etc. Márca tus párrafos con etiquetas
. Marca tu navegación como listas no ordenadas.
Elige un DOCTYPE y utilízalo. (Recomendamos XHTML transicional, a menos que seas un purista, en cuyo caso, usa XHTML estricto).
Coloca tu navegación principal en un div con una id de mainnav (navegación principal); coloca tu subnavegación dentro de una div con un id o class de subnav (subnavegación); coloca tu pie de página en un
Pues navegando un rato encontré una fantastica galería de fotos, está en la página cssplay.co.uk, aunque ya no me sorprende nada de lo que veo ahí porque hacen auténticos experimentos que pueden ser muy útiles, y son hechos con CSS, bueno la galería en cuestión se puede ver aquí. Y encontré otros experimentos para crear menús navegables, utilizando también CSS, algunos de ellos conocía como se hacían pero con JavaScript, pero CSS hace que sean más rápidos, algunos me han gustado mucho, como por ejemplo éste, así que si quieres crear un menú de navegación con CSS puedes ver esta página. Después de ver cosas como esta pienso, me queda mucho por aprender de CSS.
Es algo básico; TODAS las entradas inseguras (especialmente desde formularios introducidos por el usuario) tienen que ser limpiadas antes de ser mostradas.
echo $_GET['username'];
Puede por ejemplo tener esta salida:
Es un problema de seguridad aparente el no limpiar los datos inseguros antes de mostrarlos. Además puedes encontrar páginas muy sucias si las entradas de datos por parte del usuario no son tratadas de manera adecuada.
Como solucionarlo: Básicamente necesitas convertir < , >, ' y " a sus entidades apropiadas (< , >' , y "). Las funciones htmlspecialchars y htmlentities() pueden ayudarte ha hacer este trabajo.
Cuando haces consultas a tu base de datos siempre debes asegurarte que los datos inseguros son escapados sino tu aplicación será vulnerable a las SQL-injections y no muy fiable, algunos programadores piensan que esta parte está cubierta activando magic_quotes en sus php.ini. El problema es que los datos inseguros pueden provenir desde diferentes entradas no sólo desde $_GET, $_POST y $_COOKIE (arrastrando otras páginas o usando entradas desde la base de datos). ¿Y qué ocurre si de repente magic_quotes es desactivado?
Como solucionarlo: Yo recomiendo desactivar magic_quotes en php.ini o usando .htaccess y utilizar mysql_real_escape_string() en todas las variables usadas en las sentencias SQL.
$sql = "UPDATE users SET name='.mysql_real_escape_string($name).' WHERE id='.mysql_real_escape_string ($id).'"; mysql_query($sql); ?>
En PHP5 combinando con mysql5 también puedes utilizar sentencias preparadas.
Si dejas activo magic_quotes On deberás confiar en tu instinto.
3. Mal uso de las funciones relacionadas con las cabeceras HTTP: header(), session_start(), setcookie()
¿Alguna vez has visto esta advertencia?"warning: Cannot add header information - headers already sent [....]
Mayormente durante el desarrollo o Most likely you have either during development or when prueba de aplicaciones PHP. Cuando tu navegador descarga una página la respuesta del servidor está estructurada en dos partes diferentes: La parte de cabecera y la parte de contenido.
La cabecera consiste de datos no visibles como cookies o si el navegador debe redireccionar a otra dirección. La cabecerasiempre va primero.
La parte de contenido consiste del contenido HTML visible, imagenes, etc....
Si output_buffering está desactivado e tu php.ini. Cuando el script proporciona la salida durante la ejecución todas las funciones relacionadas con la cabecera (setcookie(), header(), session_start()) deben ser llamadas antes de dar cualquier salida. El problema es cuando alguien desarrolla con una configuración de plataforma y prueba en otra, entonces las redirecciones no funcionan, las cookies y sesiones no son almacenadas...
Como solucionarlo: La forma correcta es muy simple debes utilizar todas las funciones relacionadas con la cabecera antes de proporcionar cualquier salida y configurar output_buffering = Offen php.ini (en una plataforma de desarrollo). Si esto es un problema en tus scripts puedes hacer un hack con las funciones de control de salida.
4. Requiriendo e incluyendo archivos utilizando datos inseguros
De nuevo y otra vez no confies en los datos que nos has declarado implicitamente: Incluir y requerir archivos desde $_GET, $_POST y $_COOKIE es una estupidez y un camino mortal, tu quieres controlar que código ejecuta exactamente tu servidor.
Cualquier atacante puede requerir la siguiente URL:http://www.yourdomain.com/index.php?filename=anyfile.txt
Haciendo esto el atacante puede extraer información confidencial y ejecutar scripts PHP almacenador en otro servidor. Ahora si allow_url_fopen estña activado en tu php.ini serás un estúpido:
Entonces tu script incluye y ejecuta el código de la página http://www.youaredoomed.com/phphack.php. Haciendo esto por ejemplo pueden enviar mensajes de spam, cambiar contraseñar, eliminar archivos... Tengo una imaginación muy limitada.
Como solucionarlo: Tu tienes el control sobre que archivos el script tiene permitidos incluir y cual no está permitido. Nota: Esta es una solución rápida:
//Include only files that are allowed. $allowedFiles = array('file1.txt','file2.txt','file3.txt'); if(in_array((string)$_GET['filename'],$allowedFiles)){ include($_GET['filename']); } else{ exit('not allowed'); } ?>
5. Errores de sintaxis
Esto cubre todos los errores de sintaxis que TU cometes durante el desarrollo, probablemente sean incontables ¿no? Normalmente se trata de un corchete, un punto y coma, unas comillas, o un paréntesis que no se encuentra o que está colocado en el lugar incorrecto, es hora de comer y por eso lo pongo en la lista. Sólo hay una forma de combatir estos errores: Ser cuidadoso con los errores de sintaxis que se cometen y buscar formas de evitar repetirlos. Por supuesto un buen editor de textos ayudará mucho a no cometerlos, por favor, no uses notepad.
6. Ninguno o poco uso de programación Orientada a Objetos
Muchos sistemas que he visto y están trabajando tienen este problema. Simplemente no utilizan programación orientada a objetos. Sí, objetos y clases para un novato son abstractos pero por ejemplo si construyes un sistema para una tienda y no utilizas programación orientada a objetos, el código no será mantenible en tiempo y tamaño. PHP ha soportado una programación orientada a objetos básica desde PHP4 y PHP5 tiene un mejor soporte, por lo que debes usarla.
7. No utilizar un framework
El 95% de los desarrollos con PHP se basan en las mismas cuatro cosas: Crear, editar, listar y borrar. Para hacer esto en PHP puro sin utilizar un MVC Framework de ninguna clase (puede ser hecho en casa o libre) es una estupidez y una perdida de TU tiempo (por supuesto hay algunas excepciones y puedes tener una buena explicación de por qué no usar un framework).
Hablo desde la experiencia y hay mucho más PHP que un pequeño framework.
8. No conocer las funcionalidades existentes
Una de las cosas más importantes de PHP es que hay mucha funcionalidad disponible en el núcleo de PHP más que en las extensiones de PHP. Sin embargo, muchas veces los scripts de los programadores están reinventado el plato redondo. Yo soy culpable de hacer esto, pero es una perdida de tiempo que puedes ahorrar. Incluso cuando la funcionalidad de PHP está fuera de dudas puedes ahorrar tiempo en muchas situaciones utilizando exec() para ejecutar desde la shell.
Ahorra tiempo buscando en el manual de www.php.net y Google, mantente al día de nuevas características en versiones futuras y preguntando a las personas adecuadas cuando lo necesites.
9. Usar versiones de PHP antiguas
Este problema está principalmente relacionado con los programadores que desarrollan en PHP4 estás programando en una plataforma en desaparición y no estás usando todo el potencial de tus conocimientos, cámbiate, hay muchas mejoras y funcionalidades en PHP5. Y no es un gran problema cambiar a PHP5, la mayoría de las aplicaciones necesitan unos pocos cambios o ninguno para poder cambiar.
Y como segundo punto está el de la seguridad de correr un software viejo y sin parchear que puede acabar en un dañó de tus aplicaciones.
De acuerdo con Damien Seguy (fundador del portarl Frances de PHP http://www.nexen.net) el 12% de todos los servidores PHP están ejecutando PHP5 a comienzos de Noviembre de 2006.
Lee el artículo aquí (en Francés). Por lo que si estás desarrollando PHP probablemente seas de ese (88%) que todavía lo hace en PHP4, ¡Avergüenzate!
10. Doble escapado de comillas
Habras visto alguna vez una página mostrando un texto con \' o \" , normalmente sucede cuando un script está utilizando magic_quotes en(php.ini) y es ejecutado en un servidor con magic_quotes activado. Primero PHP ejecuta addslashes() para todas las variables GET, POST y COOKIE y una vez más cuando los datos van a ser almacenados.
Texto Original: It's a string
Despues de magic quotes al inicio del script: It\'s a string
Al ejecutar una sentencia para almacenar: It\\'s a string
Salida HTML: It\'s a string
Otra situación es cuando un usuario intenta registrarse e introduce datos no válidos, el usuario ve nuevamente el mismo formulario, esta vez con la entrada escapada, la segunda vez que el usuario envía los datos válidos la entrada es escapada nuevamente.