Foros del Web » Programando para Internet » PHP »

Sistema de subastas

Estas en el tema de Sistema de subastas en el foro de PHP en Foros del Web. Buenos días, Quería hacer un sistema de subastas con objetos ficticios (para una aplicación que estoy haciendo), pero no tengo ni idea de por dónde ...
  #1 (permalink)  
Antiguo 27/01/2009, 07:00
 
Fecha de Ingreso: agosto-2008
Mensajes: 166
Antigüedad: 15 años, 8 meses
Puntos: 1
Sistema de subastas

Buenos días,

Quería hacer un sistema de subastas con objetos ficticios (para una aplicación que estoy haciendo), pero no tengo ni idea de por dónde orientarlo. A ver si me pudierais dar unas pistas y ya continuo yo (si puedo) jeje.

Tengo una tabla en una base de datos, que se llama objetos. Cada objeto está asignado a un usuario y cada objeto tiene un ID. Los usuarios pueden marcar los objetos y ponerlos en venta, donde estarán 1 día en forma de subasta. Y ahí es donde no sé como hacerlo. Es decir, ¿cómo puedo hacer que luego en otro apartado, los distintos usuarios puedan ver los objetos en venta, y las pujas que llevan? ¿Y cómo hacer que cuando termine la subasta, cambie el usuario del objeto? (cómo hacer que la aplicación detecte que la subasta ha terminado y haga el update).


En fin.... siento no poder explicarme mejor, porque no tenga ni idea de como montarlo. Sólo pido un poco de orientación : - )

Gracias y un saludo.
  #2 (permalink)  
Antiguo 27/01/2009, 09:35
 
Fecha de Ingreso: febrero-2006
Mensajes: 134
Antigüedad: 18 años, 2 meses
Puntos: 10
Respuesta: Sistema de subastas

Pues necesitarás una tabla "pujas" para registrar las pujas de cada objeto, con un esquema similar a:
Código:
TABLA PUJAS:
id           | int
objeto_id | int
usuario_id | int (el que puja)
precio     | float (valor de la puja)
fecha       | datetime (o int(11) para timestamp)
Cuando se haga una puja, actualizas la tabla pujas así:
Código PHP:
$query "UPDATE TABLE pujas ADD VALUES(
null, $objeto, $usuario, now());"

Necesitarás también un campo "expira" en la tabla objetos (datetime o int(11) )
Así cuando la puja del objeto termine, algo así como
Código PHP:
$query "SELECT o.*, p.* FROM pujas as p, objetos as o WHERE p.objeto_id = o.id AND o.expira > now()"
[no estoy seguro de que la sintaxis sea así correcta]
al ejecutar la query obtendrás los siguientes datos:
id (de la puja), id_objeto, el usuario que puso a la venta el artículo, el usuario que pujó, la fecha de la puja...
Para saber quién fue el ganador (de un objeto $id) simplemente:
SELECT * from pujas WHERE objeto_id = $id ORDER BY price ASC LIMIT 1

Espero haberte ayudado
__________________
Si te ha gustado lo que he dicho, puedes darme algún punto de reputación, que no te cuesta nada ^_^.

Di no a los juicios de valor!
  #3 (permalink)  
Antiguo 27/01/2009, 10:07
Avatar de Ronruby  
Fecha de Ingreso: julio-2008
Ubicación: 18°30'N, 69°59'W
Mensajes: 4.879
Antigüedad: 15 años, 9 meses
Puntos: 416
Respuesta: Sistema de subastas

Solo una notita, para pasar el objeto de una cuenta a otra sin que ocurra ningun problema usa transacciones. MyISAM no soporta transacciones, por lo que tendras que usar InnoDB.
  #4 (permalink)  
Antiguo 27/01/2009, 12:19
 
Fecha de Ingreso: agosto-2008
Mensajes: 166
Antigüedad: 15 años, 8 meses
Puntos: 1
Respuesta: Sistema de subastas

Buenas!! Muchas gracias a los dos. Sólo un par de dudas:

Para santhy: Cómo puedo hacer que el script vaya updateando los campos de usuario según vayan terminando las pujas (que conforme vayan terminado, se vayan updateando los usuarios que hayan comprado los objetos). El resto me lo has dejado bastante claro Gracias!

