Tag Archive for: PHP

PHP: variables de nombre variable

Categories: PHP - Tags: ,

Las variables de nombre variable o variables variables, valga la redundancia son muy útiles a la hora de ahorrar programación ya que permite generar nombres de variables dinamicamente sobre todo en bucles y funciones.

La forma normal de crear una variables es $x=1

Pero que ocurre si tenemos que crear un bucle donde debemos asignar valores a $x1, $x2, $x3…. no sería buena idea asignar una por una, si estamos dentro de un bucle sería algo como:

1
2
3
foreach ($arr as &$value) {
   ${'x'.$i} = "valor de variable";
}

Lo mismo sirve también para usar los valores almacenados en una variable.

PHP: Limitar el tamaño de archivo que subimos

Categories: PHP - Tags:

Este simple script también funcionaría si usamos algún plugin jquery para subir archivos ya que estos plugins lo único que hacen es crear un iframe por el que se sube el archivo haciendo parecer que en realidad es una llamada AJAX.

Creando el formulario

Si no usamos AJAX, deberiamos usar un formulario como este:

1
2
3
4
5
6
7
8
<form action="subirArchivo.php" method="post" enctype="multipart/form-data">
    <input type="hidden" name="MAX_FILE_SIZE" value="100000">
    <b>Enviar un nuevo archivo: </b>
    <br>
    <input name="userfile" type="file">
    <br>
    <input type="submit" value="Subir">
</form>

Es muy importante que en ese formulario no te olvides del enctype=”multipart/form-data”

1
2
3
4
5
6
7
8
9
10
$file_name=$_FILES["fimg"]["name"];
$file_size=$_FILES["fimg"]["size"];
$file_type=$_FILES["fimg"]["type"];
if($file_name!="" AND $file_size<=$_POST['MAX_FILE_SIZE']){
        $path="../images/galeria";
        /// BOF Thumbnail
        copy($_FILES['fimg']['tmp_name'],$path.'/'.$file_name);
} else {
  echo 'El archivo es demasiado grande';
}

En este caso el tamaño máximo estoy enviandolo via PHP sin embargo nada nos impide poner un valor como 560000 (560Kb) en lugar de $_POST['MAX_FILE_SIZE']

PHP: Mostrar una imagen según la fecha

Categories: PHP - Tags:

A veces necesitamos que se muestre un banner por alguna fecha especial como puede ser fiestas patrias, dia de la madre, etc. En este tutorial voy a explicar como hacerlo de forma automática.

Paso 1:¿Qué dia es hoy?

Para saber que imagen mostrar primero necesitamos saber la fecha en un formato que nos sea util, para eso usamos esta linea:

1
$fecha = date("d-m-Y");

Paso 2: Buscamos que imagen mostrar

Usando una estructura case podemos averiguar que imagen debemos mostrar según la fecha, quedando algo así:

1
2
3
4
5
6
7
8
switch ($fecha) {
    case "04-08-2010":
        echo '<img src="http://temp.com/wp-content/6Aug.jpg" alt="Los Angeles">';
        break;
    case "05-08-2010":
        // ...
        break;
}

Y bueno eso es todo

Mostrando una imagen según la fecha y la hora

Si además quisieramos mostrar una imagen según el día y la hora, algo como lunes 10 am otra el martes 9pm, etc. Nos bastaría con buscar ya no una fecha especifica sino un dia de la semana, quedando algo como esto:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
$dia = date("D");
$hora = date("G");
switch ($dia) {
    case "Mon":
        if($hora=="10") {
            echo '<img src="http://temp.com/wp-content/lunes10.jpg" alt="Los Angeles">';
        }
        break;
    case "Tue":
        if($hora=="21") {
            echo '<img src="http://temp.com/wp-content/martes21.jpg" alt="Los Angeles">';
        }
        break;
    case "Wen":
        // ...
        break;
}

Si necesitamos agregar más horas dentro de un mismo día bastaría con agregar más condiciones if

Templates PHP parte 1

Categories: PHP - Tags:

Antes que me lluevan las críticas por lo que voy a escribir en este post, quiero primero aclarar que estoy de acuerdo en el uso de MVC (modelo-vista-controlador) en lo que no creo es que Smarty sea la solución, ya iré desarollando la idea de a pocos.

¿Qué es una plantilla/template PHP?

Las plantillas son páginas web que muestra código PHP y que “supuestamente” pueden ser editadas por cualquier persona sin tener conocimientos de programación, por lo que serían adecuadas para diseñadores y maquetadores de páginas web. Usualmente tienen extensión .TPL

Quiero indicar que en Internet encontramos muchos sistemas que dicen ser plantillas pero que en realidad no pasan de ser simples reemplazadores de variables y aunque esto no sea exactamente una plantilla la verdad es que en sistemas simples cumplen de sobra con su cometido, por ejemplo pueden ver ESTE

¿Qué es Smarty?

Si te han dado curiosidad los sistemas de plantillas en PHP es seguro que te debes haber cruzado con explicaciones sobre Smarty que es el sistema de plantillas oficial para PHP, y además estoy seguro que habrás leído comentarios sobre lo muy rápido, eficiente y simple de implementar que es, la verdad es que para cosas simples puede parecer que si, pero ya luego te darás cuenta que no es la maravilla que te cuentan.

¿Por qué no es buena idea usar Smarty?

Los argumentos a favor los encuentras rondando por google asi que yo me dedicaré a analizar que tan ciertos son:

