Club Delphi  
    Paypal   FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Bases de datos > MySQL
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 04-09-2006
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.142
Poder: 36
dec Tiene un aura espectaculardec Tiene un aura espectacular
Hola,

A ver si lo que se me acaba de ocurrir suena descabellado o no... ¿Qué tal si utilizamos la magnífica serialización de objetos que ofrece PHP? ¿Porqué no guardar, en un sólo campo de tipo "LongText" la instancia de la clase Opciones de los usuarios "serializada"? Podrían guardarse muchos pares de claves/valor.

Pienso en un "Array asociativo", como antes, al que podrían añadirse tantos elementos como fuera preciso, y que podría terminar guardado en la base de datos como digo: en un solo campo, junto al resto de la clase Opciones, previamente "serializada". Rizando un poco el rizo ni siquiera haría falta tabla de opciones (para usuarios), podría añadirse a la tabla Usuarios un campo "Opciones", precisamente. (*)

¿Qué os parece?

(*) Seguramente no; seguramente no estaría mal una tabla Opciones, salvo que, esta vez, contaría con un campo "LongText", como digo, que las almacenaría todas juntas.
__________________
David Esperalta
www.decsoftutils.com

Última edición por dec fecha: 04-09-2006 a las 20:58:36.
Responder Con Cita
  #2  
Antiguo 04-09-2006
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
A mi me parece muy buena idea a menos que quisieras hacer búsquedas sobre las opciones de usuario, por ejemplo, ¿cuántos usuarios usan morado como color de texto sobre fonde verde? Tu clase OpcionesUsuario simplemente tendría que tener cuidado en dar valores por defecto cuando aumente opciones. Yo creo que es bastante buena la idea.

// Saludos
Responder Con Cita
  #3  
Antiguo 04-09-2006
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.142
Poder: 36
dec Tiene un aura espectaculardec Tiene un aura espectacular
Hola,

Como que no la he inventado yo... je, je, je. No; quiero decir, que, recuerdo que WordPress guarda objetos serializados como opciones... claro que no hace esto únicamente, pero, a veces utiliza esta forma de guardar datos y, me he acordado de ello, seguramente.

Adjunto un sencillo ejemplo...
Archivos Adjuntos
Tipo de Archivo: zip opciones.zip (796 Bytes, 27 visitas)
__________________
David Esperalta
www.decsoftutils.com

Última edición por dec fecha: 04-09-2006 a las 21:16:00.
Responder Con Cita
  #4  
Antiguo 04-09-2006
[maeyanes] maeyanes is offline
Capo de los Capos
 
Registrado: may 2003
Ubicación: Campeche, México
Posts: 2.732
Poder: 26
maeyanes Va por buen camino
Cita:
Empezado por dec
,
Me parece que así es. Pienso que, al contener la tabla de opciones una campo "id_usuario", bien podría ser la aplicación un usuario más, salvo que contara con ciertas opciones conque el resto de usuarios no, lógicamente, pero, esto no me convence del todo ni mucho menos, porque, acaso estaríamos mezclando churras con merinas, por mucho que la aplicación pudiera considerarse un usuario más, no sería un usuario como los otros, y las opciones de los otros de nada servirían a la aplicación.
Aquí una pequeña corrección, quise referirme a tener dos tablas separadas, una para las opciones de la aplicación y otra para las opciones de los usuarios, pero lo que pensé no lo plasmé bien en mi mensaje...

Cita:
Aquí veo un inconveniente, seguro que porque en estos temas no estoy nada puesto. Como arriba (antes de que contestases) he dicho, me planteo una clase Opciones que se encargara de tratar con estas en la aplicación. En realidad ya se cuenta con una clase Usuario, y pienso que esta podría tener una variable/propiedad que podría albergar una instancia de un objeto de la clase Opciones.

De este modo, al crearse el objeto Usuario (que se crea al comienzo de la aplicación) podría aprovecharse para crear a su vez la instancia de la clase Opciones, y que esta se encargara ya de cargar las opciones del usuario en cuestión.

Ahora bien, tener opciones por defecto implica tener una lista de opciones predeterminada (¿O me equivoco?). Pero, ahora que lo pienso... tal vez es que no haya otra... no sé... la verdad es que contra más lo pienso me aparecen como posibles caminos a seguir, pero, enseguida encuentro algún obstáculo que me dice párate, no sigas por aquí, párate y mira esto...

Por ejemplo, ¿cómo se llevaría a cabo la inicialización de opciones? ¿Qué haría la clase Opcinoes en su inicialización? ¿Consultar la base de datos en busca de posibles opciones y guardarlas en el Array asociativo correspondiente para luego poder trabajar con estas? ¿Acaso debería la misma clase Opciones establecer una serie de opciones por defecto, de entrada, sin ni siquiera consultar a la base de datos? ¿Pero entonces para qué el Array asociativo? ¿Para otras opciones que no fueran las predeterminadas?

