Eviter les doubles doublons

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : Eviter les doubles doublons

par lordbdp » 01 avr. 2007, 00:51

Je ferai ta modif demain et je te dit ce qu'il en est :wink:

Si en revanche quelqu'un à la solution pour chercher nom dans prénom et inversement aussi en même temps pour les doublons...

Merci pour tout encore.

par AB » 31 mars 2007, 16:29

As-tu accès à ta table? Si oui as-tu essayé la manip que je t'ai indiquée dans mon message précédent?
Si tes champs sont de type varchar, le fait de mettre l'interclassement en latin1_general_ci les rendra insensibles à la casse. C'est à dire que 'DuPont' sera trouvé si tu cherches 'dupont' (il me semble que c'est ce que tu souhaites).
Quant'au code que tu viens de trouver je ne vois pas son utilité pour résoudre ce pb.

par lordbdp » 31 mars 2007, 14:55

Bon alors, après de multiples essais non concluants avec ce que j'ai trouvé sur les différents sujets et le manuel, voilà ce que j'ai retenu :

Code : Tout sélectionner

// On met la 1ere lettre en Majuscule et le reste en minuscule $txt = ucwords(strtolower($txt); if (strpos(($txt, '-')){ $txt = preg_replace('#-(\w)#e', "'-'.strtoupper('$1')",(txt); } if (strpos(($txt, '\'')){ $txt = preg_replace('#\'(\w)#e', "'\''.strtoupper('$1')",(txt); } // On valide tout séparateur de prénom function myUcfirst($capture){ return $capture[1].ucfirst($capture[2]); } $prenoms = preg_replace_callback("#(^|['~-])(\w+)#", "myUcfirst", $prenoms);"
Que j'ai placé avant :

Code : Tout sélectionner

// On évite les doublons dans la base
Mais j'ai le message d'erreur suivant :
Parse error: parse error, unexpected ';'
pour la ligne suivante :

Code : Tout sélectionner

$txt = ucwords(strtolower($txt);
de plus je viens de remarquer que si une personne inverse le nom et le prénom, on peut se trouver avec un doublon...

Là je mouline à fond !

par AB » 31 mars 2007, 13:09

Dans ta table, via phpmyadmin, modifie l'interclassement de tes champs en latin1_general_ci

par lordbdp » 30 mars 2007, 23:48

$verdict = mysql_query($test);
$Total_row = mysql_fetch_row($verdict);
En effet, il fallait virer MYSQL_ASSOC qui bloque la commande (:shock: ).

En revanche comment faire pour que majuscules et minuscules soient comparés comme étant la même chose. Je m'explique, il suffit que je rentre un nom ou prénom déjà existant avec une majuscule à la place d'une minuscule et alors la validation sera faite quand-même.

Merci encore.

par AB » 30 mars 2007, 16:05

Bonjour,

code à corriger en lieu et place de ta ligne existante :

 

    $verdict = mysql_query($test);

par orgerix » 30 mars 2007, 08:53

IL faut que tu mette MYSQL_ASSOC comme deuxième argument de mysql_fetch_array() et non de mysql_query().

(IL y a une fonction, mysql_fetch_assoc($requet) qui se comprote exactement comme mysql_fetch_array($requet,MYSQL_ASSOC))

par lordbdp » 29 mars 2007, 18:14

Ben je me prend un message d'erreur pour 2 lignes de code :
mysql_query(): supplied argument is not a valid MySQL-Link resource
pour :

Code : Tout sélectionner

$verdict = mysql_query($test, MYSQL_ASSOC);
mysql_fetch_row(): supplied argument is not a valid MySQL result resource
pour :

Code : Tout sélectionner

$Total_row = mysql_fetch_row($verdict);
:cry: :cry: :cry:

Je vous donne mon code complet si cela peut vous aider :

Code : Tout sélectionner

<title>Petition</title> <style type="text/css"> body { background-color: white; color: black; font-family: Arial, Verdana, serif; font-size: 12px; } input { border: 1px solid; border-color: black; background-color: white; color: black; font-family: Arial, Verdana, serif; font-size: 12px; } table { border-collapse: collapse; } td { border: 1px solid; border-color: black; } </style> <?php // On inclu le fichier de configuration include('config.php'); ?> <form action="<?php echo $PHP_SELF; ?>" method="post"> <center> Nous vous invitons à signer cette pétition, si vous le voulez bien, pour soutenir cette cause : <br /><br /><?php echo $cause; ?> <br /><br /><br /> Prénom : <input type="text" name="prenom"><br /><br />Nom : <input type="text" name="nom"> <br /><br />Date : <?php echo date('d/m/Y'); ?> <br /><br /><input type="submit" name="submit" value="Valider">&nbsp;<input type="reset" name="reset" value="Recommencer"> <br /><br /> </center> </form> <?php echo '<center><table><tr><td><b>Nom</b></td><td><b>Prénom</b></td><td><b>Date de signature</b></td></tr>'; // On se connecte à la base de données mysql_connect("$host", "$login", "$password"); mysql_select_db("$bdd"); // On sécurise les champs $nom = htmlspecialchars($_POST['nom']); $prenom = htmlspecialchars($_POST['prenom']); $date = date('d/m/Y'); $submit = htmlspecialchars($_POST['submit']); // On vérifie que tous les champs sont bien remplis if($submit && empty($nom)) { // Message d'erreur die('<center>Vous devez remplir tous les champs.<br /><br /></center>'); } if($submit && empty($prenom)) { // Message d'erreur die('<center>Vous devez remplir tous les champs.<br /><br /></center>'); } // On vérifie que les champs sont assez longs pour être raisonnables $long1 = strlen($nom); $long2 = strlen($prenom); // Si le nom est trop court (plus petit que 3 caractères) if($submit && $long1 < '3') { // Message d'erreur die('<center>Votre nom doit faire plus de 3 caractères.<br /><br /></center>'); } // Si le prénom est trop court (plus petit que 3 caractères) if($submit && $long2 < '3') { // Message d'erreur die('<center>Votre prénom doit faire plus de 3 caractères.<br /><br /></center>'); } // On évite les doublons dans la base $test = sprintf("SELECT count(*) FROM petitions WHERE nom='%s' AND prenom ='%s'",mysql_real_escape_string($nom), mysql_real_escape_string($prenom)); $verdict = mysql_query($test, MYSQL_ASSOC); $Total_row = mysql_fetch_row($verdict); $total = $Total_row[0]; if ($total > 0) { //Cette personne est déjà enregistée die('<center>Cette personne a déjà signé la pétition.<br /><br /></center>'); } if($submit) { // On enregistre la participation à la pétition mysql_query("INSERT INTO power_petition VALUES('', '" . $nom . "', '" . $prenom . "', '". $date ."')"); } // On sélectionne les résultats $sql = mysql_query('SELECT * FROM power_petition ORDER BY id DESC'); // On compte le nombre de signatures $signs = @mysql_num_rows($sql); while($donnees = @mysql_fetch_array($sql)) { ?> <tr> <td> <?php echo $donnees['nom']; ?> </td> <td> <?php echo $donnees['prenom']; ?> </td> <td> <?php echo $donnees['date']; ?> </td> </tr> <?php } echo '</table></center>'; // On ferme la connexion MYSQL mysql_close(); ?>
Merci encore.

Si vous voulez voir le résultat : http://www.neogame.fr/petitions/index.php

par zeus » 29 mars 2007, 08:09

tu n'est pas "neuneu", juste débutant.

On est tous passé par là ;)

par lordbdp » 28 mars 2007, 22:58

Merci je vais tester. J'en profiterais pour aller jeter un oeil sur le site pour neuneus comme moi , lol.

Merci à tous.

par AB » 28 mars 2007, 11:53

La requête complète :
$test = sprintf("SELECT count(*) 
  FROM donnees 
  WHERE nom='%s'
  AND prenom ='%s'",mysql_real_escape_string($nom),
mysql_real_escape_string($prenom)); 

$verdict = mysql_query($test, MYSQL_ASSOC);
$Total_row = mysql_fetch_row($verdict);
$total = $Total_row[0];

if ($total > 0)
{//le code que tu exécute si la personne est déjà enregistée
} 
Mais bon, tu devrais aller faire un tour du coté de http://www.phpdebutant.org et faire quelques tutos :wink: sinon tu ne vas pas t'en sortir.

par lordbdp » 28 mars 2007, 11:36

Donc le code suiavnt serait le bon si j'ai bien compris :

Code : Tout sélectionner

$test = "SELECT count(*) FROM donnees WHERE nom='". $nom ."' AND prenom = '". $prenom ."'"; $verdict = mysql_query($test, MYSQL_ASSOC); $Total_row = mysql_fetch_row($verdict); $total = $Total_row[0]; if ($total > 0) {//personne déjà enregistée} $test = sprintf("SELECT count(*) FROM donnees WHERE nom='%s' AND prenom ='%s'",mysql_real_escape_string($nom), mysql_real_escape_string($prenom));
Je ne rajoute pas un else avant le 2eme $test ?

par Ryle » 28 mars 2007, 00:31

ah ben voilà ! tu as trouvé, ca sert dans la doc ! ;)

plus sérieusement, c'était pas du tout après toi ou dreamweaver (encore que pour ce dernier.. ;)) mais justement parce que je comprend pas l'intérêt de cette fonction pour du SQL.

sprintf a pour but de formater une chaine.. alors c'est bien quand tu dois répéter plusieurs fois un élément, ca évite de le retaper à chaque fois (donc un seul endroit ou le modifier le cas échéant) et potentiellement inculquer la notion de type de données (même si ca n'empêche pas de continuer de voir des quotes autour de nombres :x )
Mais pour générer du code sql, franchement, à part respecter la devise "ca a été dur à coder, ca doit être dur à comprendre" je vois vraiment pas :)

par AB » 28 mars 2007, 00:19

Salut Ryle,

Ben c'était pas du dreamweaver, c'était simplement le copié collé du premier exemple (1529) de la doc PHP sur mysql_real_escape_string()

Et comme je suis pas un expert, j'ai plutôt tendance à suivre la doc.

Maintenant si tu penses que ça ne sert à rien, ça m'arrangerais plutôt, car comme tu le dis, c'est assez pénible de passer derrière quand il y a beaucoup de paramètres...

Mais alors pourquoi la doc PHP conseille également le formatage dans l'exemple 1531. ça n'apporte strictement rien par rapport à une concaténation? même pas pour se protéger de pirates hyper tordus?

par Ryle » 27 mars 2007, 23:52

Rien à ajouter si ce n'est juste une petite remarque pesonnelle concernant le sprintf... faut pas faire comme les éditeurs à la dreamweaver et l'utiliser pour des requêtes ... avec 2 paramètres c'est supportable (et encore) mais dès qu'il y en aura 5 ou plus, ca va vite devenir illisible. :(
On ne sait plus quelle variable va dans quel champ on perds du temps à vérifier l'ordre, les formats, c'est galère pour en rajouter un ou en enlever un... c'est sincèrement insuportable quand il faut passer derrière ce genre de code, alors qu'une simple concaténation donne le même résultat et est tellement plus simple à maintenir :)
$sql = "SELECT COUNT(*)  
  FROM donnees  
  WHERE nom = '".mysql_real_escape_string($nom)."' 
  AND prenom = '".mysql_real_escape_string($prenom)."'"; 
Il y a surement des fois où c'est utile (personnellement j'en ai pas encore trouvé, entre le cast implicite les fonctions de formatage) mais pitié, pas pour du sql :)


Vala, ca n'apporte rien de plus au sujet, c'était juste mon p'tit coup de trougne du soir ;)
(faudrait d'ailleurs que je pense à l'ajouter au do's and don't sql çuilà :))