Para Ronruby: Lo siento pero no tengo ni idea de lo que te refieres, jeje. Con updatear el usuario no sería suficiente? Voy a ver si en google puedo ver lo que soy las transacciones esas... jeje

Gracias y un saludo
  #5 (permalink)  
Antiguo 27/01/2009, 12:27
Avatar de Ronruby  
Fecha de Ingreso: julio-2008
Ubicación: 18°30'N, 69°59'W
Mensajes: 4.879
Antigüedad: 15 años, 9 meses
Puntos: 416
Respuesta: Sistema de subastas

Cita:
Para Ronruby: Lo siento pero no tengo ni idea de lo que te refieres, jeje. Con updatear el usuario no sería suficiente? Voy a ver si en google puedo ver lo que soy las transacciones esas... jeje
Imaginate este escenario:
Estas pasando fondos de tu cuenta de bancos a otra.
Basicamente el proceso es: retirar el dinero de tu cuenta, e insertarlo en la otra cuenta.
Pero, que pasaria si cuando se ejecuta la consulta que retira el dinero, el sistema se cae?
Pues, el sistema solo pudo ejecutar la 1era consulta, por lo cual, te dira que el dinero ya se ha enviado cuando en realidad no (:P Y te la desquitas con el servicio al cliente).

Esto se arregla con transacciones:
Primero se remueve el balance de tu cuenta
Luego se le agrega a la otra cuenta
Y si nada ocurrio en el momento, le dices al servidor que ejecute la transaccion. Es como un "apreton de manos" para cerrar el trato.
  #6 (permalink)  
Antiguo 27/01/2009, 13:01
 
Fecha de Ingreso: agosto-2008
Mensajes: 166
Antigüedad: 15 años, 8 meses
Puntos: 1
Respuesta: Sistema de subastas

Genial! Estuve googleando y ví más o menos eso pero no lo había comprendido de forma tan clara. Y entonces, para otras operaciones con base de datos, aunque sean menos importantes, también será recomendable no?

Gracias y un saludo ^_^
  #7 (permalink)  
Antiguo 27/01/2009, 13:02
Avatar de Ronruby  
Fecha de Ingreso: julio-2008
Ubicación: 18°30'N, 69°59'W
Mensajes: 4.879
Antigüedad: 15 años, 9 meses
Puntos: 416
Respuesta: Sistema de subastas

Si, yo lo considero muy importante. Para que en caso de que tu sistema falle, algun usuario no se vea perjudicado por esto.
  #8 (permalink)  
Antiguo 28/01/2009, 10:47
 
Fecha de Ingreso: febrero-2006
Mensajes: 134
Antigüedad: 18 años, 2 meses
Puntos: 10
Respuesta: Sistema de subastas

Para actualizar la tabla de usuarios, cuando tengas el array con las subastas finalizadas
Código PHP:
$sql "SELECT o.expira p.* FROM pujas as p, objetos as o ORDER BY p.valor DESC WHERE o.expira > NOW() AND o.id = p.objeto_id";
/* Con esto seleccionas la fecha de expiración y los datos de las pujas, ordenados por precio */

$result $db->query($sql)->fetchAssoc(); // Utiliza aquí tu método para obtener la consulta.

$cambiados = array(); // Array para "recordar" las filas que hemos cambiado
foreach($result as $row) {
    if(!
in_array($row['objeto_id'], $cambiados)) continue; // Ya habíamos procesado este elemento.
    
$usuario $row['p.usuario_id'];
    
$objeto $row['p.objeto_id'];
    
    
$sql "UPDATE objetos SET usuario = \"$usuario\" WHERE id = \"$objeto\" ";
    
$db->query($sql);
    
// Ahora también puedes guardar un registro, en la base de datos o en un archivo
    
$logdata 'Fin de la subasta del objeto ID'.$objeto.'. Nuevo poseedor: ID'.$usuario;
   
//BBDD:
   
$db->query('INSERT INTO logs (cadena, fecha) VALUES ("'.$logdata.'", NOW());');
   
// Archivo: (con PHP>5.2.0)
   
file_put_contents('logs/'.date('Y_m_d').'.log'$logdata."\n"FILE_APPEND);

__________________
Si te ha gustado lo que he dicho, puedes darme algún punto de reputación, que no te cuesta nada ^_^.

Di no a los juicios de valor!
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 11:49.