Actualisation porte monnaie virtuel

Petit nouveau ! | 1 Messages

28 févr. 2013, 14:13

Yop, je suis actuellement en train de coder la partie boutique de mon site. Je souhaite faire un systeme de porte monnaie virtuel. Après avoir rechargé son porte monnaie, l'utilisateur peut accéder à la partie boutique et cliquer sur le produit qu'il veut. En cliquant, l'utilisateur doit confirmer par un ptit message jscript et lorsque ceci est fait, son porte monnaie s'actualise.


Voici mon code actuel:

Affichage des produits de la boutique:
<div id="boutique">
    <h1>Explications Boutique</h1>
<?php
    $req = mysql_query('SELECT * FROM products');
 
    $total = mysql_num_rows($req);
 
 
 
    $nbcol=2;
// on compte le nombre de miniatures
$nbpics = $total;
 
// si on a au moins une miniature, on les affiche toutes
if ($nbpics != 0) {
    echo '<table>';
    for ($i=0; $i<$nbpics; $i++){
    $products = mysql_fetch_array($req);
        if($i%$nbcol==0) echo '<tr>';
        // pour chaque miniature, on affiche la miniature munie d'un lien vers la photo en taille réelle
        echo "<td><div class=\"produit\">";
        echo "<div id=\"prod_titre\">".$products['name']."</div>";
        echo "<div id=\"prod_contenu\">";
        echo "<div id=\"prod_image\"><img src=\"images/Achats/$products[id].png\" ></div>";
        // echo "<div id=\"prix\">";
        echo "<div id=\"nprix\"><br/><br/><br/>".$products['prix']."</div></div>";
        echo "<div id=\"img_prix\"><a href='' onclick=\"Actualiser($products[id], $products[name], $products[prix])\"><img src=\"images/Achats/prix.png\" ></a></div></div><br /></td>";
        // echo "<div id=\"nprix\">".$products['prix']."</div></div><br /></td>";
 
        if($i%$nbcol==($nbcol-1)) echo '</tr>';
    }
    echo '</table>';
}
// si on a aucune miniature, on affiche un petit message <img src="../../bundles/tinymce/vendor/tiny_mce/plugins/emotions/img/smile.png" title=":)" alt=":)">
else echo 'Aucune image à afficher';
 
// }
 
    ?>
</div>
<script type="text/javascript" src="js/fonctions.js"></script>
Fonctions javascript :

[javascript]function getXhr(){
var xhr = null;
if(window.XMLHttpRequest) // Firefox et autres
xhr = new XMLHttpRequest();
else if(window.ActiveXObject){ // Internet Explorer
try {
xhr = new ActiveXObject("Msxml2.XMLHTTP");
} catch (e) {
xhr = new ActiveXObject("Microsoft.XMLHTTP");
}
}
else { // XMLHttpRequest non supporté par le navigateur
alert("Votre navigateur ne supporte pas les objets XMLHTTPRequest...");
xhr = false;
}
return xhr
}

function Actualiser(id, nom, prix){
var xhr = getXhr()
// On défini ce qu'on va faire quand on aura la réponse
xhr.onreadystatechange = function(){
// On ne fait quelque chose que si on a tout reçu et que le serveur est ok
if (xhr.readyState == 4) {
if (xhr.status == 200 || xhr.status == 0){
// alert(xhr.responseText);
showConfirm(nom, prix);
}
else{
alert ("erreur"+xhr.status);
}
// xhr.responseText contient exactement ce que la page PHP renvoi
}
}
xhr.open("GET","../modules/achat.php?id="+id,true);
xhr.send(null);
}

function showConfirm(nom, prix)
{
var answer=confirm("Confirmer l'achat de"+nom+" au prix de "+prix+" Aums ?");
if (answer==true)
{
alert(xhr.responseText);
alert("Merci pour votre achat ! Allez en profiter dès maintenant !");
}
else
{
alert("Bonnes emplêtes !");
}
}[/javascript]

Page php qui est censée actualiser le porte monnaie de l'utilisateur:
<?php
session_start();
include('config.php');
?>


