Mostrando entradas con la etiqueta MySQL. Mostrar todas las entradas
Mostrando entradas con la etiqueta MySQL. Mostrar todas las entradas

Más allá de las bases de datos relacionales

supernova

Las bases de datos relacionales, como MySQL, PostgreSQL y varios productos comerciales, nos han servido bien durante muchos años. Últimamente, sin embargo, ha habido mucha discusión sobre si el modelo relacional está llegando al final

Los 10 errores mas comunes al programar orientado a objetos en PHP

El dominio de la programación orientada a objetos es, sin duda, uno de los paradigmas más codiciado por los programadores. Sin embargo, muchas veces estos cometen "atrocidades" al intentar implementarlo solo por decir a sus amigos, empresas u otros "Yo sé programar orientado a objetos".

XSS – Cross-Site-Scripting IV

Defendiendo Nuestros Usuarios.


Las formas más sencillas de defender nuestros usuarios son mediante las siguientes acciones:

Cookies:

Evitar almacenar datos vitales

XSS – Cross-Site-Scripting III

Defendiendo Nuestra Aplicación.


El primer modo de defensa que veremos, será la defensa de nuestra aplicación, misma que nos enseñara técnicas sencillas para defender nuestro sitio mediante la validación de entradas de datos.


Tenemos que tener claro que lo que debemos hacer es impedir la entrada de scripts en nuestros campos de inserción de datos, validando cada entrada para asegurarnos que no contenga código que pueda afectar nuestra aplicación o a nuestros usuarios.




  1. Limitación de caracteres de entrada.
    Lo primero que debemos hacer

MariaDB, La Hermanita Menor de MySQL

Es por todos sabido que Oracle ha adquirido Sun, y con ello lo que Sun había adquirido meses atrás, hablo en concreto de MySql.


MySql es o era (no sé cuál de los dos calificativos es correcto) el sistema de bases de datos Open Source más famoso y utilizado en el mundo.


Sin embargo, ahora tenemos que Sun forma definitivamente parte de Oracle, y Oracle tiene ahora la "patita" en máquinas de Sun, la "pattita" en lenguajes con Java, y la "patita" de bases de datos con MySql, pero Oracle es famosa precisamente por tener un gestor de bases de datos muy poderoso, el propio Oracle que da nombre a la compañía, así que, ¿qué hacer con MySql?.


Hay que tener en cuenta además, que la sombra de Oracle es muy larga y lo suficientemente ancha como para ocultar a MySql de la faz de la tierra. La incertidumbre por lo tanto, es bastante grande con respecto al futuro de MySql.


De momento no ha hecho nada "raro" con MySql, sin embargo, hay mucha gente que comenta que Oracle va a empezar a cobrar soporte con MySql y en el futuro...:s ya veremos qué...;) igual incluso hasta desaparece...


Aún y así, un irreducible finlandés no se va a quedar de brazos cruzados.
Hablo de Ulf Michael Widenius a quién se le conoce con el apodo de "Monty" (blog de Monty).


Monty es el principal autor de MySql y miembro fundador de MySql AB, empresa que fue adquirida en Febrero de 2008 por Sun Microsystems como comentaba anteriormente. Por la nada depreciable cantidad de 16 millones de € ($ 252883200 MXN).


Con la venta de MySql, Monty se embolsó mucho dinero y en Febrero de 2009 dejó Sun para montar una nueva compañía. Los motivos por los que dejó Sun no están claros.


Lo peor para Oracle, es que Monty se ha puesto a crear un nuevo motor de bases de datos de datos teniendo en mente a MySql y agregándoles "esas" cosas que quería haberle agregado a MySql en su día y que por las razones que sean, no ha podido llevar a cabo.


La iniciativa de Monty tiene que ver sobre todo con la adquisición de Sun por parte de Oracle.


Adquisición maestra, ya que se ha manejado la situación estratégica de forma expecional. Primero Sun compra MySql,  todo normal y coherente, no!?.


Luego Oracle compra Sun, y aquí aparecen las dudas. Monty duda de la compra (seguramente se sintió engañado/decepcionado/triste como amante de un sistema gestor de bases de datos abierto).


