Page 1 sur 1

Problème sur un script + question sur htmlentities

Posté : 14 déc. 2006, 11:54
par supercanard
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:

Posté : 14 déc. 2006, 11:58
par fred9999
salut
oui tu devrai passer ton champ en text sans limite
sinon tu devrai regarde le message de karinn !!! :wink:

Posté : 14 déc. 2006, 12:03
par Ryle
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 ;))

Posté : 14 déc. 2006, 12:08
par fred9999
en fait c'es annik le nom :oops:

Posté : 14 déc. 2006, 12:35
par supercanard
@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:

Posté : 14 déc. 2006, 12:55
par Ryle
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' ...

Posté : 14 déc. 2006, 13:10
par supercanard
Merci pour toutes les explications. :D
J'ai fait toutes les modifs et ça roule maintenant

Posté : 14 déc. 2006, 15:44
par Ryle
Un p'tit clic sur Résolu ? :)