Función recursiva en PHP para listar Directorios y Archivos

Ahora les traigo una funcion que me ha servido de mucho, esta función solo recibe como parametro la ruta o carpeta que queremos listar su contenido. Por ahora solo la imprime en una lista un poco fea, 😦 pero bueno ya depende de la creatividad de cada uno para darle mejor aspecto, por ejemplo se puede hacer un árbol que al dar clic en un directorio se desplegue su contenido, o hacer un explorador de archivos al estilo de joomla o como el que trae el mismo windows cuando le damos abrir ha algún fichero, bueno muchas mas cosas que se les pueda imaginar.

Aquí ta la función:

function listar_directorios_ruta($ruta)
 {
 // abrir un directorio y listarlo recursivo
 if (is_dir($ruta))
 {
 if ($dh = opendir($ruta))
 {
 echo "<br /><strong>$ruta</strong>"; // Aqui se imprime el nombre de la carpeta o directorio

 while (($file = readdir($dh)) !== false)
 {
 //if (is_dir($ruta . $file) && $file!="." && $file!="..") // Si se desea mostrar solo directorios
 if ($file!="." && $file!="..") // Si se desea mostrar directorios y archivos
 {
 //solo si el archivo es un directorio, distinto que "." y ".."
 echo "<br />$ruta$file"; // Aqui se imprime el nombre del Archivo con su ruta relativa
 listar_directorios_ruta($ruta . $file . DIRECTORY_SEPARATOR); // Ahora volvemos a llamar la función
 }
 }
 closedir($dh);
 }
 }
 }

Ahora va una pequeña explicación, Es un poco complicado entender lo de la recursividad, pero vamos a tratar de eplicar, porque como es posible que una función se mande a llamar a si misma. que raro no, bueno resulta que cuando una función se llama a si misma se crea una pila de ejecución la cual va guardando las llamadas que hace la funcion, cuando una termina, inmediatamente se empeza a ejecutar la siguiente, es decir es un proceso que consume un poco de recursos, debido a que necesita gran cantidad de memoria en tiempo de ejecucion para poder guardar la pila de ejecución.

Que hace realmente la función?. Lo primero es verificar si el parametro recibido es un directorio si es asi abrimos el directorio, con opendir, ahora leemos cada uno de los archivos dentro del directorio, si el archivo leido es un directorio, mandamos a llamar nuevamente a la función, y se repite el proceso. Al terminar es recomendable, bueno por no decir necesario, cerra el directorio.

Espero y quede claro la explicación alguna duda pregunten que pa eso tamos aqui… : )

Anuncios

Paginador de consultas en PHP y MySQL

En esta ocación les traigo un paginador de consultas en PHP, este esta asociado a consultas en MySQL, pero la pueden modificar segun sus nececidades. Cuando realizamos una consulta en MySQL, la hacemos por lo regular de la siguiente forma:

SELECT * FROM MiTabla;

Claro a veces con sus filtros y con la sentencia Where, pero bueno esta es solo un ejemplo. Supongamos que el resultado de nuestra consulta nos develve 20 registros, no son demasiados y se pueden mostrar tranquilamente en una pagian HTML, pero que pasaría si el resultado que nos devuelve son 1,000 registros, como que mostrarlos es una sola pagina seria, además de lento, antiestético. Pos ese es nuestro objetivo tratar de implementar una clase, echa por yo, para paginar el resultado de una consulta. Después de una breve introducción manos a la obra.

Empecemos por la parte de MySQL. la instrucción SELECT acepta una clausula llamada LIMIT, la cual nos sirve para restringir el numero de registros devueltos por nuestra consulta.

LIMIT tiene uno o dos argumentos, que deben ser enteros positivos. El primero especifica el desplazamiento del primer registro a devolver, y el segundo la cantidad de registros a devolver. Si no se especifica el desplazamiento este se toma como Cero (0), que es el desplazamiento inicial. Ejemplos:

SELECT * FROM MiTabla LIMIT 5;     # Devuelve los primeros 5 registros
SELECT * FROM MiTabla LIMIT 5,10;  # Devuelve los registros del 6 al 15

