Mar. 05

Para los que no saben existe algo llamado swfobject que es un script que sirve para añadir de forma fácil y segura animaciones flash en una pagina y este script es el que uso yo.

Vamos al grano resulta que hoy abrí mi blog con el chafasplorer 7 y como no tenia el plugin de flash pues entonces lo instale pero al reiniciar, sopas ninguna animación flash se visualizaba.

El problema se presenta al actualizar el plugin de flash para chafasplorer 7 el swfobject ya no funciona bien. Gogleando por la red encontré la solución:

var so = new SWFObject("animacion.swf", "sotester", "743", "133", "8", "#0000FF");

Cambiar por:

var so = new SWFObject("animacion.swf", "sotester", "743", "133", "false", "#0000FF");

Como ven solo se cambia el parámetro de la vercion de flash por false.

Por favor ya dejen de usar chafasplorer para navegar, ya dejen eso navegador lento e inseguro y que además no cumple con los estandares web, mejor… get firefox

Dic. 18

Hace unos post publique post de como organizar y visualizar los vídeos FLV almacenados en nuestro server; en esta ocasión veremos como organizar mp3.

Básicamente el código es el mismo, pero con unas modificaciones.

$contenido = '<?xml version="1.0" encoding="utf-8"?>
<playlist version="1" xmlns="http://xspf.org/ns/0/">
	<trackList>';
while($file=readdir($dp))
       {
        $extension=getExtension($file);
	      if($extension=="mp3")
	         {
                  $filenames[]=$file;
                }
       }
sort($filenames);
for($i=0;$i<count($filenames);$i++)
    {
     $ruta=$referer."/".$filenames[$i];
     $rolaname=substr($filenames[$i],0,-4);
     $se=sepcade($rolaname);
		 $contenido.='
<track>
<title>'.$se.'</title>
<creator></creator>
<location>'.$ruta.'</location>
</track>';
}

Otro cambio que hice fue en la parte en que se escribe el archivo el XML, ya que aun cambiando los permisos del archivo (mod 777) no se escribía el valor de contenido en el archivo, pero con el sig. código se soluciono.

if (is_writable($archivo))
   {
    // En nuestro ejemplo estamos abriendo $nombre_archivo en modo de adición.
    // El apuntador de archivo se encuentra al final del archivo, asi que
    // alli es donde ira $contenido cuando llamemos fwrite().
    if (!$gestor = fopen($archivo, 'wb'))
		     {
          echo "No se puede abrir el archivo ($archivo)";
          exit;
         }
    // Escribir $contenido a nuestro arcivo abierto.
    if (fwrite($gestor, $contenido) === FALSE)
		    {
         echo "No se puede escribir al archivo ($archivo)";
         exit;
        }
		 fclose($gestor);
    }

El resultado lo puedes ver en esta página y el código completo aquí

Nov. 04

Hace unos post publique como utilizar flash + php, esta ocasión veremos como hacer conexión con una BD de mysql.

Empecemos por hacer una página php que contenga las instrucciones para hacer la conexión con la BD y funciones básicas como altas, bajas, búsqueda y modificaciones.

  • Base usada en el ejemplo
