Incrémentation d'une variable

Eléphant du PHP | 75 Messages

04 oct. 2007, 19:27

Bonsoir à tous et à toutes,

Ce soir je viens vous embêter avec un de mes petits problèmes ^^.

En fait, j'ai un formulaire qui envoit une valeur numérique en POST (ex.: 1000) à un script PHP qui doit se connecter à ma base de données, sélectionner un champs, récupérer la valeur de se champs et y ajouter la valeur envoyé dans le formulaire...

Seul problème, je sais comment incrémenter le champs de ma table avec une valeur numérique directe (qui ne provient pas d'une variable), comme ci-dessous:
$req2 = "UPDATE ressource_tbl SET bois=bois+1000 WHERE joueur='volkow'";
MAIS je ne sais pas comment faire pour l'incrémenter selon la valeur de la variable que j'ai reçu par POST...

Voilà ce que j'ai essayé (et qui ne marche pas, vous vous en doutez...^^):
$req2 = "UPDATE ressource_tbl SET bois=bois+$variablepost WHERE joueur='volkow'";
Selon vous, comment puis-je faire?

En vous remerciant, Volkow.

Eléphant du PHP | 443 Messages

04 oct. 2007, 20:39

Peux-tu envoyer le code de la page qui gère l'update ?

Eléphant du PHP | 75 Messages

04 oct. 2007, 20:52

Bien sûr, le voilà:
<?php
// variable reçu par post
$bois = $_POST['bois'];

// on se connecte à MySQL
$db = mysql_connect('localhost', 'root', 'pass');

// on sélectionne la base
mysql_select_db('vkxrpg',$db);

// on crée la requête SQL
$sql = 'SELECT bois FROM ressource_tbl WHERE joueur="volkow"';

// on envoie la requête
$req = mysql_query($sql) or die('Erreur SQL !<br>'.$sql.'<br>'.mysql_error());

// on fait une boucle qui va faire un tour pour chaque enregistrement
while($data = mysql_fetch_array($req))
    {
    // on affiche les informations de l'enregistrement en cours
    echo $data['bois'];
    }

$req2 = "UPDATE ressource_tbl SET bois=bois+$bois WHERE joueur='volkow'";



// on ferme la connexion à mysql
mysql_close();
?>

Eléphant du PHP | 443 Messages

04 oct. 2007, 21:00

C'est ce qu'il me semblais, l'update pour fonctionner, il faut l'exécuter ;)
<?php
// ...
$bois = $_POST['bois'];

// ...
$req2 = "UPDATE ressource_tbl SET bois=bois+$bois WHERE joueur='volkow'";
mysql_query($req2); <----------

?>
tu devrais protéger la chaine sql en écrivant plutot:
$req2 = "UPDATE ressource_tbl SET bois='".mysql_escape_string($bois)."' WHERE joueur='volkow'";
N'hésite pas si tu as un pb...

Eléphant du PHP | 75 Messages

04 oct. 2007, 21:09

:shock:

Je crois que je vais arrêter la programmation, parce que vu l'erreur que j'ai faite...

^^

En plus ça fait 5 jours que j'essaye de trouver le problème, LOL!

Juste, à quoi sert la protection de la chaîne?

:oops:

Merci pour ton aide précieuse!!

:wink:

Eléphant du PHP | 443 Messages

04 oct. 2007, 21:21

Juste, à quoi sert la protection de la chaîne?
parce qu'on peut exécuter plusieurs ordres sql dans un même query, par exemple:
mysql_query('select * from bidule; delete from bidule;');
donc tu peux imaginer, comme le contenu de $bois vient du GET donc définie par le client, comment un hooligan pourrait détruire tous tes efforts:
mysql_query("UPDATE ressource_tbl SET bois=bois+$bois WHERE joueur='volkow'");
// --> que se passerait-il si:
// --> $bois = '0; delete from ressource_tbl; select * from ressource_tbl ';
Bon il devrait avoir de la chance, mais y'a des pervers :?
L'utilisation des quotes autour des paramètres et de mysql_escape_string t'affranchissent de ce genre d'inconvénients.

Bonne soirée.
Modifié en dernier par Tracker le 04 oct. 2007, 21:39, modifié 2 fois.

Eléphant du PHP | 75 Messages

04 oct. 2007, 21:29

Même si le formulaire est protégé par un autre formulaire de login?

En plus, j'ai du mal à tout comprendre!

C'est du complexe pour moi ça ^^!

:roll:

EDIT: je viens de comprendre!!!

En fait, vu que l'on peut enchaîner à la suite plusieurs requêtes, il suffit qu'il mette après la valeur du formulaire la deuxième requête qui supprimerait la table...

OooooKkkkk ^^!

J'ai capté, merci!

Eléphant du PHP | 443 Messages

04 oct. 2007, 21:35

Quoi qu'il en soit, utilise systématiquement les quotes et la fonction mysql_escape_string(...) quand tu injectes une variable dans un ordre SQL.

Prends ça comme une règle :wink:

Eléphant du PHP | 75 Messages

04 oct. 2007, 21:42

Ok merci mais juste, avec:

Code : Tout sélectionner

'".mysql_escape_string($bois)."'
Comment je fais l'incrémentation?

Comme ça:

Code : Tout sélectionner

SET bois=bois+'".mysql_escape_string($bois)."'
?????

Eléphant du PHP | 443 Messages

04 oct. 2007, 22:23

Exactement, bon courage pour la suite.

Modérateur PHPfrance
Modérateur PHPfrance | 6373 Messages

04 oct. 2007, 22:50

Juste, à quoi sert la protection de la chaîne?
parce qu'on peut exécuter plusieurs ordres sql dans un même query, par exemple:
mysql_query('select * from bidule; delete from bidule;');
Non, on ne peut pas exécuter plusieurs requêtes dans un même mysql_query, voir la doc : mysql_query()
mysql_query() envoie une seule requête (les requêtes multiples ne sont pas supportées) à la base de données courante sur le serveur associé avec le link_identifier spécifié.
Liste de paramètres

query

Une requête SQL

La chaîne de requête ne doit pas se terminer par un point-virgule.
Mais tu as quand même raison concernant la protection des données entrées par l'utilisateur, vu qu'il y a d'autres moyens de faire des trucs pas top, par exemple biaiser le résultat de la requête et accéder à des endroits sans avoir l'autorisation ;)


Enfin, Volkow, si ta question est résolue, pense à ajouter le tag [Résolu]
pour indiquer aux personnes qui voudront consulter ce sujet qu'il contient une solution.
Tu peux réaliser cette opération en cliquant sur le bouton Image en haut à gauche de ce sujet.

Eléphant du PHP | 443 Messages

05 oct. 2007, 06:53

Non, on ne peut pas exécuter plusieurs requêtes dans un même mysql_query, voir la doc : mysql_query()
Je suis d'accord, mais quand on débute on n'est jamais un master en SQL, alors une fausse vérité permet, quelque fois, de comprendre le problème.

pour les injections:
http://www.ghostsinthestack.org/article ... s-sql.html

Modérateur PHPfrance
Modérateur PHPfrance | 2575 Messages

05 oct. 2007, 07:17

Celà dit, ce n'est qu'une question de temps, peut être dans les prochaines versions mysql_query() peut devenir transactionnelle et permettre le multi-requêtage. Et à ce moment là :tir2: bonjour les injections SQL par des GET non contrôlés.
--------//////----//---//----//////
-------//---//----//---//----//---//
------//////----//////-----//////
-----||--------||--||---||
Prendre le recul n'est pas une perte de temps.


ps: Affrontez moi dans l'arène

Eléphant du PHP | 443 Messages

05 oct. 2007, 08:42

Il y a d'autres raisons encore, par exemple SQLServeur supporte les 'Compound Statement" dans les query, ex:

Code : Tout sélectionner

BEGIN delete from tlb1 select * from tlb2 END
Mysql pourrait également suivre le même chemin car c'est bien pratique.