Re: [PHP-ES] Consulta sobre php y mysql

[email protected] (Fermin) Thu, 15 Mar 2012 08:25:38 +0100
Newsgroups php.general.es
Message-ID <CAMpKFiiR1yNM-bhiurReiwX88Texuw8rU=Ji4Yx9izepy77G1Q@mail.gmail.com>
Buenas, esto puede resolverse mediante semaforos,
http://php.net/manual/es/function.sem-get.php

La seccion critica (que que otorga el premio, es la que solo sera
accesible por un solo usuario, de esta forma el premio te aseguras que
solo lo de una vez.

Hay ejemplos en la doc, y puede ser una solucion sencilla.

On Wed, Mar 14, 2012 at 5:51 PM, Satyam <[email protected]> wrote:
> Antes de otorgar el premio debes hacer, mediante AJAX o técnica similar, una
> conexión con el servidor que haga dos operaciones en la base de datos que
> verifique que el premio no ha sido otorgado.   Esto, habitualmente, se
> traduce en hacer un update de un campo booleano en el premio que indique que
> ha sido otorgado, solo si ese campo es falso.
>
> Update TablaPremios set otorgado= 1 where premio='xxxxx' and otorgado = 0;
>
> Luego verificas el numero de registros afectados.  Si se ha afectado un
> registro, es que no había sido otorgado.  Si no se afecto ningun registro,
> es que ya estaba otorgado. Nota que en esta unica instrucción, que no admite
> interrupciones, verificas que no haya sido otorgado y lo marcas otorgado,
> todo en una operación indivisible.
>
> Satyam
>
>
> On 03/14/2012 05:01 PM, Ricardo Vila wrote:
>>
>> Bueno estoy usando innodb, el tema es que quiero ver como prevenir que un
>> premio se entregue a dos personas.
>>
>> porque el proceso como lo mencione es:
>> - veo si hay premios (una consulta a la bd)
>> - genero un arreglo de 10 posiciones (el # de posiciones puede cambiar,
>> solo a modo de ejemplo puse 10)
>> - Si hay premios (en este caso se asume que solo queda 1 premio), lo
>> agrego
>> al arreglo
>> teniendo : $arrpremio = array(0,0,0,1,0,0,0,0,0,0)
>> - Luego obtengo un random de 0 a 9,(asumo que me manda 3)
>> - Ese valor es el indice del arreglo, entonces obtengo su valor, es decir
>> $gano = $arrpremio[3] ( y esto es igual a 1)
>> - aca pregunto si valor es 1, gano si no que siga intentando
>> - Entonces bajo este esquema, se puede dar que a dos usuarios jugando
>> simultaneamente les muestre el premio.
>>
>> Agradezco de antemano sus respuestas
>>
>> Saludos,
>> Ricardo Vila
>>
>>
>>
>> 2012/3/14 Ricardo Martinez<[email protected]>
>>
>>> Mmm, en mi opinión:
>>>
>>> entiendo que como motor estás usando MyIsam. En caso contrario
>>> especificalo.
>>>
>>> Todas las consultas que dices que haces y acciones, deberías de hacerlas
>>> todas la vez dentro de un
>>>
>>> try
>>>    {
>>>     sentencias
>>>   }
>>>
>>> Un saludo!!!
>>>
>>>
>>> On Wed, Mar 14, 2012 at 12:14 AM, Ricardo
>>> Vila<[email protected]>wrote:
>>>
>>>> Buenas listeros,
>>>>
>>>> La presente es para consultarles respecto a como podría hacer para
>>>> evitar
>>>> que un registro se muestre igual a dos usuarios distintos, me explico
>>>> con
>>>> un ejemplo
>>>>
>>>> Tengo una tabla premios, con los campos idpremio, cantidad
>>>>
>>>> entonces como puedo prevenir que si tengo un registro que tenga en el
>>>> campo
>>>> cantidad = 1, y dos usuarios ingresan a la vez, el sistema lo que hace
>>>> es
>>>> ver si hay premios, en este caso, obtiene 1, luego genero un arreglo de
>>>> 10
>>>> posiciones y coloco este id dentro, genero un random y luego obtengo un
>>>> indice y con esto veo si gano o no, entonces, si dos usuarios estan a la
>>>> vez ingresando, hay la posibilidad de que a ambos le salga que ganaron
>>>> el
>>>> premio cuando en realidad solo hay un premio.
>>>>
>>>> Como podría evitar este problema, estuve pensando en bloquear las tabla
>>>> hasta que termine de jugar un usuario, pero eso tomaría tiempo por cada
>>>> usuario, de ser así, sería factible usar colas, para poder procesar esta
>>>> información
>>>>
>>>> agradezco de antemano su respuesta
>>>>
>>>> Saludos,
>>>> Ricardo Vila
>>>>
>>>
>>>
>>> --
>>> Ricardo
>>> _______________________________________________
>>> IT Architect
>>> website: http://www.pulsarinara.com
>>>
>
> --
> PHP Spanish Localization Talk Mailing List (http://www.php.net/)
> To unsubscribe, visit: http://www.php.net/unsub.php
>