Problème update query

LeRelOo
Invité n'ayant pas de compte PHPfrance

31 janv. 2013, 08:10

Bonjour à tous, Je block un peut sur une update en sql...

J'expose, j'ai un formulaire ou je rentre un pseudo, pour y ajouter un chiffre bien précis dans son "portefeuille virtuel" quand je valide le pseudo sur ce formulaire, cela est censé me remplacer la somme par la somme + la somme que je veut additionner ! Vous suivez ? :D

Exemple ici, au lieu de calculer la somme présente + les 2000, ça me met le champ `somme` à 2000 , au lieu de 2000 + la somme déjà présente :/
<?php
$serveur_mysql = "xxxxx";
$utilisateur_mysql = "xxxxx";
$mot_de_passe_mysql = "xxxxx";
$nom_de_la_base = "xxxxx";

$connexion = mysql_connect($serveur_mysql, $utilisateur_mysql, $mot_de_passe_mysql);
$selection_de_la_base = mysql_select_db($nom_de_la_base,$connexion);

$req_pseudo=mysql_query("SELECT `portefeuille` WHERE `username`='".$_POST['pseudo']."'");
$tabresult=mysql_fetch_array($req_pseudo);
$somme_depart=$tabresult[0];
$somme_arrivee=$somme_depart+2000;

mysql_query("UPDATE `portefeuille` SET `somme`='".$somme_arrivee."' WHERE `username`='".$_POST['pseudo']."'");
mysql_close();
header("location: index.php");
exit();

?>
J'ai volontairement mis des xxxxx ... sachez que le script marche, enfin, mis à part qu'il calcule pas la somme présente pour y ajouter les 2000 :s

Ou me trompe-je ? s'il vous plait =D

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

31 janv. 2013, 09:34

Salut,


Update table SET somme = somme + $somme where ta condition ;)

Si somme est un entier pas de quote (') c'est inutile ;)

Pour info ton code est ouvert au faille SQL (demande a Google injection SQL pour plus d'info).
Utilise mysql_real_escape_string sur les valeurs du formulaire.

Tu peux aussi te tourner vers l'extension mysqli plutôt que mysql qui est dépréciée depuis la future version de php (5.5) et sera supprimée un jour (histoire de pas être emmerdé un jour).

@+
Il en faut peu pour être heureux ......

LeRelOo
Invité n'ayant pas de compte PHPfrance

31 janv. 2013, 10:04

Mmhh tout ça pour ça !!

en gros je remplace
$req_pseudo=mysql_query("SELECT `portefeuille` WHERE `username`='".$_POST['pseudo']."'");
$tabresult=mysql_fetch_array($req_pseudo);
$somme_depart=$tabresult[0];
$somme_arrivee=$somme_depart+2000;
par :
$somme=2000;
et
mysql_query("UPDATE `portefeuille` SET `somme`='".$somme_arrivee."' WHERE `username`='".$_POST['pseudo']."'");
par:
mysql_query("UPDATE `portefeuille` SET `somme`=`somme`+'".$somme."' WHERE `username`='".$_POST['pseudo']."'");
Youpiii ça fonctionne !! un grand merci !!
Et pour les failles... :/ c'est une autre paire de manches xD car je débute ! merci pour l'info je vais voir ce que je peut faire.

ViPHP
ViPHP | 2577 Messages

31 janv. 2013, 10:13

C'est effectivement ca. La solution de Moogli est la "plus jolie".

Dans ton premier script, le select n'était pas correct :
$req_pseudo=mysql_query("SELECT somme from `portefeuille` WHERE `username`='".$_POST['pseudo']."'");
Pour info, il faut demander à php d'afficher les erreurs (error_reporting dans php.ini ou fonction error_reporting()) et tester la bonne exécution des requetes (mysql_error() et mysql_errno()).

LeRelOo
Invité n'ayant pas de compte PHPfrance

31 janv. 2013, 10:35

Merci pour cet infos, et, puis-je abuser de votre sympathie pour les injections ? voici donc mon formulaire:
<form id="form1" method="post" action="script.php">
<p>
<label>
Entrez votre pseudo igame :<br />
<input type="text" name="pseudo" id="pseudo" />
</label>
</p>
<p>
<label>
<input type="submit" name="button" id="button" value="Submit" />
</label>
</p>
</form>
et donc mon script.php:
<?php
$serveur_mysql = "xxx";
$utilisateur_mysql = "xxx";
$mot_de_passe_mysql = "xxx";
$nom_de_la_base = "xxx";

$connexion = mysql_connect($serveur_mysql, $utilisateur_mysql, $mot_de_passe_mysql);
$selection_de_la_base = mysql_select_db($nom_de_la_base,$connexion);

$somme=20;

mysql_query("UPDATE `xxx` SET `somme`=`somme`+'".$somme."' WHERE `username`='".$_POST['pseudo']."'");
mysql_close();
header("location: index.php");
exit();
?>
Y-a t-il un réel danger pour le reste de mes table sur la même base ? voir pour les autres bases du serveur ?
Si oui, que dois-je faire s'il vous plait, parce que pour être franc ! Je vais pas y arriver de-suite et le formulaire est déjà accessible à certaine personne :s

ViPHP
xTG
ViPHP | 7331 Messages

31 janv. 2013, 11:10

En effet il est tout à fait possible de faire ce que l'on veut de ta base de données. :)
$_POST['pseudo'] peut être modifié pour modifier ta requête.
Par exemple :

Code : Tout sélectionner

' OR 1 = 1
Ta requête deviendra :
UPDATE `xxx` SET `somme`=`somme` + ... WHERE `username`= '' OR 1 = 1
Et modifiera tous les champs. ;)

Pour éviter cela tu as la fonction mysql_real_escape_string() qui échappe les données.
A noter aussi que le driver mysql est obsolète (plus de mises à jour, même de sécurité) et qu'il sera à terme supprimé de PHP.
Il faut donc t'habituer à utiliser mysqli (fonctions très proches des fonctions mysql) ou l'interface PDO.

Petit nouveau ! | 1 Messages

31 janv. 2013, 11:32

Ok ok, bon, ben je vais devoir lire :roll:

Je pense que je vais stopper ma nuit blanche ici, me faire une bonne sieste, et voir tout cela plus tard !
Encore merci à tous, j'ai déjà un autres sujet à faire, avec une while qui me casses les roupettes !!

à très vite !
Cordialement