JeuWeb - Crée ton jeu par navigateur
Condition - 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 : Condition (/showthread.php?tid=4729)

Pages : 1 2 3


Condition - Ksama - 11-04-2010

Bonjour, je reviens encore avec un petit problème (décidément, ça deviens une habitude -.-). Bref, voici mon problème :
Pour la création d'une unité, il faut 5 de nourriture.
Après l'envoie du formulaire, je met le calcul sur une autre page :


<?php
$query = sprintf("SELECT nourriture FROM membre WHERE login = '%s';", $_SESSION['login']);
$calcul = mysql_query($query);
$nourriture = mysql_fetch_assoc($calcul);

if ($_POST['mont'] * 5 < $nourriture)
{
echo "Vous n'avez pas asser de ressources !";
}
else
{
$query1 = sprintf("UPDATE membre SET mt = mt + '%d' WHERE login = '%s';", $_POST['mont'], $_SESSION['login']);
$resource1 = mysql_query($query1);

$query2 = sprintf("UPDATE membre SET nourriture = nourriture - 5 * '%d' WHERE login = '%s';", $_POST['mont'], $_SESSION['login']);
$resource2 = mysql_query($query2);
}
?>

Je reprend la valeur que le joueur a rentré ($_POST['mont']), je la multiplie par 5 et je la compare à une variable qui à pour valeur le nombre de nourriture du joueur ($nourriture).

Je fait ça sous forme de condition. Seulement voilà, si je met admettons 5 et que j'ai 10 nourriture, il va bien afficher que je n'ai pas assez de ressources. Mais si je met 1, il va toujours dire que je n'ai pas assez de ressources.

Seulement la condition de marche pas, le reste fonctionne.

Voilà, j'ai chercher pendants des heures, mais je en trouve pas mon erreur.
Merci d'avance pour votre aide.


RE: Condition - Ter Rowan - 11-04-2010

le signe <, si tu le remplaces par > ?

là ce que je lis c'est que si mont * 5 (soit ce qui doit etre consommé) est inférieur au stock, ça ne marche pas

à noter tu pourrais ne faire qu'une seule requête update, puisque tu tapes dans la même table

EDIT : et en plus (je pense ton code très critiquable mais bon je ne suis pas assez à niveau pour tout t'expliquer) tu devrais passer par une variable intermédiaire pour ton $_POST['mont']

genre

$mont = intval($_POST['mont']);

et après utiliser $mont, tu réduiras les risques d'injection SQL


RE: Condition - Sephi-Chan - 11-04-2010

Faut-il t'envoyer une fois de plus à la documentation de mysql_fetch_assoc ? Lis, bordel ! Tu gagneras du temps !

La documentation dit clairement :

Documentation PHP a écrit :Retourne un tableau associatif de chaînes qui contient la ligne lue dans le résultat result, ou bien FALSE s'il ne reste plus de lignes à lire.

Donc ta variable $nourriture contient un tableau, et toi, tu cherches à comparer $_POST['mont'] * 5 à un tableau. Au passage :
  • $nourriture est un mauvais nom pour ta variable. Cette variable contient un tableau : le jeu de résultat de la requête ;
  • Apprends à nommer tes variables et paramètres. Ici par exemple, tu as un paramètre nommé "mont". Ça veut rien dire. Si ce paramètre a pour valeur un nombre d'unités achetées, alors appelle le "quantite_unite_achetees".

Après la déclaration de $nourriture, insert cette ligne :


echo '<pre>', print_r($nourriture), '</pre>';

Tu comprendras que pour avoir la valeur que tu attends, il faut que tu prennes la clé 'nourriture' de ton tableau. Voici donc un fragment de code qui produira le résultat attendu :


$resource = mysql_query($query);
$result = mysql_fetch_assoc($resource);
$nourriture = $result['nourriture'];

if ($_POST['mont'] * 5 < $nourriture){
echo "Vous n'avez pas asser de ressources !";
}

Maintenant, petite mise au point. Dans ton autre sujet, je t'avais montré comment faire ta requête, avec un nommage correct des variables ($query, $resource, $result). Je vois que tu n'as pas respecté ça : du coup tu t'es planté.

Non seulement tu ne lis pas la documentation, mais en plus tu ne lis pas nos réponses. Ça donne vachement envie de t'aider…


Sephi-Chan


RE: Condition - Cartman34 - 11-04-2010

Ksama, faire une seule requete est toujours mieux que 2 si ca concerne la même entrée.
Si tu commences à faire une requete par champs de ta table que tu veux modifier, t'as pas fini.


RE: Condition - Ksama - 11-04-2010

Excusez moi ...
D'abord merci pour votre aide. Je ferrai plus attention la prochaine fois.

Citation :Non seulement tu ne lis pas la documentation, mais en plus tu ne lis pas nos réponses. Ça donne vachement envie de t'aider…
Je lis la documentation et vos réponses, j'ai envi de progresser ...
Pour le nom des variables et le code, c'est vrai que je ne suis pas très organiser, je vais arranger ça. Merci pour tout, je vais corriger tout et poster à nouveau, le tout corriger.

Edition :

<?php
$requete = sprintf("SELECT nourriture FROM membre WHERE login = '%s';", $_SESSION['login']);
$resource = mysql_query($requete);
$resultat = mysql_fetch_assoc($resource);
$nourriture_en_stock = $resultat['nourriture'];

if ($_POST['montgolfiere_achetees'] * 5 > $nourriture_en_stock)
{
echo "Vous n'avez pas asser de ressources !";
}
else
{
$modification_montgolfiere = sprintf("UPDATE membre SET montgolfiere = montgolfiere + '%d' WHERE login = '%s';", $_POST['montgolfiere_achetees'], $_SESSION['login']);
$resource1 = mysql_query($modification_montgolfiere);

$modification_nourriture = sprintf("UPDATE membre SET nourriture = nourriture - 5 * '%d' WHERE login = '%s';", $_POST['montgolfiere_achetees'], $_SESSION['login']);
$resource2 = mysql_query($modification_nourriture);

echo "Vous avez acheté " .$_POST['montgolfiere_achetees']. " montgolfières !";
}
?>

Voilà, j'ai préférer garder le même nombres de requêtes pour mieux m'y retrouver.
Ensuite j'ai modifier le nom des variables. J'ai repris le nom des variable que Sephi-Chan m'a proposées mais je les ai changer pour que je comprenne mieux.

Merci à tous, j'espère ne plus avoir à vous embêter comme sa.


RE: Condition - Sephi-Chan - 11-04-2010

Voilà, si tu y vois plus clair en traduisant, c'est déjà ça de gagné (d'ailleurs, en français, ressource prend deux 's').

