Transaction sur plusieurs scripts php

Transaction sur plusieurs scripts php - PHP - Programmation

Marsh Posté le 13-11-2007 à 17:19:21    

Bonjour,
 
je suis en train de réaliser un module de reservation et j'ai un petit probleme.  
Lorsqu'un client fait une reservation j'aimerais enregistrer dans la bd qu'une reservation a été faite pour eviter qu'un autre client se connecte et lui pique la place entre temps, logique quoi. Le probleme est qu'il est possible qu'un client commancant le processus de reservaton quitte son navigateur et donc je risque d'avoir des données inutiles dans ma bd.
Je travaille avec php 5 et mysql (base InnoDB) et j'aimerais démarrer une transaction au debut du process de resa puis la terminer plusieurs scripts plus loin... Mais je ne suis pas sur que ca soit possible surtout que je fais plusieurs requetes entre temps :/
 
Sinon quelle autre solution voyez vous ?
 
Merci

Reply

Marsh Posté le 13-11-2007 à 17:19:21   

Reply

Marsh Posté le 13-11-2007 à 19:36:47    

les sessions ... ou un objet "réservation" (POO) qui ne valide la réservation qu'à la "fin" c.à.d. une commande que le visiteur enclanche pour réellement écrire dans la base de données (que ce soit en POO ou en sessions d'ailleurs)


---------------
NewsletTux - outil de mailing list en PHP MySQL
Reply

Marsh Posté le 13-11-2007 à 19:42:54    

Oui c'est ce que j'avais prévu mais la premiere chose que peut faire un utilisateur sur le site c'est checker si il y a des disponibilité. Et moi pour le renseigner je regarde la base de données. Donc j'ai besoin d'enregistrer temporairement les reservations en cours... C'est pour ca que j'ai pensé aux transactions...

Reply

Marsh Posté le 13-11-2007 à 20:28:42    

eh bien rajoute un champ "valide" ...
un gars se pointe, il ajoute une ligne dans la BDD et lorsqu'il valide sa place, tu mets ce champ à 1 (par exemple)
 
comme ça au listing tu peux savoir le nombre de places validées, et le nb de places en cours.
Sachant aussi que tu peux effectuer une requête qui supprime toutes les places non validées sur lesquelles ya pas eu d'action depuis 30 min par exemple (donc un champ date/time)


---------------
NewsletTux - outil de mailing list en PHP MySQL
Reply

Marsh Posté le 14-11-2007 à 01:53:33    

J'y ai pensé mais c'est justement le probleme des réservations non validé qui restent en bd. Apres on peut effectivement les supprimer par une action manuelle ou un script qui les supprimer mais ca reste de la bidouille. Je cherchais un truc un peu mieux mais bon si je ne trouve rien d'autres je ferais un truc de ce style...
 
Pour la requete qui supprime tu la lances automatiquement ?

Reply

Marsh Posté le 14-11-2007 à 10:12:26    

tu peux soit la lancer automatiquement (via une tâche CRON par exemple) soit à l'arrivée d'un utilisateur : lorsque la page index.php (en supposant que telle soit la page d'"entrée" ) s'exécute, elle contient une requête DELETE FROM blabla WHERE { condition }; ainsi lorsque quelqu'un arrive, d'office tout est effacé.
A la rigueur, tu peux également le faire sur chacune des pages qu'il consulte, mais ça multiplie les requêtes SQL (cas de plein d'utilisateurs simultanés) et je ne suis pas sûr que ça soit judicieux.
 
Par Cron, tu le fais automatiquement, qu'il y ait des gens en cours de réservation ou pas.


---------------
NewsletTux - outil de mailing list en PHP MySQL
Reply

Marsh Posté le 14-11-2007 à 10:24:46    

Ne mélangeons pas tout. Une transaction au sens DB ne doit pas s'étendre sur tout le processus de réservation vu par l'utilisateur!

Loizo a écrit :

