Problème PHP/SQL

Fermé
Charly - Modifié par jordane45 le 18/07/2015 à 00:07
jordane45 Messages postés 38173 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 10 mai 2024 - 18 juil. 2015 à 03:48
Bonjour,
J'ai un problème j'ai créé un site en local pour faire des test, un page d'achat, sauf que j'aimerai que la personne puissent acheté qu'une seul fois le produit.
J'utilise if(mysql_num_rows($test) > 0) { pour que quand une personne achète ton username sois trouvé dans la table et que l'action d'achat sois refusé.
Pour mieux voir : https://pastebin.com/MwyeQvct


Merci de votre prochaine réponse,
Cordialement.


Code PHP :

  $achat = Securise($_GET['achat']);
  if($achat == "fanperso") 
  {
   if($user['point'] >= 0) 
   {
    $sql =
    $stock2 = mysql_query("SELECT * FROM stock WHERE utilise = '0' LIMIT 1");
    $stock = mysql_fetch_array($stock2);
    $row = mysql_fetch_assoc($test); 
    $test = mysql_query("SELECT * FROM service_fansite WHERE username=".$user['username']." LIMIT 1");
    mysql_query("INSERT INTO transaction (username,quoi,quand) VALUES ('".$user['username']."','commande service FanSite Grauit ','".FullDate('full')."')");
    mysql_query("INSERT INTO service_fansite (username,service,valable,fin,domaine,acces_utilisateur,acces_mdp,hote,statut) VALUES ('".$user['username']."','FanSite Gratuit','1 mois','".FullDate('default')."','En cours','Pro seulement','Pro seulement','Pro seulement','1')") or die (mysql_error());
    mysql_query("DELETE FROM stock WHERE id = '".$stock['id']."' LIMIT 1");
                header('Location: sitefan?achat=ok');
            } 
             else 
            {
    if(mysql_num_rows($test) > 0) {
    header('Location: sitefan?achat=non');
   }
  }
  }
  
      if(isset($_GET['achat'])) 
 { 
  $achat = Securise($_GET['achat']); 
  if($achat == "ok") { $message = '
      <div class="alert alert-dismissible alert-success">
      <button type="button" class="close" data-dismiss="alert">×</button>
      <strong><center>Bravo! votre service viens d\'être commandé.</center></strong>
    </div>
  '; }
  elseif ($achat == "non") { $message = '
      <div class="alert alert-dismissible alert-danger">
      <button type="button" class="close" data-dismiss="alert">×</button>
      <strong><center>Vous n\'avez pas assez de points. <a href="recharge">clic ici</a> pour en acheter</center></strong>
    </div>
  '; }
  elseif(empty($achat)) { header('Location:./sitefan'); }
 }



EDIT : Ajout des balises de code. (la coloration syntaxique )
Explication disponible ici : https://codes-sources.commentcamarche.net/faq/10686-le-nouveau-codes-sources-comment-ca-marche#balises-code

Merci d'y penser à l'avenir.
A voir également:

2 réponses

jordane45 Messages postés 38173 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 10 mai 2024 4 665
18 juil. 2015 à 00:14
Bonjour,

1 - Tu as une variable $sql = .. sans rien derrière !

2 - Ton MysqlNumRows se trouve dans ton ELSE ... alors que l'exécution de ta requête est dans le bloc if juste avant..... Normal que ça n'aille pas...


PS : La norme PSR-2 préconnise l'écriture des IF / ELSE de la forme suivante ( l'accolade ouvrante sur la même ligne...)
Comme ceci :
if(condition) {
  //....
}elseif( condition...){
 //...
}else{
 // ....
}
 

Essaye de la respecter...ça rend le code plus lisible.

Ce qui.. une fois ton code remis en forme donne :
$achat = Securise($_GET['achat']);
  if($achat == "fanperso"){
   if($user['point'] >= 0){
    $sql =
    $stock2 = mysql_query("SELECT * FROM stock WHERE utilise = '0' LIMIT 1");
    $stock = mysql_fetch_array($stock2);
    $row = mysql_fetch_assoc($test); 
    $test = mysql_query("SELECT * FROM service_fansite WHERE username=".$user['username']." LIMIT 1");
    mysql_query("INSERT INTO transaction (username,quoi,quand) VALUES ('".$user['username']."','commande service FanSite Grauit ','".FullDate('full')."')");
    mysql_query("INSERT INTO service_fansite (username,service,valable,fin,domaine,acces_utilisateur,acces_mdp,hote,statut) VALUES ('".$user['username']."','FanSite Gratuit','1 mois','".FullDate('default')."','En cours','Pro seulement','Pro seulement','Pro seulement','1')") or die (mysql_error());
    mysql_query("DELETE FROM stock WHERE id = '".$stock['id']."' LIMIT 1");
                header('Location: sitefan?achat=ok');
    } else {
      if(mysql_num_rows($test) > 0) {
      header('Location: sitefan?achat=non');
    }
   }
  }
  
 if(isset($_GET['achat'])){ 
  $achat = Securise($_GET['achat']); 
  if($achat == "ok") { 
     $message = '
      <div class="alert alert-dismissible alert-success">
      <button type="button" class="close" data-dismiss="alert">×</button>
      <strong><center>Bravo! votre service viens d\'être commandé.</center></strong>
    </div>'; 
  }elseif($achat == "non") { 
    $message = '
      <div class="alert alert-dismissible alert-danger">
       <button type="button" class="close" data-dismiss="alert">×</button>
       <strong><center>Vous n\'avez pas assez de points. <a href="recharge">clic ici</a> pour en acheter</center></strong>
      </div>'; 
  }elseif(empty($achat)) { 
   header('Location:./sitefan'); 
  }
 }

NB : Tu constateras que j'ai mis le code entre "balises de code" (autrement dit.. avec la coloration syntaxique ! )

NB2 : Ce code n'est pas "corrigé" ... l'explication de ton souci ayant été donné plus haut.

0
Bonjour,
Merci de votre réponse !
J'ai suivi votre conseil,
Après avoir essayer comme vous m'avez dit j'ai eu ceci : (En bas)
Le seul problème c'est que quand je met if(mysql_num_rows($test) >= 1)
Je peux rien acheté, if(mysql_num_rows($test) == 1) Pareil je peux rien acheté,
if(mysql_num_rows($test) <= 1) Alors que la je peux acheté dans tout les cas que je possède déjà le produit ou non, hors se que je voudrais c'est une fois qu'un utilisateur à acheté ce produit 1 fois, qu'il puisse pu en racheté un.
Je suis désoler mais je début en php, puis le script qui est la je l'ai pris sur un forum puis modifier avec se que j'avais besoin.

Merci, Cordialement.

$achat = Securise($_GET['achat']);
  if($achat == "fanperso"){
   if($user['point'] >= 0){
   if(mysql_num_rows($test) >= 1) {
    $sql =
    $stock2 = mysql_query("SELECT * FROM stock WHERE utilise = '0' LIMIT 1");
    $stock = mysql_fetch_array($stock2);
    $test = mysql_query("SELECT * FROM service_fansite WHERE username = ".$user['username']." LIMIT 1");
    mysql_query("INSERT INTO transaction (username,quoi,quand) VALUES ('".$user['username']."','commande service FanSite Grauit ','".FullDate('full')."')");
    mysql_query("INSERT INTO service_fansite (username,service,valable,fin,domaine,acces_utilisateur,acces_mdp,hote,statut) VALUES ('".$user['username']."','FanSite Gratuit','1 mois','".FullDate('default')."','En cours','Pro seulement','Pro seulement','Pro seulement','1')") or die (mysql_error());
    mysql_query("DELETE FROM stock WHERE id = '".$stock['id']."' LIMIT 1");
    header('Location: sitefan?achat=ok');
    } else {
      header('Location: sitefan?achat=non');
    }
   }
  }
0
jordane45 Messages postés 38173 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 10 mai 2024 4 665 > Charly
18 juil. 2015 à 02:53
Tu n'as toujours pas compris visiblement....
Tu fais appelle à la fonction mysql_num_rows... sur la variable $test....
Variable que tu initialise via ta requête à l'interieur de ton bloc IF ...
et donc.... $test ne vaut rien !
En plus..; tu as toujours cette ligne
 $sql =  
qui se balade toute seule.....
0
jordane45 Messages postés 38173 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 10 mai 2024 4 665
Modifié par jordane45 le 18/07/2015 à 02:55
Je n'avais pas vu non plus que ta requête
  $test = mysql_query("SELECT * FROM service_fansite WHERE username = ".$user['username']." LIMIT 1");

sera toujours fausse... car tu as oublié les quotes autour de ton username.


PS: Tu utilises l'extension mysql_* ... qui est considérée comme obsolète !
je t'invite vivement à passer à la PDO.
Voici un peu de lecture :

https://www.commentcamarche.net/faq/43261-php-l-extension-mysql-est-obsolete#top

https://www.commentcamarche.net/faq/44117-connexion-a-une-base-avec-pdo-mysqli

.
0
jordane45 Messages postés 38173 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 10 mai 2024 4 665
18 juil. 2015 à 02:56
Je viens également de voir ton delete
  mysql_query("DELETE FROM stock WHERE id = '".$stock['id']."' LIMIT 1");

Tu veux dire que tu n'as qu' UN SEUL produit à chaque fois ?
Tu ne gères pas des quantités ??
0
jordane45 Messages postés 38173 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 10 mai 2024 4 665
Modifié par jordane45 le 18/07/2015 à 03:00
Et pour finir ..... prend l'habitude de séparer tes requêtes de leur exécution
par exemple :
$username = $user['username'];
$sql = "SELECT * 
       FROM service_fansite 
    WHERE username = 'username' 
    LIMIT 1";

$test = mysql_query($sql) or die( "ERROR ! ".mysql_error() . "<br>Erreur dans la requete :<br>";$sql);

En cas d'erreur... (avec l'extension Mysql_* ).. tu peux utiliser un OR DIE ... et y afficher la requête !
0
jordane45 Messages postés 38173 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 10 mai 2024 4 665
Modifié par jordane45 le 18/07/2015 à 03:49
Voici ton code en parti remis en forme....

