Page 1 sur 2

Probléme de checkbox

Posté : 15 nov. 2007, 23:12
par arcä
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

Posté : 15 nov. 2007, 23:18
par h0_noMan
Changes le nom de tes checkbox.

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

Posté : 15 nov. 2007, 23:28
par arcä
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

Posté : 15 nov. 2007, 23:31
par arcä
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

Posté : 15 nov. 2007, 23:41
par Tong
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.

Posté : 15 nov. 2007, 23:45
par arcä
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") ;
  }
?>

Posté : 16 nov. 2007, 00:01
par h0_noMan
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.

Posté : 16 nov. 2007, 00:04
par arcä
ok je teste sa et je re :)
merci bien pour votre aide

Posté : 16 nov. 2007, 00:14
par arcä
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 ?

Posté : 16 nov. 2007, 00:19
par h0_noMan
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.

Posté : 16 nov. 2007, 00:22
par Tong
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:

Posté : 16 nov. 2007, 00:37
par arcä
Donc voila j ai modifier la ligne comme tu a marqué ,j'ai le message d éreur suivant:
Champ 'inscrit' inconnu dans field list

Posté : 16 nov. 2007, 00:46
par Tong
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'";

Posté : 16 nov. 2007, 00:58
par arcä
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 :)

Posté : 16 nov. 2007, 00:58
par h0_noMan
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.