El departamento de la libre competencia de la Unión Europea analiza entonces si vulnera la libertad, pero aunque Oracle y Sun tienen un frente común en el mundo de las bases de datos, no es menos cierto que al tener Sun sus departamentos de Hardware y Software con Java a la cabeza, se ha hecho claramente la vista gorda sobre MySql.


Sin dudas, siento que esto ya estaba pactado de ante mano y Monty fue engañado. Quitaron a MySql, y así Oracle solo tendría un único competidor real y de importancia, hablo de SQL Server.


Al menos a Monty le quedó la tranquilidad de haberse hecho rico. Pero Monty es como comentaba antes, un hombre irreducible y tenía pensado vengar su honor como si de un duelo se tratara.


En Internet apareció entonces una iniciativa impulsada por el propio Monty para salvar a MySql, hecho que motivó que Monty se adentrara en esta aventura.


El producto en el que anda trabajando se llama MariaDB. El nombre de Maria se debe a su hija menor.


En realidad, MariaDB es un fork (bifurcación, branch o rama) que parte del código base de MySql. Es decir y como ellos lo comentan en el wiki de la página MariaDB es un upgrade de MySQL.


La empresa de Monty encargada de llevar a cabo la aventura de MariaDB se llama Monty Program AB.


El icono elegido por Monty en este caso es una foca, icono que posiblemente utilice para sus distribuciones.




MariaDB Logo
MariaDB Logo


Ahora bien... ¿cuál es la versión actual de MariaDB?.
La versión actual es MariaDB 5.2.0 Beta que está basada en MySql 5.1.


Monty afirma que esta versión es estable, aunque no quiere decirlo muy alto porque es una versión en desarrollo y por lo tanto, no debería ser utilizada en producción.


El caso es que a Oracle le ha salido un emergente y posible competidor, porque el irreducible Monty no tiene pensado dejar tirada a la Comunidad y va a hacer todo lo posible por sacar adelante el proyecto de MariaDB.


Por su hija y por él mismo, va a luchar para prevalecer su honor. Una noticia que personalmente celebro de pie.

Diferencias entre TRUNCATE y DELETE en MySQL

Si os habeis preguntado alguna vez las diferencias entre truncate y delete en la base de datos MySQL Server. Aquí os pongo una pequeña explicación de cuando utilizar una u otra.


TRUNCATE


Este comando borra todas las filas de una tabla sin registrar las eliminaciones individuales en el log de transacciones.


Por ejemplo:


[sourcecode lang="sql"]TRUNCATE Cursos;[/sourcecode]


Borra todos los registros de la tabla Cursos


DELETE


DELETE borra las filas de una tabla, pero registra las eliminaciones individuales en el log de transacciones. Podemos utilizar la clausula WHERE para filtrar las filas que necesitemos eliminar.


Ejemplo:


[sourcecode lang="sql"]DELETE FROM Cursos  WHERE CursoId = 50;[/sourcecode]


DIFERENCIAS ENTRE TRUNCATE Y DELETE




  • Ambas eliminan los datos, no la estructura.

  • Solo DELETE permite la eliminación condicional de los registros.

  • DELETE es una operación registrada en el log de transacciones y trucate no.

  • TRUNCATE es una operación registrada en el log de transacciones, pero como un todo, en conjunto, no por eliminación individual. TRUNCATE se registra como una liberación de las páginas de datos en las cuales existen los datos.

  • TRUNCATE es más rápida que DELETE.

  • Ambas se pueden deshacer con un ROLLBACK.

  • TRUNCATE reiniciará el contador para una tabla que contenga una columna IDENTITY.

  • DELETE mantendrá el contador de la tabla para una columna IDENTITY.

  • TRUNCATE es un comando DDL(lenguaje de definición de datos) mientras que DELETE es un DML(lenguaje de manipulación de datos).

  • TRUNCATE no desencadena un TRIGGER, DELETE sí.

  • TRUNCATE recrea una tabla.


CUANDO USARLAS




  • Usar Truncate es más rapido que Delete si vas a borrar toda una tabla y no te importan los indices(identity) o bien quieres resetearlos.

  • Usar Delete para borrados selectivos.

  • Usar Delete en caso de tener Foreign Key, es decir .. usarla en caso de borrados en cascada.

