Page 1 sur 1

Décompte d'un montant avec mise a jour coté server

Posté : 19 avr. 2013, 08:51
par onHellworld
Bonjour,
Je vais vous exposé mon problème car je ne trouve pas de solutions me satisfaisant.

J'aimerai faire un compte d'un montant que l'ont peu arrêter à tout moment. En gros un sorte d'enchère automatique mais à l'envers.
En gros on un a prix (exemple 344.-) et chaque secondes le prix perd 0.05 cts. La page affiche donc un "décompteur" automatique.

En dessous nous avons un bouton qui permet d'arreter le compteur et d'acheter le produit au prix ou le décompte est arrivé. Pour tous les autres visiteurs a partir de ce moment la, l'article est concidèré comme vendu donc le compteur s'arrete et un message "vendu" s'affiche au prochain refresh.

Voila l'idée.

La solution que j'ai reussi a mettre en place c'est un script qui execute une page TOUTE LES SECONDES qui elle va lire dans la DB le montant actuel, l'affiche et fait un update du montant - 0.05. De cette facon lorsque l'article est acheté, je peux mettre a jour la table avec un tag et arreter le compteur pour els autres visiteurs. Sauf que 2 requet (select, puis update) chaque seconde, multipilé par le nombre de visiteur ca fait que ca suit pas ...

Donc ma question est, quelle est la solution pour ce genre de chose ? j'ai penser a bosser avec des timestamp, faire un select la 1ere fois et décrémenter mais je n'ai aucun moyen de cette fois de dire a tous les visiteurs quand l'article est vendu. Il faut bien que j'interoge la DB... je vois vraiment pas comment faire !

Est-ce qu'il y a des personnes qui ont des idées ?

Je met ci-dessous le code que j'ai pour l'instant et qui fonctionne pour que vous voyez plus en détail.
Merci infiniment a celui ou ceux qui me metteront sur la bonne voie !

Bonne journée.
David

SCRIPT QUI EXECUTE LA PAGE SQLRequestEchere.php CHAQUE SECONDE
[javascript]function getXMLHttpRequest() {
var xhr = null;
if (window.XMLHttpRequest || window.ActiveXObject) {
if (window.ActiveXObject) {
try {
xhr = new ActiveXObject("Msxml2.XMLHTTP");
} catch(e) {
xhr = new ActiveXObject("Microsoft.XMLHTTP");
}
} else {
xhr = new XMLHttpRequest();
}
} else {
// alert("Erreur : XMLHttpRequest non prit en charge !");
return null;
}
return xhr;
}

function ajax(url) {
this.xhr = getXMLHttpRequest();
this.xhr.open('GET', url, true);
this.xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
this.xhr.send();
}

function afficher() {
var temp = new ajax('modules/SQLRequestEchere.php');
temp.xhr.onreadystatechange = function() {
if(temp.xhr.readyState == 4 && (temp.xhr.status == 200 || temp.xhr.status == 0)) {
document.getElementById('resultat').innerHTML = temp.xhr.responseText;
} else if(temp.xhr.status >= 400) {
// alert('Erreur : Affichage de la page impossible !');
}
}
setTimeout("afficher();", 2000);// Temps rafrechissement --> 5000ms = 5s
}[/javascript]

PAGE SQLRequestEchere.php QUI FAIT SELECT, UPDATE DU MONTANT
<?PHP 
	include('../include/connexion_db.php');
   	include('../include/variablesGlobales.php'); 
  
	$query = "SELECT ENC_MONTANT, ENC_REMPORTE FROM enchere WHERE ENC_ID = '0'";
	$result = mysql_query($query);
	$row = mysql_fetch_row($result);
	$montant = $row[0];
	$reporte = $row[1];	
	
	$montantToAffiche = $montant;
	$montant = $montant - 0.05;	   
	
	if ($reporte == "")
	{
		echo "<FONT style='font-size:50px;font-family: Roboto Condensed, Arial, sans-serif;color:#000000'>".$montantToAffiche."</FONT><FONT style='font-size:30px;font-family: Roboto Condensed, Arial, sans-serif;color:#000000'> CHF</FONT>";	

		$queryImage = "UPDATE enchere SET ENC_MONTANT = '$montant' WHERE ENC_ID = '0'";
		$resultImage = mysql_query($queryImage);
	}	
	else
		echo "<script language='javascript' type='text/javascript'>\n
			 window.location.replace('index.php?lang=$lang');\n
			 </script>";
	

	include('../include/deconnexion_db.php');
?>

Re: Décompte d'un montant avec mise a jour coté server

Posté : 19 avr. 2013, 23:02
par moogli
salut,

le calcul tu peux le laisser faire au sgdb (update table set champ = champ -0.05).
ensuite ton système décrémente toute les seconde pour tous les utilisateur connecté.
du coup si deux utilisateur en même temps tu envoie deux requetes (don c0.1 toute les secondes) etc etc.

peux être faut il plutôt voir la chose dans l'autre sens, le serveur SQL effectue le compte à rebours (tâche planifiée du serveur sql) et un script serveur envois les modifs via websocket. il ne fait que de la consultation.

Après cela dépend de ce que tu souhaite faire exactement, du nombre de gens en même temps sur le système etc etc.

Par contre je me demande si ce type de système sera très bien toléré, parce que j'imagine qu'il n'y a pas qu'une seule enchère active à la fois et que ceci va vite être gourmand en ressource autant SGBD, serveur que réseau.


@+

Re: Décompte d'un montant avec mise a jour coté server

Posté : 22 avr. 2013, 11:47
par Invité
Salut Moogli, merci pour ta réponse

Alors l'idée c'est qu'il n'y a qu'un seul article a la fois mais il peux y avoir sans trop de problème quelques milliers d'utilisateur simultanément.
Ton idée de laisser le server SQL fait le boulot me plait bien mais parcontre je connais pas du tout ... est-ce que tu aurai quelqes exemple a me donner ?

Merci beaucoup !

Re: Décompte d'un montant avec mise a jour coté server

Posté : 22 avr. 2013, 19:55
par moogli
juste la doc ;)

j'ai jamais testé : http://dev.mysql.com/doc/refman/5.1/en/events.html