Pero he ahí otro problema (creo) y es que todas las opciones necesitan ser inicializadas al menos la primera vez que se piensen utilizar... digo yo, vamos... y me temo que al cabo habría que ir añadiendo y añadiendo opciones en la inicialización de la clase ídem...

No sé... disculpad que discurra de esta manera,... es lo que digo, habrá que darle vueltas a esto para no estar horas en realidad perdiendo el tiempo... no es que me importe, pero, tal vez sea bueno darle vueltas antes de escribir siquiera la primera línea de código.
Con lo que comentas, y siguiendo con mi propuesta, podrías tener las opciones con sus valores predeterminados bajo un ID de usuario con valor 0 o -1, así si deseas agregar una opción nueva, solo creas un registro nuevo para ese usuario. Ahora, para inicializar los valores predeterminados, al hacer un usuario login, se leen las opciones y sus valores de este ID de usuario, acto seguido, se leen las opciones modificadas del usuario.

Representado sería algo como esto:

Código:
Id_Usuario  Clave    Value
0           Opcion1  0
0           Opcion2  1
0           Opcion3  1 <--- hasta aquí, todas las opciones con sus valores predeterminados.
1           Opcion2  0 <--- el usuario con ID 1 solo modificó el valor de la opcion2.
Claro, tiene el pequeño inconveniente que se tendría que leer dos veces la tabla de opciones del usuario.

Cita:
Empezado por dec
Hola,

A ver si lo que se me acaba de ocurrir suena descabellado o no... ¿Qué tal si utilizamos la magnífica serialización de objetos que ofrece PHP? ¿Porqué no guardar, en un sólo campo de tipo "LongText" la instancia de la clase Opciones de los usuarios "serializada"? Podrían guardarse muchos pares de claves/valor.

Pienso en un "Array asociativo", como antes, al que podrían añadirse tantos elementos como fuera preciso, y que podría terminar guardado en la base de datos como digo: en un solo campo, junto al resto de la clase Opciones, previamente "serializada". Rizando un poco el rizo ni siquiera haría falta tabla de opciones (para usuarios), podría añadirse a la tabla Usuarios un campo "Opciones", precisamente. (*)

¿Qué os parece?

(*) Seguramente no; seguramente no estaría mal una tabla Opciones, salvo que, esta vez, contaría con un campo "LongText", como digo, que las almacenaría todas juntas.
Aquí el inconveniente que le veo sería que si algún otro programador quiere agregar alguna funcionalidad a la aplicación y esta conlleve opciones de usuario nuevas, tendría que modificar la clase opciones para agregarlas.


Saludos...
Responder Con Cita
  #5  
Antiguo 04-09-2006
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.142
Poder: 36
dec Tiene un aura espectaculardec Tiene un aura espectacular
Hola,

Cita:
Empezado por Maeyanes
Aquí [ serializando la clase Opciones ] el inconveniente que le veo sería que si algún otro programador quiere agregar alguna funcionalidad a la aplicación y esta conlleve opciones de usuario nuevas, tendría que modificar la clase opciones para agregarlas.
Yo pienso que no, puesto que las opciones en realidad estarían todas en un Array asociativo de la clase Opciones... si se quisiera añadir una nueva opción bastaría (según lo veo ahora) con añadir un nuevo elemento al Array de opciones.

Evidentemente, a la que se añadiera el nuevo elemento habría que actualizar todas (si no se encuentra la forma de hacerlo de otro modo), digo, habría que actualizar todas las opciones, pero, en realidad hablamos de actualizar UN campo de la base de datos...

Cuando el usuario iniciara de nuevo sesión, la opción añadida antes no se habría perdido, sino que se recuperaría con el resto de opciones al "deserializar" el objeto. Además pienso en la cantidad de funciones conque cuenta PHP para trabajar con Arrays... no conozco la mayoría, pero, sé que están ahí...
__________________
David Esperalta
www.decsoftutils.com
Responder Con Cita
  #6  
Antiguo 04-09-2006
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Yo no creo que sea necesario actualizar nada. Por ello mencioné lo de valores por defecto. Cuando un usuario se conecte, al momento de deserializar, el objeto OpcionesUsuario tendrá más propiedades, pero éstas tendran valores por defecto. Cuando guardes las opciones ya guardarás todas ellas pues lo que habrás actualizado será el método Save del objeto.

// Saludos
Responder Con Cita
  #7  
Antiguo 04-09-2006
[maeyanes] maeyanes is offline
Capo de los Capos
 
Registrado: may 2003
Ubicación: Campeche, México
Posts: 2.732
Poder: 26
maeyanes Va por buen camino
Cita:
Empezado por dec
Hola,



