PHP|Débutant :: Forums

Advertisement

Besoin d'aide ? N'hésitez pas, mais respectez les règles

Vous n'êtes pas identifié(e).

#1 02-09-2010 15:31:00

debe
Membre
Inscription : 25-06-2009
Messages : 87

test pas toujours efficace

bonjour,
encore une panne que je n'arrive pas à reproduire. je fais une vérification afin que des personnes n'arrivent pas à signer deux fois une même pétition.
de mon coté, je n'arrive pas à signer deux fois, j'ai bien le message "vous avez déjà signé"

mais certaine personnes sont en doublons parmi les signataires (leur identifiant unique, pas que leur nom)

j'ai une table signataire (id_signataire, nom etc...), une pétition (id_petition, texte etc...) et une table verif_petition avec id_signataire, id_petition.

je teste avec nom, prenom, adresse mel si la personne existe. si non, je l'ajoute, si oui, je test si elle a déjà signé. c'est sur cette partie que j'ai un soucis (c'est forcément la même personne car il renvoie le même id_signataire)


<?php
// 1-c il existe alors je regarde s'il a déjà signé   
        $query = "SELECT id_verif FROM verif_petition WHERE id_signataire = '$id_signataire' && id_petition = '$id'";
        $dem = mysql_query($query) or die('Erreur SQL !'.$query.'<br>'.mysql_error();
        $res = mysql_num_rows ($dem);
        //il a déja signé
        if($res!='0')
          {  
          ?>
            <h2>Vous avez déjà participé</h2>
           
          <?php
          }
          // il n'a pas signé
        else {
      $id = $_POST['id'];
      $sql = "INSERT INTO verif_petition(id_verif,id_petition,id_signataire,date,enligne) VALUES('','$id','$id_signataire',now(),'$enligne')";
            mysql_query($sql) or die('Erreur SQL !'.$sql.'<br>'.mysql_error());          
}        
?>
 

ce code fonctionne a chaque fois que je l'essaie, en local et sur le site, et pourtant, certains signent 2 voir 3 fois.

Hors ligne

#2 02-09-2010 21:02:08

moogli
Modérateur
Inscription : 08-05-2009
Messages : 336
Site Web

Re : test pas toujours efficace

salut,

si tu regarde bien la doc de mysql_num_rows tu pourra voir que cette fonction retourne un entier, décrit dans le prototype :

doc MySQL a écrit :

int mysql_num_rows  ( resource $result  )

et toi tu test ligne 7

<?php if($res!='0') ?>

qui littéralement signifie si le contenu de la variable $res est différent du texte '0' alors ...

hors c'est toujours le cas car le nombre entier zéro est différent de la chaine de caractère '0'.

je te conseil plutôt d'utiliser mysql pour faire le calcul et bien sur de vérifier le type donnée que tu compare smile


<?php
// 1-c il existe alors je regarde s'il a déjà signé  
// heu ça sort d'où $id_signataire & id_petition ?, tu ne doit mettre entre ' les indexs puisse qu'ils sont (a priori) numérique !
$query = "SELECT count(id_verif) as nbsignature FROM verif_petition WHERE id_signataire='$id_signataire' && id_petition=$id";
$dem = mysql_query($query);
if ($dem === false ){
  // Attention il faut éviter d'afficher se genre de chose en production !
  echo '<p class="erreurSQL">Erreur SQL : '.mysql_error().'<br />Avec la requete : '.$query.'</p>';
}
else {
  $res = mysql_fetch_assoc($dem);// je sais qu'il n'y aura qu'un tuple car c'est ce que l'on demande
  if($res['nbsignature'] == 0){  
    // pas de signature
    if ( !empty($_POST['id'])) { // Ben faut être sûre que cette index existe !
      $sql = 'INSERT INTO verif_petition(id_verif,id_petition,id_signataire,date,enligne) VALUES(null,\''.mysql_real_escape_string($_POST['id']).'\',\''.$id_signataire.'\',now(),\''.$enligne.'\')';
      $ret = mysql_query($sql);
      if ($ret === false) {
        echo '<p class="erreurSQL">Erreur SQL : '.mysql_error().'<br />Avec la requete : '.$query.'</p>';
      }
      else {
        echo '<p class="felicitation">Votre signature à bien été enregistrée</p>';
      }
    }
    else {
      echo '<p class="erreur">Pas touche au formulaire ...................</p>'; // ;)
    }
  }
  else {
    // deja signé cette pétition !
    echo '<h2>Vous avez déjà participé</h2>';
  }        
}
?>
 

@+


Il en faut peu pour être heureux pompompompompompompompompompompom

Hors ligne

#3 03-09-2010 10:58:04

debe
Membre
Inscription : 25-06-2009
Messages : 87

Re : test pas toujours efficace

merci pour cette réponse très instructive ... j'ai encore du travail avant de savoir programmer
pour cela
!empty($_POST['id'])
je ne t'avais pas tout mis, le test se fait dès l'ouverture de la page. mais à le relire, toujours avec le même soucis que je vais corriger grâce à ton message

[code = php]if(!is_numeric($id))     
{
echo" </title></head><body>";
require_once("../include/en_tete.inc");
echo "<h2>Erreur </h2> Cette requête n'est pas valide.<p>Consulter la liste des cyber actions et pétitions ";
    echo '<a href="http://www.cyberacteurs.org/actions">sur cette page : http://www.cyberacteurs.org/actions</a>';
exit();
}
else
{
$sql = "SELECT id_petition FROM petition WHERE id_petition = '$id' && valid = 'oui'";
$req = mysql_query($sql) or die('Erreur SQL !'.$sql.'<br>'.mysql_error());
$result = mysql_num_rows ($req);
    if($result=='0')
    {
    echo" </title></head><body>";
    require_once("../include/en_tete.inc");
    echo '<h2>Cyber action / pétition </h2><strong>Aucune pétition ou cyber action ne correspond à votre demande.</strong><p> La pétition ou cyber action demandée n\'existe peut être plus.<p> Vous pouvez en voir le bilan sur cette page <a href="../archives/index.php">http://www.cyberacteurs.org/archives</a> <p>ou bien consulter la liste des cyber actions et pétitions <a href="../actions/index.php">http://www.cyberacteurs.org/actions</a>' ;
[/code]

Hors ligne

#4 03-09-2010 13:08:17

debe
Membre
Inscription : 25-06-2009
Messages : 87

Re : test pas toujours efficace

juste un truc quand même, cette page
http://www.cyberacteurs.org/actions/pre … p?id=15412
a un $id qui n'existe pas et est testé comme précédement.
#
$sql = "SELECT id_petition FROM petition WHERE id_petition = '$id' && valid = 'oui'";
#
$req = mysql_query($sql) or die('Erreur SQL !'.$sql.'<br>'.mysql_error());
#
$result = mysql_num_rows ($req);
#
  if($result=='0')
#
  {}

et renvoie bien le resultats la pétition n'existe pas

comment cela fait que ça marche si je me suis trompé ?

Hors ligne

#5 04-09-2010 20:25:59

moogli
Modérateur
Inscription : 08-05-2009
Messages : 336
Site Web

Re : test pas toujours efficace

auto cast ?

je vois pas d'autre idée

@+


Il en faut peu pour être heureux pompompompompompompompompompompom

Hors ligne

#6 06-09-2010 10:41:51

debe
Membre
Inscription : 25-06-2009
Messages : 87

Re : test pas toujours efficace

je viens de chercher sur internet mais je ne comprend pas ce terme "auto cast"

Hors ligne

#7 07-09-2010 11:47:03

moogli
Modérateur
Inscription : 08-05-2009
Messages : 336
Site Web

Re : test pas toujours efficace

transformation automatique de type de donnée, par exemple de caractère en entier. ceci afin de simplifier la vie des gens qui l'utilise.

Par exemple un formulaire ne founit que des chaines de caractère pourtant il est courant de voir if($_POST['id']==28) ..., on devrait utiliser intval pour "changer" la donnée de chaine de caractère en entier wink

@+


Il en faut peu pour être heureux pompompompompompompompompompompom

Hors ligne

#8 07-09-2010 13:22:38

debe
Membre
Inscription : 25-06-2009
Messages : 87

Re : test pas toujours efficace

Merci, j'ai compris

affaire résolue donc

Hors ligne

Pied de page des forums