jueves, 31 de enero de 2013

Paginación en PHP

Buenas a tod@s!!!

Hoy traigo un método eficaz para hacer una paginación de distintos elementos en PHP y mysqli. Aunque el ejemplo esté en mysqli el método es compatible en otras versiones de mysql, solo varían las funciones utilizadas para las consultas (las querys son las mismas).

Para simplificar dividiremos el método en dos partes: La obtención de datos y el proceso para mostrarlos.

Obtención de datos:

obtener_elementos.php

$limite_elementos_pagina=20;
//obtenemos por get la pagina que queramos consultar, la primera vez la pagina será 0
if(isset($_GET["pagina"])){
$pagina=(int)$_GET["pagina"];
}
else {
$pagina=0;
}
$pagina_actual=$pagina;
$pagina_elemento=$pagina*$limite_elementos_pagina;
//con esta query obtendremos los elementos pertenecientes a la página del GET
$query="SELECT * FROM `elementos` ORDER BY elementos.id ASC LIMIT ".$pagina_elemento.",".$limite_elementos_pagina.";";
$query.="SELECT count(*) AS `count` FROM `elementos`";
if($mysqli->multi_query($query)){
//en $elementos tendremos guardados los elementos requeridos
if($elementos = $mysqli->store_result()) {
$mysqli->next_result();
if($result = $mysqli->store_result()) {
if($row = $result->fetch_array(MYSQLI_ASSOC)) {
//obtenemos el número de páginas que hay, la función ceil redondea por arriba
$numero_paginas=ceil($row['count']/$limite_elementos_pagina);
//llamamos al archivo php para mostrar los elementos
include("mostrar_elementos.php");
}
}
}
}

El código está bastante comentado, pero hay un par de apuntes que aclarir:
La función isset comprueba si existe la variable y devuelve cierto en dicho caso.
Mysqli permite las sentencias múltiples, en este caso tenemos un poco de caos en el código; lo que hacemos solamente es obtener los elementos en referencia a la página de la base de datos y obtener el número de elementos que hay.
Para obtener el número de páginas, dividimos el número de elementos totales entre el limite de elementos por página; hay un dato importante y es que tenemos que redondear por arriba, ya que, si el número resultante es decimal, indicará que habrá una página con un número de elementos inferior al límite.
Finalmente la función include, nos incluye el código del archivo seleccionado consecutivamente a esa función (include).

Ahora procedemos a mostrar los elementos:

mostrar_elementos.php

<html>
<head>
</head>
<body>
<div>
<?php while($row = $elementos->fetch_array(MYSQLI_ASSOC)) { ?>
<p> <?php echo $row['id'].' '$row['atributo1'].' '$row['atributo2'];?> </p>
<?php } ?>
</div>
<div>
<?php $i=0;
while($i<$numero_paginas){ ?>
<?php if($i==$pagina_actual) { ?>
<label> <?php echo $pagina_actual+1; $i++; ?> </label>
<?php }
else {?>
<a href="obtener_elementos.php?page=<?php echo $i; ?>"> <?php echo $i+1; $i=$i+1; ?> </a>
<?php
}
}?>
</div>
</body>
</html>

Para mostrar los elementos intercalamos html y php.
Dentro del primer DIV, en el while recorremos todos los elementos pertenecientes a la página actual, obtenidos anteriormente y mostramos sus atributos.
En el segundo DIV, vamos de 0 hasta el número de páginas-1 (ya que la página 0 cuenta): En el caso de que la página sea la actual no permitiremos acceder a ella (label), en el caso de que no lo sea crearemos un link para obtener los elementos de dicha página, dónde le pasaremos por GET el número de página que se corresponda.
Cabe indicar que el número de página que mostramos es una unidad superior al número de página real, ya que no tiene mucho sentido que el usuario vea la página número 0.

Espero no dejarme nada, cualquier cosa, comentario!!!

Un saludo!!!

miércoles, 30 de enero de 2013

Encriptación y desencriptación en PHP

Buenas a tod@s!!

Hoy traigo un método de encriptación y desencriptación de PHP, para ocultar lo que nos venga de gusto y aumentar así nuestra privacidad.

Las funciones que vienen a continuación són simples: cogen la variable a encriptar o desencriptada y la devuelven desencriptada o encriptada respectivamente.

El cifrado de encriptación que utilizaremos es MCRYPT_RIJNDAEL_256 y el modo MCRYPT_MODE_ECB.

