JeuWeb - Crée ton jeu par navigateur
Marché et entrées doubles - Version imprimable

+- JeuWeb - Crée ton jeu par navigateur (https://jeuweb.org)
+-- Forum : Discussions, Aide, Ressources... (https://jeuweb.org/forumdisplay.php?fid=38)
+--- Forum : Programmation, infrastructure (https://jeuweb.org/forumdisplay.php?fid=51)
+--- Sujet : Marché et entrées doubles (/showthread.php?tid=4783)

Pages : 1 2 3


Marché et entrées doubles - atra27 - 02-05-2010

Bon voila, j'ai un script de gestion d'inventaire...
Quand on utilise mettont 10 fleches sur 20, il retranche 10 et update la base.
Quand le nombre de fléches tombe a zéro, il suprimme le champ dans la base de donnée.

Maintenant j'ai un probléme...
Pour mon script de marché, le joueur peut acheter des fleches suivant le nombre (et le prix) défini par d'autres users.
L'idée serai qu'en une seule requete SQL
Si il ya déjà un champ pour ce joueur, pour cet id d'objet et pour cette place (correspond au lieu de stockage), alors on ajoute la valeur achetée a la valeur précédente (en gros j'ai un champ avec 10 fléches, j'en achete 15, je me retrouve avec 25 fléches dans ce champ)
Mais si il n'y a pas ce champ (c'est a dire 0 fléches dans l'inventaire) et bien on insert dans la base un nouveau champ contenant l'id de l'user, l'id objet et la quantité.

Voila je sais pas si c'est clair...

Ma table marché (en gros la ou sont stockées les produits mis en vente):
http://img707.imageshack.us/img707/9743/53364268.png

Ma table inventaire (La ou on stocke l'inventaire des joueurs suivant la position dans l'inventaire):
http://img576.imageshack.us/img576/1328/62447362.png


Idées? bout de script? peu étre un lien vers le manuel de MySQL si j'ai loupé un truc...


RE: Marché et entrées doubles - titnome - 02-05-2010

Bien.
Donc je trouve déjà ton idée pas très précise... je crois juste avoir compris que tu ne voulais faire qu'une requête En traitant deux tables. Je ne comprend pas bien le principe mais bon...

J'ai tout de même une question. Pourquoi mettre le nom de champs de ta base de données en anglais ? Je trouve le français tellement plus intéressant. On sais de quoi on parle... Ou alors ajoute y des commentaires je sais pas mais le jour ou tu va vouloir faire une pause je ne sais pas si tu arrivera à reprendre...


RE: Marché et entrées doubles - atra27 - 02-05-2010

Pour l'anglais je sais pas bonne question...
Peut être car les mots anglais me viennent souvent a l'esprit plus facilement que les mots français...

Pour ce qui est des tables, je les donnais a titre indicatif mais en gros il faudrai en une seule requête faire:
Si idowner = tel valeur, idobject = tel valeur et place=tel valeur alors update quantité en bdd+quantité a ajouter/retirer
Sinon insert tout con...

Et si possible en une requête, plutôt que de faire un select du champ puis addition et update ou insert.
Je suis pas partisan de faire 10 requêtes pour une page donc si y a moyens d'en économiser vu le nombre de transactions...

En gros je veux éviter les doublons de champs...
avoir par exemple 1 seul champ qui correspond au nombre de tel objet a tel place et pour tel joueur plutôt que d'avoir le nombre total répartis sur plusieurs champs (10 d'un coté puis 20 de l'autre pour donner 30 total)
1 seul champ par joueur/objet/place en gros...

C'est plus clair?


RE: Marché et entrées doubles - nicodd - 02-05-2010

Tu peux par exemple mettre l'id de l'user et l'id de l'objet en clé primaire, ce qui t'assure l'unicité de la paire.
Ensuite, tu fais un insert ... on duplicate key update ...

Qui t'inséreras un objet si il n'existe pas, et mettra à jour le champ correspondant si l'entrée existe déjà.


RE: Marché et entrées doubles - atra27 - 02-05-2010

Le probléme c'est que l'id de l'user n'est pas unique...
Un même user (donc même id) peut avoir des objets différents (même idjoueur mais pas le même idobject) ou alors un même type d'objet mais a une place différente (même idjoueur, même idobject mais place différente)

Ce que je veux c'est faire l'update si il y a déjà une ligne avec les 3 champs égaux a ceux que l'on veux insérer... (sans oublier d'additionner la quantité présente et celle qu'on veut ajouter...)

Sinon je fait sa tout simple un select, puis un simple if/else suivant si le champ existe ou pas... Mais bon si y a une autre solution je suis preneur :p


RE: Marché et entrées doubles - Argorate - 02-05-2010

Je ne vois pas comment le faire en une requete...
J'ai eut le même "probleme" pas plus tard qu'hier, et pour ma part j'ai fait un count(*) dans ta base avec les bon id pour le WHERE pour determiner s'il y a deja une quantité (une ligne) dans la bdd, et si ça existe alors je fais un UPDATE qte = qte + valeur_qui_vient_detre_ajouter, sinon un INSERT INTO qte = valeur_qui_vient_detre_ajouter.

Je sais pas si j'ai bien répondu a ton problème? ^^


RE: Marché et entrées doubles - atra27 - 02-05-2010

Heu c'est quoi l'utilité du count?

J'aurai fait un truc genre (codé a l'arrache juste pour montrer comment je ferai niveau logique grosso modo):
Code PHP :
<?php 
select id
, qantity where [toutes mes condition] LIMIT 1
if(isset($data)){
$quantity=$data['quantity']+$quantity
update
(quantity where id='$data['id']');
}else{
insert(etc etc etc);
}

Bon bah si y a pas d'autre solution... c'est parti je finirai cette fonction demain alors...


RE: Marché et entrées doubles - Argorate - 02-05-2010

On fait exactement pareil, sauf que toi pour determiner si il y a une entrée dans la BDD tu fais un select de qq chose et ensuite tu es obligé de faire un isset de ton $data

alors que moi je recupere un nombre (0 ou 1) et je fais donc if($data > 0)... mais sinon c'est pareil, mais je préfére ma methode qui est plus optimisé je pense^^


RE: Marché et entrées doubles - jo_link_noir - 02-05-2010

L'id de l'user + l'id de l'objet sont unique non ?

CREATE UNIQUE INDEX obj_p ON `test` (idobjet, idjoueur);

Et après tu fais ce que dit nicodd : insert ... on duplicate key update ...


RE: Marché et entrées doubles - atra27 - 02-05-2010

@ jo_link_noir:
L'id est unique car sa correspond a l'id unique dans la table...
Par contre l'id de l'objet n'est pas unique... plusieurs user peuvent avoir le méme type d'objet
de la méme façon l'id du joueur n'est pas unique non plus... un joueur peut avoir plusieurs objets

La seule combinaison que je veux pas avoir c'est 2 champs avec le méme idjoueur, idobject et place c'est tout...
Tout le reste est possible...

@Argorate

Dans mon cas j'en profite pour récupérer des infos et les afficher (pas indispensable mais sa ajoute un peu de confort je trouve)
Et il me semble pas compter soit plus rapide qu'un select avec limit 1... le count recherche toutes les occurrences, alors que le select s'arrête dans ce cas a la première...
Avec les index on doit pas voir trop de différence mais quand même...

Faudrait je fasse un test des deux méthodes pour le fun tient ^^

En tous cas merci Wink