Comprendido ya este tema, ahora veamos como podemos aplicar esto en PHP. En esta ocasión vamos a programar un poquito, bueno digo un poquito porque no me gusta la programación orientada a objetos, con clases. Pego el código fuente y después vemos la explicación:

<?PHP
class Paginador
{
 var $pag = 0;
 var $desde = 0;
 var $hasta = 0;
 var $consulta = "";

 function Paginador()
 {
 ?>
 <script language="javascript" type="text/javascript">
 function pagina(pag,formulario)
 {
 direccion = document.forms[formulario].action.split("?pag=");
 document.forms[formulario].action = direccion[0] + "?pag=" + pag;
 document.forms[formulario].submit();
 }
 </script>
 <?PHP
 }

 function inicia($var_pag, $consult, $num=10)
 {
 if(isset($var_pag) && $var_pag>0)
 $this->pag = $var_pag;
 else
 $this->pag = 1;

 /* Si el usuario define cuantos registros quiere ver por pagina*/
 if($_POST['paginador_num'])
 {
 $num = $_POST['paginador_num'];
 }

 /* Para no perder la consulta al cambiar de pagina*/
 if($_POST['paginador_query'])
 $consult = $_POST['paginador_query'];

 $this->hasta = $num;
 $this->consulta = $consult;
 $this->desde=($this->hasta*$this->pag)-$this->hasta;
 }

 function imprime($url,$posicion,$otros="")
 {
 $todos = 0;
 $result = mysql_query($this->consulta);
 if($result)
 $todos = mysql_num_rows($result);
 $paginas=ceil($todos/$this->hasta);

 // Evita el desfazamiento del contador de pagina
 if($this->pag > $paginas)
 {
 $this->desde = 0;
 $this->pag = $paginas;
 }

 echo '<div align="center">';
 echo '<form name="form_paginador'.$posicion.'" action="'.$url.'" method="post" onsubmit="">';
 echo '<input type="hidden" name="paginador_query" value="'.$this->consulta.'" />';
 echo "<!-- INICIO OTROS -->".$otros." <!-- FIN OTROS -->";
 echo '<table><tr height="24px" align="center">';
 echo "<td>Registros por p&aacute;gina:
   <input type='text' size='2' name='paginador_num' value='".$this->hasta."'></td>";
 if($this->pag>1)
 echo "<td width=\"23\">
    <a href=\"#\" onclick=\"pagina('1','form_paginador".$posicion."');\" title=\"Primero\">
    <img src=\"images/primero.gif\" border=\"0\" align=\"absbottom\"/></a></td>
 <td>|</td>
 <td width=\"23\">
    <a href=\"#\" onclick=\"pagina('".($this->pag-1)."','form_paginador".$posicion."');\" title=\"Anterior\">
    <img src=\"images/anterior.gif\" border=\"0\" align=\"absbottom\"/></a></td>";
 echo "<td>|</td><td><b><u>P&aacute;gina ".$this->pag."/".$paginas."</u></b><td>|</td>";
 if($this->pag<$paginas)
 echo "<td width=\"23\">
    <a href=\"#\" onclick=\"pagina('".($this->pag+1)."','form_paginador".$posicion."');\" title=\"Siguiente\">
    <img src=\"images/siguiente.gif\" border=\"0\" align=\"absbottom\"/></a></td>
 <td>|</td>
 <td width=\"25\"><a href=\"#\" onclick=\"pagina('".($paginas)."','form_paginador".$posicion."');\"title=\"Último\">
    <img src=\"images/ultimo.gif\" border=\"0\" align=\"absbottom\"/></a></td>";
 echo "<td><b> (Total : ".$todos." registros) </b></td></tr></table></form></div>";
 }

 function query()
 {
 //echo $this->consulta." LIMIT ".$this->desde.", ".$this->hasta;
 if($this->desde < 0) $this->desde = 0;
 //echo $this->consulta." LIMIT ".$this->desde.", ".$this->hasta;;
 return $this->consulta." LIMIT ".$this->desde.", ".$this->hasta;
 }
}
?>

Como ven se crea una clase a la cual se le llama Paginador, esta clase contiene cuatro atributos principales:

$pag = Hace referencia hacia la pagina siguiente.
$desde = indica el Desplazamiento de la sentencia limit;
$hasta = incida la cantidad de registros que devuelve la consulta;
$consulta = El query SQL sin la clausuala LIMIT;

Ahora hablemos de las funciones:

Paginador() = Este es el constructor, este imprime la función en JavaScript que nos permite enviar los datos a la siguiente pagina.
inicia($var_pag, $consult, $num=10) = esta es la primera función que se debe ejecutar, $var_pag contiene la pagina actual que se debe mostrar, $consult es el query SQL y $num es el numero de registros por paginas que se deben mostrar, este por default es 10.
imprime($url,$posicion,$otros=””) = esta funcion imprime el paginado, $url es la misma pagina, $posion es un entero cualquiera, en realidad no se pa que esta jejeje, $otros son datos estras que nos pueden servir para ejecutar un sentencia mas especifica, como por ejemplo un filtro de usuarios de solo chiapas, etc.
query() = esta función devuelve el query SQL, en formato texto, con su respectivo LIMIT ya procesado.

Ejemplo de implementación:

/* PAGINADOR */
 $consulta = 'SELECT * FROM MiTabla';
 $paginador = new Paginador();
 $paginador->inicia($_GET['pag'],$consulta);

 $resultado = ejecutaQuery($paginador->query());

 $otros = '<input type="hidden" name="filtro" value="'.$_POST['filtro'].'" />';

 $paginador->imprime('pagina.php','1',$otros);

Si observan la variable $resultado contiene el result_set, por asi decir, resultado de la consulta, esa variable es la qe debemos utilizar para imprimir los resultados.

Espero les sirva esta pequeña clase, les prormeto qe para la proxima la voy a depurar bien y la voy hacer con JQuery, la cual todavia no la domino bien, he ahi que esta clase utiliza el metodo POST y tiene que refrescar toda la pagina, pero ya pronto les tendre la Version 2 del Paginador con JQuery.

Correción de los Acentos en PHP y MySQL

Bueno va mi primer post, espero que se de mucha utilidad. Resulta que los que nos gusta o tenemos la necesidad de hacer algún sistemita en PHP y MySQL, en ocasiones, los acentos o caracteres de código ascii extendido como la ñ,?,<>, … no se muestran bien o no se guardan como deben ser, cuando se registran desde PHP, por ejemplo un sistema donde se tenga que registrar los comentarios de los visitantes, o un sistema para registrar personas, etc.

El detalle en este problemilla radica en el tipo de codificación que utilizan en el encabezado de la pagina PHP y el de MySQL, a lo que llamamos comúnmente “char set” o conjunto de caracteres, en espanish, MySQL comúnmente utiliza para el Cliente, o sea la consolita, utf8 y para las bases de datos latin1, bueno tonces vamos a ver como darle solución.

Si buscan en san google van a encontrar que esto se puede solucionar colocando la codificación utf8 al encabezado HTML, pero aquí va una solución, que desde hace un buen rato me ha funcionado a la perfección.

Pa los que trabajan Dreamweaver, like me, si le dan crear un nuevo documento html observarán que en el encabezado aparece la siguiente linea de código:

<meta http-equiv=”Content-Type” content=”text/html; charset=windows-1252″ />

Esta linea indica el conjunto de caracteres que la pagina va a utilizar, bueno en esta tenemos que modificar el valor de charset por “iso-8859-1”. Al final debe quedar así:

<meta http-equiv=”Content-Type” content=”text/html; charset=iso-8859-1″ />

Esto es en la parte de PHP, ahora vamos a MySQL. Cuando creamos nuestra base de datos por lo regular la hacemos de la siguiente manera:

Create database MiBasesita;

Si ya tenemos creada la base de datos, entonces escribimos la siguiente linea para modificar el charset de la base de datos:

alter database MiBasesita default character set utf8 collate utf8_general_ci;

Con eso modificaran el conjunto de caracteres de la base de datos, recuerden que por default MySQL le asigna latin1.

Ahora al imprimir el resultado de alguna consulta les recomiendo que utilicen la función htmlentities();

Espero y les funcione, Suerte…