La función de encriptación es esta:


function encriptar($cadena)
{
$clave = "ljkljlk4ñj5lk432l532";
$cifrado = MCRYPT_RIJNDAEL_256;
$modo = MCRYPT_MODE_ECB;
$cadena_encriptada= mcrypt_encrypt($cifrado, $clave, $cadena, $modo,
mcrypt_create_iv(mcrypt_get_iv_size($cifrado, $modo), MCRYPT_RAND));
return $cadena_encriptada;
}

En la variable $clave ponemos lo que nos apetezca, lógicamente debemos ser coherentes y poner la misma en la función desencriptar que tenemos más abajo.
La función mcrypt_encrypt que utilizamos es una función que encontramos en las librerías de PHP.

La función para desencriptar es la siguiente:


function desencriptar($cadena)
{
$clave = "ljkljlk4ñj5lk432l532";
$cifrado = MCRYPT_RIJNDAEL_256;
$modo = MCRYPT_MODE_ECB;
$temp = mcrypt_decrypt($cifrado, $clave, $cadena, $modo,
mcrypt_create_iv(mcrypt_get_iv_size($cifrado, $modo), MCRYPT_RAND)
);
//Para saltar caracteres raros
$temppos = stripos($temp, chr(0));
if ($temppos !== false) {
$cadena_desencriptada = substr($temp, 0,$temppos);
}else{
$cadena_desencriptada = $temp;
}
return $cadena_desencriptada;
}

Como vemos es casi lo mismo que la anterior función; algunas veces, pero, nos encontramos que la cadena que nos devuelve la función contiene caracteres un tanto raros, utilizando la función substr como hemos visto los podemos evitar.

Nos vemos!!!


lunes, 28 de enero de 2013

Animate JQuery

Buenas a todos!!

Hoy traigo una función de JQuery para animar un poco nuestras páginas web. El ejemplo que he tomado es un poco simple (no he tenido mucho tiempo...), pero basta para ver como funciona.

La función es el animate y sirve para animar, valga la redundancia, nuestros elementos de las páginas web cambiando de forma progresiva los estilos de estos.

Para utilizar la función basta con unos sencillos pasos:

Lo primero seria cargar la libreria jquery; con esta dirección cargamos la última versión de jquery:

<head>
<script src="http://code.jquery.com/jquery-latest.js"></script>
</head>

Seguidamente ponemos una imagen cualquiera con una altura y una anchura de 10em por ejemplo :

<div>
<img id="imagen" src="mi_imagen.png" style="height: 10em; width: 10em;" />
</div>

Y por último creamos la función que nos permita animar:

<script>
$('#imagen').mouseover(function() {
$('#imagen').animate({
height: '12em',
width: '12em'
}, 1000);
});
$('#imagen').mouseout(function() {
$('#imagen').animate({
height: '10em',
width: '10em'
}, 1000);
});
</script>

Este código nos permite agrandar la imagen cuando el ratón está encima de ella y reducirla cuando lo sacamos fuera. Para hacer esto vamos por partes:
Seleccionamos mediante el JQuery la id de la imagen: $('#imagen').
Aplicamos la función de la librería JQuery  mouseover o mouseout  que nos permite establecer una nueva función que se ejecutará cuando el ratón esté encima o fuera de la imagen.
Nuevamente seleccionamos la id que queramos y le aplicamos, esta vez, la función animate.
La función animate acepta varios parámetros, en este caso nos quedaremos con dos:
El primer parámetro es una lista dónde especificaremos las propiedades CSS que queremos cambiar de la imagen, en este caso he cambiado la altura y anchura; el segundo parámetro es la duración de la animación.

NOTA: Es importante que el script se ejecute después de crear el objeto que queremos animar y no antes, en el caso que elijamos funciones como mouseover o mouseout.

Un saludo!!


domingo, 27 de enero de 2013

Recoger por POST una lista de checkbox en PHP

Buenas a tod@s señoras y señores!!!

Hoy explicaré como recoger una lista de checkbox de un formulario HTML, utilizando un POST en PHP.

Lo primero es crear el formulario de la siguiente forma:

<form action="recoger_checkbox.php" method="post">
     <input type="checkbox" name="numero[]" value="1"/> 1 <br/>
     <input type="checkbox" name="numero[]" value="2"/> 2 <br/>
     <input type="checkbox" name="numero[]" value="3"/> 3 <br/>
     <input type="checkbox" name="numero[]" value="4"/> 4 <br/>
     <input type="submit">