Los diez errores más comunes en el diseño de una base de datos

Hola SQLeros,Louis Davidson es un experto en el diseño de Base de Datosy es autor del libro SQL Server 2005 Database Design and Optimization en el artículo aquí enlazado presenta los diez errores más comunes en el diseño de una BD que el ha detectado a lo largo de su experiencia:




  • Mala planeación del diseño

  • Ignorar la normalización

  • Estándares de nomenclatura deficientes

  • Falta de documentación

  • Una sola tabla para guardar todos los valores del dominio

  • Usar columnas GUID como la única llave de una tabla

  • No usar las funcionalidades SQL para preservar la integridad de los datos

  • No usar Stored Procedures para acceder a los datos

  • Intentar construir objetos genéricos en los stored procedures

  • Falta de pruebas


En mi experiencia la mayoría de los desarrollos donde he trabajado presentan algunas de estas deficiencias en su base de datos. Creo yo que en muchos de los casos es porque se deja a un programador diseñar la base cuando debe ser haber un DBA involucrado en el proceso. Se que muchos proyectos no pueden pagar el sueldo de un DBA en exclusivo pero creo que al menos debe haber un DBA por organización que supervise el diseño elaborado por los programadores, lo mejore y le de su visto bueno.
Con las bases de datos pasa como con el diseño web, cuando se deja en manos de un programador elresultado puede ser un desastre e imagino que la mayoría de ustedes ha tenido que lidiar con chapuzas como una tabla totalmente desnormalizada (digo a veces está bien desnormarlizar para ganar en desempeño pero hay límites) y que necesita de 5 o más campos para tener una llave compuesta (y dile adios a tu idea de usar un ORM para la capa de datos), o una tabla con 20 campos que se llaman campo1, campo2, .. campoN y que nadie en la organización sabe que diablos es el campo7 o quién era el encargado de actualizarlo pero sin él tu aplicación no funciona, en fin no seguiré descargando mi frustración aquí :P . En mi opinión una forma de evitarle frustraciones a los otros programadores es que, dado que las empresas no van a querer pagar un DBA para auxiliarte en el 70% de los casos,nosotros nos documentemos con artículos como el de Louis para realizar un mejor trabajo que programar no es solo usar Spring o el último patrón de diseño.

Crear Servicio Web En PHP Con NüSoap

1.- Para que funcione el ejemplo descárgate las clases de NüSOAP desde la pagina del proyecto http://sourceforge.net/projects/nusoap/.