Un détail, maintenant, concernant sprintf(). Tu ne dois pas mettre de guillemets simples autour du marqueur %d. Il n'y en a qu'autour des chaînes de caractères %s.

Une autre chose bien plus importante : tu ne dois pas utiliser les données qui viennent de $_POST (ou $_GET) directement dans tes requêtes, car un utilisateur peut les modifier. Je t'invite donc à déclarer une variable en début de script pour y stocker la quantité de montgolfières achetées. D'ailleurs il y a encore une faute dans ton paramètres, il faudrait mettre montgolfière au pluriel. Smile


$montgolfieres_achetees = (int) $_POST['montgolfieres_achetees']; // On peut aussi faire intval($_POST['montgolfieres_achetees']) !

Comme ça, tu es protégé face aux injections SQL : tu as la garantie que ta variable contiendra toujours un nombre (même si on met la chaîne "Jambon fumé" dans ce paramètre).


(11-04-2010, 07:11 PM)Ksama a écrit : Merci à tous, j'espère ne plus avoir à vous embêter comme sa.

Le problème n'est pas de nous embêter ou pas, c'est d'apprendre de tes erreurs. J'espère au moins que tu ne feras plus celle-ci.


Sephi-Chan


RE: Condition - php_addict - 11-04-2010

je te conseille egalement de te renseigner les injection de CODE SQL, car tes $_POST ne sont pas du tout sécurisés....


RE: Condition - Cartman34 - 11-04-2010

(11-04-2010, 08:12 PM)Sephi-Chan a écrit :

$montgolfieres_achetees = (int) $_POST['montgolfieres_achetees']; // On peut aussi faire intval($_POST['montgolfieres_achetees']) !

Comme ça, tu es protégé face aux injections SQL : tu as la garantie que ta variable contiendra toujours un nombre (même si on met la chaîne "Jambon fumé" dans ce paramètre).
je lui conseillerai même plus:
Code PHP :
<?php 
$_POST
['montgolfieres_achetees'] = intval($_POST['montgolfieres_achetees']);
Mais sprintf() le protège déjà des injections car avec %d il convertit la variable en int.


RE: Condition - php_addict - 11-04-2010

htmlentities($_POST['montgolfieres_achetees']) c'est pas plus judiceux?


RE: Condition - Sephi-Chan - 11-04-2010

Rien à voir.

htmlentities() doit toujours être utilisé pour l'affichage de texte (à moins d'être sûr de sa source, mais dans le doute, mettez-le. Ça sert à éviter les failles XSS.

Ici, c'est pour t'assurer que tu auras un entier et pas une chaîne qui contient du SQL indésirable (une injection).


Sephi-Chan