Archive for category: 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: friendly url

Categories: PHP, Posicionamiento - Tags: ,

Anteriormente había escrito sobre el funcionamiento de friendly url pero aún hay muchos que están en duda sobre su funcionamiento así que voy a aprovechar de hacer un ejemplo práctico muy sencillo sin usar web modular (que es para lo que normalmente sirve) para que sea lo más simple posible.

Lo básico en URL amigable

Lo primero debemos asegurarnos de tener activo el módulo mod_rewrite de lo contrario dará un error “Internal Server Error” o simplemente no funcionará, luego creamos un archivo .httacess

1
2
3
4
5
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /micarpeta/
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

Allí primero verificamos el mod_rewrite luego seteamos la RewriteBase es decir la carpeta donde esta nuestro sitio, si se tratara de www.misitio.com esa línea sería:

1
RewriteBase /

Las 2 últimas líneas nos dicen que de existir ese archivo o carpeta se olvide de la URL amigable y use esos archivos

Creando pagina.html

Para esto en nuestro archivo.httacess añadimos:

1
RewriteRule (.*)\.html$ index.php?page=$1

Esto genera una equivalencia entre
index.php?page=mipagina
mipagina.html

Para emular carpetas

Para esto en nuestro archivo.httacess añadimos:

1
2
RewriteRule /local/(.*)/ index.php?page=local&link=$1
RewriteRule local/(.*) index.php?page=local&link=$1

Esto va a generar una equivalencia entre:
index.php?page=local&link=restaurante-san-jose
www.misitio.com/local/restaurante-san-jose/

La cantidad de parámetros y de nombres de las variables depende de cada caso en concreto

Uso de las variables

Todas las variables GET que creamos tanto con friendly URL como sin esta mantienen sus nombres por ejemplo en el caso:
index.php?page=local&link=restaurante-san-jose
www.misitio.com/local/restaurante-san-jose/

Las variables creadas en ambas direcciones son: page que tiene el valor local y la variable link que tiene el valor restaurante-san-jose

Debemos tener claro que con url amigable lo único que estamos haciendo es disfrazar la dirección pero este disfraz altera las rutas relativas por lo que posiblemente fallen todas las invocaciones a hojas de estilos, javascripts e imágenes que se hayan hecho sin usar una ruta absoluta, para remediar esto hay 2 posibles soluciones:

Alterando la ruta base(basepath)

Esta es la más simple y rápida basta con agregar la siguiente linea HTML en el encabezado de nuestra página web

1
<base href="http://www.misitio.com/" />

Usando un path absoluto

Esta es la solución que más se utiliza debido a que la otra solución puede no funcionar en algunos navegadores especialmente en los antiguos (IE6 por ejemplo tiene varios peros), lo que hacemos es guardar la ruta absoluta en una constante que luego usaremos cada vez que invoquemos una imagen, css o javascript.

1
2
3
define("_path", "http://misitio.com/");
// Para invocar una imagen por ejemplo
<img src="<?php echo _path; ?>miimagen.jpg" />

De esta forma hay algunas variantes usando short open tags, templates, funciones, etc pero la idea básica es la misma.

Pueden ver un ejemplo funcionado AQUI
No doy link a los archivos del ejemplo ya que su funcionamiento varía según la carpeta donde se le coloque, por lo que terminarían dando más problemas que soluciones.

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 2

Categories: PHP - Tags: , , ,

En el post anterior hablé sobre los sistemas de templates y en especial de Smarty, la idea general es que no hace falta aprender un nuevo lenguaje de programación intermedio para las plantillas sino que con PHP puro es suficiente.

Yo considero que lo más importante es ser ordenado y de esta forma podemos separar la lógica de la programación del diseño.

Usando Savant 3

Lo que me gusta de este sistema de templates es que tiene las ventajas de Smarty sin sus problemas, en primer lugar nos ofrece las ventajas del uso de cache y sobre todo no exige que aprendamos un nuevo lenguaje de programación sino que usa nuestro PHP de siempre para mantener el esquema de programación MVC, lo pueden bajar AQUI

Uso de clases

Como dije antes ser ordenado permite separar la lógica de la programación del diseño, esto sumado al uso de clases y web modular. Veamos un ejemplo primero de lo que NO debemos hacer:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?php
$link = mysql_connect("localhost", "nobody"odigo">$link = mysql_connect("localhost", "nobody");
mysql_select_db("
mydb", $link);
$result = mysql_query("
SELECT nombre, email FROM agenda", $link);
echo "
<table border = '1'> \n";
echo "
<tr> \n";
echo "
<td><b>Nombre</b></td> \n";
echo "
<td><b>E-Mail</b></td> \n";
echo "
</tr> \n";
while ($row = mysql_fetch_row($result)){
echo "
<tr> \n";
echo "
<td>$row[0]</td> \n";
echo "
<td>$row[1]</td> \n";
echo "
</tr> \n";
}
echo "
</table> \n";
?>

Ese desastre esta bien como ejemplo o cuando recién empezamos con PHP, esa ensalada de código no le sirve de nada al diseñador, veamos como sería eso mismo pero separando la lógica del diseño:

1
2
3
4
5
6
7
8
9
10
11
12
<?php query_posts($query_string); ?>
<?php if ( have_posts() ) : while ( have_posts() ) : the_post(); ?>
<div class="post">
<h2><a href="<?php the_permalink() ?>" rel="bookmark"><?php the_title(); ?></a></h2>
<div class="entry">
   <?php the_content(); ?>
</div>
<p class="postmetadata">Posted in <?php the_category(', '); ?></p>
</div>
<?php endwhile; else: ?>
<p>Sorry, no posts matched your criteria.</p>
<?php endif; ?>

En este caso copiado de WordPress, que para mi es uno de los mejores en lo que refiere al uso de MVC, si abrimos el archivo usando Dreamweaver, el diseñador podrá editarlo sin problemas basta que respete la ubicacion de las condiciones if y el bucle while (tal como ocurriría con Smarty pero sin sus complicaciones).

La conexión de base de datos se coloca en un archivo config.inc.php por ejemplo, y el manejo de la conexión en si se hace mediante una clase destinada a dicho fin, también es posible mediante clases separarlo en una cabecera PHP con la creación del objeto y luego el código html:

1
2
3
4
5
6
7
8
9
10
11
12
<?php
///// no tocar /////
$noticia = new noticia();
if ($noticia->cuantos<=0) {
///// no tocar /////
?>
   <p><b>No se encontraron noticias</b></p>
<?php } else { for ($i=0; $i<$noticia->cuantos; $i++) { ?>
   <h2><?=$noticia->titulo?></h2>
   <p><span class="fecha"><?=$noticia->fecha?></span></p>
   <p><?=$noticia->texto?></p>
<?php } ?>

Con dejarle algunas indicaciones al diseñador que no debe tocar ciertas líneas, además de usar nombres muy claros para nuestra variables (titulo, fecha, texto, etc) le damos suficiente ayuda para que sepa que parte tocar y como organizarlo.