2.- Después descomprimes ese archivo y lo copias a tu sitio web (para este ejemplo el sitio se llama miwebservice y los archivos de NuSOAP los puse en un directorio llamado lib-nusoap.

3.- Luego ejecutas en tu Servidor MySQL el script de la Base de Datos db_productos.sql que lo puedes descargar desde esta pagina.

4.- Luego crea una pagina PHP (en este ejemplo la pagina se llama servicioweb.php) y codificas lo siguiente:
[sourcecode language="php"]
< ?php
require_once('lib-nusoap/nusoap.php');

$server = new soap_server;

$ns="http://localhost/aplicativo"; // espacio de nombres; Sitio donde estará alojado el web service
$server->configurewsdl('MiWebService'); //nombre del web service
$server->wsdl->schematargetnamespace=$ns;

/************ REGISTRANDO EL ARRAY A DEVOLVER(array de productos) **************/
$server->wsdl->addComplexType(
'ArregloProductos', // Nombre
'complexType', // Tipo de Clase
'array', // Tipo de PHP
'', // definición del tipo secuencia(all|sequence|choice)
'SOAP-ENC:Array', // Restricted Base
array(),
array(
array('ref' => 'SOAP-ENC:arrayType', 'wsdl:arrayType' => 'tns:Productos[]') // Atributos
),
'tns:Productos'
);

/************ REGISTRANDO LA ESTRUCTURA DE DATOS PRODUCTOS **************/
$server->wsdl->addComplexType('Productos', 'complexType', 'struct', 'all', '',
array(
'ProductoID'=> array('name' => 'ProductoID','type' => 'xsd:int'),
'Nombre' => array('name' => 'Nombre', 'type' => 'xsd:string'),
'Precio' => array('name' => 'Precio', 'type' => 'xsd:string')
)
);

/*METODO DEL WEB SERVICE*/
function ListarProductos($estado){
if($estado!=''){
$db = new mysqli(); //mysqli exclusivo para usar procedimientos almacenados
$db_result = $db->connect ("localhost", "root", "","db_productos");
$sql=sprintf("call usp_ListarProductos('%s');",$estado); //intentando filtrar el SQL Injection
$result = $db->query($sql);
if (mysqli_errno($db)) printf("mySQL error %s\n", $db->error); //si es que hubo error se muestra
$db->close();
$i=0;
if($result->num_rows>0){
while($row = mysqli_fetch_assoc($result)){
$toc[$i]['ProductoID'] = $row["producto_id"];
$toc[$i]['Nombre'] = $row["nombre"];
$toc[$i]['Precio'] = $row["precio"];
$i++;
}
$result->free; //liberando memoria
return $toc;
}
}
return '';
}

/************ REGISTRANDO EL METODO **************/
$server->register(
'ListarProductos', // Nombre del Método
array('estado' => 'xsd:string' ), // Parámetros de Entrada
array('return' => 'tns:ArregloProductos') //Datos de Salida
);

/******PROCESA LA SOLICITUD Y DEVUELVE LA RESPUESTA*******/
$input = (isset($HTTP_RAW_POST_DATA)) ? $HTTP_RAW_POST_DATA : implode("\r\n", file('php://input'));
$server->service($input);
exit;
?>
[/sourcecode]



Si deseas puedes descargar el ejemplo completo desde aquí. Varios usuarios me han hecho la observación en la cual no funciona el código, esto es por el nombre de la carpeta comprimida que llame SQLeros-NüSoapEjemplo.zip, para que funcione bien solo cambienle el nombre por: SQLeros-NuSoapEjemplo.zip

También veremos como consumir el servicio desde C#,VB.Net y Java. Saludos

Exporta Datos Fácilmente desde PHP a Excel

Hola, bienvenidos de nuevo al blog, en posts anteriores de SQLeros, habíamos visto como hacer CRUD, gracias al post de Luda, y ahora les traigo una forma fácil y muy rápida de hacer reportes de los datos hacia Excel.


Basicamente se trata de tomar el

Sistema de Boletaje para Terminales de Autobuses

Hola el día de hoy les presento una de mis mas recientes creaciones es un pequeño sistema para la venta de boletos de una terminal de autobuses, es algo sencillo y todavía le falta pulirlo mas pero para los fines didácticos es mas que suficiente.

Compartir sesiones con MySql en diferentes servidores

Muchos sitios necesitan correr desde varios servidores, por ejemplo para aprovechar la localidad
de los usuarios con respecto al servidor, para balancear la carga, para compartir usuarios registrados o simplemente como resguardo
por si alguno de los sitios falla. Uno de los aspectos a contemplar para este menester es el
manejo de sesiones, aqui explicamos como mantener sesiones entre multiples servidores.




Descripcion del problema


Supongamos que tenemos 2 servidores que corren el mismo sitio por ejemplo mexico.foo.org y espana.foo.org,
los sitios pueden ser exactamente iguales o bien tener algunas diferencias entre si, lo que es claro es que
los usuarios de foo.org pueden comenzar por cualquiera de los sitios y moverse de un sitio a otro si les
parece conveniente


Sesiones


El uso de sesiones permite mantener presistencia entre las distintas paginas de un site en forma limpia
y eficiente, PHP4 permite manejar sesiones en forma sumamente sencilla, por ejemplo:













session_start();
$data="hola";
session_register("data");




Todas las paginas que usen sesiones deben empezar con session_start() o al menos hacer el session_start() antes de generar cualquier tipo de salida al browser. Una vez inicializada la sesion se utiliza session_register para guardar una variable en la sesion, notar que a session_register se le pasa elnombre de la variable y no la variable misma.
Una vez registrada la variable podemos tener otra pagina php distinta con:













session_start();
echo "$data";




Y la variable $data tomara el valor "hola" ya que habia sido guardada en la sesion con dicho nombre, se puede tambien
eliminar variables de la sesion y algunas otras cosas mas, pueden encontrar el manual en español sobre el uso de sesiones en esta direccion


Bien, podemos suponer ahora que sabemos usar sesiones, las sesiones son muy utiles para llevar datos pertenecientes
al usuario, como por ejemplo su userid u otros datos importantes, si tenemos dos servidores para el mismo sitio es logico
que la sesion se mantenga cuando el usuario pasa de un sitio a otro, pero esto no ocurre automaticamente


El problema


Internamente y sin modificaciones PHP4 guarda los datos de las sesiones en /tmp, periodicamente el mecanismo de "garbage collection" elimina las sesiones vencidas, la duracion maxima de una sesion sin actividad puede configurarse en php.ini (usualmente en /usr/local/lib). Como es evidente al cambiar de un servidor a otro el segundo no tiene acceso al directorio /tmp del primero por lo que la sesion se pierde, el session_start del nuevo servidor mas que abrir la sesion anterior debe crear una nueva y perdemos los datos que veniamos arrastrando en la sesion


Una primera alternativa que funciona es usar NFS para que los dos servidores puedan acceder a /tmp en un mismo lugar, sin embargo, esto no siempre es posible y muchas veces no queremos usar NFS unicamente por esta razon.


La solucion al problema


La solucion mas practica al problema de la persistencia de la sesion entre multiples servidores reside en usar una base de datos, por ejemplo MySQL, para almacenar los datos de la sesion. De esta forma ambos servidores pueden acceder a la misma base de datos (en un solo servidor) para consultar los datos de la sesion. Tantos servidores como deseemos pueden compartir la sesion siempre y cuando puedan acceder al mismo servidor MySQL.


Para que los datos de la sesion se guarden en MySQL es necesario modificar la forma en que PHP maneja sesiones


Cambiando los Session-Handlers


PHP4 dispone de un mecanismo que permite cambiar la forma en la cual se almacenan las sesiones por cualquier metodo que el usuario desee, para ello se usa la funcion session_set_save_handler. La funcion recibe 6 parametros que son los nombres a 6 funciones que se describen a continuacion:




  • Primera funcion:Abrir la sesion

  • Segunda funcion:Cerrar la sesion

  • Tercera funcion:Leer los datos de la sesion

  • Cuerta funcion:Escribir los datos de la sesion

  • Quinta funcion:Destruir una sesion

  • Sexta funcion:Eliminar sesiones vencidas


Por ejemplo:













session_set_save_handler ( 
'mysql_session_open',
'mysql_session_close',
'mysql_session_read',
'mysql_session_write',
'mysql_session_destroy',
'mysql_session_gc' );




En el ejemplo seteamos los nombres de las 6 funciones que seran usadas para manejar sesiones, veamos ahora que
prototipo debe tener y que hace cada funcion










































FuncionPrototipoDescripcion
mysql_session_openmysql_session_open($sess_path, $session_name);Esta funcion es llamada para inicializar la sesion, recibe el path en donde guardar las sesiones si se usan archivos y el bombre de la sesion, en MySQL ninguno de los parametros nos interesa
mysql_session_closemysql_session_close()Esta funcion se llama cuando la pagina termina y el handler necesita dejar cerrado el archivo o lo que sea que haya usado para mantener la sesion, no elimina la sesion solo deja todo listo para volver a abrirla con open
mysql_session_readmysql_session_read($key)Esta funcion se usa para leer los datos asociados a una sesion,las sesiones se identifican por una clave que se recibe como parametro, no es necesario preouparse por los datos que se recuperan ya que esto lo maneja php4 internamente, si el usuario registra 4 variables los handlers solo guardan y recuperan un par clave-valor, la forma en que las 4 variables se serializan y desserializan esta a cargo del PHP
mysql_session_writemysql_session_write($key,$val)Esta funcion se usa para almacenar el contenido de la sesion indicada por $key, $val tiene todas las variables de la sesion serializadas y listas para ser almacenadas.Est funcion se suele llamar al final de cada script antes de hacer el close.
mysql_session_destroymysql_session_destroy($key)Es invocada para eliminar los datos de una sesion.
mysql_session_gcmysql_session_gc($maxlifetime)Esta funcion debe eliminar todas las sesiones que tengan mas de $maxlifetime segundos de vida.


Preparando la base para guardar sesiones


Una vez que hemos analizado como funcionan los handlers es bueno analizar como vamos a guaradar la informacion en MySQL, si entendimos bien el mecanismo solo necesitamos guardar algo de tipo clave-valor por cada sesion y ademas un timestamp que permita saber hace cuanto tiempo que no se usa la sesion. Podemos crear una tabla de la forma:













DROP TABLE IF EXISTS PHPSessions;
CREATE TABLE PHPSessions (
SessionID CHAR(32) NOT NULL PRIMARY KEY,
LastActive INTEGER NOT NULL,
Data TEXT
);



SessionID es la clave de la sesion, LastActive la ultima fecha de uso de la sesion y Data los datos de la sesion, notemos que al estar definida como PRIMARY KEY la columna SessionID esta indexada lo cual agiliza mucho el manejo de sesiones cuando hay miles de usuarios en el sistema.


Handlers para Mysql


Analicemos ahora que debe hacer cada funcion para almacenar las sesiones en Mysql



































FuncionDescripcion
mysql_session_open($path,$name);En esta funcion tenemos que abrir la conexion a la base, usar mysql_pconnect con una conexion persistente es muy recomendable, ademas seleccionamos la base con mysql_select_db. Los dos parametros que recibe la funcion se ignoran.
mysql_session_close();Aqui no hace falta hacer nada ya que no es necesario cerrar la conexion a la base
mysql_session_read($key);Esto es simplemente un select a la base y devolvemos la columna data para la clave recibida. Ademas actualizar el timestamp del registro.
mysql_session_write($key,$data);Aquie hay que hacer un update si la sesion ya existe o bien un insert en caso contrario. Ademas actualizamos el timestamp del registro.
mysql_session_destroy($key);Un simple delete de la base
mysql_session_gc($maxlifetime);Borramos de la tabla todos los registros para los cuales la diferencia entre el ultimo tiempo de acceso y el actual sea mayor al parametro recibido


El codigo


Una vez analizado que es lo que hay que hacer solo resta programarlo, a continuacion presentamos el codigo y que pueden obtener tambien desde este link













<? 
// This code is released under the same license as PHP

$SessionTableName = "PHPSessions";
assert(!empty($SessionTableName));

function mysql_session_open ($save_path, $session_name) {
mysql_pconnect("HOST","USER","PASS");
mysql_select_db("BASE");
return true;
}

function mysql_session_close() {
return true;
}

function mysql_session_read ($SessionID) {
global $SessionTableName;

$SessionID = addslashes($SessionID);

$session_data = mysql_query("SELECT Data FROM $SessionTableName
WHERE SessionID = '$SessionID'") or die(db_error_message());
if (mysql_numrows($session_data) == 1) {
return mysql_result($session_data, 0);
} else {
return false;
}
}

function mysql_session_write ($SessionID, $val) {
global $SessionTableName;

$SessionID = addslashes($SessionID);
$val = addslashes($val);

$SessionExists = mysql_result(mysql_query("SELECT COUNT(*) FROM $SessionTableName
WHERE SessionID = '$SessionID'"), 0);

if ($SessionExists == 0) {
$retval = mysql_query("INSERT INTO $SessionTableName
(SessionID, LastActive, Data)
VALUES ('$SessionID', UNIX_TIMESTAMP(NOW()), '$val')")
or die(db_error_message());
} else {
$retval = mysql_query("UPDATE $SessionTableName SET
Data = '$val', LastActive = UNIX_TIMESTAMP(NOW())
WHERE SessionID = '$SessionID'") or die(db_error_message());
if (mysql_affected_rows() == 0) {
error_log("unable to update session data for session $SessionID");
}
}

return $retval;
}

function mysql_session_destroy ($SessionID) {
global $SessionTableName;

$SessionID = addslashes($SessionID);

$retval = mysql_query("DELETE FROM $SessionTableName
WHERE SessionID = '$SessionID'") or die(db_error_message());
return $retval;
}

function mysql_session_gc ($maxlifetime = 300) {
global $SessionTableName;
$CutoffTime = time() - $maxlifetime;
$retval = mysql_query("DELETE FROM $SessionTableName
WHERE LastActive < $CutoffTime") or die(db_error_message());
return $retval;
}

session_set_save_handler (
'mysql_session_open',
'mysql_session_close',
'mysql_session_read',
'mysql_session_write',
'mysql_session_destroy',
'mysql_session_gc' );
?>




Como usar el los nuevos handlers


Para usar los nuevos handlers tenemos que, en primer lugar crear la tabla PHPSessions con el codigo provisto para alguna base mysql, si se quiere se puede crear una nueva base para las sesiones, una vez creada la tabla modificar el script con los handlers indicando HOST,USER,PASS y BASE en la funcion mysql_session_open, luego solamente resta poner el script en el servidor y hacer un include del mismo "antes" del session_start, y eso es todo, pueden probarlo y ver como los datos se almacenan en la tabla y se mantiene la persistencia de la sesion. Para usarlo en otro server el proceso es el mismo, no olviden poner correctamente el HOST, USER,PASS en la funcion de conexion para que los dos servidores se conecten a la misma base MySQL.


Conclusiones


Las tecnica que hemos descripto permite compartir sesiones facilmente entre servidores y ademas ha demostrado ser
mucho mas limpia y eficiente incluso en instalaciones con un unico servidor, esta es una de las cosas a tener en cuenta
cuando nos lancemos a construir multiples sitios o sitios que quieran compartir usuarios en forma limpia y efectiva.

Invocar funciones PHP desde Flex con AMFPHP

Adobe Flex es un framework de desarrollo que nos permite crear rápida y facilmente aplicaciones RIA (Aplicaciones de Internet Enriquecidas), basado en la plataforma Flashcombinando el lenguaje de marcas MXML y ActionScript. También, gracias a su entorno de desarrollo se simplifica el desarrollo de aplicaciones AIR.


En esta oportunidad quiero explicar cómo hacer uso de Flex para invocar funciones hechas enPHP (no entraré en detalles, pues no conozco a fondo ActionScript). Una forma de hacerlo es mediante AMFPHP. Pero ¿qué es AMFPHP? Es un RPC (Llamada a Procedimientos Remotos) que nos permite comunicar datos de aplicaciones-funciones entre el cliente (JavaScript, Flash, Flex, etc) y servidor (PHP, ASP, JSP, etc). En este caso AMFPHP realiza la comunicación de procesos remotos entre Flash (y por extensión aplicaciones RIA en Flex y AIR) y PHP.


Vamos por paso para la implementación de un proyecto en Flex que llame a funciones en PHP.


1. Descargar y extrae la carpeta amfphp que contiene la siguiente estructura (y para no perderse en el tutorial, colocala en la raíz de tu sitio web de tal forma que quede así:http://localhost/amfphp)



+ ampphp
 
+services
 
+core
 
+browser
 
-gateway.php
 
-globals.php
 
-.htaccess
 
-json.php
 
-xmlrpc.php
 
-phpinfo.php

2. Verificar el funcionamiento del amfphp. Para ello abres tu navegador y escribeshttp://localhost/amfphp/browser. Aparecera una ventana de configuración donde se muestra la ubicación del archivo gateway que actuará como puerta de enlace. En esta ventana solo dale clic en Save.


Podrás apreciar un especie de explorador. En la vista árbol a tu izquierda se mostrarán todas las clases en PHP que podemos usar. Para que una clase aparezca allí debes guardarla en el directorio services.


3. Vamos crear una clase en PHP. Vamos a lista una relación de clientes de una base de datos MySQL. La estructura de la tabla es la siguiente (ingresa un par de registros luego):



CREATE TABLE IF NOT EXISTS `cliente` (
 
`id` tinyint(7) NOT NULL auto_increment,
 
`nombres` varchar(50) NOT NULL,
 
`ciudad` varchar(50) NOT NULL,
 
`sexo` char(1) NOT NULL,
 
`telefono` varchar(10) NOT NULL,
 
`fecha_nacimiento` datetime NOT NULL,
  KEY
`id` (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;

En archivo PHP debe tener el mismo nombre que la clase, en este caso se llama sample.php:



<?php
class sample{
   
function getUsers () {
        $mysql
= mysql_connect(localhost, "root", "");

        mysql_select_db
( "empresa" );

                $Query
= "SELECT * from cliente";
                $Result
= mysql_query( $Query );
               
while ($row = mysql_fetch_object($Result)) {
                        $return
[] = $row;
               
}
               
return( $return );
       
}
}
?>

Volvamos a http://localhost/amfphp/browser y podemos apreciar en la lista de servicios, a la mano izquierda, nuestra clase llamada sample. Si la seleccionamos se muestran sus métodos, en este caso getUsers, y pulsamos el botón call se mostrará el resultado en la parte inferior.


amfphp browser


4. Abrimos Flex (en mi caso Flex Builder 3) y creamos un nuevo proyecto Flex de nombresample.


new project


new project


Configuramos la ruta en nuestro servidor local:


new project


new project


El archivo autogenerado sample.mxml lo dejamos allí por un momento. Ahora vamos agregar un archivo de ActionScript a nuestro proyecto, para ello le damos clic derecho en la carpeta srcy seleccionamos New > ActionScript File.


new project


new project


El archivo RemotingConnection.as contiene un clase que llama a una conexión remota especificando la url de ésta.



package {
       
import flash.net.NetConnection;
       
import flash.net.ObjectEncoding;

       
public class RemotingConnection extends NetConnection
       
{
               
public function RemotingConnection( sURL:String )
               
{
                        objectEncoding
= ObjectEncoding.AMF0;
                       
if (sURL) connect( sURL );
               
}

               
public function AppendToGatewayUrl( s : String ) : void
               
{
                       
//
               
}
       
}
}

Ahora el archivo autogenerado sample.mxml, lo reemplazamos por el siguiente contenido:



<?xml version="1.0" encoding="utf-8"?>

       
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="vertical" xmlns="*" creationComplete="initApplication()">

       
<mx:DataGrid dataProvider="{dataProvider}">
               
<mx:columns>
                               
<mx:DataGridColumn headerText="ID" dataField="id"/>
                               
<mx:DataGridColumn headerText="Nombres" dataField="nombres"/>
                               
<mx:DataGridColumn headerText="Ciudad" dataField="ciudad"/>
                               
<mx:DataGridColumn headerText="Telefono" dataField="telefono"/>
                               
<mx:DataGridColumn headerText="Sexo" dataField="sexo"/>
                               
<mx:DataGridColumn headerText="Fecha Nacimiento" dataField="fecha_nacimiento"/>
                       
</mx:columns>
       
</mx:DataGrid>

       
<mx:Script>
                <![CDATA[
                        [Bindable]
                        public var dataProvider:Array;
                        public var gateway : RemotingConnection;

                        public function initApplication()
                        {
                                gateway = new RemotingConnection( "http://localhost/amfphp/gateway.php" );
                                gateway.call( "sample.getUsers", new Responder(onResult, onFault));
                        }

                        public function onResult( result : Array ) : void
                        {
                                dataProvider = result;
                        }

                        public function onFault( fault : String ) : void
                        {
                                trace( fault );
                        }
                ]]>
       
</mx:Script>

</mx:Application>

Hemos creado un DataGrid para mostrar los datos de la consulta al servidor MySQL. Dentro de las etiquetas <mx:Script/> hacemos uso de ActionScript para llamar a la claseRemotingConnection que creamos anteriormente. La función initApplication() se encarga de conectar con la puerta de enlace: gateway.php, y llama al método getUsers() de la clasesample. La respuesta la recibe la función onResult() que pasa los datos a la variabledataProvider y ésta pasa al DataGrid.


6. Ahora simplemente compilamos el proyecto (Ctrl + F11) y podemos apreciar el resultado en el navegador web.


new project


De esta forma podemos crear aplicaciones web complejas que incluyan inserción y actualización de datos. Pero eso no esto, incluso podemos crear aplicaciones de escritorio gracias a AIR con esta funcionalidad, es decir llamadas a procesos remotos. Les dejo los archivos de este tutorial para que lo prueben en su servidor local.


Lo vi en: Flex and PHP Using AMFPHP