CREATE TABLE `agenda` (
  `id` INT(11) NOT NULL AUTO_INCREMENT,
  `nombre` CHAR(30) COLLATE latin1_general_ci NOT NULL,
  `fon` CHAR(10) COLLATE latin1_general_ci NOT NULL,
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci;
  • Conexión
$DBhost = "localhost";
$DBuser = "usuario_de_la_base";
$DBpass = "password_de_la_base";
$DBName = "nombre_de_la_base";
// conectando al servidor MySQL
$DBConn = mysql_connect($DBhost,$DBuser,$DBpass) or die("error en conexión: " . mysql_error());
// selección de la base
mysql_select_db($DBName, $DBConn) or die("error al seleccionar la base: " . mysql_error());
  • altas, bajas, etc.
switch($accion){
  case 'regi':
	  echo $nombre."  ".$fon;
		$consulta="INSERT INTO `agenda` (`nombre`, `fon`) VALUES('$nombre','$fon');";
		$resultado=mysql_query($consulta)or die ("error en la consulta". mysql_error());
	break;
	case 'leer':
	    $consulta="SELECT * FROM `agenda`;";
	    $resultado=mysql_query($consulta)or die ("error en la consulta". mysql_error());
	    $nfilas=mysql_num_rows($resultado);
	    echo "filas=".$nfilas;
	    echo "&registros=";
	    while($fila=mysql_fetch_row($resultado))
		    {
		     echo "<b>Nombre:</b> ".$fila[1].'<br />'."<b>Teléfono:</b> ".$fila[2].'<br<br /><br /><br />';
		    }
	break;
	case 'busca':
	     if($crite=="byname")
	        {
                   $consulta="SELECT * FROM `agenda` WHERE `nombre`='$valor';";
                }
	    if($crite=="byfon")
	        {
                  $consulta="SELECT * FROM `agenda` WHERE `fon`=$valor ;";
                }
	    $resultado=mysql_query($consulta)or die ("error en la consulta". mysql_error());
	    echo "&buscar=";
	    while($fila=mysql_fetch_row($resultado))
	            {
		      echo "<b>Nombre:</b> ".$fila[1].'<br />'."<b>Teléfono:</b> ".$fila[2].'<br<br />'
                    }
        break;
}

En esta código usaremos la sentencia switch para realizar las diferentes operaciones de la BD, los valores de la variable $accion se mandaran desde flash

En flash creamos un campo de texto dinámico en el cual cargaremos los registros de la base, para esto utilizaremos la instrucciones loadvars, load y onload para poner el valor de $accion=leer y así llamar a dicha función en la pagina php.

function leer()
       {
	  regis=new LoadVars;
          regis.load(_global.server+"phpf/agenda.php?accion=leer");
          regis.onLoad=function ()
		 {
                   registro.htmlText=this.registros;
                 }
      }

Donde regis es la variable que guarda el resultado de la acción leer de la pagina php, registro es el campo dinamico que mostrara los resultados y _global.server tiene el valor del host donde se ejecuta el script php.

Para insertar registros, creamos 2 campos tipo input, usamos la sentencia sendAndLoad la cual carga los valores contenidos en un objeto LoadVars (datos para este ejemplo) y los envía mediante la URl al servidor.

datos = new LoadVars();
datos.nombre = nom;
datos.fon = fo;
function registra()
       {
        datos.sendAndLoad(_global.server + "phpf/agenda.php?accion=regi", datos, "POST");
        datos.onLoad = function(success){
			if(success){
				nombre.text="";
				fon.text="";
				msg.text="Datos registrados";
				}
		      }
     }

Donde datos.nombre = nom contiene el valor del primer campo tipo input, y datos.fon = fo el valor del segundo campo.

Teniendo estas dos funciones (leer e insertar) y con un poco de más de programación e imaginación podemos implementar las opciones de eliminación y búsqueda.

archivos del ejemplo

22

Sep. 23

Existen varias maneras de ecriptar password en un formulario, las más fácil es usar códigos de ecriptación ya definidos como : SHA-1, MD4 o MD5

En php existe una función md5() que cumple con esta tarea, pero el inconveniente es que lo hace en el lado del servidor, lo que significa que del cliente al servidor la clave viaja en forma plana.

Para solucionar esto esta su equivalente en java script con el cual podemos los valores de los campos de un formulario y mandarlo directamente en md5 del cliente al servidor.

ejemplo:


Valor en MD5

codigo:

<label for="pass">Texto aquí:</label><input name="cmd5" type="text" size="20" id="cmd5"/>
<a href="#" onclick="javascript:(alert(hex_md5(document.getElementById('cmd5').value)));">Valor en MD5</a>
Para usar la ecriptación en los formularios podemos hacerlo de dos formas, la primera como lo mencionan en la pagina del autor y la segunda es crear un campo oculto y usar el método onSubmit().

Donde el campo falso contiene el valor que se cifrara en md5 y el campo oculto es el valor que enviara como password

Html

<form action='una_page.php' method="post" onSubmit="return checkData()" name="forc">
<p>
   <label for="user">Usuario:</label><input name="user" type="text" size="20" />
</p>
<!--Campo falso-->
<p>
   <label for="pass">Password</label><input name="passwordmd5" type="password" size="20" />
</p>
<!--Campo oculto-->
<p>
   <input name="password" type="hidden"    size="40" />
</p>
<p align="center">
    <input type="submit" value="Entrar" class="enviar"/>
</p>
</form>

Javascript

function checkData()
  {
    document.forc.password.value=hex_md5(document.forc.passwordmd5.value);
  }
Sep. 06

Si tu eres desarrollador de aplicaciones en php y se te complica hacer la sección de identificación y logeo, phpsp es tu solución

Phpsp es una serie de scripts escritas en php que de manera fácil y sencilla crean un sistema de logeo e identificación para una aplicación php. Características

  • Seguridad fácil para las páginas
  • Crear diferentes grupos de usuarios cada con sus propios permisos
  • Puede usarse con o sin base de datos
  • Manejo de sesiones
  • Soporte multilenguaje
  • Interfaz personalizable
  • Trabaja con php3, php4, php5

· Instalación

  • 1. Descomprimir phpSecurePages en la aplicación o en servidor
  • 2. Configurar el archivo secure.php

Ejecutar el sig. script si vas a usar BD

CREATE TABLE phpSP_users (
primary_key MEDIUMINT UNSIGNED NOT NULL AUTO_INCREMENT,
user VARCHAR(50) NOT NULL,
password VARCHAR(32) NOT NULL,
userlevel TINYINT(3),
PRIMARY KEY (primary_key),
KEY (user)
);

· Configuración

Editar el archivo secure.php y modificar los siguientes parámetros

  • $cfgIndexpag: página inicial del sitio
  • $languageFile: lenguaje de phpsp
  • $useDatabase: en true, para usar BD

Más info de la configuración aqui

· Uso

Poner el siguiente código al inicio de tus páginas

<?PHP
$cfgProgDir = 'phpSecurePages/';
include($cfgProgDir . "secure.php");
?>

Ejemplo de phpsp

Ago. 19

Cuando escribo post muy largos en mi blog, no me gusta que estos ocupen una gran parte del blog; así que decidí investigar la manera de ocultar o mostrar parte del contenido.

Para word press hay muchos plugins que hacen esto, pero al probarlos no me gustaron ya que muchos de ellos recargan la pagina para mostrar el contenido restante de un post. Así que mejor decidí implementar algo por mi cuenta.

1. Empecemos por el css incluyendo el siguiente código.

.show
  {
   position:relative;
   display:none;
  }
 
.hide
  {
   position:relative;
   display:block;
  }

2. Con javascript usaremos el siguiente script y el código.

function oculta3(id)
   {
   var elemento = document.getElementById(id);
   var state1="status1-"+id;
   var state2="status2-"+id;
   if (elemento.className == "show")
     {
      elemento.className = "hide";
      xDisplay(state1,'none')
      xDisplay(state2,'block')
     }
  else
    {
      elemento.className = "show";
      xDisplay(state1,'block')
      xDisplay(state2,'none')
   }
 }

3. En el html lo siguiente

<div id="status1-nombre">
<a href="javascript:oculta3('nombre');">mostrar</a>
</div>
<div id="status2-nombre" class="show" >
<a href="javascript:oculta3('nombre');">ocultar</a>
</div>
<div id="nombre" class="show">Contenido oculto</div>

El primer div indica el mensaje que se mostrara cuando el contenido este oculto, el segundo div muestra lo contrario y el tercer div es donde estará el contenido a ocultar. Donde ‘nombre’ lo cambiaremos por el identificador del div que vayamos a usar.

Jul. 26

Para este ejemplo vamos a crear un XML de la forma

<?xml version="1.0" encoding="utf-8"?>
<playlist version="1" xmlns="http://xspf.org/ns/0/">
<trackList>
<track>
<title></title>
<creator></creator>
<location></location>
</track>
</trackList>
  • 1.Creamos una variable que contenga las primeras tres líneas del XML
$contenido='<?xml version="1.0" encoding="utf-8"?>
<playlist version="1" xmlns="http://xspf.org/ns/0/">
<trackList>';
  • 2.Mediante un for llenamos los datos del xml: tile, creator y location.
for($i=0;$i<count($filenames);$i++){
$contenido.='
   <track>
   <title>'.$se.'</title>
   <creator></creator>
   <location>'.$ruta.'</location>
   </track>';
}
  • 3.Agregar a la variable las ultimas líneas después del for
$contenido.='
</trackList>
</playlist>';
  • 4.Por último para guardar el el valor de $contenido, lo hacemos con las siguientes funciones de archivo.
$file3=$dir."/archivo.xml";
$archivo=fopen($file,"w");
fwrite($archivo,utf8_encode($contenido));
fclose($archivo);

Para ver con más detalle el código aquí y el xml generado aquí

Jul. 24

Como ya tengo varios vídeos (formato FLV) en mi hosting, me vi en la necesidad de crear algún método para administrarlos y no estar entrando al ftp, cada vez que quiera ver la url del un vídeo, entonces recordé que hace tiempo Ivan karam publico un explorador de archivos hecho en php en la page de tuxteno. El cual tome y le hice las siguientes modificaciones para poder administrar los vídeos

•Con getcwd obtengo el directorio actual donde se ejecuta el script y con la variable predefinida $_SERVER obtengo varios datos del servidor

if(!isset($referer))
   {
    $referer="http://".$_SERVER['SERVER_NAME']."/videos/vids";
   }

• Con esta función obtengo la extensión de un archivo, para este caso .flv

function getExtension($archivo)
        {
      	 $a=explode(".",$archivo);
      	 return $a[count($a)-1];
        }

Como mis archivos los tengo nombrados con guión bajo, algo así un_archivo_1.flv, entonces uso esta función para cambiar esos guiones por espacios y mandarlos a imprimir

function sepcade($cadena)
        $cade3="";
        $cade2=explode( "_", $cadena );
	      for($j=0;$j<count($cade2);$j++)
	        {
	         $cade3.=$cade2[$j]." ";
	        }
      	return $cade3;
       }

• Para reproducir los vídeos creo una función java script usando swfobject y xlibrary, para evitar que se recargue la página cada vez que se cambia de vídeo.

function playmovie(file)
     {
      var video = new SWFObject("http://erufenix.codesys.org/media/flvplayer.swf", "mymovie", "640", "480", "8", "#336699");
      var sep_file=file.split("/");
      var sep2_file=sep_file[5].split(".");
      var sep3_file=sep_file[5].split("_");
      video.addVariable("file",file);
      video.addVariable("autostart","true");
      video.addParam("wmode", "transparent");
      video.write("videos");
      var sej=cadesep(sep3_file);
      xInnerHtml('title2', "Estas viendo: " + "<a href='" + file + "'>" + sej + "<\/a>")
      document.title = ":: Videos de erufenix :: - "+sej;
     }

Puedes ver el el script funcionando en http://erufenix.codesys.org/videos/ y el código completo aqui

Jul. 11

Para aquellos novatos en el lenguaje C, les recomiendo este ebook. Contiene bastantes ejemplos bien detallados de cadenas, arreglos, estructuras, punteros y manejos de archivos

  C Novice to Professional (13.3 MiB, 56 hits)