</form>

Véase que en el parámetro name hemos escrito numero[], con eso "[]" conseguiremos pasar por post la cadena de valores que el usuario elija, dentro de la cadena estarán los valores de value.
Obtendremos algo similar a esto (he eliminado el botón del submit para evitar confusión ya que no lleva a ninguna parte!):

1
2
3
4

Una vez tenemos esto procedemos a recoger los checkbox que el usuario ha seleccionado. Para esto debemos crear el fichero recoger_checkbox.php mencionado en la acción del formulario y obtener los datos de la siguiente forma:

if ($_SERVER["REQUEST_METHOD"] == "POST") { 
    $numero=$_POST["numero"];
    $count = count($numero);
    for ($i = 0; $i < $count; $i++) {
        echo $numero[$i];
    }
}
Comentando de manera rápida lo que hace el código:
Línea 1: Si la petición es POST continuará el proceso.
Línea 2: Guardamos la cadena obtenida por POST en la variable $numero (podriamos trabajar directamente con $_POST["numero"]).
Línea 3: Guardamos el número de parámetros que contiene la cadena.
Línea 4: Recorremos la cadena utilizando el for.
Línea 5: Mostramos por pantalla el contenido de la posicion de la cadena.

Con eso conseguiremos mostrar los valores seleccionados en el checkbox, a partir de aquí podremos hacer con ellos lo que nos plazca; como introducir-los en la base de datos o realizar operaciones con ellos.

Un abrazo!!!

sábado, 26 de enero de 2013

Fondo transparente, contenido opaco (opacity)

Buenas a todos!

Hoy traigo un poco de CSS, concretamente un problema que me trajo muchos dolores de cabeza pero que tiene fácil solución, lo suyo es encontrarla...

Definimos un DIV de fondo rojo y con opacidad 0.4:
<div style="background-color: red; opacity: 0.4;">

Y dentro ponemos una imagen.
src="http://upload.wikimedia.org/wikipedia/commons/thumb/4/47/PNG_transparency_demonstration_1.png/300px-PNG_transparency_demonstration_1.png" />


Puede que así nos resulte correcto dependiendo de lo que queramos hacer...
Pero en mi caso, quería que la imagen tuviera opacidad 1, mientras que el fondo permaneciera transparente.
Dado que la opacidad del DIV se aplica en todo su contenido, como podemos solventar este problema?

La respuesta es simple:
En el estilo del DIV, aplicamos la transparencia solamente en el fondo y no en el contenido del DIV, de esta forma:
<div style="background-color: rgba(255,0,0,0.4);">


La imagen se ve perfecta ahora y el fondo ha quedado transparente. Véase que hemos cambiado el nombre del color por su código RGB (red => 255,0,0) y hemos añadido el valor alpha (RGBA) para definir la transparencia del fondo.

viernes, 25 de enero de 2013

Crear archivos DOCX dinámicamente desde PHP

Hola mundo!

Por primera vez voy a escribir en mi blog y compartir mis experiencias. De momento voy a subir un post relacionado con la informática para probar todo esto... Pues bien ahí va!

El otro día estaba buscando como poder crear un archivo .docx, dinámicamente desde PHP. Tiré de google y encontré esta magnífica librería de PHP: phpdocx. Pero después de probar y probar la versión gratuita, no se adaptaba a mis requisitos y como pagar 99 € no entraba en mis planes continué buscando... 

Y al final lo encontré!!! phpword. No tiene tantas funcionalidades como la versión de pago del anterior, pero es mejor que su versión gratuita... Obviamente este es gratuito y viene acompañado de algunos ejemplos que hablan por si solos.
Puedes descargar-te la librería desde su página web, repito: http://phpword.codeplex.com/ .
Para estrenar también el nuevo servicio de almacenamiento en la nube MEGA, voy a colgar una versión, tal vez más antigua dependiendo de la fecha en la que leáis esto.

PHPWord_0.6.2_Beta.zip (174 KB)

En conclusión si tienes 99€ para gastarte en una libreria de PHP que obviamente parece cumplir de maravilla sus funciones, toma la primera opción. Si por el contrario, tu próposito no merece ninguna inversión y puedes cumplir-lo con un método sencillo pero eficaz, toma la segunda.

C U