Yo pienso que no, puesto que las opciones en realidad estarían todas en un Array asociativo de la clase Opciones... si se quisiera añadir una nueva opción bastaría (según lo veo ahora) con añadir un nuevo elemento al Array de opciones.

Evidentemente, a la que se añadiera el nuevo elemento habría que actualizar todas (si no se encuentra la forma de hacerlo de otro modo), digo, habría que actualizar todas las opciones, pero, en realidad hablamos de actualizar UN campo de la base de datos...

Cuando el usuario iniciara de nuevo sesión, la opción añadida antes no se habría perdido, sino que se recuperaría con el resto de opciones al "deserializar" el objeto. Además pienso en la cantidad de funciones conque cuenta PHP para trabajar con Arrays... no conozco la mayoría, pero, sé que están ahí...
Reconozco que no me he metido lo suficiente a PHP.

Ahora, como sería? Como usuario inicio sesión, la aplicación lee las opciones de la base de datos ("deserializa" el objeto), hago algún cambio de estas opciones, trabajo con la aplicación y finalizo la sesión, la aplicación aquí guarda las opciones (o puede guardarlas desde que aplico los cambios a estas opciones).

Dado lo anterior, ¿en que momento se podría agregar una opción nueva? Esto lo pregunto por que no se exactamente como funciona la serialización de objetos en PHP. A lo que voy, si creo el objeto con un arreglo de X elementos, al "deserializar" este objeto conteniendo X - 1 elementos, ¿se pierde el elemento extra con el que inicialicé el arreglo o solo se sobreescriben los que ya existían?


Saludos...
Responder Con Cita
  #8  
Antiguo 04-09-2006
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.142
Poder: 36
dec Tiene un aura espectaculardec Tiene un aura espectacular
Hola,

Cita:
Empezado por Román
Yo no creo que sea necesario actualizar nada. Por ello mencioné lo de valores por defecto. Cuando un usuario se conecte, al momento de deserializar, el objeto OpcionesUsuario tendrá más propiedades, pero éstas tendran valores por defecto. Cuando guardes las opciones ya guardarás todas ellas pues lo que habrás actualizado será el método Save del objeto.
Me pierdo un poco en el tema de la inicialización de las opciones. En lo que "he caído" es en que acaso no sea preciso serializar todo el objeto, sino que bastaría con hacerlo con el Array que guarde las opciones, propiamente. Esto es posible porque PHP no sólo serializa Objetos (ignoro ahora mismo si un Array lo es en PHP, pero, me parece que no), sino, variables de tipo "mixed"... y Arrays, por ejemplo.

Cita:
Empezado por Maeyanes
Ahora, como sería? Como usuario inicio sesión, la aplicación lee las opciones de la base de datos ("deserializa" el objeto), hago algún cambio de estas opciones, trabajo con la aplicación y finalizo la sesión, la aplicación aquí guarda las opciones (o puede guardarlas desde que aplico los cambios a estas opciones).
Exacto. Las opciones por defecto siempre serán las mismas hasta que el usuario las cambie... en el apartado de opciones de la aplicación. Efectivamente, tendrá que "aplicar los cambios", puesto que, por las características de una aplicación de este tipo, no es posible guardar las opciones "cuando el usuario salga de la aplicación", pongamos por caso.

Pero, de todos modos, los programas no tienen porqué guardar las opciones al salir, aunque ahora me doy cuenta de que esto lo he hecho alguna que otra vez... hombre, tal vez algunas opciones han de guardarse al salir, como la posición de un formulario en pantalla, pero, buena parte de las opciones se "tocarán" en el apartado de opciones, se editarán y se guardarán desde ahí cuando el usuario lo precise.

Cita:
Empezado por Maeyanes
Dado lo anterior, ¿en que momento se podría agregar una opción nueva? Esto lo pregunto por que no se exactamente como funciona la serialización de objetos en PHP. A lo que voy, si creo el objeto con un arreglo de X elementos, al "deserializar" este objeto conteniendo X - 1 elementos, ¿se pierde el elemento extra con el que inicialicé el arreglo o solo se sobreescriben los que ya existían?
Si serializas un objeto que contiene diez "propiedades" al deserializar será eso lo que recuperes. Ahora... cómo añades opciones... pues supongo que "todo a la vez". Esto es, supongamos un Plugin que necesitara añadir un par de opciones de usuario... cuando esto se llevara a cabo habría se añadirían las opciones al Array correspondiente, y, efectivamente, habría en ese mismo punto que actualizar la base de datos, es decir, para que en sucesivas ocasiones la nueva opción estuviera disponible.

No he podido resistir y he escrito este poco de código en un momento como aquél que dice (no lo he probado ni nada) y lo expongo aquí porque creo que puede dar alguna idea de cómo llevar a cabo el tema, haciéndolo como venimos diciendo:

Código PHP:
<?php

class Opciones
{
  var 
$idUsuario 0;
  var 
$opciones null;

  function 
Opciones($idUsuario)
  {
    
$this->opciones = array();
    
$this->idUsuario $idUsuario;    
    
$this->Cargar();
  }

  
/**
   * Cargamos las opciones del usuario.
   */
  
function Cargar()
  {
    global 
$bdatos;
    
$consultaSql "SELECT opcion_contenido FROM opciones 
     WHERE opcion_id_usuario = '
{$this->idUsuario}' LIMIT 1;";
    
$this->opciones unserialize($bdatos->Variable($consultaSql));    
  }

  
/**
   * Guardamos las opciones del usuario.
   */
  
function Guardar()
  {
    global 
$bdatos;
    
$contenido serialize($this->opciones);
    
$consultaSQL "UPDATE opciones SET opcion_contenido = '$contenido'
     WHERE opcion_id_usuario = '
{$this->idUsuario}' LIMIT 1;";
  }
  
  
/**
   * Averiguamos si existe una opción de usuario en concreto.
   *
   * @param string $clave
   * @return boolean
   */
  
function Existe($clave)
  {
    return 
array_key_exists($clave$this->opciones);
  }

  
/**
   * Leemos el valor de una opción. Si esta no existe retornamos el valor
   * por defecto que se especifique en el parámetro correspondiente.
   * 
   * Nota: esos "mixed", ¿qué pasa con ellos?
   *
   * @param string $clave
   * @param mixed $valorPorDefecto
   * @return mixed
   */
  
function Leer($clave$valorPorDefecto '')
  {
    if(!isset(
$this->opciones[strtolower($clave)]))
      return 
$valorPorDefecto;    
    else 
      return 
$this->opciones[strtolower($clave)];
  }

  
/**
   * Escribimos el valor de una opción del usuario.
   *
   * Nota: Otra vez el "mixed" sale a relucir...
   * 
   * @param string $clave
   * @param mixed $valor
   */
  
function Escribir($clave$valor)
  {
    
$this->opciones[strtolower($clave)] = $valor;    
    
$this->Actualizar();
  }  
  
  
/**
   * Actualiza las opciones del usuario.
   */
  
function Actualizar()
  {
    
$this->Guardar();
  }
  
// class Opciones

?>
Por supuesto el código anterior no está ni probado, ni "concluído" ni nada de nada... pero puede dar alguna idea, espero. En caso de dudas aquí estamos. ¡Y otra vez muchas gracias a todos muchachos!
__________________
David Esperalta
www.decsoftutils.com
Responder Con Cita
  #9  
Antiguo 04-09-2006
[maeyanes] maeyanes is offline
Capo de los Capos
 
Registrado: may 2003
Ubicación: Campeche, México
Posts: 2.732
Poder: 26
maeyanes Va por buen camino
Yo me refiero a la serialización de arreglos, ya que es de lo que has hablado, que tu clase opciones contenga un arreglo con estas y sus valores, es por eso mi ejemplo. En cuanto a propiedades si me doy la idea de como sería.

Saludos...
Responder Con Cita
  #10  
Antiguo 04-09-2006
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.142
Poder: 36
dec Tiene un aura espectaculardec Tiene un aura espectacular
Hola,

Bueno. No creas que tengo del todo claro el asunto Maeyanes, ni mucho menos... ahora mismo estoy haciendo alguna que otra prueba, pero, según voy avanzando me va surgiendo algún que otro reparo... qué sé yo... pero, vamos a ver si sacamos algo en claro. Desde luego este Hilo me ha venido estupendamente.

Si todo esto no es más que por un usuario de Loturak, que quiere que las descripciones de los enlaces siempre estén visibles, ya ves tú... no tiene otra cosa mejor en qué pensar... el jodío, y yo, que, sabiéndolo, pues quiero darle el gusto, porque además creo que esto abre la puerta a otras posibilidades.

Ahora, espero que nos os toque nunca un usuario tan puñetero como el que os digo.
__________________
David Esperalta
www.decsoftutils.com
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
¿Cómo ver a los usuarios conectados desde mi aplicacion? federiconqn21 Conexión con bases de datos 3 23-07-2006 01:56:09
Problema al ejecutar un procedimiento dos usuarios distintos en aplicacion asp.net mamen .NET 5 04-05-2006 14:58:23
lanzo aplicación para que sea terminada por usuarios de internet unreal4u Varios 0 25-11-2004 19:34:03
Usuarios conectados en mi aplicacion ? Jorge Taveras MS SQL Server 8 29-06-2004 22:18:41
opciones para grabar un video jfgonzalez OOP 2 11-08-2003 16:25:42


La franja horaria es GMT +2. Ahora son las 16:45:27.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi