Probléme de checkbox

Eléphanteau du PHP | 15 Messages

15 nov. 2007, 23:12

Bonjour je débute en php et je suis face à un petit problème.

Je suis entrain de créer une interface de gestion de point en php pour ma guilde (jeux world of warcraft).

Explication:

j ai donc créer 3 page php relier a une base de donnée .
La première page et juste une récap des points des joueurs, avec en prime, un lien a coté de chaque nom qui me permet d'accédé a la seconde page, qui n'est rien d’autre que la page de mise a jour des points sous forme de formulaire.
La dernière page sert juste a me dire si tout c'est bien passé.

Explication en image:

page1
Image

page2
Image

page3
Image

Mon problème:

Voici mon petit problème j ai créer en page 2 deux case a coché, qui normalement, la case 1 devrait ajouté +1 dkp si coché, et la case 2 +10 dkp si coché.
Si je coche qu'une seule case sur les 2 cela fonctionne très bien les dkp (point) sont mis a jour : D
Par contre si je coche les deux case (se qui risque d'arrivé souvent) sa me renvoie sur la page trois (logique^^) mais en fait les changement ne sont pas pris en compte et sa modifie les dkp de la personne sélectionné a zéro au lieu d’avoir comme résultat un ajout de 11 dkp.

Donc si quelqu’un aurais une solution SVP se serait très aimable par avance merci .

Voici mon code de la page 2 car mon problème vient de cette page :
<?php
  //connection au serveur:
  $cnx = mysql_connect( "localhost", "root", "" ) ;
  
  //sélection de la base de données:
  $db = mysql_select_db( "bob" ) ;
  
  //récupération de la variable d'URL,
  //qui va nous permettre de savoir quel enregistrement modifier
  $id  = $_GET["id"] ;
  
  //requête SQL:
  $sql = "SELECT * FROM paladin WHERE id = $id";
	    
  //exécution de la requête:
  $requete = mysql_query( $sql, $cnx ) ;
  
  //affichage des données:
  if( $result = mysql_fetch_object( $requete ) )
  {
  ?>
<form name="insertion" action="modif3.php" method="POST">
  <input type="hidden" name="id" value="<?php echo($id) ;?>">
  <table border="2" align="center" cellspacing="2" cellpadding="2">
    <tr align="center">
      <td bgcolor="#FFFFFF">nom</td>
      <td><input type="text" name="nom" value="<?php echo($result->nom) ;?>"></td>
    </tr>
    <tr align="center">
      <td bgcolor="#FFFFFF">dkp</td>
      <td><input type="text" name="dkp" value="<?php echo($result->dkp) ;?>"></td>
    </tr>
    <tr align="center">
      <td bgcolor="#FFFFFF">inscription</td>
      <td bgcolor="#FFFFFF"><div align="left">
        <input type="checkbox" name="dkp" value="<?php echo($result->dkp+1) ;?>">
      +1 si inscrit</div></td>
    </tr>
    <tr align="center">
      <td bgcolor="#FFFFFF">presence</td>
      <td bgcolor="#FFFFFF"><div align="left">
        <input type="checkbox" name="dkp" value="<?php echo($result->dkp+10) ;?>">
      +10 si present</div></td>
    </tr>
    <tr align="center">
      <td colspan="2" bgcolor="#FFFFFF"><p>
        <input type="submit" value="modifier">
          </p>        </td>
    </tr>
  </table>
</form>
  <?php
  }//fin if 
  ?>
Bon ok se n'est pas de l'art mais je rappelle je débute :D

Eléphant du PHP | 445 Messages

15 nov. 2007, 23:18

Changes le nom de tes checkbox.

Tu as :
1. hidden -> id
2. text -> nom
3. text -> dkp
4. checkbox -> dkp
5. checkbox -> dkp

Eléphanteau du PHP | 15 Messages

15 nov. 2007, 23:28

Merci pour cette réponse : D
j'ai déjà testé et si je change les noms rien ne se passe :( je passe en page 3 comme si tout c’été bien passé mais quand je vais vérifier dans la page 1 rien ne bouge snif merci quand même :D

Eléphanteau du PHP | 15 Messages

15 nov. 2007, 23:31

j'ai aussi testé avec :
<input type="checkbox" name="dkp[]" value="<?php echo($result->dkp+10) ;?>">
Et la pire sa me renvoie sur une éreur

Eléphant du PHP | 91 Messages

15 nov. 2007, 23:41

Je ne sais pas ce que tu as compris, mais ce que voulais dire h0_noMan, c'est qu'il ne faut pas désigner plusieurs éléments de ton formulaire par le même attribut name, hors ici, tes checkbox s'appellent toutes les 2 dkp, ainsi que ton champ text.

Comment peut tu les différencier ensuite dans ta page 3 si ils ont tous la même dénomination ? :wink:

Tu devrais poster le code de ta page 3 si tu souhaites une aide plus précise.

Eléphanteau du PHP | 15 Messages

15 nov. 2007, 23:45

ok merci tong :D

voici le code de la page 3:
<?php
  //connection au serveur
  $cnx = mysql_connect( "localhost", "root", "" ) ;
 
  //sélection de la base de données:
  $db  = mysql_select_db( "bob" ) ;
 
  //récupération des valeurs des champs:
  //nom:
  $nom     = $_POST["nom"] ;
  //prenom:
  $dkp = $_POST["dkp"] ;
  //récupération de l'identifiant de la personne:
  $id         = $_POST["id"] ;
  
  //création de la requête SQL:
 $sql ="UPDATE paladin SET nom='$nom', dkp='$dkp' WHERE id='$id'";
  //exécution de la requête SQL:
  $requete = mysql_query($sql, $cnx) or die( mysql_error() ) ;
 
  
  //affichage des résultats, pour savoir si la modification a marchée:
  if($requete)
  {
    echo("La modification à été correctement effectuée") ;
  }
  else
  {
    echo("La modification à échouée") ;
  }
?>

Eléphant du PHP | 445 Messages

16 nov. 2007, 00:01

Donc change le nom de tes checkbox pour qu'aucun champs n'ait le meme nom qu'un autre.

Puis dans ta page3, il faut aussi que tu recuperes ces valeurs comme tu recuperes le nom.

Eléphanteau du PHP | 15 Messages

16 nov. 2007, 00:04

ok je teste sa et je re :)
merci bien pour votre aide