- J'ai viré les ELSEIF en pagaille.. pour les remplacer par un SWITCH (plus lisible! )

- J'ai commencé à remettre tes requêtes en formes... je te laisse finir

- Je récupère les variables AVANT de les utiliser ... et je ne le fais qu'une seule fois.....

VOilou :

//récuperation des variables
$username = isset($user['username'])?$user['username']:'';
$achat = isset($_GET['achat']) ? Securise($_GET['achat']) : '';

switch($achat){

    case "fanperso":
 if($user['point'] >= 0){

           //Vérification achat non.
           $sql = "SELECT * 
                     FROM service_fansite 
                    WHERE username = '$username' 
                    LIMIT 1";

           $test = mysql_query($sql) or die( "ERROR ! ".mysql_error() . "<br>Erreur dans la requete :<br>".$sql);
         
         if(mysql_num_rows($test) > 0) {
             header('Location: sitefan?achat=non');
          }

   $sql = "SELECT * FROM stock WHERE utilise = '0' LIMIT 1";
   $stock2 = mysql_query($sql) or die( "ERROR ! ".mysql_error() . "<br>Erreur dans la requete :<br>".$sql);
   $stock = mysql_fetch_array($stock2);
  
   mysql_query("INSERT INTO transaction (username,quoi,quand) VALUES ('$username','commande service FanSite Grauit ','".FullDate('full')."')");
  
   mysql_query("INSERT INTO service_fansite (username,service,valable,fin,domaine,acces_utilisateur,acces_mdp,hote,statut) 
            VALUES ('$username','FanSite Gratuit','1 mois','".FullDate('default')."','En cours','Pro seulement','Pro seulement','Pro seulement','1')") or die (mysql_error());
  
    mysql_query("DELETE FROM stock WHERE id = '".$stock['id']."' LIMIT 1");

    header('Location: sitefan?achat=ok');
  }
    break;

    case "ok":
 $message = '
   <div class="alert alert-dismissible alert-success">
    <button type="button" class="close" data-dismiss="alert">×</button>
    <strong><center>Bravo! votre service viens d\'être commandé.</center></strong>
   </div>'; 
    break;

   case "non":
    $message = '
    <div class="alert alert-dismissible alert-danger">
     <button type="button" class="close" data-dismiss="alert">×</button>
     <strong><center>Vous n\'avez pas assez de points. <a href="recharge">clic ici</a> pour en acheter</center></strong>
    </div>'; 
 break;

   case "":
 header('Location:./sitefan'); 
 break; 
 
   default:
    // aucune valeur correspondante !
    header('Location:./sitefan'); 
  break;
}


Cordialement,
Jordane
0
Je te remercie beaucoup d'avoir pris du temps pour moi,
Je suis vraiment obligé de passé sous du pdo ?
Déjà que je galère avec le php/sql, après si il est meilleur de passé sous pdo, tempis je vais essayer d'apprendre !

Merci beaucoup !
0
jordane45 Messages postés 38173 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 10 mai 2024 4 665
18 juil. 2015 à 03:48
Je confirme... c'est mieux.
0