<?php
if(isset($_SESSION['id'])){

	if (isset($_GET['id']))
		$id=$_GET['id'];
	{
		// echo "Achat du produit $id";
	    $id_prod = intval($_GET['id']); // on filtre pour être certain de récupérer un nombre entier
	    $req1 = mysql_query('SELECT Aum FROM users WHERE id = '.$_SESSION['id'].' LIMIT 1');
	    $req2 = mysql_query('SELECT prix FROM products WHERE id = '.$id_prod.' LIMIT 1');
	 
	    if (FALSE !== $req1 && mysql_num_rows($req1) && FALSE !== $req2 && mysql_num_rows($req2)) // La requête est passée et on a bien au moins un résultat
	    {
	        $products = mysql_fetch_assoc($req2); // Te renvoie un tableau associatif au lieu d'un tableau doublement indexé, légérement plus optimisé
	        $aum      = mysql_fetch_assoc($req1);
	        $monnaie = $aum[0] - $products[0];
	 
	        $sql = 'UPDATE users SET Aum='.$monnaie.' WHERE id='.$_SESSION['id']; // Ici on prend une valeur DU SERVEUR et surtout pas une valeur venant du JavaScript
	        $req = mysql_query($sql);
	    }
	    else
	    {
	        echo "Erreur : une des deux requêtes a échoué ou il n'y a aucun produit / user correspondant aux ids fournis";
	    }
	}
}
else{

	echo "Vous n'avez pas l'autorisation d'accéder à la page.";
}
?>
Avez-vous des remarques? des suggestions?

Il n'y a aucune erreur javascript d'après la console sur chrome..pourtant ça ne fait pas ce que je veux.. Quand je clique sur un produit la page s'actualise seulement.

Merci d'avance

Peace

Modérateur PHPfrance
Modérateur PHPfrance | 2575 Messages

04 mars 2013, 11:54

Bonjour, moi je pense que la méthode n'est pas bonne car tu donne l'impression à l'utilisateur qu'il peut annuler ou confirmer son achat à un moment où le programme ne peut réaliser une éventuelle annulation. Regarde la fonction showConfirm elle ne fait qu'afficher des messages à l'utilisateur à un moment où l'opération d'achat a été déjà effectuée par Ajax. Ce décalage dans le temps est assuré par xhr.open(...., true) qui envoi l'appel à la page ../modules/achat.php en mode Asynchrone. Donc, si le programme achat.php réalise l'achat du produit, à quoi servirait de demander la confirmation de l'utilisateur après avoir effectué cet achat c'est à dire après avoir reçu la réponses d'Ajax (le moteur de l'action d'achat) car s'il y a réponse d'Ajax (xhr.onreadystatechange) avec les bon status (4+ 200 ou 0) l'achat a été déjà effectué.

Bon. Maintenant, je te conseille de procéder par étapes de validation de l'achat comme le font la plupart des sites marchands pour que l'utilisateur soit à l'aise avec la démarche. C'est à dire:
1. L'utilisateur rempli son panier virtuel (là tu peux utiliser Ajax pour mettre à jour le panier dans la session utilisateur et non par SQL ; le panier est virtuel. Tu peux aussi attacher au panier une bourse de monnaie virtuelle qui s'alimentera au départ par le solde initial de l'utilisateur tel qu'il est dans la base et diminuera au fur et à mesure de la mise à jour du panier virtuel par des actions d'achat de modif ou de suppression de produits dans le panier. Comme tu as $_SESSION['id'] tu peux mettre le panier virtuel dans $_SESSION['panier'] et la monnaie virtuelle dans $_SESSION['monnaie'])

2. Le panier doit être affiché sur un afficheur spécifique qui permet sa gestion par des actions comme : modification de quantité, suppression de produit, actualisation forcée et recalcul, annulation ou vidage du panier et validation intentionnelle de l'utilisateur.

3. Au niveau de l'afficheur du panier, l'action de validation déclenche la séquence de validation et abouti sur le programme définitif d'achat (là où il y a les commande PHP/SQL d'UPDATE de la base) et dans cet esprit d'achat par lot, le panier se videra si l'utilisateur le valide ou s'il l'annule.
Par cette méthode on peut parler d'annulation à proprement dit dans le cas où l'utilisateur ne suit pas le processus de validation en n'appuyant jamais sur l'action de validation. Ou bien si tu lui propose de pouvoir vider son panier (VIRTUEL).
--------//////----//---//----//////
-------//---//----//---//----//---//
------//////----//////-----//////
-----||--------||--||---||
Prendre le recul n'est pas une perte de temps.


ps: Affrontez moi dans l'arène