Eléphanteau du PHP | 15 Messages

16 nov. 2007, 00:14

ok donc voila je vien de modifier tout sa est j'ai une éreur sur la page 3 :
Champ 'inscrit' inconnu dans field list
modif sur la page 2:
<?php
  //connection au serveur:
  $cnx = mysql_connect( "localhost", "root", "" ) ;
  
  //sélection de la base de données:
  $db = mysql_select_db( "bob" ) ;
  
  //récupération de la variable d'URL,
  //qui va nous permettre de savoir quel enregistrement modifier
  $id  = $_GET["id"] ;
  
  //requête SQL:
  $sql = "SELECT * FROM paladin WHERE id = $id";
	    
  //exécution de la requête:
  $requete = mysql_query( $sql, $cnx ) ;
  
  //affichage des données:
  if( $result = mysql_fetch_object( $requete ) )
  {
  ?>
<form name="insertion" action="modif3.php" method="POST">
  <input type="hidden" name="id" value="<?php echo($id) ;?>">
  <table border="2" align="center" cellspacing="2" cellpadding="2">
    <tr align="center">
      <td bgcolor="#FFFFFF">nom</td>
      <td><input type="text" name="nom" value="<?php echo($result->nom) ;?>"></td>
    </tr>
    <tr align="center">
      <td bgcolor="#FFFFFF">dkp</td>
      <td><input type="text" name="dkp" value="<?php echo($result->dkp) ;?>"></td>
    </tr>
    <tr align="center">
      <td bgcolor="#FFFFFF">inscription</td>
      <td bgcolor="#FFFFFF"><div align="left">
        <input type="checkbox" name="inscrit" value="<?php echo($result->dkp+1) ;?>">
      +1 si inscrit</div></td>
    </tr>
    <tr align="center">
      <td bgcolor="#FFFFFF">presence</td>
      <td bgcolor="#FFFFFF"><div align="left">
        <input type="checkbox" name="present" value="<?php echo($result->dkp+10) ;?>">
      +10 si present</div></td>
    </tr>
    <tr align="center">
      <td colspan="2" bgcolor="#FFFFFF"><p>
        <input type="submit" value="modifier">
          </p>        </td>
    </tr>
  </table>
</form>
  <?php
  }//fin if 
  ?>
modif sur la page 3:
<?php
  //connection au serveur
  $cnx = mysql_connect( "localhost", "root", "" ) ;
 
  //sélection de la base de données:
  $db  = mysql_select_db( "bob" ) ;
 
  //récupération des valeurs des champs:
  //nom:
  $nom     = $_POST["nom"] ;
  //prenom:
  $dkp = $_POST["dkp"] ;
  //inscrit:
  $inscrit = $_POST["inscrit"] ;
  //present:
  $present = $_POST["present"] ;
  //récupération de l'identifiant de la personne:
  $id         = $_POST["id"] ;
  
  //création de la requête SQL:
 $sql ="UPDATE paladin SET nom='$nom', dkp='$dkp', inscrit='$inscrit', present='$present' WHERE id='$id'";
  //exécution de la requête SQL:
  $requete = mysql_query($sql, $cnx) or die( mysql_error() ) ;
 
  
  //affichage des résultats, pour savoir si la modification a marchée:
  if($requete)
  {
    echo("La modification à été correctement effectuée") ;
  }
  else
  {
    echo("La modification à échouée") ;
  }
?>
pouré tu corigé mon éreur stp ?

Eléphant du PHP | 445 Messages

16 nov. 2007, 00:19

Tu n'as pas d'erreur en soi meme.

Une checkbox non cochée n'envoie pas de valeur.
Donc tu dois :

1. Tester si la checkbox a retourné quelque chose (isset() par exemple)
- Si oui alors tu recupères sa valeur (ca tu l'a deja fait)
- Si non alors elle n'est pas coché.

Et tu dois faire cela avec les 2 checkbox.

Eléphant du PHP | 91 Messages

16 nov. 2007, 00:22

Une checkbox n'est pas transmise si elle n'est pas cochée.

Tu dois donc tester l'existence de $_POST["inscrit"] et = $_POST["present"] avant d'essayer de les affecter à tes variables $inscrit et $present

Le test d'existence se fait grâce à la fonction isset()

Tu remplaces donc

Code : Tout sélectionner

$inscrit = $_POST["inscrit"] ;
Par

Code : Tout sélectionner

$inscrit = (isset($_POST["inscrit"])) ? $_POST["inscrit"] : 0;
EDIT : Grilled :wink:

Eléphanteau du PHP | 15 Messages

16 nov. 2007, 00:37

Donc voila j ai modifier la ligne comme tu a marqué ,j'ai le message d éreur suivant:
Champ 'inscrit' inconnu dans field list

Eléphant du PHP | 91 Messages

16 nov. 2007, 00:46

La c'est au niveau de ta base de donnée que tu as un problème. Tu essaye d'accéder à un champ qui n'existe pas.

J'imagine que ta base n'a qu'un seul champ dkp, et pas de champ inscrit et présent. La requête de ta page3 était donc bonne, il faut juste que tu calcule la valeur à donner à dkp.

Code : Tout sélectionner

$dkp = $_POST["dkp"] ; $dkp += (isset($_POST["inscrit"])) ? $_POST["inscrit"] : 0; $dkp += (isset($_POST["present"])) ? $_POST["present"] : 0;
Puis tu reprend ta 1ere requete, qui était bonne

Code : Tout sélectionner

$sql ="UPDATE paladin SET nom='$nom', dkp='$dkp' WHERE id='$id'";

Eléphanteau du PHP | 15 Messages

16 nov. 2007, 00:58

merci! merci! merci! sa marche :D

j'ai quand méme un dernier probléme lol

explication :

la checkbox inscrit et present sont parano ^^ normalement si je selectione les deux sa doit juste rajouté 11 dkp alors que la sa se multipli .
sinon je suis sur et se grace a vous que je suis pas loin du but :)

Eléphant du PHP | 445 Messages

16 nov. 2007, 00:58

Je rajouterais un intval dans le tas.
$dkp = $_POST["dkp"] ;
$dkp += (isset($_POST["inscrit"])) ? intval($_POST["inscrit"]) : 0;
$dkp += (isset($_POST["present"])) ? intval($_POST["present"]) : 0; 
Et dans une requete, les champs de type numerique ne doivent pas entre encapsuler entre 2 quote.