Separa la lógica de la presentación

Eso no es del todo cierto, ya que Smarty es todo un lenguaje de programación, veamos algunas de las supuestas ayudas que da Smarty para los diseñadores y vamos con los ejemplos para visualizar esto:
Con Smarty:

1
2
3
4
5
<table>
   <tr>
      <td>{$mivariable}</td>
   </tr>
</table>

Ahora veamos lo tremendamente dificil que es hacerlo sin Smarty

1
2
3
4
5
<table>
   <tr>
      <td><?=$mivariable?></td>
   </tr>
</table>

Seguro que algunos escépticos me dirán que en algo tan simple es lo mismo pero que en programación da muchas facilidades para los diseñadores, veamos si eso es cierto
Condiciones usando Smarty:

1
2
3
4
5
6
7
{if $name eq "Fred"}
    Welcome Sir.
{elseif $name eq "Wilma"}
    Welcome Ma'am.
{else}
    Welcome, whatever you are.
{/if}

Veamos lo complicadísimo que es hacer lo mismo usando PHP

1
2
3
4
5
6
7
<?php if ($name == "Fred"):?>
    Welcome Sir.
<?php elseif($name == "Wilma"): ?>
    Welcome Ma'am.
<?php else: ?>
    Welcome, whatever you are.
<?php endif; ?>

¿Alguién notó lo mucho que se simplificó para el diseñador? Al menos yo no, además de cambiar mis invocaciones PHP por llaves y encima complicarme con algo llamado eq cuando yo ya tenía mi archiconocido ==

Smarty es más veloz

Tal vez sea más veloz que otro sistema de plantillas sin compilar ni optimizar pero nunca más veloz que usar puro PHP como hice en los ejemplos anteriores, sumado a esto es mucho más pesado, o creen que esas miles de líneas de código que forman Smarty no van a consumir procesos en tu servidor.

Smarty incorpora una sistema de patrones de sintáxis

Eso en castellano significa que dentro de la plantilla podamos incluir manejo y manipulación de variables; es decir dentro de una plantilla de Smarty puede hacerse programación. Me parece o al inicio dijimos que el objetivo de usar plantillas es para no mezclar la programación con el diseño, si eso es cierto como se nos va a ocurrir meter programación ahi, eso desnaturaliza su uso y encima vamos a decir que eso es una ventaja….

Por esas razones considero que Smarty es mala idea ya que nos obliga a aprender un lenguaje de programación intemedio entre diseño y programación que quitará rendimiento a nuestra aplicación y al final no logra separar el diseño de la lógica.

En el próximo post indicaré cual es la solución para mi.

Seguridad, ataques y spam en la web

Categories: PHP - Tags: , ,

Desde que empecé a postear en mi blog he sufrido múltiples ataques afortundamente he podido repelerlos todos gracias a una serie de plugins para WordPress sin embargo estas mismas funciones es posible incluirlas en nuestros scripts, veamos algunas formas:

No permitir HTML

Nada más molesto que ser bombardeado por cientos de mensajes llenos de código basura, con links para comprar viagra (creo que no lo necesito), ofertas de mil cosas he incluso mensajes en árabe que llenan de links y código malicioso en los peores casos añaden javascript que invocan banners de propaganda o intentan descargarla algún troyano a nuestros visitantes lo mejor para prevenirlos es no permitir el uso de código HTML para eso podemos usar una muy útil función de PHP que es strip_tags y se usa de la siguiente forma:

1
2
3
4
5
//// Para eliminar todo rastro de html seria
$text = '<p>mi codigo html</p><a href="#fragment">Other text</a>';
echo strip_tags($text);
//// Para permitir el uso solo de <p> y <b>
echo strip_tags($text, '<p><b>');

Existen formas más elaborados usando PHP purifier por ejemplo pero por lo general no requerimos un script tan pesado y con strip_tags basta.

Usar un código de seguridad

Más conocido como captcha podemos colocar nuestra letras como si fueran un gráfico un poco distorcionado y así prevenir que robots posteen, hay algunos detalles que debemos tomar en cuenta primero que el código se debe verificar al momento de enviar el formulario y al recibir los datos ya que los robots suelen no usar el formulario y saltarse toda validación javascript, hay muchas opciones de captcha basta buscar en google pero siempre tomando en cuenta que el código sea lo suficientemente comprensible para un humano.

Bloquear IP

Esta es una de las formas más radicales de prevenir spam ya que los robots suelen venir de algunos ip que no varían al bloquearlos se disminuye el spam pero cuidado porque podriamos estar bloqueando a todo un grupo de usuarios que estén bajo un mismo IP público.
Para esto en PHP verificamos el IP de nuestro visitante

1
2
3
4
5
6
7
8
<?php $ip = $_SERVER['REMOTE_ADDR'];
//// Hacemos un array de ips baneadas
$ips_baneadas = array('10.0.0.1',’192.0.0.1’);  
$contador = count($ips_baneadas);  
//// Verificamos si el visitante esta baneado
for ($i=0; $i<$contador; $i++) {  
if($ip == $ips_baneadas[$i]) { die("Lo sentimos, estas baneado . $ip"); } } ?>  
?>

Y bueno esas son las formas más usuales de prevenir spam aunque les aseguro que no son 100% seguras digamos que son un 99% seguras combinadas asi que siempre quedará algo que debamos borrar manualmente por lo que no esta demás poner alguna opción que diga “denunciar” para eliminar algún comentario malicioso.