J'y ai pensé mais c'est justement le probleme des réservations non validé qui restent en bd. Apres on peut effectivement les supprimer par une action manuelle ou un script qui les supprimer mais ca reste de la bidouille.


C'est une façon parfaitement valide de faire, via un script exécuté à intervalle régulier. En entreprise, on parlera de "batch job" qu'on fait tourner la nuit. :sol:
 

Loizo a écrit :

Pour la requete qui supprime tu la lances automatiquement ?


Oui!
 

NewsletTux a écrit :

soit à l'arrivée d'un utilisateur : lorsque la page index.php (en supposant que telle soit la page d'"entrée" ) s'exécute, elle contient une requête DELETE FROM blabla WHERE { condition }; ainsi lorsque quelqu'un arrive, d'office tout est effacé.
A la rigueur, tu peux également le faire sur chacune des pages qu'il consulte, mais ça multiplie les requêtes SQL (cas de plein d'utilisateurs simultanés) et je ne suis pas sûr que ça soit judicieux.


Je suis sûr que ça n'est pas judicieux.  Ca, c'est effectivement du bricolage. [:pingouino]


---------------
Now Playing: {SYNTAX ERROR AT LINE 1210}
Reply

Marsh Posté le 14-11-2007 à 13:29:50    

OK donc il me faut un moyen de lancer une requete automatiquement, je ne suis pas sur que l'hebergeur utilisé le permette...  
Je vais me renseigner, merci :jap:
 
Edit : Apres verif mon hebergeur propose un service type Cron. Donc pour récapitulier, j'enregistre dans la bd la reservation avec un flag "complete" a 0 que je passe à 1 quand le processus complet de reservation est terminé. Et la nuit j'efface toutes les resa dont le flag "complete" est a 0 ?  
Comment savoir qu'un enregitrement est dans la bd depuis moins de 30mn par exemple ?

Message cité 1 fois
Message édité par Loizo le 14-11-2007 à 13:39:33
Reply

Marsh Posté le 14-11-2007 à 14:59:55    

Loizo a écrit :

Comment savoir qu'un enregitrement est dans la bd depuis moins de 30mn par exemple ?


Sur base de la date du record, bien sûr.


---------------
Now Playing: {SYNTAX ERROR AT LINE 1210}
Reply

Marsh Posté le 14-11-2007 à 16:01:11    

NewsletTux a écrit :


Sachant aussi que tu peux effectuer une requête qui supprime toutes les places non validées sur lesquelles ya pas eu d'action depuis 30 min par exemple (donc un champ date/time)


 
oui il faut effectivement penser à l'y inclure également.


---------------
NewsletTux - outil de mailing list en PHP MySQL
Reply

Marsh Posté le 14-11-2007 à 16:01:11   

Reply

Marsh Posté le 14-11-2007 à 18:35:50    

Ah oui logique :D
Ok je vais faire comme ca alors, merci :)

Reply

Marsh Posté le 14-11-2007 à 18:47:34    

Procédure stockée pour la transaction de réservation. Cette même procédure fera le ménage à chaque appel pour des réservations avortées (délai suffisament grand pour que ça laisse le temps d'aller pisser en cours de réservation :D)

Reply

Marsh Posté le 14-11-2007 à 19:16:29    

Non. On ne sait jamais si la personne reviendra des chiottes.
 
Le nettoyage des réservations avortées est une considération disctincte du flux de la réservation. Il n'est pas souhaitable de les coupler, en l'espèce de conditonner le nettoyage (back-end) à un flux utilisateur.


---------------
Now Playing: {SYNTAX ERROR AT LINE 1210}
Reply

Marsh Posté le 14-11-2007 à 21:00:11    

Ouais surtout qu'entre temps la personne peut avoir besoin de créer un compte et on lui demande quelques infos qu'il n'a peut etre pas sous la main donc je ne veux pas risquer d'effacer une resa en cours :/

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed