Problème sur un script + question sur htmlentities

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 : Problème sur un script + question sur htmlentities

par Ryle » 14 déc. 2006, 15:44

Un p'tit clic sur Résolu ? :)

par supercanard » 14 déc. 2006, 13:10

Merci pour toutes les explications. :D
J'ai fait toutes les modifs et ça roule maintenant

par Ryle » 14 déc. 2006, 12:55

Tout à fait pour le test :)


Pour ton delete, en fait, si tu ne met pas d'apostrophes autour de tes chaines de caractère pour les délimiter, mysql va l'interpréter comme s'il s'agissait d'une instruction sql.
Dans ce cas ci, il va considérer qu'il s'agit du nom d'une colonne, et comme celle-ci n'existe pas dans la table indiquée, génèrera une erreur SQL (que tu verrais apparaitre dans le or die() de ton code) :)

Je précise qu'il ne s'agit la que des chaines (donc varchar, date, etc.) pas des nombres (int, float, ..) pour lesquels il ne peut y avoir de confusion possible, et où il ne faut pas en mettre :)

Code : Tout sélectionner

WHERE mon_id = 5 AND mon_total < 130 AND ( ma_chaine LIKE 'toto%' OR ma_chaine = 'titi' ) AND ma_date = '2006-12-14' ...

par supercanard » 14 déc. 2006, 12:35

@fred : Merci je vais faire une recherche :wink:

@ryle :
Bon j'essaye de suivre... alors si je comprends bien c'est "nb" qui va contenir le nombre d'occurences trouvées ?

Donc il faut ensuite que modifie cette partie :

Code : Tout sélectionner

if ($data['email'] == $email) {
en

Code : Tout sélectionner

if ($data['nb'] > 0) {
Ok pour les apostrophes... parce que la sans apostrophes ma requete delete ne fonctionne pas ? :roll:

par fred9999 » 14 déc. 2006, 12:08

en fait c'es annik le nom :oops:

par Ryle » 14 déc. 2006, 12:03

Hello et bienvenue :)

Ton soucis se trouve ici :
$data= mysql_fetch_assoc($req);
En fait, cette fonction te retourne la première ligne de résultat de ta requête et place le pointeur sur le suivant. On l'utilise donc généralement dans un while() afin de pouvoir lire toutes les lignes retournées par la requête.

Ceci dit, dans ton cas, il faudrait modifier un peu ta requête. En effet, c'est inutile de ramener tous les enregistrement de ta table quand il suffit juste de vérifier si l'un d'entre eux existe. A ta place, j'opterais donc pour la requête suivante :
"SELECT COUNT(*) AS nb FROM newsletter_email WHERE email = '".$email."'";
Ceci te retournera le nombre d'occurence de l'email $email dans ta table. Tu peux alors utiliser comme tu le fais la fonction mysql_fetch_assoc (puisqu'il n'y aura qu'une seule ligne de retournée par la requête) et regarder la valeur du champ 'NB'. A zéro, le mail n'a pas été trouvé, tu fais l'INSERT, à 1 (ou plus ?) le mail a été trouvé, tu fais le DELETE :)

Nota : pense aux apostrophes pour délimiter une chaine en sql (dans le delete ;))

par fred9999 » 14 déc. 2006, 11:58

salut
oui tu devrai passer ton champ en text sans limite
sinon tu devrai regarde le message de karinn !!! :wink:

Problème sur un script + question sur htmlentities

par supercanard » 14 déc. 2006, 11:54

Bonjour,
Je suis nouveau sur le forum, débutant en php. En fait je suis plutôt dans le design (xhtml, css, toshop etc...) mais je pense m'orienter petit à petit vers le développement. Bon ça c'etait juste histoire de me présenter vite fait :wink:

Alors voilà, je suis en train d'essayer de faire un script trés simple d'inscription a une newsletter.
Si on entre son adresse, qu'elle est inexistante dans la base, on s'inscrit, si elle existe on se désinscrit.
Il semblerais que j'ai un problème sur mon script puisque la fonction de désinscription ne marche pas? Je me retrouve donc avec des doublons dans la base.

J'ai commenté mon code au mieux. Je cherche l'erreur mais je sèche... :

Code : Tout sélectionner

<?php // SI FORMULAIRE SUBMIT if (isset($_POST['email'])) { $email= addslashes($email); // Apostrophes et $email= htmlentities($email); // code HTML $sql= "SELECT email FROM newsletter_email"; $req= mysql_query($sql) or die ('Erreur : '.$sql.'<br />'.mysql_error()); $data= mysql_fetch_assoc($req); // A FAIRE : Controler un champ vide // SI EMAIL PRESENT DANS LA BASE ON L'EFFACE if ($data['email'] == $email) { $sql= "DELETE FROM newsletter_email WHERE email=$email"; $req= mysql_query($sql) or die ('Erreur : '.$sql.'<br />'.mysql_error()); echo "<p class='alerte'>Votre adresse email viens d'être supprimé. Vous ne recevrez plus notre newsletter.</p>"; exit(); } // SINON ON L'AJOUTE else { $sql= "INSERT INTO newsletter_email (id,email) VALUES ('','$email')"; mysql_query($sql) or die ('Erreur : '.$sql.'<br />'.mysql_error()); echo "<p class='alerte'>Inscription réussie. Vous recevrez notre newsletter à l'adresse eMail $email.</p>"; } } ?>
Sinon j'ai aussi une autre question a propos de la fonction htmlentities.
Si je limite un formulaire a 250 caractères. Il y a bien 250 caractères, mais une fois la fonction htmlentities appliqué les caractères spéciaux sont remplacés, donc on se retrouve avec plus de 250 caractère.
Et a l'insertion dans la base dans un champ varchar, il y en a donc qui sautent... :shock: